Skip to main content

2023 year in review

2023 was a year of challenges, deep learning, experimentation, patience, and self-reliance.


My work this year had a very different balance compared to previous years. Due to the economy, I invested about 75% of my time on personal projects and 25% on client work.


This year was a rough one for consulting due to the collapse of Silicon Valley Bank in March that sent ripples of panic throughout our industry. Demand for client work evaporated as companies of all sizes reacted with fear of a looming wider collapse. As many people were affected by layoffs, I felt fortunate to have my own business, even if revenue took a substantial hit.

So, faced with fewer prospects, I invested my time in creating educational content, refining my way of working, going deep on interesting problems, and exploring a new product I'd like to launch in the future.

I've noticed confidence and momentum in the industry are picking up again lately, so demand for consulting is returning to normal. I've already started booking out 2024, with the spring filling up quick. If you or your team need help with accessible design and development, test-driven development, Shape Up, or process improvements, feel free to reach out:

Educational content

I started the year off with recording a course called Accessibility-first design for LinkedIn Learning. It was a great experience to record onsite at the LinkedIn Learning offices in Santa Barbara, California, and enjoy the warm January weather as an escape from the snow.

The script writing process for the course got me in a solid writing habit and the video format pushed me to be clearer and more concise in my teaching. Both of these experiences have continued to improve my educational content.

The course launched in April and now has over 12,000 students with a 4.9/5 rating. I'm happy with how the course turned out and glad so many people want to create more accessible design for everyone. A goal of my career is making accessibility-first the default way to build great products, so this was a solid step in that direction.

Now that I've created a formal course, I'm open to making more courses in the future. I've long considered doing this independently, which I might explore again at some point, but creating a course for Frontend Masters on a topic such as test-driven accessibility would be a fantastic fit.

Outside of course content, I blogged fairly consistently this year with 12 posts. I wrote a series on my custom second brain setup, which continues to be one of most valuable investments in my career and personal life. This year, I highlighted over 1,200 articles on design, development, and accessibility, and my second brain setup scaled perfectly for capturing those highlights and referencing them easily when working or creating new content.

I also wrote the first post in what will likely become a series on accessibility with All about accessible headings. I'd like to write posts in this series about accessible links, buttons, landmark regions, etc. that cover all the considerations of foundational accessibility.

I have dozens and dozens of post ideas, so I expect to keep the blogging pace going, if not accelerate it.

In addition to blog content, I picked my Build UX YouTube channel back up with 3 new videos towards the end of the year. I found I really enjoyed writing a post, then using that post as a rough outline for a video, and then publishing them together as complimentary resources. With so many blog post ideas kicking around, I hope to get a rhythm of videos out alongside new posts.

To wrap up educational content for the year, I wrote an article for the 2023 HTMHell Advent Calendar called Test-driven HTML and accessibility. This article teaches the approach to testing that I've developed throughout this year and transformed how I work. This topic is something I plan on expanding a ton in 2024, as I'm confident it will provide a lot of value for improving and protecting accessibility.


As client work was lighter than usual, I was able to dedicate most of my time to self-directed learning and building.

The bulk of my learning was with test-driven development (TDD), which I was able to incorporate fully in both my personal and client work.

TDD has been the most valuable practice of my development career. It gives so much clarity, confidence, quality, and resiliency to coding. It eliminates nearly 100% of the waste with manual debugging and has made me a substantially better developer. It's also been an incredibly powerful learning tool, even as I've dived into unfamiliar codebases, libraries, problems, and languages.

In April, I attended a small workshop from James Shore on Nullables, which is his technique for testing production code without hitting external systems. This approach eliminates the need for integration tests and mocks, which are slow and unreliable. Instead, you can turn off communication with the outside world and unit test functionality throughout the codebase.

The workshop was a bit of a stretch for my skills at the time. But a few months later, my main client was struggling with a problem that was the perfect candidate for this approach. With nullables in place, we were able to confidently unit test all of the functionality we were working on with tests that ran predictably and instantaneously. We even replaced existing clunky integration tests and reduced the test suite run time from several minutes down to a few hundred milliseconds.

The last frontier for testing that I wanted to solve was testing HTML and accessibility. James Shore kindly shared his past experiences using tools like Karma and Test'em, but these projects were now aging and I couldn't get them running in my projects.

