An Expo app (iOS/Android/Web) using Zero for realtime sync, with a Hono API, Better Auth, and Drizzle ORM (PostgreSQL). Shared types, schema, queries, and mutators live in the shared workspace.
- Node and bun
- Docker (for PostgreSQL)
bun icp .env.sample .envThis brings up Postgres with WAL enabled and runs migrations from migrations/.
bun run dev:db-upThis uses the Zero schema generated from Drizzle via shared/src/zero-schema.gen.ts.
bun run dev:zero-cacheHono server on port 3000. Requires DATABASE_URL in .env.
bun run dev:apiChoose one of the following:
bun run dev:expo # Expo dev menu
bun run ios # iOS simulator
bun run android # Android emulator
bun run web # Expo for WebNote: URLs are centralized in lib/config.ts with defaults for local development:
- Zero cache:
http://localhost:4848 - API:
http://localhost:3000
For production builds (TestFlight/App Store), configure URLs in eas.json under each build profile.
If testing on a physical device in development, update the hardcoded defaults in lib/config.ts to your machine's LAN IP.
Common utilities:
bun run dev:db-down # Stop Postgres
bun run dev:clean # Remove local replica/db volume (destructive)This project is configured with EAS Build for iOS deployments.
Update eas.json with your production server URLs:
"production": {
"autoIncrement": true,
"env": {
"EXPO_PUBLIC_ZERO_CACHE_URL": "https://your-production-zero-cache.com",
"EXPO_PUBLIC_API_URL": "https://your-production-api.com"
}
}bunx eas-cli build --platform ios --profile productionbunx eas-cli submit --platform ios --latestThe build number will auto-increment on each production build. Once submitted, the build will appear in App Store Connect under TestFlight within 5-15 minutes.