← Build log

Build log

I deleted the app to fix the app

Hedge is a daily calibration trivia game I build solo; the architecture lives in the case study. This one is the story of the day the native question-review app stopped being an app, and what deleting it bought.

Hedge's questions get reviewed on a phone. That was the whole design: a separate Expo app, never published, thirty-second approval bursts from the couch. It worked for a thousand questions. Then I started wanting it on the iPad, and on the Mac, and the answers were all native answers: an iPad build, ad-hoc provisioning with UDID bookkeeping, or TestFlight with its 90-day build expiry treadmill. Every option was more ceremony for an app whose only job is talking to a server in my closet.

A website in an app costume

Mid-complaint, the reframe landed. The admin app is useless without a network path to the mini. It has no local database, no offline mode, nothing native about it except the packaging. A thin HTTP client with no offline story is a website wearing an app costume. So the fix was not a better costume. The fix was to stop pretending: serve a responsive web app straight off the Mac mini that already runs the content server, and let one URL be the phone app, the iPad app, and the desktop app.

What deletion bought

Deleting the native layer deleted a whole category of my life. The admin EAS project, gone. Preview-channel OTAs, runtime version management, dev-client rebuilds every SDK bump, provisioning profiles, the App Transport Security exception, all gone. Deploying the admin is now "the server builds 400KB of static files." The mini pulls, restarts, done.

The bet that paid

The part that made it a one-day rewrite instead of a one-month rewrite was a bet placed months earlier. Every piece of testable logic in this project lives in a shared TypeScript package, and the rule was enforced even when it felt like ceremony. The scheduler, the validators, the runway math, the similarity engine: all of it ran in a browser unchanged. The rewrite was only ever the render layer.

Same-day production

It was in production use the same afternoon, which is how it found two real bugs before dinner, including a crash caused by Gothic script in a Wikipedia sidebar. The iPhone home-screen version then spent a day fighting me over 47 points of screen, but that story already got its own entry ("I deployed a ruler"). Ten days of using the web app for every review session since, on every device I own, without opening the old one once.

Retired

So this week the Expo admin app officially retires. Not because it failed. Because it was scaffolding, and the building is done.