Three kids apps sharing one brand, one account and one subscription, migrated off a native Swift codebase into a single Flutter monorepo. The interesting part is not that they look alike. It is that they are one codebase.
Three apps, one codebase



10M+
downloads
3 platforms
Android, iOS and Web
Ages 2 to 10
COPPA-safe
The package graph
One Melos workspace on Dart pub workspaces. The apps are thin. What they share, a data layer and a design system, lives in packages they both depend on, and the dependency rules are enforced by the build rather than by agreement.

Content without a release
All three apps are data-driven players. The catalogue is not compiled in; it loads at runtime. New videos, new games and new audiobooks reach children without an app release, without a review queue, and without waiting for the slowest platform.
The shared data layer is offline-first, so a download keeps working on a plane or in a car, which for this audience is most of the time it gets used.

Under the hood
Riverpod, hand-written
No code generation, so what you read is what runs.
go_router behind AppNavigator
Three apps route through one shared navigator.
get_it
Dependency injection across the workspace.
Swift origin
The native codebase these three apps replaced.