I have shipped forty-six things outside client work. Websites, apps, scripts, Figma plugins. I kept a register of all of them, with what each one was, what happened to it, and why it stopped.
Reading that register back is less flattering than the usual essay on designers who build. Eleven still run, one is on the bench right now. Twenty-five I stopped on purpose. Nine existed to learn one thing and were never meant to survive.
Building was never the hard part. That is the finding, and everything below is the evidence.
First, an honest word about the numbers
The register records lines of code per project, and they total something like 1.7 million. That number is worthless. Three projects account for 71 per cent of it, because they vendor large datasets that I did not write.
The honest measure is the median project: about 5 000 lines across 24 files. That is the real unit here, a fortnight of evenings, repeated forty-six times.
I mention this because the rest of the piece asks you to trust the register, and a register you can only trust selectively is not worth much.
Nine of them died of access, not of ability
Twenty-five projects were stopped on purpose. Nine of those twenty-five were stopped for the same reason, and it is not one I expected to see repeat.
A watch on French nonprofit filings, where the terms of access to public data did not allow scraping. A Spotify tool made unusable by API quotas and an authentication flow. Automatic tennis court booking that worked for a week, until the federation tightened its bot protection. A Vinted sniper where the anti-bot detects down to the TLS fingerprint. A net worth dashboard that would have required a regulatory licence to aggregate bank accounts in France. Three Figma plugins that the platform outgrew or would not support.
Not one of those is a design problem or an engineering problem. Every one is a permission problem. A fifth of everything I built ran into somebody else deciding who gets to read what, or what a tool is allowed to do.
Calling that a decision rather than a defeat is not a rebrand. In each case the choice was to stop or to enter an arms race, and an arms race is not a project. But it is worth saying plainly: if you are a designer about to build, ask whose permission this needs, and what happens the day they change their mind. I did not ask it nine times.
Seven of the twelve that survive have one user, and it is me
Here is the part that took me longer to admit.
Of the twelve still alive, five have a public URL and people other than me on them. The other seven are a cron that alerts me to nearby food deals, a cron that watches supermarket promotions, a script that turns album covers into videos on my own machine, a fuel price comparison I run for my own trips, an extension that re-ranks a wine merchant against its ratings, a scraper that files job postings into a dataset I read myself, and a diagnostics companion I built for my own car.
Every one of them works. Every one of them has exactly one user.
The clearest case is a travel app I built as a full monorepo: web, mobile, server, admin, and a Discord bot. It held. It is still in closed beta. My own note in the register reads: what was missing was not technical, it was an audience.
A designer who can build will build. The building is never the constraint. What you cannot manufacture in an evening is somebody’s reason to arrive.
The only channel that paid also broke half of what I put in it
The two projects that made money did not find an audience. They were born inside one. Both are Figma plugins, published on a marketplace where the users were already standing there, searching.
That is the whole mechanism, and it is worth more than any growth advice: I did not solve distribution, I borrowed it.
The bill came separately. I put six plugins into that marketplace. Two sold. One I abandoned because the maths were too expensive to optimise. The remaining three I stopped because of the platform itself: a CMYK preparation tool that could not be reliable because browser colour conversion is not, a relief and depth tool whose features broke with every API update, and a gradient importer defeated by freeform gradients having no reproducible equivalent.
So the same channel that produced all of my revenue also ended half of what I gave it. Borrowed distribution is real distribution, and rent is charged in roadmap control.
Stopping on purpose is the skill nobody lists
The largest column is not failure. It is twenty-five projects I ended deliberately, each with a written reason.
A Webflow class cleaner, stopped because Webflow shipped the feature natively. A breach checker, stopped because the official service does it better and for free. A route calculator, stopped because Mappy and Michelin have the official toll data and I never would. A directory of products made in France, stopped because verifying real origin is journalism, not a side project.
None of those are defeats. Each is an answer to a question I could only ask by building far enough to see it: is the thing I am making better than what already exists, and if not, what exactly am I doing.
Deciding to stop, on the record, with the reason written down, is the part of this practice that transfers most directly to paid work. It is also the part nobody puts on a CV, because a list of things you did not finish reads badly until you attach the reasoning.
What I would tell a designer who can build
Build. The skill compounds and it changes what you are able to specify, which is the real return.
But be honest about which of the three problems you are actually solving. Making the thing is the one you can do alone, on a weekend, and it is the one that feels like progress. Getting permission to use the data you need is somebody else’s decision, and you should find out the answer before you start. Getting strangers to arrive is the hard one, and forty-six attempts have not made me better at it.
The register is the piece I would keep if I could only keep one. Not the code. Forty-six entries, each with what it was, what happened, and why. It is the only reason I can tell you any of this instead of remembering it flatteringly.