Personal Finance Tracker
A private, offline-first mobile app to log, track, and analyse your daily expenses.
Built with Expo + React Native.
Features • Tech Stack • Getting Started • Development Build • Building with EAS • Project Structure • Privacy • License
- Expense logging — Quickly log transactions with name, amount, category, and currency via a bottom-sheet form.
- Dashboard — At-a-glance view of total expenses, average per day, spending streak, and recent activity.
- Transaction logs — Scrollable, grouped history with month headers and inline editing.
- Analytics — Daily, weekly, and monthly charts powered by
react-native-gifted-charts, plus category breakdowns and summary averages. - Categories — 8 seeded categories (with deterministic colour palette) plus custom user-created categories.
- Multi-currency — Preset currencies with a configurable default; symbols displayed throughout the UI.
- Streak tracking — Tracks consecutive days of logging to build habits.
- CSV import/export — Backup and restore your data via CSV files using
expo-document-pickerandexpo-sharing. - Multiple themes — 5 colour themes: light (space-summer), dark (space-dark-summer), space-red, alien-green, and space-cadet (see palettes).
- Offline-first — All data stored locally on-device with SQLite. No network required.
- Onboarding flow — Guided first-run experience with a walkthrough screens.
Krabby ships with 5 colour themes. Each theme defines a consistent set of semantic tokens mapped to HeroUI Native components.
| Token | Value |
|---|---|
| Background | #fffae6 |
| Foreground | #7b4019 |
| Surface | #ffbf78 |
| Accent | #ff7d29 |
| Accent fg | #ffffff |
| Muted | oklch mix #7b4019 / #fffae6 @ 55/45 |
| Field border | oklch mix #7b4019 28% transparent |
| Token | Value |
|---|---|
| Background | #251910 |
| Foreground | #fffae6 |
| Surface | oklch(28% 0.05 55) |
| Accent | #ff7d29 |
| Accent fg | #1a0f0a |
| Focus / Link | #ffbf78 |
| Token | Value |
|---|---|
| Background | #1a0505 |
| Foreground | #f6efd2 |
| Surface | oklch(18% 0.06 15) |
| Accent | #e24040 |
| Accent fg | #f6efd2 |
| Focus / Link | #e24040 |
| Token | Value |
|---|---|
| Background | #050e00 |
| Foreground | #ccffcc |
| Surface | #0d1a00 |
| Accent | #08cb00 |
| Accent fg | #000000 |
| Focus / Link | #08cb00 |
| Token | Value |
|---|---|
| Background | #0d1030 |
| Foreground | #e9e3df |
| Surface | oklch(18% 0.06 265) |
| Accent | #ff7a30 |
| Accent fg | #0d1030 |
| Focus / Link | #ff7a30 |
Source of truth:
app/heroui-theme.css— TypeScript mirror inconstants/heroui-theme.ts.
| Layer | Technology |
|---|---|
| Framework | Expo SDK 54 |
| UI | React Native 0.81, Reanimated 4, Gesture Handler 2, HeroUI Native |
| Styling | Uniwind (Tailwind v4 for RN), CSS-based theming |
| Navigation | Expo Router (file-based) |
| Database | SQLite via expo-sqlite + Drizzle ORM |
| Forms | react-hook-form + zod |
| Charts | react-native-gifted-charts |
| Fonts | JetBrains Mono (@expo-google-fonts/jetbrains-mono) |
| Storage | All data in local SQLite; images via expo-file-system (if applicable) |
| TypeScript | Strict mode, path aliases @/* → ./* |
npm installThe fastest feedback loop — no native toolchain required:
npm run webnpm run ios # iOS simulator (macOS only)
npm run android # Android emulator / connected deviceThese commands compile the native app, start Metro, and launch on the target device.
If you already have a development build installed:
npm startnpm run lintThis app uses native modules (e.g. expo-sqlite, react-native-gesture-handler, react-native-reanimated) that require a development build. Expo Go is sufficient for development on the web target but will not work for native device testing.
Local build (simulator, emulator, or connected device):
npm run ios # iOS
npm run android # AndroidEAS cloud build (physical devices without a local toolchain):
eas build --platform android --profile development
eas build --platform ios --profile developmentInstall the resulting build on your device, then connect to Metro with npx expo start --dev-client.
Build and distribute the app using EAS Build.
- EAS CLI:
npm install -g eas-cli - Log in to your Expo account:
eas login
| Profile | Type | Use case |
|---|---|---|
development |
Dev client | Debug builds with the dev menu |
preview |
Internal distribution | Share with testers via QR or link |
production |
App store release | Production binary for submission |
eas build --platform android --profile previewFor a development build:
eas build --platform android --profile developmentFor a production build:
eas build --platform android --profile productioneas build --platform ios --profile previewNote: iOS builds require an active Apple Developer account and are only available on macOS.
eas submit --platform android --profile production
eas submit --platform ios --profile productionFor all available options, see the EAS Build documentation.
krabby/
├── assets/ # App icons, splash screen, favicon
├── app/ # Expo Router file-based routes
│ ├── _layout.tsx # Root layout (fonts, DB, providers, theme)
│ ├── (tabs)/
│ │ ├── _layout.tsx # Tab navigator layout
│ │ ├── index.tsx # Dashboard / Home tab
│ │ ├── logs.tsx # Transaction logs tab
│ │ ├── analytics.tsx # Charts & analytics tab
│ │ └── settings.tsx # Settings tab
│ ├── categories.tsx # Category management
│ ├── currencies.tsx # Currency management
│ ├── modal.tsx # Reusable modal screen
│ └── global.css # Uniwind CSS entry point
├── components/ # Reusable UI components
│ ├── home/ # Dashboard-specific components
│ ├── onboarding/ # Onboarding flow screens
│ ├── settings/ # Settings panel components
│ └── ui/ # Generic UI primitives (Card, TagPill, etc.)
├── constants/ # Design tokens, fonts, theme, general config
├── contexts/ # React contexts (transactions, onboarding, theme, user-name)
├── db/
│ ├── schema.ts # Drizzle table & relation definitions
│ ├── db.ts # DB singleton (expo-sqlite)
│ ├── migrate-once.ts # One-time migration guard
│ └── seeders/ # Database seeding (categories, currencies)
├── drizzle/ # Drizzle Kit migration output
├── hooks/ # Custom hooks (fonts, color-scheme, theme, currencies)
├── lib/ # Library config (default font, etc.)
├── repository/ # Data access layer (raw DB queries)
├── schemas/ # Zod schemas for CRUD validation
├── services/ # Business logic / validation orchestration
├── types/ # Shared TypeScript types
├── utils/ # Utility functions (formatting, analytics, colours)
├── validation/ # Form-level Zod schemas (e.g. transaction form)
├── app.json # Expo configuration
├── eas.json # EAS Build profiles
├── drizzle.config.ts # Drizzle Kit config
├── metro.config.js # Metro bundler config
└── package.json
Krabby is built as an offline-first application.
- All financial data is stored exclusively on your device via SQLite.
- Nothing is ever sent to any server, API, or third party.
- No accounts, no telemetry, no tracking.