How hamsathumar/ai-powered-expense-tracker works
Purpose and runtime
A local-first personal expense tracker for accounts, transactions, categories, people/shared expenses, recurring payments, reports, backup, and voice entry. It is an Expo/React Native TypeScript app, runnable on Android, iOS, web, and Expo Go. Primary startup/routing is Expo Router’s file-based route tree under src/app/, rooted at src/app/_layout.tsx.
Navigation and screen composition
The application shell establishes shared providers and navigation, while the tab layout is the primary user entry point. Main areas are dashboard, accounts, reports, and settings; stack routes cover create/detail/edit flows.
• src/app/_layout.tsx
• src/app/(tabs)/_layout.tsx
• src/app/(tabs)/index.tsx
• src/app/transaction/new.tsx
• src/app/account/[id].tsx
Persistence boundary
src/db/ is the persistence layer and should be the exclusive boundary between screens/services and stored financial data. Database initialization, migrations, seed data, and backup logic are separated from entity-specific query modules.
• src/db/client.ts
• src/db/migrations.ts
• src/db/queries/transactions.ts
• src/db/backup.ts
Financial domain logic
src/domain/ holds pure business rules and typed models, separate from React UI and database access. It covers money handling, transaction/account activity, recurring schedules, expense splitting, settlements, and backup-format validation—logic that must remain deterministic and reusable across screens and persistence operations.
• src/domain/types.ts
• src/domain/money.ts
• src/domain/billSplit.ts
• src/domain/recurring.ts
• src/domain/settlement.ts
Transaction and account workflows
Transaction creation/editing is composed from reusable financial input components and persists through transaction/account/category/people query boundaries. Account and category routes provide management/detail flows; account activity is calculated by domain logic rather than embedded in presentation.
• src/components/TransactionForm.tsx
• src/app/transaction/[id].tsx
• src/db/queries/accounts.ts
• src/db/queries/categories.ts
• src/db/queries/people.ts
Shared expenses, recurring items, and reporting
People, bill splitting, and settle-up form a shared-expense workflow. Recurring items have dedicated list, detail, edit, payment, display, and query layers. Reports obtain persisted aggregates through a distinct query module and render visual summaries such as donut charts.
• src/app/bill-split.tsx
• src/app/settle-up.tsx
• src/app/recurring/[id]/payments.tsx
• src/db/queries/recurring.ts
• src/db/queries/reports.ts
Voice AI, files, and app-wide presentation state
Voice capture routes through an AI boundary that builds prompts, calls Gemini, validates parsed output, and protects configuration; parsed results should feed normal transaction workflows rather than bypassing domain validation. Backup-file and profile-photo services isolate device/file operations. Theme and currency contexts provide app-wide display configuration, while pending-count state supports queued work indicators.
• src/app/voice.tsx
• src/ai/gemini.ts
• src/ai/parseVoice.ts
• src/ai/validate.ts
• src/services/backupFile.ts
• src/theme/CurrencyContext.tsx
Main entry points: money.ts Financial rules · client.ts Database lifecycle · _layout.tsx Main tabs · TransactionForm.tsx Transaction form
Components 19
App UI
Expo Router screens and shared composition.
- App shell · Establishes shared providers and navigation.
src/app/_layout.tsx - Main tabs · Primary dashboard, accounts, reports, and settings entry.
src/app/(tabs)/_layout.tsx - Dashboard
src/app/(tabs)/index.tsx - Transaction flows
src/app/transaction/new.tsx - Account detail
src/app/account/[id].tsx - Shared expenses
src/app/bill-split.tsx - Recurring payments
src/app/recurring/[id]/payments.tsx - Voice entry
src/app/voice.tsx - Currency display · App-wide currency presentation state.
src/theme/CurrencyContext.tsx
Domain & workflows
Deterministic financial rules and reusable input flow.
- Transaction form · Reusable financial input composition.
src/components/TransactionForm.tsx - Financial rules · Money, activity, recurring schedules, splits, and settlements.
src/domain/money.ts - Domain models
src/domain/types.ts
Persistence
Exclusive stored-financial-data boundary.
- Database lifecycle · Initializes, migrates, and seeds local storage.
src/db/client.ts - Transaction queries
src/db/queries/transactions.ts - Account queries · Also supports category and people persistence workflows.
src/db/queries/accounts.ts - Recurring queries
src/db/queries/recurring.ts - Report aggregates · Provides persisted aggregates for visual summaries.
src/db/queries/reports.ts
Device & AI
External AI and local file boundaries.
- Backup and files · Isolates backup-file and device file operations.
src/services/backupFile.ts - Voice parsing AI · Builds prompts, parses and validates voice-derived transactions.
src/ai/parseVoice.ts
Connections 23
- App shell → Main tabs: hosts
- App shell → Currency display: provides
- Main tabs → Dashboard: opens
- Main tabs → Account detail: navigates to
- Main tabs → Transaction flows: navigates to
- Transaction flows → Transaction form: composes
- Transaction form → Financial rules: applies rules
- Financial rules → Domain models: uses
- Transaction form → Transaction queries: persists through
- Account detail → Account queries: loads activity
- Account detail → Financial rules: calculates activity with
- Shared expenses → Financial rules: splits and settles with
- Shared expenses → Account queries: uses people data
- Recurring payments → Recurring queries: reads and records
- Recurring payments → Financial rules: evaluates schedules
- Dashboard → Report aggregates: reads summaries
- Voice entry → Voice parsing AI: submits capture
- Voice parsing AI → Transaction form: returns validated draft
- Transaction queries → Database lifecycle: uses
- Account queries → Database lifecycle: uses
- Recurring queries → Database lifecycle: uses
- Report aggregates → Database lifecycle: uses
- Backup and files → Database lifecycle: backs up and restores