# kdevs-developer/spendly architecture

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

- Interactive diagram: https://gitdiagram.com/kdevs-developer/spendly
- Repository: https://github.com/kdevs-developer/spendly

## Overview

Spendly is an offline-first Android expense tracker with Firebase-backed accounts and data. A user signs in, enters the app’s money-management screens, and records or reviews transactions; reports, insights, exports, recurring items, bill reminders, and shared-expense/chat features extend that workflow. Navigation coordinates screens, while Repo centralizes cloud data access. The README documents the broader feature set; some screens and integrations are represented by their exact tree paths but were not sampled, so uncertain connections are omitted.

Main entry points: [`app/src/main/java/com/kdevs/spendly/data/Repo.kt`](https://github.com/kdevs-developer/spendly/blob/master/app/src/main/java/com/kdevs/spendly/data/Repo.kt) (Firebase repository), [`app/src/main/java/com/kdevs/spendly/nav/Nav.kt`](https://github.com/kdevs-developer/spendly/blob/master/app/src/main/java/com/kdevs/spendly/nav/Nav.kt) (Screen navigation), [`app/src/main/java/com/kdevs/spendly/ui/screens/chat/ConversationScreen.kt`](https://github.com/kdevs-developer/spendly/blob/master/app/src/main/java/com/kdevs/spendly/ui/screens/chat/ConversationScreen.kt) (Chat and friends), [`app/src/main/java/com/kdevs/spendly/MainActivity.kt`](https://github.com/kdevs-developer/spendly/blob/master/app/src/main/java/com/kdevs/spendly/MainActivity.kt) (Android activity)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_entry["App entry"]
  node_activity["Android activity<br/>[MainActivity.kt]"]
  node_navigation["Screen navigation<br/>[Nav.kt]"]
end

subgraph group_money["Money management"]
  node_home["Home and activity<br/>[HomeScreen.kt]"]
  node_transactions["Transactions<br/>[TxnFormScreen.kt]"]
  node_pickers["Filters and pickers<br/>[FilterScreen.kt]"]
  node_reports["Reports and insights<br/>[ReportsScreen.kt]"]
  node_money_planning["Budgets and goals"]
  node_recurring["Recurring and bills"]
end

subgraph group_social["Sharing and chat"]
  node_splits["Shared expenses<br/>[SplitsScreen.kt]"]
  node_chat["Chat and friends"]
end

subgraph group_data["Data and services"]
  node_repository[("Firebase repository<br/>[Repo.kt]")]
  node_insight_engine["Insight calculations<br/>[Insights.kt]"]
  node_worker["Recurring worker<br/>[RecurringWorker.kt]"]
  node_inbox["Message notifications<br/>[Inbox.kt]"]
  node_push_function["Push function<br/>[index.js]"]
  node_widget["Home-screen widget<br/>[SpendlyWidget.kt]"]
end

subgraph group_account["Account and utilities"]
  node_auth["Sign-in screens<br/>[AuthScreen.kt]"]
  node_export["Data export<br/>[ExportScreen.kt]"]
  node_settings["Settings and backup<br/>[SettingsScreen.kt]"]
  node_lock["Biometric lock<br/>[Lock.kt]"]
  node_preferences[("Device preferences<br/>[Prefs.kt]")]
end

node_person(("User"))
node_firebase[("Firebase services")]

node_person -->|"opens app"| node_activity
node_activity -->|"shows app"| node_navigation
node_navigation -->|"routes to"| node_auth
node_navigation -->|"routes to"| node_home
node_navigation -->|"routes to"| node_transactions
node_navigation -->|"routes to"| node_chat
node_navigation -->|"routes to"| node_splits
node_auth -->|"authenticates with"| node_repository
node_home -->|"reads data"| node_repository
node_transactions -->|"saves transactions"| node_repository
node_pickers -->|"loads options"| node_repository
node_reports -->|"reads data"| node_repository
node_reports -->|"uses calculations"| node_insight_engine
node_export -->|"gets transactions"| node_repository
node_export -->|"saves chosen file"| node_person
node_repository -->|"accesses services"| node_firebase
node_worker -->|"processes recurring"| node_repository
node_worker -->|"uses reminders"| node_inbox
node_settings -.->|"updates settings"| node_preferences
node_lock -->|"reads lock setting"| node_preferences
node_lock -.->|"prompts unlock"| node_activity
node_chat -->|"loads messages"| node_repository
node_chat -->|"updates inbox"| node_inbox
node_splits -->|"stores splits"| node_repository
node_push_function -.->|"sends pushes"| node_firebase

click node_activity "https://github.com/kdevs-developer/spendly/blob/master/app/src/main/java/com/kdevs/spendly/MainActivity.kt"
click node_navigation "https://github.com/kdevs-developer/spendly/blob/master/app/src/main/java/com/kdevs/spendly/nav/Nav.kt"
click node_auth "https://github.com/kdevs-developer/spendly/blob/master/app/src/main/java/com/kdevs/spendly/ui/screens/auth/AuthScreen.kt"
click node_home "https://github.com/kdevs-developer/spendly/blob/master/app/src/main/java/com/kdevs/spendly/ui/screens/home/HomeScreen.kt"
click node_transactions "https://github.com/kdevs-developer/spendly/blob/master/app/src/main/java/com/kdevs/spendly/ui/screens/money/TxnFormScreen.kt"
click node_pickers "https://github.com/kdevs-developer/spendly/blob/master/app/src/main/java/com/kdevs/spendly/ui/screens/pickers/FilterScreen.kt"
click node_reports "https://github.com/kdevs-developer/spendly/blob/master/app/src/main/java/com/kdevs/spendly/ui/screens/home/ReportsScreen.kt"
click node_money_planning "https://github.com/kdevs-developer/spendly/tree/master/app/src/main/java/com/kdevs/spendly/ui/screens/money"
click node_recurring "https://github.com/kdevs-developer/spendly/blob/master/app/src/main/java/com/kdevs/spendly/ui/screens/money/RecurringScreens.kt"
click node_splits "https://github.com/kdevs-developer/spendly/blob/master/app/src/main/java/com/kdevs/spendly/ui/screens/splits/SplitsScreen.kt"
click node_chat "https://github.com/kdevs-developer/spendly/blob/master/app/src/main/java/com/kdevs/spendly/ui/screens/chat/ConversationScreen.kt"
click node_export "https://github.com/kdevs-developer/spendly/blob/master/app/src/main/java/com/kdevs/spendly/ui/screens/export/ExportScreen.kt"
click node_settings "https://github.com/kdevs-developer/spendly/blob/master/app/src/main/java/com/kdevs/spendly/ui/screens/settings/SettingsScreen.kt"
click node_lock "https://github.com/kdevs-developer/spendly/blob/master/app/src/main/java/com/kdevs/spendly/ui/screens/settings/Lock.kt"
click node_repository "https://github.com/kdevs-developer/spendly/blob/master/app/src/main/java/com/kdevs/spendly/data/Repo.kt"
click node_insight_engine "https://github.com/kdevs-developer/spendly/blob/master/app/src/main/java/com/kdevs/spendly/data/Insights.kt"
click node_worker "https://github.com/kdevs-developer/spendly/blob/master/app/src/main/java/com/kdevs/spendly/data/RecurringWorker.kt"
click node_inbox "https://github.com/kdevs-developer/spendly/blob/master/app/src/main/java/com/kdevs/spendly/data/Inbox.kt"
click node_preferences "https://github.com/kdevs-developer/spendly/blob/master/app/src/main/java/com/kdevs/spendly/data/Prefs.kt"
click node_push_function "https://github.com/kdevs-developer/spendly/blob/master/functions/index.js"
click node_widget "https://github.com/kdevs-developer/spendly/blob/master/app/src/main/java/com/kdevs/spendly/data/SpendlyWidget.kt"

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_activity,node_navigation,node_person toneBlue
class node_home,node_transactions,node_pickers,node_reports,node_money_planning,node_recurring,node_firebase toneAmber
class node_splits,node_chat toneMint
class node_repository,node_insight_engine,node_worker,node_inbox,node_push_function,node_widget toneRose
class node_auth,node_export,node_settings,node_lock,node_preferences toneIndigo
```

## Components

### App entry

- [Android activity](https://github.com/kdevs-developer/spendly/blob/master/app/src/main/java/com/kdevs/spendly/MainActivity.kt): `app/src/main/java/com/kdevs/spendly/MainActivity.kt`
- [Screen navigation](https://github.com/kdevs-developer/spendly/blob/master/app/src/main/java/com/kdevs/spendly/nav/Nav.kt): `app/src/main/java/com/kdevs/spendly/nav/Nav.kt`

### Money management

- [Home and activity](https://github.com/kdevs-developer/spendly/blob/master/app/src/main/java/com/kdevs/spendly/ui/screens/home/HomeScreen.kt): `app/src/main/java/com/kdevs/spendly/ui/screens/home/HomeScreen.kt`
- [Transactions](https://github.com/kdevs-developer/spendly/blob/master/app/src/main/java/com/kdevs/spendly/ui/screens/money/TxnFormScreen.kt): `app/src/main/java/com/kdevs/spendly/ui/screens/money/TxnFormScreen.kt`
- [Filters and pickers](https://github.com/kdevs-developer/spendly/blob/master/app/src/main/java/com/kdevs/spendly/ui/screens/pickers/FilterScreen.kt): `app/src/main/java/com/kdevs/spendly/ui/screens/pickers/FilterScreen.kt`
- [Reports and insights](https://github.com/kdevs-developer/spendly/blob/master/app/src/main/java/com/kdevs/spendly/ui/screens/home/ReportsScreen.kt): `app/src/main/java/com/kdevs/spendly/ui/screens/home/ReportsScreen.kt`
- [Budgets and goals](https://github.com/kdevs-developer/spendly/tree/master/app/src/main/java/com/kdevs/spendly/ui/screens/money): `app/src/main/java/com/kdevs/spendly/ui/screens/money`
- [Recurring and bills](https://github.com/kdevs-developer/spendly/blob/master/app/src/main/java/com/kdevs/spendly/ui/screens/money/RecurringScreens.kt): `app/src/main/java/com/kdevs/spendly/ui/screens/money/RecurringScreens.kt`

### Sharing and chat

- [Shared expenses](https://github.com/kdevs-developer/spendly/blob/master/app/src/main/java/com/kdevs/spendly/ui/screens/splits/SplitsScreen.kt): `app/src/main/java/com/kdevs/spendly/ui/screens/splits/SplitsScreen.kt`
- [Chat and friends](https://github.com/kdevs-developer/spendly/blob/master/app/src/main/java/com/kdevs/spendly/ui/screens/chat/ConversationScreen.kt): `app/src/main/java/com/kdevs/spendly/ui/screens/chat/ConversationScreen.kt`

### Data and services

- [Firebase repository](https://github.com/kdevs-developer/spendly/blob/master/app/src/main/java/com/kdevs/spendly/data/Repo.kt): `app/src/main/java/com/kdevs/spendly/data/Repo.kt`
- [Insight calculations](https://github.com/kdevs-developer/spendly/blob/master/app/src/main/java/com/kdevs/spendly/data/Insights.kt): `app/src/main/java/com/kdevs/spendly/data/Insights.kt`
- [Recurring worker](https://github.com/kdevs-developer/spendly/blob/master/app/src/main/java/com/kdevs/spendly/data/RecurringWorker.kt): `app/src/main/java/com/kdevs/spendly/data/RecurringWorker.kt`
- [Message notifications](https://github.com/kdevs-developer/spendly/blob/master/app/src/main/java/com/kdevs/spendly/data/Inbox.kt): `app/src/main/java/com/kdevs/spendly/data/Inbox.kt`
- [Push function](https://github.com/kdevs-developer/spendly/blob/master/functions/index.js): `functions/index.js`
- [Home-screen widget](https://github.com/kdevs-developer/spendly/blob/master/app/src/main/java/com/kdevs/spendly/data/SpendlyWidget.kt): `app/src/main/java/com/kdevs/spendly/data/SpendlyWidget.kt`

### Account and utilities

- [Sign-in screens](https://github.com/kdevs-developer/spendly/blob/master/app/src/main/java/com/kdevs/spendly/ui/screens/auth/AuthScreen.kt): `app/src/main/java/com/kdevs/spendly/ui/screens/auth/AuthScreen.kt`
- [Data export](https://github.com/kdevs-developer/spendly/blob/master/app/src/main/java/com/kdevs/spendly/ui/screens/export/ExportScreen.kt): `app/src/main/java/com/kdevs/spendly/ui/screens/export/ExportScreen.kt`
- [Settings and backup](https://github.com/kdevs-developer/spendly/blob/master/app/src/main/java/com/kdevs/spendly/ui/screens/settings/SettingsScreen.kt): `app/src/main/java/com/kdevs/spendly/ui/screens/settings/SettingsScreen.kt`
- [Biometric lock](https://github.com/kdevs-developer/spendly/blob/master/app/src/main/java/com/kdevs/spendly/ui/screens/settings/Lock.kt): `app/src/main/java/com/kdevs/spendly/ui/screens/settings/Lock.kt`
- [Device preferences](https://github.com/kdevs-developer/spendly/blob/master/app/src/main/java/com/kdevs/spendly/data/Prefs.kt): `app/src/main/java/com/kdevs/spendly/data/Prefs.kt`

### Other components

- **User**
- **Firebase services**

## Connections

- User → Android activity: opens app (evidence: `README.md`)
- Android activity → Screen navigation: shows app (evidence: `app/src/main/java/com/kdevs/spendly/MainActivity.kt`)
- Screen navigation → Sign-in screens: routes to (evidence: `app/src/main/java/com/kdevs/spendly/nav/Nav.kt`)
- Screen navigation → Home and activity: routes to (evidence: `app/src/main/java/com/kdevs/spendly/nav/Nav.kt`)
- Screen navigation → Transactions: routes to (evidence: `app/src/main/java/com/kdevs/spendly/nav/Nav.kt`)
- Screen navigation → Chat and friends: routes to (evidence: `app/src/main/java/com/kdevs/spendly/nav/Nav.kt`)
- Screen navigation → Shared expenses: routes to (evidence: `app/src/main/java/com/kdevs/spendly/nav/Nav.kt`)
- Sign-in screens → Firebase repository: authenticates with (evidence: `app/src/main/java/com/kdevs/spendly/ui/screens/auth/AuthScreen.kt`)
- Home and activity → Firebase repository: reads data (evidence: `app/src/main/java/com/kdevs/spendly/ui/screens/home/HomeScreen.kt`)
- Transactions → Firebase repository: saves transactions (evidence: `app/src/main/java/com/kdevs/spendly/ui/screens/money/TxnFormScreen.kt`)
- Filters and pickers → Firebase repository: loads options (evidence: `app/src/main/java/com/kdevs/spendly/ui/screens/pickers/FilterScreen.kt`)
- Reports and insights → Firebase repository: reads data (evidence: `app/src/main/java/com/kdevs/spendly/ui/screens/home/ReportsScreen.kt`)
- Reports and insights → Insight calculations: uses calculations (evidence: `app/src/main/java/com/kdevs/spendly/ui/screens/home/ReportsScreen.kt`)
- Data export → Firebase repository: gets transactions (evidence: `app/src/main/java/com/kdevs/spendly/ui/screens/export/ExportScreen.kt`)
- Data export → User: saves chosen file (evidence: `app/src/main/java/com/kdevs/spendly/ui/screens/export/ExportScreen.kt`)
- Firebase repository → Firebase services: accesses services (evidence: `README.md`)
- Recurring worker → Firebase repository: processes recurring (evidence: `app/src/main/java/com/kdevs/spendly/data/RecurringWorker.kt`)
- Recurring worker → Message notifications: uses reminders (evidence: `app/src/main/java/com/kdevs/spendly/data/RecurringWorker.kt`)
- Settings and backup → Device preferences: updates settings (evidence: `app/src/main/java/com/kdevs/spendly/ui/screens/settings/SettingsScreen.kt`)
- Biometric lock → Device preferences: reads lock setting (evidence: `app/src/main/java/com/kdevs/spendly/ui/screens/settings/Lock.kt`)
- Biometric lock → Android activity: prompts unlock
- Chat and friends → Firebase repository: loads messages (evidence: `app/src/main/java/com/kdevs/spendly/ui/screens/chat/ConversationScreen.kt`)
- Chat and friends → Message notifications: updates inbox (evidence: `app/src/main/java/com/kdevs/spendly/ui/screens/chat/ConversationScreen.kt`)
- Shared expenses → Firebase repository: stores splits (evidence: `app/src/main/java/com/kdevs/spendly/ui/screens/splits/SplitsScreen.kt`)
- Push function → Firebase services: sends pushes