Luckily, right as Karma was officially deprecated, I came across Web Test Runner, which is a tool that runs JavaScript tests in the browser instead of in Node. This makes it possible to run tests in all the major browser engines (Chromium, WebKit, and Firefox) simultaneously in the background with every change. Most importantly, it means that tests have access to the real DOM and actual user interaction events. I cover this in depth in my Test-driven HTML and accessibility article, but in short I've been able to unit test everything I build, from logic, to integrations, to rendered DOM, to accessibility, all with a lightweight setup that has scaled perfectly to many hundreds of tests running at once.


The reason why I was writing many hundreds of tests is I started exploring a product that I'd like to sell in the future. I'm not ready to discuss what the product is just yet, but I am excited for the value, quality, accessibility, and efficiency it'll bring to designers and developers alike.

This project was the central driver of my learning and will continue to inspire relevant educational content to share what I've found.

It quickly became the largest codebase I've built on my own and was a good proving ground for the level of polish I know is possible if teams prioritize the right things. While I've needed to continuously refine the codebase as it scales, having tests in place made this a calm and steady practice.

This experience was really clarifying for my career. I now am inspired to continue building this product on the side, and if I can one day focus on it full-time, I'd be thrilled and terrified to take on that challenge. While I could make a bet on it full-time, I'd rather come at it from a place of security and patience to do what's best in the long term.

Working rhythm

As I worked on my own projects throughout the year, I organically discovered and refined what is now my ideal working rhythm.

At a higher level, I used each month as a Shape Up cycle, with the first 3 weeks focused on product work, and the last week acting as a cooldown focused on creating content and framing/shaping work for the next month.

This larger rhythm feels like the perfect balance of making meaningful progress on features and learning that is substantial and fresh enough to share in a blog post and video. While I didn't directly tie each month's post and video to what I was working on, I'd like to do this in the future. When I'm ready to announce the product I'm working on, I'll still use that last week for creating educational content, but it can use the product as a concrete example if needed. I feel providing value routinely will be more effective than any actual marketing.

At a daily level, I found similar balance. My ideal workday is now the following:

  • 8:00 AM to 9:30 AM: deep work
  • 9:30 AM to 10:30 AM: break/shallow work
  • 10:30 to 12:00 PM: deep work
  • 12:00 PM to 1:00 PM: lunch
  • 1:00 PM to 2:00 PM: deep work
  • 2:00 PM onward: go live my life

This schedule guarantees 4 hours of deep work, which is far above what most full-time roles can achieve. I find 90 minutes is the longest deep work block I can sustain without diminishing returns, and having hour-long breaks between blocks keeps me fresh, gives an outlet for less important work, and lets my brain subconsciously process important problems.

While I designed and refined this schedule for my solo product work, I found it works perfectly with clients as well. Each deep work block is perfect for pairing/mobbing sessions, and the 8:00 AM to 2:00 PM PST schedule has a lot of overlap with my clients in the EST timezone 3 hours ahead.


I love mountain biking, and this year I finally got into the habit of routinely volunteering to do trail work in our local trail system. It was a ton of fun learning about trail design, which has many parallels to software design, particularly when it comes to accessibility in the form of adaptive riding. It was also super rewarding to make major improvements to trails I love, and then immediately enjoy the improvements by riding as a group.

I made several new friends as part of this group and now have great people to ride with. We even did a mountain bike camping trip in the summer to check out other trail systems in the Alsea and Black Rock areas of Oregon which was one of the highlights of my year.

Outside of mountain biking, I started making wood fire pizzas routinely and was able to hone my Neapolitan dough skills. I had a ton of fun experimenting with different toppings, learning how to shape and stretch dough quickly, and growing ingredients in our garden. Everything always turns out great, and worst case, you just make a calzone if the dough isn't cooperating.

Lastly, I continued my Japanese learning habit with a 450 day streak. I studied in Kyoto, Japan in 2012 but lost much of my conversational skills and Kanji in the decade since. Last year, I got back into studying routinely, and I'm happy to have my speaking and reading coming back strong.

Wrapping up

Although this year didn't go according to plan, I feel I made the most of the time I had to evolve as a developer, improve my work and way of working, and lay the foundations for a future business.

While I'm looking forward to having more predictability and stability again, I now have new skills, resilience, and calm that will make this year of unsurety worth it in the long run.