December 6, 2019

2019 Year in Review

Last year was probably the best year I've ever had and I had a lot of optimism and excitement going into 2019, but looking back on the year now I'm pretty disappointed.

I didn't accomplish most of what I set out to accomplish, and didn't spend nearly enough time doing the sort of work I most enjoy.

Highlights

  • Released Tailwind CSS v1.0 — I finally released the first stable version of Tailwind in May.
  • Built the Laravel Vapor front end — I spent about month on this in the spring, pairing with Taylor every day to build out the front end.
  • Spoke at Laracon Madrid — I traveled to Spain with my family for almost 2 weeks and gave a talk on Advanced Vue Component Design.
  • Released Tailwind Custom Forms — While in Spain, I put together a Tailwind plugin that provides better default form styles for application UIs.
  • Spoke at Laracon US — I traveled to New York in July to give a talk on Tailwind CSS Best Practice Patterns at Laracon.
  • Started releasing "Designing with Tailwind CSS" — Over the summer I started publishing a free video course on building user interfaces with Tailwind.
  • Started work on Tailwind UI — Around September, Steve Schoger and I started working on Tailwind UI basically full-time.
  • Streamed 15 live coding sessions — Throughout the year I did a bunch of live streams, including internal work on Tailwind itself as well as building various user interfaces with the framework.
  • Published 25 Full Stack Radio episodes — Managed to stick to the bi-weekly schedule for yet another year, getting out 25 new episodes (with another one or two still to come).

Business

From a pure financial perspective, this was the best year my business has ever had. Refactoring UI continues to sell really well, my older courses are still making good money, and Full Stack Radio podcast sponsorships are still going strong.

One disappointing thing though is that I didn't introduce a single new income stream this year. Last year I launched both Advanced Vue Component Design and Refactoring UI, but this year I didn't actually launch anything.

It's starting to feel like sort of a pattern — I launched two products in 2016, none in 2017, two again in 2018, and now zero in 2019. I think this is a big part of why this year feels a bit bleh to me.

Tailwind CSS

Releasing v1.0

I released v1.0 on May 13 which felt like a big accomplishment, but it was a bit disappointing as well because I had really hoped to get it out in February. Instead it took almost half the year.

The most frustrating part of this is that it's not like I was productively coding on awesome new features and functionality for 5 months. Almost all of that time was spent agonizing over frustrating design decisions, like the config file format, and doing calls with developers who use the framework to get their input on some of these hard decisions.

That sort of work is important and it's why v1.0 turned out as well as it did, but man is it ever soul-crushing and demoralizing. I spent half the year second-guessing every tiny detail, losing confidence in my own decisions, and just being unhappy with my work until some of those hard decisions were finally cracked and things came together.

Tailwind Custom Forms

While I was in Spain for Laracon EU, I released the first version of the first official Tailwind plugin, @tailwindcss/custom-forms which aims to provide a better starting point for styling annoying form elements like checkboxes, radio buttons, and select menus.

I wanted to get this to v1.0 a long time ago, but unfortunately didn't manage to get to it by the end of the year. Right now the plan is to finish and release that just before we release Tailwind UI, so that Tailwind UI can leverage the default styles from that plugin.

"Designing with Tailwind CSS" video course

In the summer I started working on Designing with Tailwind CSS, the free video course I mentioned in my Going Full-Time on Tailwind CSS late last year.

I managed to publish 22 lessons out of about ~40 planned before putting it on pause to try and make some progress on Tailwind UI with Steve so he wasn't waiting for me.

I really wanted to get this whole video series done in about ~6 weeks, and have it released in like April, so it's a pretty shitty feeling going into 2020 with almost half of the course still left to record.

I'm happy with the videos I did get done though and I think they have been great for growing the user base, so I'm glad I invested the time, just disappointed it's in a half-finished state.

Overall though it was a great year for Tailwind:

Lots of established and recognizable companies have started using Tailwind as well, for example Firefox Send by Mozilla is built with Tailwind, ConvertKit are now using Tailwind in their dashboard, even the new Borderlands 3 and Diablo 4 websites are built with Tailwind.

Tailwind had the highest satisfaction rating of any CSS framework in the State of CSS survey this year, and was the second most popular CSS framework in the Front-End Tooling Survey.

I definitely think the project gained a ton of mind share this year, and it feels like it's getting more and more popular each week so I definitely consider that a success.

Laravel Vapor

In the spring I spent about a month working more or less full-time with Taylor Otwell every day to build out the front-end for Vapor, a serverless hosting platform for Laravel applications. We built the whole thing as a Vue SPA, with Tailwind for the styling of course.

Since working for myself full-time I don't get to do a lot of collaborative programming and really miss it, so it was really nice to get to work on this for a while. The timing wasn't perfect because I hadn't finished Tailwind v1.0 at the time so I had that stress sitting in the back of my brain the whole time, but that aside I had a lot of fun working with Taylor on this.

Conference speaking

This year I spoke at three conferences:

  • Laracon Online 2019: Tailwind CSS by Example

    In March I gave a live-coding "talk" at Laracon Online where I took a design that Steve Schoger put together in his talk (right before mine) and tried to implement it as fast as I could with Tailwind, while explaining my thought process and reasoning behind my approach.

  • Laracon EU Madrid 2019: Advanced Vue Component Design

    In May I gave the same talk I gave at VueConf TO last year to an audience of Laravel developers at the inaugural Spanish edition of Laracon EU.

  • Laracon US 2019: Tailwind CSS Best Practice Patterns

    In July I gave a talk on how I personally use Tailwind, how I handle common problems, and some mistakes I see people making and best practices for correcting them.

    You can check out the video on YouTube.

