The operating system for my hobby apps — written down because every rule here was paid for once. Each one has a receipt in the log.
I'm not hunting the one perfect app. I take small, cheap swings and let the interesting ones reveal themselves. A miss should cost weeks, not months — and it should be shelved without guilt the moment it stops pulling.
Plant30 was built, working, and shelved anyway. I'd stopped opening it myself — a tracker you don't open is already dead.
Local-first by default: on-device storage, iCloud for sync, no servers unless the idea genuinely demands one. Then an app that doesn't find its people can stay on the App Store forever without bleeding money — misses are free to keep.
nestry+ exists because nestry carried a hosted backend and auth for a two-person private dataset. The fork deleted the server entirely: Core Data + CloudKit sharing, one-time purchase.
A framework is a bet that you know what the next five apps need. I didn't. Copying a shipped app's spine and deleting what doesn't apply is faster — and every clone improves the spine. Frameworks are extracted, not built.
rookie-kit, my app-factory SDK, stalled on day 3 of a 7-day plan. Never resurrected. Never missed.
Users raging at an incumbent looks like an opening. Usually it means a graveyard: dozens of builders saw the same rage and shipped the same alternative. If half the search results are competitors' own "best alternatives to X" blog posts, the door already closed.
I researched a Splitwise alternative twice. Real anger, sourced quotes — and a dozen well-funded clones already fighting over the keyword. Parked it.
Distribution kills more small apps than the build does. Before a line of code: is there an ASO-able niche, a community that actually wants it, or an invite loop built into the product? "It's good, people will find it" is not an answer.
Streaks, badges, and guilt-notifications optimize the wrong metric on a utility. If skipping three days makes the app punish you, the app serves itself, not you.
Gut Log shipped with streaks deliberately cut. Locked philosophy: measure the gut, not the app.
If the app's whole value is feeling personal and polished, cross-platform wrappers are the wrong trade. Go native, and cover the other platform honestly — a good web app beats a bad port.
carebit (Expo) was rewritten as Bloompair (SwiftUI). Android got a proper PWA instead of a second-class native build.
A public log with only wins is marketing. The kills — with dates and reasons — are what make the ships believable, and writing the reason down is how the lesson actually sticks.