Shipping fast as a one-person shop

I cut about two TestFlight builds a week across three apps. People ask how — usually expecting an answer about AI or some clever stack. The honest answer is three boring habits.

1. Tiny pull requests

Most of my PRs touch fewer than 200 lines. A small PR is easy to review, easy to revert, and almost never blocks a release. The cost is more PRs total — but each one is so cheap that throughput goes up, not down.

2. CI that catches my mistakes before users do

Every PR runs the full test suite (8,600+ tests on the Flutter side), static analysis, and a release build for both iOS and Android. If the build fails, I never see it on the device — the next push fixes it. Ten minutes of CI is cheaper than a TestFlight cycle and a confused tester.

3. Saying no to scope creep that does not affect the user

The hardest one. A clean abstraction nobody asked for is still scope creep. Three duplicated lines is fine. Three files of dependency-injected ceremony to "fix" them is not. The bar I use: does the user notice the difference? If not, leave it alone and ship the actual feature.

None of this is novel. It just compounds — week after week, the codebase stays small enough that I can hold all of it in my head, and that is what makes shipping fast feel sustainable instead of stressful.

— Peter Le