A Kealy Studio starter — part of the free tier of the App Dev with AI course.
This is your starting point for building a real iOS, Android, and web app with Expo and React Native, designed to be developed with AI coding tools like Claude Code. It uses development builds: you compile the app once (locally or in the cloud with EAS), install it on your simulator or phone, and from then on iterate with instant JavaScript reloads. Expo Go is not supported — this app ships native modules, and the Expo Go app in the stores lags behind SDK 56.
- Expo SDK 56 (React Native 0.85, React 19.2.3) with expo-router file-based routing and typed routes
- Development-build workflow —
expo-dev-clientplus aneas.jsonwith development, preview, and production build profiles - Design token theme system — semantic colors, spacing, typography, and radius scales in
src/lib/theme.ts, with full light/dark support - Persisted theme picker — light/dark/system mode on the Settings tab, stored with Zustand + AsyncStorage and restored on launch (the splash screen holds until the saved theme loads, so there's no wrong-theme flash)
- UI primitives —
Button,Card,Input, andTextcomponents built on the theme tokens, exercised by a "Design preview" section on the home screen so a restyle is visible immediately - Shared
Screenscaffold — safe areas, tab-bar clearance, and wide-screen max width handled in one place - Error boundaries — a global boundary in the root layout plus a
ScreenErrorBoundarywrapping every screen - Local storage —
@react-native-async-storage/async-storagewith typed helpers insrc/lib/storage.ts - Common device capabilities pre-installed — camera, photo picker, media library, location, haptics, video, SVG, gradients, blur, clipboard, sharing, file system, and WebView, with permissions pre-configured — their native code is already in your development build, so reaching for them never requires a rebuild
- TypeScript strict mode, ESLint, and the React Compiler (automatic memoization)
- CLAUDE.md — project conventions so your AI assistant writes correct, current Expo code
- Node.js 22.13 or newer
- For local builds: Xcode (Mac only) for iOS, Android Studio for Android
- Or a free Expo account to compile in the cloud with EAS Build — no Xcode or Android Studio needed
-
Install dependencies:
npm install
-
Name your app.
app.jsonships with the name and slug set tochange-me, the scheme set tochangeme, and the bundle identifier / Android package set tocom.changeme.changeme— that's deliberate. Before anything else, setname,slug,scheme,ios.bundleIdentifier, andandroid.packageto your app's real identity, and matchpackage.json'snameto the slug (or ask your AI assistant to do it). -
Build and install the app once. Locally, with Xcode / Android Studio installed:
npm run ios # iOS Simulator npm run android # Android Emulator
Or in the cloud with EAS (link your Expo account first, then build):
npm install -g eas-cli # once eas init eas build --profile development --platform ios # iPhone eas build --profile development --platform android # Android device
-
Develop:
npm start
The dev server connects to your installed development build — from here on it's instant reloads. Press
wto open the web version.
You only need to rebuild the native app when you add a library containing native code that isn't already pre-installed — the common ones already are.
src/
├── app/ # Screens — each file is a route (Home, Settings)
├── components/
│ ├── ui/ # Button, Card, Input, Text
│ ├── error/ # Error boundaries
│ ├── AppTabs # Tab bar (native + web variants)
│ └── Screen # Shared screen scaffold (safe areas, tab insets, max width)
├── hooks/ # useColors, useIsDark, useColorScheme
├── lib/ # theme.ts (design tokens), storage.ts (AsyncStorage helpers)
└── stores/ # Zustand stores (theme mode, persisted on device)
- Screens live in
src/app/— each file is a route (file-based routing); wrap screen content in the sharedScreencomponent - Colors, spacing, and typography all come from
src/lib/theme.ts— change the tokens there and the whole app follows - Reusable components live in
src/components/ui/ - Global state goes in
src/stores/(seethemeStore.tsfor the persisted-store pattern)
Add new libraries with npx expo install <package> (not plain npm install) so versions stay compatible with the SDK.
npm run lint # ESLint
npm run typecheck # TypeScript© Kealy Studio. Provided to students of the App Dev with AI course for use in their own projects. Not for redistribution as a starter kit.