A personal, all-in-one iOS app (React Native + Expo) from the Personal OS PRD. All six screens are implemented (Today, Tasks, Journal, Habits, Gym, Finance) and the Phase-1 backbone is real: Tasks, Habits (per-day logs), Journal, Finance and the Quick-Capture Inbox all persist to SQLite via Zustand stores. Quick Capture → Inbox → triage (into Task/Journal/Habit) works end-to-end, and the Today screen aggregates live data from every module to compute the daily score. (Gym is still a session-only view.)
| Concern | Choice |
|---|---|
| Framework | React Native + Expo (Dev Client), SDK 54 |
| Language | TypeScript (strict) |
| Navigation | Expo Router (file-based, typed routes) |
| Local DB | SQLite via expo-sqlite |
| State | Zustand |
| Charts | react-native-svg (donut) |
| Fonts | IBM Plex Sans / IBM Plex Mono |
| Icons | MaterialCommunityIcons (@expo/vector-icons) |
The UI is a 1:1 implementation of the Claude Design project
1114d4bb-6857-465a-8ae9-4124d2af582d, screen 06 Finance.dc.html
(imported reference kept in design/).
npm install
npx expo start # then press "i" for iOS simulator, or scan with a Dev ClientPer the PRD, deployment is via an Expo Dev Client (cable Mac → iPhone); no App Store needed. Run
npx expo run:iosfor a native dev build.
This app uses native modules (Skia, Reanimated, SQLite, …) so it cannot run in
Expo Go — you must build a native dev/release build. ios/ and android/ are
git-ignored; expo run:ios will auto-prebuild + pod install on first run.
Requirements: macOS + Xcode + CocoaPods, iPhone with Developer Mode on and
the Mac trusted. Verify with xcodebuild -version && pod --version.
xcrun xctrace list devices # copy your iPhone's UDIDnpx expo run:ios --device # pick the device interactively
# or target a specific device by UDID:
npx expo run:ios --device <UDID>After the first build, subsequent runs only need Metro:
npx expo start --dev-clientFirst launch with a free Apple ID is blocked by iOS until you trust the profile: on the iPhone go to Settings → General → VPN & Device Management → Trust the Apple Development profile, then run the command again.
The JS bundle is embedded, so the app runs after unplugging the cable / shutting down the Mac:
npx expo run:ios --device <UDID> --configuration ReleaseFree Apple ID limitation: signed builds expire after 7 days. Rebuild & reinstall with the command above when the app stops opening.
app/
_layout.tsx # fonts + store init + splash + root Stack
(tabs)/
_layout.tsx # bottom tab bar + hidden journal/habits routes
index.tsx # → TodayScreen
tasks.tsx # → TasksScreen
health.tsx # → GymScreen (immersive workout; tab bar hidden)
finance.tsx # → FinanceScreen
more.tsx # hub → Journal / Habits
journal.tsx # → JournalScreen (hidden route)
habits.tsx # → HabitsScreen (hidden route)
src/
theme/ # colors, typography, icon mapping (shared tokens)
types/finance.ts # domain model + Zustand store contract
utils/ # currency (VND) + date/month helpers
db/ data/seed.ts # SQLite schema/helpers + Finance first-run data
store/ # one Zustand store per module
features/ # today / tasks / journal / habits / gym / finance
design/ # imported Claude Design reference
| Tab | Screen | Design |
|---|---|---|
| Today | index → TodayScreen |
01 Today |
| Tasks | tasks → TasksScreen |
02 Tasks |
| Health | health → GymScreen (immersive) |
05 Gym Tracker |
| Finance | finance → FinanceScreen |
06 Finance |
| More | hub → Journal / Habits | — |
| (hidden) | journal, habits |
03 / 04 |
Implemented: quick transactions, custom categories, monthly budget with usage
bar, monthly overview (income / spent / saved), and category breakdown donut.
Data persists to SQLite and is multi-user-ready (every row carries an optional
userId). Recurring transactions and CSV export are modeled in the schema for a
follow-up.