Most founder stories you read skip the boring middle. This one is mostly the boring middle, and that is exactly why it is worth reading.
In 2017, Justin Duke was annoyed. He wanted a simple way to publish a newsletter, and every tool he tried was either bloated, expensive, or both. So he built his own. He did not quit his job. He did not raise money. He did not plan a launch. He just kept shipping, one small improvement at a time, for nine years.
Today that side project, Buttondown, does over $1M in annual recurring revenue. Here is how he got there, and why he thinks most people chasing the same dream are rushing a step they should be sitting with.

It Started With Spite, and a Bit of Hubris
Duke did not set out to build a company. He set out to fix an annoyance. The newsletter platforms available at the time felt clunky to him as a developer, and he figured he could write something cleaner over a weekend.
That instinct, part frustration and part overconfidence, is a pattern you see across a lot of durable side projects. The founder is not chasing a market opportunity. They are scratching their own itch, and the business shows up later as a side effect.
Building the First Version on Stolen Hours
The first version of Buttondown was embarrassingly small. Duke built it in whatever hours he could find around a full-time job, without any expectation that it would become his main source of income.
There was no roadmap and no pressure to make it impressive. That lack of pressure is part of why it survived. He was building for himself first, which meant the bar for "good enough to ship" stayed low enough that he actually kept shipping.
A Stack That Barely Changed in Nine Years
Buttondown has run on largely the same technical foundation since the beginning: Django and Postgres on the backend, with Vue giving way to Next.js on the frontend over time. Duke has not chased new frameworks for their own sake.
For a tool whose entire value proposition is reliability, that restraint is a feature, not a limitation. Newsletter infrastructure is not the place to be experimenting with the latest framework of the month.
No Launch Day, Just Slow Compounding
Ask Duke when Buttondown "launched" and there is not a clean answer, because there was no single launch. Growth came from several things stacked on top of each other over years, not a single moment:
Writing in public, consistently sharing what he was building and learning, which built an audience of exactly the people likely to need the product
An unplanned acquisition channel, as large language model tools began recommending Buttondown to people asking how to start a newsletter
Obsessive support, answering customer questions personally for years longer than most founders would tolerate
Product visibility, Buttondown's own branding appears on free-tier newsletters, which quietly advertises the product to new readers
Charge More, Apologize Less
One of Duke's clearest regrets is how long he kept prices too low. He treated inexpensive pricing as a kindness to early users, but came to see it differently.
Under-pricing doesn't make you generous. It makes you fragile, and it starves the business of the resources it needs to serve those same customers well.
Raising prices did not cost him the goodwill he feared it would. It gave the business room to actually support the people using it.
The Hardest Transition Was Not Technical
Scaling the code was never the hard part. Scaling himself was. Moving from a solo founder who did everything personally, especially support, to someone who had to build a team and hand off work he had held onto for years, was the harder shift.
Letting go of direct control over support conversations meant trusting that the standard he had set could survive without him being the one answering every message.
Why He Thinks Indie Hackers Should Keep Their Day Jobs
Duke is candid that he does not think everyone should quit their job to chase a side project the way he eventually did. His own path only worked because he gave it years, unpaid, before it owed him anything.
A day job is not the obstacle to a side project succeeding. For most people building something new, it is what buys the runway to let the thing grow slowly enough to actually work.
Two Pieces of Advice
Write before you build. An audience that trusts you is worth more early on than a polished feature set nobody has asked for yet.
Price for the business you want, not the one you're afraid of losing. Cheap pricing protects the founder's discomfort, not the customer.
What Comes Next
Buttondown is still Duke's main focus, still largely bootstrapped, and still growing without a marketing budget to speak of. The plan going forward looks a lot like the plan for the last nine years: keep writing, keep listening to support tickets, and keep shipping in small increments.
You can follow Justin Duke's writing directly at jmduke.com or on X.
If this was useful, pass it on to someone weighing whether to quit their job before their side project has proven anything. Sometimes the job is the advantage, not the obstacle. That is how this newsletter keeps growing.