One TypeScript codebase, two clients. npm workspaces with Turborepo hold the React 18 web app (apps/web), the React Native 0.85 + Expo mobile app (apps/mobile), and eight shared packages consumed as raw source, so a single edit hot-reloads both apps.
The state (22 Redux slices and the gamification logic), the API layer behind a narrow HttpClient interface, the theme tokens, the translations, the validation schemas, and the icon registry are all one implementation. Each platform keeps only what must differ: persistence, navigation, token storage, and the entire render layer. The marketing site lives at the repo root, deliberately outside the workspace, and ships to Cloudflare Pages on its own.
One CI graph typechecks, builds, and tests every workspace, then runs the Playwright e2e suite against the full stack. A push to main deploys the web app to Cloudflare Workers Static Assets with wrangler deploy and, when the mobile app or any shared package changed, builds the signed Android App Bundle and uploads it to the Google Play open testing track. Production releases go out from that same workflow on a manual run; the app is on Google Play.
The monorepo, UI components, Redux and data, language and theme, UI security and study notebook architecture topics all document this repository.