Dev Tools
Seventeen utilities I got tired of googling every week, gathered into one panel. No sign-up and no usage limit.
The problem
Converting a PNG to WebP, removing an image background, formatting JSON, generating a QR code, reading text out of a screenshot. Two-minute jobs that always end up in the same place: a site plastered with ads, a watermark on the output and a subscribe button halfway through. None of these tasks is hard, and every one of them still charges a toll.
The decision
Build all seventeen at once, in a single panel, and leave it up for free. The decision that holds the rest together was one of scope: each tool does one thing and asks for nothing in return. There is no account to create and no plan to subscribe to.
Seventeen tools, one route
The obvious path would be seventeen folders, seventeen pages and seventeen copies of the same shell. That works right up until you touch the layout: then it is the same fix seventeen times, and the seventeenth is the one that gets forgotten.
So the whole panel is a single dynamic route, /[tool], served from a central registry. Every tool declares itself there with a name, category, description and component; the sidebar, the search and the cards on the home page all read from that same registry. Adding the eighteenth means writing the tool and registering one line. Navigation updates itself, and search never disagrees with the menu because both read the same list.
The file never leaves your machine
Processing happens in the tab, not on a server of mine. That solves infrastructure cost, upload waiting time and the privacy question all at once, because a file that never goes up needs no retention policy.
Copy and paste until the pattern shows up
This is where I learned the difference between repeating yourself and generalising too early. I wrote the first three tools by copying and pasting on purpose, abstracting nothing. Only when the third was done did the common shape show up on its own, and the central registry then became the consequence of something I had already watched happen three times. Had I abstracted on the first one, getting the shell right would have been luck.