It’s hard to believe, but Cushion turns 10 years old in a few months. Even in real life, 10 years is a long time, but in software, 10 years is an eternity. 10 years ago, Vercel and OpenAI didn’t exist, React and Vue were brand new frameworks, and we were still writing CoffeeScript because ES6 didn’t exist yet. Even so, after all these years, I’m proud to say that Cushion still works, still makes an honest income, and I’m still passionate about it.

The past fews years leading up to this 10-year milestone, however, have been full of existential thoughts. When I look at where Cushion is now (and honestly where it’s been for the last ~5 years), I feel a sense of nostalgia and longing for the years before it—when Cushion was only me and only a side project. (Cushion currently is only me and only a side project, but I’ll explain what I mean…)

It’s easy to forget, but for a couple of years in the middle, Cushion was a venture-backed startup. In mid-2016, I made the decision to take Cushion to the next level, from a bootstrapped side project to a startup with a team and funding. That change significantly altered the trajectory and made Cushion more than only me and more than only a side project. I truly believed at the time that Cushion could be the only tool for freelancers, and I thought that’s what I wanted. While the bootstrapping years were as wholesome as it gets—with me casually whittling away at my precious object and consistently writing about it—the startup years were a nonstop sprint of aiming for the fences, under the gun of a dwindling runway, in a startup world where I always felt like an imposter.

In hindsight, I’m glad we tried it, but ever since those years, I can’t shake this aching feeling that Cushion is “off-course”. Instead of embracing what worked really well up until that point and doubling down on those features, we were always in search of the “network effect” that would grow Cushion exponentially. We spent months working behind the curtain on big features that would never leave private beta, while the rest of the app remained stagnant. I never felt good about neglecting the features that people actually used, and I felt even worse when I needed to cut our losses with the big features—erasing months of progress in the wrong direction.

Ever since the startup experience, I’ve had a theory brewing inside me—or rather eating at me. It feels obvious now, but it didn’t at the time: if I would’ve stopped expanding Cushion’s scope at the 2-year mark—when Cushion was thriving—and instead focused on growing the user base with the features that really worked well at that time, Cushion would’ve grown more while also being easier to grow, maintain, and improve. This makes sense now, but it didn’t cross my mind at the time—I’m a builder at heart.

Now that I’m on holiday break for a few weeks, I’m ready to test this theory. When I look through my journal posts and changelog entries, that 2-year mark puts us around early 2016—when Cushion was truly in its prime. The app was simple, focused, and easy to market. This is my goal.

In combination with this theory, I also want to introduce another thought: what would Cushion look like if it were built with a modern stack? Most of Cushion’s inner workings are at least seven years old, including a Heroku infrastructure, Ruby backend, and a frontend potpourri of jQuery, CoffeeScript, Angular, and Vue (from when I tried to incrementally migrate to Vue by embedding it within Angular…) After living with this codebase for years, I’m certain that a modern upgrade of Cushion’s stack would work wonders for consistent improvements—especially when what used to take weeks could now be done in a day or two.

A modern upgrade also brings another important factor—excitement. Legacy codebases can be draining, but one way to fight that feeling is to build a dev environment you’re excited to work in. 10 years ago, believe it or not, I was excited to use Angular and Webpack. Now, not so much. These days, I’m all-in with Vue and Vite, but who knows about 10 years from today. Regardless, Cushion is ready for a fresh coat of paint and a fresh new engine.


I could’ve written this post a week earlier with an outline of my plan, but I wanted to hold off until I actually started working on it—and I have. After a day, I already have the web app deployed and running with user models and authentication—including the addition of Google Auth, which would’ve been a headache to implement in the existing codebase. I’m really looking forward to seeing how far I can run with this, while at the same time only considering it a test of a hypothesis. Nothing’s set in stone, but this is what side projects are made for—trying things out and having fun.