I shipped two template versions today, upgraded all six derived apps twice, tested them twice, patched them both times, and committed the results twice. Not because I wanted to do everything twice.

The goal sounded simple - push a new Spernakit version out to all six apps, then stress-test each one for bugs I hadn’t noticed. In practice, it turned into about two dozen smaller jobs stacked on top of each other: release the template version, propagate it cleanly to every app, explore each app like a real user, triage the findings, fix them, sync keys and configs, and stack everything into clean commits. Most of it wasn’t done by hand; I ran each phase as a parallel wave of AI subagents, one per app, so the whole fleet moved at once.

I packed about forty smaller improvements into v3.1.29: code reorganizations, performance wins, a new “Test OAuth connection” button, animations that don’t jank anymore, and the last fourteen audits for that version. After applying the template changes and checking the app customizations, I ran the browser testers over the buttons and forms, including at phone size. That turned up twenty-five bugs across the fleet, including mobile failures the fourteen audits had missed. Four showed up in multiple apps: pages going blank on mobile, a Settings menu leaking admin-only items to lower roles, the signup form silently rejecting bad input, and shared dashboard links returning “not found.” Anything appearing in several apps like that is a template bug, so I fixed those in the template and sent them back out.

By then, the fixes were sitting on the template but not tagged as a release, so I ran the whole thing again, quicker, to tag v3.1.30 and push it out to the six apps. The second run included a regression pass, re-testing each app from a user’s perspective instead of just checking that the code compiled. Four more bugs came out of that. Three evaporated on inspection and the fourth I chased way too far: the shared-dashboard URL looked cut short in the share dialog, so users were copying a URL that 404’d. I traced the token through ten layers of backend and frontend code looking for string truncation and found nothing… because there wasn’t any. The URL was full length the whole time; the dialog’s input field was just narrow enough that the trailing characters scrolled off. The fix was zero backend changes - auto-select the full value when the field gets focus.

The parallel-agent pattern is really paying off. Six or seven independent things that would have eaten most of a day sequentially finished in ten-to-fifteen-minute waves, and the afternoon session took less than two hours, which was much quicker than the previous one. The audits check phone-size layouts now.