Apps already shipped have to keep working, keep passing review and keep being worth opening — at ten of them and at a hundred.
Updated 2026-09-02 · iOS · macOS · Android · Web
One workspace holds six domains, and each app uses its own repository. The shared code, the release lanes and the conventions belong to none of them and are kept separately.
Roughly 120 apps are live across the four platforms. iOS releases run from one shared lane; the Android side ships from a Flutter monorepo.
Project directories in the workspace, counted 2026-09-02. Live store listings are a smaller number — an app can be built and not yet submitted.
The parts no app needs to build again — payment, analytics, review prompts, localization, privacy handling — live in shared packages. Fixing one of them fixes it everywhere that uses it.
What people actually look at is not shared. Features, the design system the screens are built from, artwork and the app’s own content are written per app. Backends follow the same split: each app has its own, and takes only the common parts from one shared module.
The same code under all of them.
A release is a build, screenshots, store metadata in 26 languages, and a submission. All of it is handled through the official store APIs rather than a browser.
There is no deploy script per app; they share one lane. Per-app values are not restated but read from the files that already hold them. Two steps stay with a person: checking the build on a real device, and pressing release.
Keyword rank is collected per app and per country every day and read as a series. Usage events go to a collector of our own, which puts an app’s iOS and Android side by side.
The in-house services all ship as Docker images: keyword ranking, usage analytics, ad metrics, reports, the GPU jobs that generate assets, and the console that operates all of it. One service is one image, so moving or restoring one is the same job as adding a new one.
Builds and deploys are handled by CI, and server state is collected continuously so that anything going wrong raises an alert.
The repetitive work runs on agents: release mechanics, metadata updates across 26 languages, the sweep that checks every app against a policy change.
What an agent follows is written down as a skill. 44 skills and 27 agents are versioned in the same repository as the code they act on, and a convention file per domain carries the rules that hold everywhere in it. Store behaviour that has caught us before ends up here as steps.