A sanitized Expo + React Native + TypeScript fullstack monorepo template. It is designed for quickly starting a distributable mobile app while demonstrating a production-style architecture: Expo client, Express API, shared packages, PostgreSQL migrations, Redis-backed worker queues, import jobs, CI, release automation, and static marketing/legal pages.
- pnpm workspaces with TurboRepo
- Node.js 20.19.4 and pnpm 10.28.1
- Expo Router, React Native, TypeScript
- Express API with typed request/response contracts
- PostgreSQL migration package and Redis queue/cache package
- Worker project for background imports and queue-based jobs
- GitHub Actions, EAS build placeholders, and Cloudflare Pages static site
projects/client: Expo app with catalog, account, settings, auth placeholder, billing placeholder, and API client.projects/api: Express API with versioned health, app config, catalog, account, and subscription webhook routes.projects/worker: background worker that can run an inline sample job locally or attach to Redis queues.projects/scripts: repository utility command placeholders for checks and generation.packages/types: shared enums, route builders, environment schemas, and wrapped validation schemas.packages/components: React Native component wrappers used by the client.packages/database: database connection helper, migrations, and seeds.packages/cache: Redis and queue helpers.packages/jobs: reusable import job logic.cloudflare-pages/client: static marketing, legal, and login redirect pages.
pnpm install
cp projects/api/.env.example projects/api/.env
cp projects/client/.env.example projects/client/.env
cp projects/worker/.env.example projects/worker/.envLocal development defaults do not require real auth, subscription, Redis, or database credentials. Add provider values only when you are ready to wire those services.
pnpm dev:client
pnpm dev:api
pnpm dev:worker
pnpm migrate:dev
pnpm build
pnpm lint
pnpm test
pnpm format- Auth: provide
EXPO_PUBLIC_AUTH_*and APIAUTH_*values to replace placeholder login behavior. - Subscriptions: provide public subscription SDK keys in the client and webhook secrets in the API, then replace the placeholder billing context with provider calls.
- EAS: replace the zero UUID in
projects/client/app.base.tsx, configureEXPO_TOKEN, and setEAS_PROJECT_CONFIGURED=truein repository variables. - Cloudflare Pages: set project/account secrets, set
CLOUDFLARE_PROJECT_CONFIGURED=true, and deploycloudflare-pages/client. - PostgreSQL/Redis: set
DATABASE_URLandREDIS_URLfor migrations, API persistence, and queue workers.
- Real auth, subscription, observability, app-store, or static-hosting provider accounts.
- Production-grade catalog persistence; the API uses in-memory demo data until you connect database queries.
- A real external import provider; the worker demonstrates the queue/import shape with sample data.
- Fully automated releases; the release workflow is intentionally a placeholder you can wire to your preferred versioning and changelog process.
Rename @acme/*, update app identifiers, replace the catalog example with your domain, and add real provider credentials in your private deployment environment. Keep .env.example files safe and placeholder-only.