I went through everything I’d built and counted: twenty-two repositories. About nine are polished enough that I’d point someone at them. The rest are real work that stopped somewhere short of a front door.
There’s a clean tell for which is which. The ones that shipped have a live URL on a real domain — Court Canvas, the tennis bracket pool, the Austin courts guide. The ones that stalled are private repos with no link: a Go system monitor, a modern-standby sleep dashboard, an AI coloring-book generator. Each was interesting enough to start and never interesting enough to finish. Starting is cheap. Finishing is the tax, and most things don’t pay it.
What went well: the small Windows tools. A single-file health report, a laptop benchmark — each does one thing, shipped quickly, and didn’t grow features it didn’t need. Small and done beats big and someday every time I actually check.
The most expensive thing I redid was Court Canvas. I shipped the first iOS version by wrapping the web app — fast, one codebase — and Apple rejected it as a glorified webview while the in-app purchases quietly broke. So I rewrote it native in SwiftUI. The shortcut saved weeks up front and charged them back with interest. For a touch-heavy app where the paid unlock matters, native was always where it was going to land; the wrapper just made me learn that the long way.
If there’s a pattern across twenty-two repos, it’s that the number isn’t the point. Nobody’s impressed by a repo count. What matters is how many have a real address you can visit — and that number is always smaller, and always the honest one.