⚠️ Work in progress!
Spendwise is a personal finance app built with Expo and React Native. The app is local-first: core financial data lives in on-device SQLite and user preferences live in MMKV.
- Onboarding and profile/preferences setup
- Accounts, categories, and transactions
- Stats, insights, and trend views
- Budgets and savings goals
- CSV import flow
- Currency rates and formatting preferences
- Local notifications for finance reminders
- Optional app lock / biometric protection
- Optional AI assistant backed by user-provided API keys
- Expo SDK 54 with React Native 0.81
- Expo Router 6 for file-based navigation
- SQLite for primary app data
- Zustand + MMKV for persisted preferences and lightweight app state
- React Query for async queries/mutations over local data and network tasks
- TanStack Form + Zod for forms and validation
- Uniwind for styling
- Jest + React Native Testing Library + Maestro
- Node.js 20+
pnpm- Expo / EAS tooling as needed for device builds
pnpm installCopy .env.example to .env and adjust values for your machine.
cp .env.example .envOn Windows PowerShell, use:
Copy-Item .env.example .envAt minimum, the current env schema expects:
EXPO_PUBLIC_APP_ENVEXPO_PUBLIC_API_URLEXPO_PUBLIC_VAR_NUMBEREXPO_PUBLIC_VAR_BOOLAPP_BUILD_ONLY_VAR(optional)
If EXPO_PUBLIC_ASSOCIATED_DOMAIN is not used, omit it entirely instead of leaving it blank.
EXPO_PUBLIC_NAME, EXPO_PUBLIC_SCHEME, EXPO_PUBLIC_BUNDLE_ID, EXPO_PUBLIC_PACKAGE, and EXPO_PUBLIC_VERSION are derived in env.ts.
pnpm start
pnpm ios
pnpm android
pnpm webpnpm lint
pnpm lint:ts
pnpm lint:all
pnpm test
pnpm test:watch
pnpm test:ci
pnpm verify
pnpm install-maestro
pnpm e2e-test
pnpm doctor
pnpm knippnpm e2e-test currently targets the development app id and assumes Maestro is installed.
pnpm install-maestro uses a shell installer and may need a Bash-compatible environment.
development: local dev and internal development buildspreview: pre-release QA / preview buildsproduction: store-ready production builds
Helpers:
pnpm start:preview
pnpm start:production
pnpm ios:preview
pnpm ios:production
pnpm android:preview
pnpm android:productionsrc/app: Expo Router entry points and route filessrc/features: feature-first modules such as accounts, transactions, stats, insights, budgets, goals, imports, settings, notifications, and securitysrc/components: shared app components and UI primitivessrc/lib: infrastructure for SQLite, storage, theming, i18n, utilities, and app-wide providerssrc/translations: translation resources
App startup happens in src/app/_layout.tsx, where the app initializes SQLite, runs migrations, sets up notifications, checks budget/upcoming-bill alerts, and mounts global providers.
- Financial records are stored locally in SQLite on the device.
- Preferences and lightweight persisted state are stored in MMKV.
- AI provider keys are configured in-app and stored locally in persisted state.
- AI requests are sent directly from the client to the selected provider.
.docs/setup.md.docs/architecture.md.docs/features.md.docs/testing.md.docs/release.mdAGENTS.md
This Project is based on Obytes starter
High-level roadmap (subject to change):
- Improve currency support (rates + consistent formatting, including default currency)
- Support global budgets and per-category budgets (monthly and yearly)
- Allow making existing transactions repeatable (recurring rules)
- Recommendations and chat
- Insights
- Improve overall UI/UX across the app
- Clear feedback for actions (toasts, errors, confirmations, etc.)
- Add richer transaction details (e.g. merchant)
- Expand test coverage (including Android)
- Prepare and publish store app releases
