React Native Airborne is an opinionated starter template for building mobile apps (iOS/Android) with Expo + Convex + Clerk.
The goal is to remove repetitive setup so you can scaffold a new production-ready app quickly.
bun create react-native-airborne@latest my-appOptional Nix setup:
bun create react-native-airborne@latest my-app --nix
cd my-app
direnv allow--nix keeps root-level flake.nix, flake.lock, and .envrc.
Without --nix, those files are omitted.
- Bun workspaces monorepo (
client/,server/) - Expo + Expo Router + Native Tabs (SDK 55)
- Uniwind + Tailwind v4
- Clerk auth flows (email/password + Google, with Apple on iOS)
- Convex backend +
convex-test - Zustand + MMKV for non-sensitive local preferences
- Expo push notifications
- Strict ESLint + Prettier + tests
my-app/
client/ # Expo app
server/ # Convex backend
- Bun
1.3.4+ justcommand runner- Expo toolchain for iOS/Android simulators/devices
- Clerk app with native API enabled
- Clerk OAuth providers configured for Google and Apple
- Convex project/deployment
cd my-app
bun install --workspaces
cp client/.env.example client/.env
cp server/.env.example server/.envFirst-time Convex setup (once per deployment):
cd server
bun run devThen run app + backend together:
just devClient (client/.env):
EXPO_PUBLIC_CLERK_PUBLISHABLE_KEY(required)EXPO_PUBLIC_CONVEX_URL(required)EXPO_PUBLIC_EAS_PROJECT_ID(optional)
Server (server/.env):
CLERK_JWT_ISSUER_DOMAIN(required in real environments)EXPO_PUSH_ENDPOINT(optional)EXPO_ACCESS_TOKEN(optional)
just dev: start Expo + Convexjust dev-client: start Expo onlyjust dev-server: start Convex onlyjust prebuild: generate local iOS/Android foldersjust ios: launch iOS appjust android: launch Android appjust fmt: format client/serverjust lint: lint checksjust typecheck: TypeScript checksjust test: client + server testsjust ci: lint + typecheck + tests
just prebuild is supported for local native runs.
client/ios and client/android are generated locally and should not be committed.
- Theme support is built-in for
light,dark, andsystem. - Do not store sensitive auth/session tokens in MMKV.
- Clerk session tokens are persisted via
@clerk/clerk-expo/token-cacheusingexpo-secure-store(iOS Keychain / Android Keystore). - Social login uses Clerk OAuth (
oauth_google,oauth_apple), with Apple shown only on iOS. - Uniwind is configured via
client/global.cssandclient/metro.config.js. SafeAreaViewis wrapped withwithUniwindinclient/src/components/screen.tsx.server/convex/_generatedships with starter stubs; after connecting Convex, runcd server && bun run codegen..direnv/is gitignored by default.- You can pass Expo flags through
just ios/just android, for example:just ios --device "iPhone 16"orjust android --device "Pixel_8_API_35".
If you are maintaining the template itself (not just using it), see AGENTS.md for internal workflow and release details.
MIT