This is down from five conferences last year and felt like a better number. Next year I'll probably only do one or two.

Writing

At the beginning of the year I started my work journal, but unsurprisingly fell out of that habit pretty quickly and stopped writing updates in March.

I also wrote quite a bit of new documentation for Tailwind leading up to the 1.0 launch, but after that I only wrote one other real piece of content all year, which was an article on Persistent Layout Patterns in Next.js.

Overall I'm fine with this as I didn't have any real goals or ambitions to do a lot of writing this year. If anything I'm disappointed that I fell out of habit with the journal updates because I find them really valuable to write and they really help me appreciate my own accomplishments more, so I'd like to figure out a way to do better with this next year.

Live streaming

I streamed 15 live coding sessions in 2019, which you could put into three categories:

  • Working on Tailwind v1.0

    I streamed three sessions early in the year where I was working on some features for Tailwind 1.0.

  • Building the example application for "Designing with Tailwind CSS"

    Over the summer in preparation for the video course, I live-streamed myself building the example app we eventually build in the course.

    Check out the first video on my YouTube channel.

  • Building components for Tailwind UI

    Later in the year, I streamed a bunch of work on Tailwind UI itself, where I was building out designs Steve had put together in Figma.

    Here's one where I build an inbox UI from scratch in about two hours.

You can browse all of my uploads for the year on my YouTube channel.

Podcasting

I've published 25 new Full Stack Radio episodes so far this year, and the show now has over 3,000,000 total downloads.

Some of my favorites of the year:

Every week I keep worrying I'm going to run out of guests and topics but hasn't happened yet. Fingers crossed I can keep it going strong in 2020.

Tailwind UI

Around September, Steve and I started focusing pretty much exclusively on Tailwind UI, a library of professionally designed and crafted components and templates built with Tailwind CSS.

Three months in it finally feels like we're on the right track, but up until now this has been the most frustrating, morale-destroying project I've ever worked on in my life.

The challenge with this project is that there are so many things it could be.

Is it a set of themes? Is it a UI kit? Is it more of an educational directory of "how to implement x UI pattern with Tailwind"? Should it have one opinionated look, or should the components be in a variety of styles? If it's a variety, are they all together in one product or should it be split into multiple?

You can listen to me work through some of these questions with my friend Ian Landsman in Full Stack Radio #123.

It feels like every two weeks with this project we have some new eureka moment that makes everything crystal clear, only to be completely questioning everything again two weeks later.

We've designed and built well over a hundred components at this point, but even now I don't know for sure how much of what we've built is going to make the cut and how much we're going to scrap because we're not happy with it.

The fundamental problem here is that I want this project to be really, really good, and for it to actually be useful to people. Basically every other product in this space (templates, themes, whatever) fails on both of these points. It looks great on the live preview page, then you buy it only to download some zip file full of tightly intertwined crap with some weird custom build script that you can't actually do anything useful with.

On top of that, they always seem to be missing the components you actually need for whatever project you're building.

And after working on this thing full-time for three months, I know why this is the case: making a product like this is insanely hard.

It does feel like there is a light at the end of the tunnel though, and I'm really happy with our current process and plan. It's just super frustrating that it took 3 months of spinning our wheels and trying different approaches and backtracking constantly to get here.

It feels very much like what I went through at the beginning of the year to get Tailwind CSS v1.0 right, so at least the fact that that turned out great gives me some hope.

We really wanted to launch the first version of this by the end of the year but that's definitely out of the question now with only a couple of weeks left before 2020. With any luck though we'll finally have something for sale early next year, likely in February.

Disappointments

Too many loose ends

Looking back on the year, I think the reason I feel most disappointed is that I only actually finished one meaningful project (Tailwind v1.0), and that was 7 months ago.

I really expected to have the Tailwind course done and Tailwind UI at least available in early access by the end of the year, so going into 2020 with both of those projects still open is a crappy feeling.

Not enough programming

So much of my work this year has just been slow, hard thinking. I deeply miss having a clearly defined programming problem and being able to sit down for a full day building something that I can click around in and make it do things.

Even building templates for Tailwind UI doesn't give me that satisfaction because it's just the HTML, and that's only a tiny part of building something that actually works.

When I see friends like Freek building things like Mailcoach I am hugely envious because I can just imagine how fun it is to sit down with your text editor and make something come to life that's actually solving your own problem.

This year I think I spent maybe 3 hours total doing that sort of fun "living application" work, which was when Taylor and I paired on a complex background job I needed to add to one of my old apps. Three hours the entire year. That crushes me.

I desperately need to find a way to spend more time building real tools, because for the last year I basically haven't really done any product development at all and that's by far the most fun I have at a computer. The problem is I don't get paid to do that — I get paid to record podcasts, make videos, and write books.

Hopefully I can figure this out for next year, because I think not being able to do any of that work this year has contributed significantly to this year feeling so tiresome and unrewarding.

Looking ahead to 2020

Despite this year feeling so blah, I'm genuinely excited and enthusiastic about 2020.

  • I feel like we have finally got a clear vision for Tailwind UI and we're much more in execution vs. strategizing mode now which feels great.
  • I'm planning to add a little job board to the Tailwind website in the spring which should hopefully help me scratch that "building software" itch for a month or so.
  • Steve and I have some big plans for the Refactoring UI brand that will involve building a new pretty sophisticated web app to replace the current website.
  • We've got plans for more, smaller Tailwind UI-related projects, so with any luck it will be a multi-launch year vs. 2019 which was a zero-launch year.

Let's go 2020!