# abdulazeem-10/expenseai architecture

> Architecture diagram of the GitHub repository abdulazeem-10/expenseai, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-11-15). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/abdulazeem-10/expenseai
- Repository: https://github.com/abdulazeem-10/expenseai

## Overview

ExpenseAi is a mobile personal-finance app whose main workflow takes a user from authentication and onboarding to recording income or expenses, then viewing balances, budgets, and spending patterns. Finance hooks fetch and mutate data through Supabase-backed services, while the app also supports AI-assisted receipt, voice, and chat flows. Separate scheduled Edge Functions send budget alerts and weekly recaps. The graph combines sampled source references with README-documented capabilities; unsampled screen and AI wiring is not inferred beyond those documented links.

Main entry points: [`hooks/useFinanceData.ts`](https://github.com/abdulazeem-10/expenseai/blob/main/hooks/useFinanceData.ts) (Finance queries), [`lib/services/transactions.ts`](https://github.com/abdulazeem-10/expenseai/blob/main/lib/services/transactions.ts) (Transaction service), [`hooks/mutations/useTransactionMutations.ts`](https://github.com/abdulazeem-10/expenseai/blob/main/hooks/mutations/useTransactionMutations.ts) (Finance mutations), [`supabase/functions/check-budget-alerts/index.ts`](https://github.com/abdulazeem-10/expenseai/blob/main/supabase/functions/check-budget-alerts/index.ts) (Budget alerts)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_mobile["Mobile app"]
  node_app["Expo app<br/>[_layout.tsx]"]
  node_auth["Sign-in and sign-up<br/>[sign-in.tsx]"]
  node_authschema["Auth validation<br/>[auth.ts]"]
  node_onboarding["Onboarding<br/>[onboarding.tsx]"]
  node_sync["User sync<br/>[useUserSync.ts]"]
  node_dashboard["Dashboard<br/>[index.tsx]"]
  node_transactionsui["Transactions<br/>[transactions.tsx]"]
  node_entry["Transaction entry"]
  node_profile["Profile and accounts<br/>[profile.tsx]"]
  node_preferences["User preferences<br/>[userStore.ts]"]
end

subgraph group_finance["Finance data"]
  node_financehooks["Finance queries<br/>[useFinanceData.ts]"]
  node_mutations["Finance mutations"]
  node_querykeys["Query keys<br/>[keys.ts]"]
  node_accounts["Account service<br/>[accounts.ts]"]
  node_budgets["Budget service<br/>[budgets.ts]"]
  node_transactions["Transaction service<br/>[transactions.ts]"]
  node_categories["Categories and types<br/>[categories.ts]"]
  node_supabaseclient["Authenticated client<br/>[useSupabase.ts]"]
  node_database[("Supabase Postgres")]
end

subgraph group_ai["AI features"]
  node_assistantui["AI assistant<br/>[assistant.tsx]"]
  node_capture["Receipt and voice capture"]
  node_extraction["Transaction extraction"]
  node_gemini{{"Gemini API"}}
end

subgraph group_jobs["Scheduled email jobs"]
  node_cron(("Scheduled trigger"))
  node_budgetjob["Budget alerts<br/>[index.ts]"]
  node_tipsjob["Weekly tips<br/>[index.ts]"]
  node_admin["Admin data client<br/>[supabaseAdmin.ts]"]
  node_email["Email rendering and send<br/>[resend.ts]"]
end

node_user(("User"))
node_resend{{"Resend API"}}
node_inbox(("User inbox"))

node_user -->|"uses"| node_app
node_app -->|"routes to"| node_auth
node_auth -->|"validates with"| node_authschema
node_user -->|"sets preferences"| node_onboarding
node_onboarding -->|"uses"| node_supabaseclient
node_sync -->|"uses"| node_supabaseclient
node_sync -->|"updates"| node_preferences
node_dashboard -->|"loads finance data"| node_financehooks
node_transactionsui -->|"loads transactions"| node_financehooks
node_entry -->|"records transactions"| node_mutations
node_profile -->|"manages accounts"| node_accounts
node_financehooks -->|"reads"| node_accounts
node_financehooks -->|"reads"| node_budgets
node_financehooks -->|"reads"| node_transactions
node_mutations -->|"writes"| node_transactions
node_mutations -->|"invalidates"| node_querykeys
node_accounts -->|"reads and writes"| node_database
node_budgets -->|"reads and writes"| node_database
node_transactions -->|"reads and writes"| node_database
node_transactions -->|"uses types"| node_categories
node_financehooks -->|"uses"| node_supabaseclient
node_capture -.->|"submits capture"| node_extraction
node_extraction -->|"extracts with"| node_gemini
node_assistantui -->|"asks finance questions"| node_gemini
node_cron -->|"invokes"| node_budgetjob
node_cron -->|"invokes"| node_tipsjob
node_budgetjob -->|"queries data"| node_admin
node_tipsjob -->|"queries data"| node_admin
node_budgetjob -->|"sends alert"| node_email
node_tipsjob -->|"sends recap"| node_email
node_email -->|"sends email"| node_resend
node_resend -->|"delivers"| node_inbox

click node_app "https://github.com/abdulazeem-10/expenseai/blob/main/app/_layout.tsx"
click node_auth "https://github.com/abdulazeem-10/expenseai/blob/main/app/(auth)/sign-in.tsx"
click node_authschema "https://github.com/abdulazeem-10/expenseai/blob/main/lib/schemas/auth.ts"
click node_onboarding "https://github.com/abdulazeem-10/expenseai/blob/main/app/(root)/onboarding.tsx"
click node_sync "https://github.com/abdulazeem-10/expenseai/blob/main/hooks/useUserSync.ts"
click node_dashboard "https://github.com/abdulazeem-10/expenseai/blob/main/app/(root)/(tabs)/index.tsx"
click node_transactionsui "https://github.com/abdulazeem-10/expenseai/blob/main/app/(root)/(tabs)/transactions.tsx"
click node_entry "https://github.com/abdulazeem-10/expenseai/blob/main/app/(root)/(tabs)/add-transaction.tsx"
click node_profile "https://github.com/abdulazeem-10/expenseai/blob/main/app/(root)/(tabs)/profile.tsx"
click node_preferences "https://github.com/abdulazeem-10/expenseai/blob/main/store/userStore.ts"
click node_financehooks "https://github.com/abdulazeem-10/expenseai/blob/main/hooks/useFinanceData.ts"
click node_mutations "https://github.com/abdulazeem-10/expenseai/blob/main/hooks/mutations/useTransactionMutations.ts"
click node_querykeys "https://github.com/abdulazeem-10/expenseai/blob/main/lib/query/keys.ts"
click node_accounts "https://github.com/abdulazeem-10/expenseai/blob/main/lib/services/accounts.ts"
click node_budgets "https://github.com/abdulazeem-10/expenseai/blob/main/lib/services/budgets.ts"
click node_transactions "https://github.com/abdulazeem-10/expenseai/blob/main/lib/services/transactions.ts"
click node_categories "https://github.com/abdulazeem-10/expenseai/blob/main/constants/categories.ts"
click node_supabaseclient "https://github.com/abdulazeem-10/expenseai/blob/main/hooks/useSupabase.ts"
click node_assistantui "https://github.com/abdulazeem-10/expenseai/blob/main/app/(root)/(tabs)/assistant.tsx"
click node_capture "https://github.com/abdulazeem-10/expenseai/blob/main/components/ReceiptScannerModal.tsx"
click node_extraction "https://github.com/abdulazeem-10/expenseai/blob/main/lib/services/extractTransaction.ts"
click node_budgetjob "https://github.com/abdulazeem-10/expenseai/blob/main/supabase/functions/check-budget-alerts/index.ts"
click node_tipsjob "https://github.com/abdulazeem-10/expenseai/blob/main/supabase/functions/weekly-tips/index.ts"
click node_admin "https://github.com/abdulazeem-10/expenseai/blob/main/supabase/functions/_shared/supabaseAdmin.ts"
click node_email "https://github.com/abdulazeem-10/expenseai/blob/main/supabase/functions/_shared/resend.ts"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_app,node_auth,node_authschema,node_onboarding,node_sync,node_dashboard,node_transactionsui,node_entry,node_profile,node_preferences,node_user,node_inbox toneBlue
class node_financehooks,node_mutations,node_querykeys,node_accounts,node_budgets,node_transactions,node_categories,node_supabaseclient,node_database toneAmber
class node_assistantui,node_capture,node_extraction,node_gemini,node_resend toneMint
class node_cron,node_budgetjob,node_tipsjob,node_admin,node_email toneRose
```

## Components

### Mobile app

- [Expo app](https://github.com/abdulazeem-10/expenseai/blob/main/app/_layout.tsx): `app/_layout.tsx`
- [Sign-in and sign-up](https://github.com/abdulazeem-10/expenseai/blob/main/app/(auth)/sign-in.tsx): `app/(auth)/sign-in.tsx`
- [Auth validation](https://github.com/abdulazeem-10/expenseai/blob/main/lib/schemas/auth.ts): `lib/schemas/auth.ts`
- [Onboarding](https://github.com/abdulazeem-10/expenseai/blob/main/app/(root)/onboarding.tsx): `app/(root)/onboarding.tsx`
- [User sync](https://github.com/abdulazeem-10/expenseai/blob/main/hooks/useUserSync.ts): `hooks/useUserSync.ts`
- [Dashboard](https://github.com/abdulazeem-10/expenseai/blob/main/app/(root)/(tabs)/index.tsx): `app/(root)/(tabs)/index.tsx`
- [Transactions](https://github.com/abdulazeem-10/expenseai/blob/main/app/(root)/(tabs)/transactions.tsx): `app/(root)/(tabs)/transactions.tsx`
- [Transaction entry](https://github.com/abdulazeem-10/expenseai/blob/main/app/(root)/(tabs)/add-transaction.tsx): `app/(root)/(tabs)/add-transaction.tsx`
- [Profile and accounts](https://github.com/abdulazeem-10/expenseai/blob/main/app/(root)/(tabs)/profile.tsx): `app/(root)/(tabs)/profile.tsx`
- [User preferences](https://github.com/abdulazeem-10/expenseai/blob/main/store/userStore.ts): `store/userStore.ts`

### Finance data

- [Finance queries](https://github.com/abdulazeem-10/expenseai/blob/main/hooks/useFinanceData.ts): `hooks/useFinanceData.ts`
- [Finance mutations](https://github.com/abdulazeem-10/expenseai/blob/main/hooks/mutations/useTransactionMutations.ts): `hooks/mutations/useTransactionMutations.ts`
- [Query keys](https://github.com/abdulazeem-10/expenseai/blob/main/lib/query/keys.ts): `lib/query/keys.ts`
- [Account service](https://github.com/abdulazeem-10/expenseai/blob/main/lib/services/accounts.ts): `lib/services/accounts.ts`
- [Budget service](https://github.com/abdulazeem-10/expenseai/blob/main/lib/services/budgets.ts): `lib/services/budgets.ts`
- [Transaction service](https://github.com/abdulazeem-10/expenseai/blob/main/lib/services/transactions.ts): `lib/services/transactions.ts`
- [Categories and types](https://github.com/abdulazeem-10/expenseai/blob/main/constants/categories.ts): `constants/categories.ts`
- [Authenticated client](https://github.com/abdulazeem-10/expenseai/blob/main/hooks/useSupabase.ts): `hooks/useSupabase.ts`
- **Supabase Postgres**

### AI features

- [AI assistant](https://github.com/abdulazeem-10/expenseai/blob/main/app/(root)/(tabs)/assistant.tsx): `app/(root)/(tabs)/assistant.tsx`
- [Receipt and voice capture](https://github.com/abdulazeem-10/expenseai/blob/main/components/ReceiptScannerModal.tsx): `components/ReceiptScannerModal.tsx`
- [Transaction extraction](https://github.com/abdulazeem-10/expenseai/blob/main/lib/services/extractTransaction.ts): `lib/services/extractTransaction.ts`
- **Gemini API**

### Scheduled email jobs

- **Scheduled trigger**
- [Budget alerts](https://github.com/abdulazeem-10/expenseai/blob/main/supabase/functions/check-budget-alerts/index.ts): `supabase/functions/check-budget-alerts/index.ts`
- [Weekly tips](https://github.com/abdulazeem-10/expenseai/blob/main/supabase/functions/weekly-tips/index.ts): `supabase/functions/weekly-tips/index.ts`
- [Admin data client](https://github.com/abdulazeem-10/expenseai/blob/main/supabase/functions/_shared/supabaseAdmin.ts): `supabase/functions/_shared/supabaseAdmin.ts`
- [Email rendering and send](https://github.com/abdulazeem-10/expenseai/blob/main/supabase/functions/_shared/resend.ts): `supabase/functions/_shared/resend.ts`

### Other components

- **User**
- **Resend API**
- **User inbox**

## Connections

- User → Expo app: uses (evidence: `README.md`)
- Expo app → Sign-in and sign-up: routes to (evidence: `README.md`)
- Sign-in and sign-up → Auth validation: validates with (evidence: `app/(auth)/sign-in.tsx`)
- User → Onboarding: sets preferences (evidence: `README.md`)
- Onboarding → Authenticated client: uses (evidence: `app/(root)/onboarding.tsx`)
- User sync → Authenticated client: uses (evidence: `hooks/useUserSync.ts`)
- User sync → User preferences: updates (evidence: `hooks/useUserSync.ts`)
- Dashboard → Finance queries: loads finance data (evidence: `app/(root)/(tabs)/index.tsx`)
- Transactions → Finance queries: loads transactions (evidence: `README.md`)
- Transaction entry → Finance mutations: records transactions (evidence: `README.md`)
- Profile and accounts → Account service: manages accounts
- Finance queries → Account service: reads (evidence: `hooks/useFinanceData.ts`)
- Finance queries → Budget service: reads (evidence: `hooks/useFinanceData.ts`)
- Finance queries → Transaction service: reads (evidence: `hooks/useFinanceData.ts`)
- Finance mutations → Transaction service: writes (evidence: `hooks/mutations/useTransactionMutations.ts`)
- Finance mutations → Query keys: invalidates (evidence: `hooks/mutations/useTransactionMutations.ts`)
- Account service → Supabase Postgres: reads and writes (evidence: `README.md`)
- Budget service → Supabase Postgres: reads and writes (evidence: `README.md`)
- Transaction service → Supabase Postgres: reads and writes (evidence: `lib/services/transactions.ts`)
- Transaction service → Categories and types: uses types
- Finance queries → Authenticated client: uses (evidence: `hooks/useFinanceData.ts`)
- Receipt and voice capture → Transaction extraction: submits capture (evidence: `README.md`)
- Transaction extraction → Gemini API: extracts with (evidence: `README.md`)
- AI assistant → Gemini API: asks finance questions (evidence: `README.md`)
- Scheduled trigger → Budget alerts: invokes (evidence: `README.md`)
- Scheduled trigger → Weekly tips: invokes (evidence: `README.md`)
- Budget alerts → Admin data client: queries data (evidence: `supabase/functions/check-budget-alerts/index.ts`)
- Weekly tips → Admin data client: queries data (evidence: `supabase/functions/weekly-tips/index.ts`)
- Budget alerts → Email rendering and send: sends alert (evidence: `supabase/functions/check-budget-alerts/index.ts`)
- Weekly tips → Email rendering and send: sends recap (evidence: `supabase/functions/weekly-tips/index.ts`)
- Email rendering and send → Resend API: sends email (evidence: `README.md`)
- Resend API → User inbox: delivers (evidence: `README.md`)
