# udbhav-44/bahikhata architecture

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

- Interactive diagram: https://gitdiagram.com/udbhav-44/bahikhata
- Repository: https://github.com/udbhav-44/bahikhata

## Overview

BahiKhata is an offline-first Android household expense ledger. The main workflow is entering a regular or catalog-priced grocery expense, saving it locally, then reviewing totals and transactions on the dashboard or in reports. Other major capabilities include editable categories and product catalog, monthly budgets, item-spending analysis, export/backup, reminders, preferences, and a quick-add widget. The graph combines README-documented capabilities with sampled entry-point, repository, storage, export, reminder, and widget code; unsampled screen-to-view-model wiring is shown only where the product structure supports it.

Main entry points: [`app/src/main/java/com/bahikhata/app/data/LedgerRepository.kt`](https://github.com/udbhav-44/bahikhata/blob/master/app/src/main/java/com/bahikhata/app/data/LedgerRepository.kt) (Ledger repository), [`app/src/main/java/com/bahikhata/app/ui/navigation/BahiKhataApp.kt`](https://github.com/udbhav-44/bahikhata/blob/master/app/src/main/java/com/bahikhata/app/ui/navigation/BahiKhataApp.kt) (App navigation), [`app/src/main/java/com/bahikhata/app/MainActivity.kt`](https://github.com/udbhav-44/bahikhata/blob/master/app/src/main/java/com/bahikhata/app/MainActivity.kt) (Main activity), [`app/src/main/java/com/bahikhata/app/di/AppContainer.kt`](https://github.com/udbhav-44/bahikhata/blob/master/app/src/main/java/com/bahikhata/app/di/AppContainer.kt) (Dependency container)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_app["Application shell"]
  node_activity["Main activity<br/>[MainActivity.kt]"]
  node_navigation["App navigation<br/>[BahiKhataApp.kt]"]
  node_container["Dependency container<br/>[AppContainer.kt]"]
end

subgraph group_entry["Expense entry"]
  node_entryscreen["Expense form"]
  node_entryvm["Expense state"]
  node_catalog["Grocery catalog<br/>[CatalogScreen.kt]"]
  node_catalogvm["Catalog state"]
  node_categories["Expense categories"]
  node_catvm["Category state"]
end

subgraph group_insights["Ledger and insights"]
  node_home["Home dashboard<br/>[HomeScreen.kt]"]
  node_homevm["Home state<br/>[HomeViewModel.kt]"]
  node_transactions["Transactions"]
  node_txvm["Transaction state"]
  node_budget["Monthly budgets<br/>[BudgetScreen.kt]"]
  node_budgetvm["Budget state<br/>[BudgetViewModel.kt]"]
  node_reports["Spending reports<br/>[ReportsScreen.kt]"]
  node_reportvm["Report state"]
  node_itemspending["Item spending"]
  node_itemvm["Item spending state"]
end

subgraph group_state["Local state"]
  node_repository["Ledger repository"]
  node_database[("Room database<br/>[AppDatabase.kt]")]
  node_daos["Ledger DAOs"]
  node_preferences[("Preferences store")]
end

subgraph group_extras["Conveniences"]
  node_export["Export and backup<br/>[ExportManager.kt]"]
  node_more["More and settings<br/>[MoreScreen.kt]"]
  node_settings["Settings<br/>[SettingsScreen.kt]"]
  node_settingsvm["Settings state"]
  node_widget["Quick-add widget"]
  node_reminders["Reminder worker<br/>[ReminderWorker.kt]"]
end

node_user(("Household user"))
node_notification["Android notifications"]
node_file["User-selected file"]

node_user -->|"opens"| node_activity
node_activity -->|"hosts"| node_navigation
node_activity -->|"gets services"| node_container
node_navigation -->|"shows"| node_home
node_navigation -->|"routes to"| node_entryscreen
node_navigation -->|"routes to"| node_transactions
node_navigation -->|"routes to"| node_catalog
node_navigation -->|"routes to"| node_categories
node_navigation -->|"routes to"| node_budget
node_navigation -->|"routes to"| node_reports
node_home -->|"collects state"| node_homevm
node_entryscreen -->|"submits form"| node_entryvm
node_catalog -->|"edits catalog"| node_catalogvm
node_transactions -->|"requests history"| node_txvm
node_categories -->|"edits categories"| node_catvm
node_budget -->|"edits limits"| node_budgetvm
node_reports -->|"requests reports"| node_reportvm
node_itemspending -->|"requests details"| node_itemvm
node_homevm -->|"observes ledger"| node_repository
node_entryvm -->|"saves expense"| node_repository
node_catalogvm -->|"manages catalog"| node_repository
node_txvm -->|"queries entries"| node_repository
node_catvm -->|"manages categories"| node_repository
node_budgetvm -->|"queries budgets"| node_repository
node_reportvm -->|"queries totals"| node_repository
node_itemvm -->|"queries item spend"| node_repository
node_container -->|"creates"| node_database
node_container -->|"provides"| node_repository
node_container -->|"provides"| node_preferences
node_repository -->|"queries and writes"| node_daos
node_daos -->|"accesses"| node_database
node_more -->|"opens"| node_settings
node_settings -->|"updates options"| node_settingsvm
node_settingsvm -->|"reads and writes"| node_preferences
node_activity -->|"observes theme"| node_preferences
node_more -->|"starts export"| node_export
node_export -->|"loads ledger data"| node_repository
node_export -->|"writes output"| node_file
node_widget -->|"reads widget config"| node_preferences
node_widget -->|"adds grocery entry"| node_repository
node_reminders -->|"posts reminder"| node_notification
node_user -->|"uses"| node_widget
node_user -->|"opens tools"| node_more

click node_activity "https://github.com/udbhav-44/bahikhata/blob/master/app/src/main/java/com/bahikhata/app/MainActivity.kt"
click node_navigation "https://github.com/udbhav-44/bahikhata/blob/master/app/src/main/java/com/bahikhata/app/ui/navigation/BahiKhataApp.kt"
click node_container "https://github.com/udbhav-44/bahikhata/blob/master/app/src/main/java/com/bahikhata/app/di/AppContainer.kt"
click node_home "https://github.com/udbhav-44/bahikhata/blob/master/app/src/main/java/com/bahikhata/app/ui/home/HomeScreen.kt"
click node_homevm "https://github.com/udbhav-44/bahikhata/blob/master/app/src/main/java/com/bahikhata/app/ui/home/HomeViewModel.kt"
click node_entryscreen "https://github.com/udbhav-44/bahikhata/blob/master/app/src/main/java/com/bahikhata/app/ui/addexpense/AddExpenseScreen.kt"
click node_entryvm "https://github.com/udbhav-44/bahikhata/blob/master/app/src/main/java/com/bahikhata/app/ui/addexpense/AddExpenseViewModel.kt"
click node_catalog "https://github.com/udbhav-44/bahikhata/blob/master/app/src/main/java/com/bahikhata/app/ui/catalog/CatalogScreen.kt"
click node_catalogvm "https://github.com/udbhav-44/bahikhata/blob/master/app/src/main/java/com/bahikhata/app/ui/catalog/CatalogViewModel.kt"
click node_transactions "https://github.com/udbhav-44/bahikhata/blob/master/app/src/main/java/com/bahikhata/app/ui/transactions/TransactionsScreen.kt"
click node_txvm "https://github.com/udbhav-44/bahikhata/blob/master/app/src/main/java/com/bahikhata/app/ui/transactions/TransactionsViewModel.kt"
click node_categories "https://github.com/udbhav-44/bahikhata/blob/master/app/src/main/java/com/bahikhata/app/ui/categories/CategoriesScreen.kt"
click node_catvm "https://github.com/udbhav-44/bahikhata/blob/master/app/src/main/java/com/bahikhata/app/ui/categories/CategoriesViewModel.kt"
click node_budget "https://github.com/udbhav-44/bahikhata/blob/master/app/src/main/java/com/bahikhata/app/ui/budget/BudgetScreen.kt"
click node_budgetvm "https://github.com/udbhav-44/bahikhata/blob/master/app/src/main/java/com/bahikhata/app/ui/budget/BudgetViewModel.kt"
click node_reports "https://github.com/udbhav-44/bahikhata/blob/master/app/src/main/java/com/bahikhata/app/ui/reports/ReportsScreen.kt"
click node_reportvm "https://github.com/udbhav-44/bahikhata/blob/master/app/src/main/java/com/bahikhata/app/ui/reports/ReportsViewModel.kt"
click node_itemspending "https://github.com/udbhav-44/bahikhata/blob/master/app/src/main/java/com/bahikhata/app/ui/itemspending/ItemSpendingScreen.kt"
click node_itemvm "https://github.com/udbhav-44/bahikhata/blob/master/app/src/main/java/com/bahikhata/app/ui/itemspending/ItemSpendingViewModel.kt"
click node_repository "https://github.com/udbhav-44/bahikhata/blob/master/app/src/main/java/com/bahikhata/app/data/LedgerRepository.kt"
click node_database "https://github.com/udbhav-44/bahikhata/blob/master/app/src/main/java/com/bahikhata/app/data/AppDatabase.kt"
click node_daos "https://github.com/udbhav-44/bahikhata/tree/master/app/src/main/java/com/bahikhata/app/data/dao"
click node_preferences "https://github.com/udbhav-44/bahikhata/blob/master/app/src/main/java/com/bahikhata/app/data/PreferencesRepository.kt"
click node_export "https://github.com/udbhav-44/bahikhata/blob/master/app/src/main/java/com/bahikhata/app/data/backup/ExportManager.kt"
click node_more "https://github.com/udbhav-44/bahikhata/blob/master/app/src/main/java/com/bahikhata/app/ui/more/MoreScreen.kt"
click node_settings "https://github.com/udbhav-44/bahikhata/blob/master/app/src/main/java/com/bahikhata/app/ui/settings/SettingsScreen.kt"
click node_settingsvm "https://github.com/udbhav-44/bahikhata/blob/master/app/src/main/java/com/bahikhata/app/ui/settings/SettingsViewModel.kt"
click node_widget "https://github.com/udbhav-44/bahikhata/blob/master/app/src/main/java/com/bahikhata/app/widget/QuickAddWidgetProvider.kt"
click node_reminders "https://github.com/udbhav-44/bahikhata/blob/master/app/src/main/java/com/bahikhata/app/work/ReminderWorker.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_container,node_user,node_file toneBlue
class node_entryscreen,node_entryvm,node_catalog,node_catalogvm,node_categories,node_catvm toneAmber
class node_home,node_homevm,node_transactions,node_txvm,node_budget,node_budgetvm,node_reports,node_reportvm,node_itemspending,node_itemvm toneMint
class node_repository,node_database,node_daos,node_preferences toneRose
class node_export,node_more,node_settings,node_settingsvm,node_widget,node_reminders,node_notification toneIndigo
```

## Components

### Application shell

- [Main activity](https://github.com/udbhav-44/bahikhata/blob/master/app/src/main/java/com/bahikhata/app/MainActivity.kt): `app/src/main/java/com/bahikhata/app/MainActivity.kt`
- [App navigation](https://github.com/udbhav-44/bahikhata/blob/master/app/src/main/java/com/bahikhata/app/ui/navigation/BahiKhataApp.kt): `app/src/main/java/com/bahikhata/app/ui/navigation/BahiKhataApp.kt`
- [Dependency container](https://github.com/udbhav-44/bahikhata/blob/master/app/src/main/java/com/bahikhata/app/di/AppContainer.kt): `app/src/main/java/com/bahikhata/app/di/AppContainer.kt`

### Expense entry

- [Expense form](https://github.com/udbhav-44/bahikhata/blob/master/app/src/main/java/com/bahikhata/app/ui/addexpense/AddExpenseScreen.kt): `app/src/main/java/com/bahikhata/app/ui/addexpense/AddExpenseScreen.kt`
- [Expense state](https://github.com/udbhav-44/bahikhata/blob/master/app/src/main/java/com/bahikhata/app/ui/addexpense/AddExpenseViewModel.kt): `app/src/main/java/com/bahikhata/app/ui/addexpense/AddExpenseViewModel.kt`
- [Grocery catalog](https://github.com/udbhav-44/bahikhata/blob/master/app/src/main/java/com/bahikhata/app/ui/catalog/CatalogScreen.kt): `app/src/main/java/com/bahikhata/app/ui/catalog/CatalogScreen.kt`
- [Catalog state](https://github.com/udbhav-44/bahikhata/blob/master/app/src/main/java/com/bahikhata/app/ui/catalog/CatalogViewModel.kt): `app/src/main/java/com/bahikhata/app/ui/catalog/CatalogViewModel.kt`
- [Expense categories](https://github.com/udbhav-44/bahikhata/blob/master/app/src/main/java/com/bahikhata/app/ui/categories/CategoriesScreen.kt): `app/src/main/java/com/bahikhata/app/ui/categories/CategoriesScreen.kt`
- [Category state](https://github.com/udbhav-44/bahikhata/blob/master/app/src/main/java/com/bahikhata/app/ui/categories/CategoriesViewModel.kt): `app/src/main/java/com/bahikhata/app/ui/categories/CategoriesViewModel.kt`

### Ledger and insights

- [Home dashboard](https://github.com/udbhav-44/bahikhata/blob/master/app/src/main/java/com/bahikhata/app/ui/home/HomeScreen.kt): `app/src/main/java/com/bahikhata/app/ui/home/HomeScreen.kt`
- [Home state](https://github.com/udbhav-44/bahikhata/blob/master/app/src/main/java/com/bahikhata/app/ui/home/HomeViewModel.kt): `app/src/main/java/com/bahikhata/app/ui/home/HomeViewModel.kt`
- [Transactions](https://github.com/udbhav-44/bahikhata/blob/master/app/src/main/java/com/bahikhata/app/ui/transactions/TransactionsScreen.kt): `app/src/main/java/com/bahikhata/app/ui/transactions/TransactionsScreen.kt`
- [Transaction state](https://github.com/udbhav-44/bahikhata/blob/master/app/src/main/java/com/bahikhata/app/ui/transactions/TransactionsViewModel.kt): `app/src/main/java/com/bahikhata/app/ui/transactions/TransactionsViewModel.kt`
- [Monthly budgets](https://github.com/udbhav-44/bahikhata/blob/master/app/src/main/java/com/bahikhata/app/ui/budget/BudgetScreen.kt): `app/src/main/java/com/bahikhata/app/ui/budget/BudgetScreen.kt`
- [Budget state](https://github.com/udbhav-44/bahikhata/blob/master/app/src/main/java/com/bahikhata/app/ui/budget/BudgetViewModel.kt): `app/src/main/java/com/bahikhata/app/ui/budget/BudgetViewModel.kt`
- [Spending reports](https://github.com/udbhav-44/bahikhata/blob/master/app/src/main/java/com/bahikhata/app/ui/reports/ReportsScreen.kt): `app/src/main/java/com/bahikhata/app/ui/reports/ReportsScreen.kt`
- [Report state](https://github.com/udbhav-44/bahikhata/blob/master/app/src/main/java/com/bahikhata/app/ui/reports/ReportsViewModel.kt): `app/src/main/java/com/bahikhata/app/ui/reports/ReportsViewModel.kt`
- [Item spending](https://github.com/udbhav-44/bahikhata/blob/master/app/src/main/java/com/bahikhata/app/ui/itemspending/ItemSpendingScreen.kt): `app/src/main/java/com/bahikhata/app/ui/itemspending/ItemSpendingScreen.kt`
- [Item spending state](https://github.com/udbhav-44/bahikhata/blob/master/app/src/main/java/com/bahikhata/app/ui/itemspending/ItemSpendingViewModel.kt): `app/src/main/java/com/bahikhata/app/ui/itemspending/ItemSpendingViewModel.kt`

### Local state

- [Ledger repository](https://github.com/udbhav-44/bahikhata/blob/master/app/src/main/java/com/bahikhata/app/data/LedgerRepository.kt): `app/src/main/java/com/bahikhata/app/data/LedgerRepository.kt`
- [Room database](https://github.com/udbhav-44/bahikhata/blob/master/app/src/main/java/com/bahikhata/app/data/AppDatabase.kt): `app/src/main/java/com/bahikhata/app/data/AppDatabase.kt`
- [Ledger DAOs](https://github.com/udbhav-44/bahikhata/tree/master/app/src/main/java/com/bahikhata/app/data/dao): `app/src/main/java/com/bahikhata/app/data/dao`
- [Preferences store](https://github.com/udbhav-44/bahikhata/blob/master/app/src/main/java/com/bahikhata/app/data/PreferencesRepository.kt): `app/src/main/java/com/bahikhata/app/data/PreferencesRepository.kt`

### Conveniences

- [Export and backup](https://github.com/udbhav-44/bahikhata/blob/master/app/src/main/java/com/bahikhata/app/data/backup/ExportManager.kt): `app/src/main/java/com/bahikhata/app/data/backup/ExportManager.kt`
- [More and settings](https://github.com/udbhav-44/bahikhata/blob/master/app/src/main/java/com/bahikhata/app/ui/more/MoreScreen.kt): `app/src/main/java/com/bahikhata/app/ui/more/MoreScreen.kt`
- [Settings](https://github.com/udbhav-44/bahikhata/blob/master/app/src/main/java/com/bahikhata/app/ui/settings/SettingsScreen.kt): `app/src/main/java/com/bahikhata/app/ui/settings/SettingsScreen.kt`
- [Settings state](https://github.com/udbhav-44/bahikhata/blob/master/app/src/main/java/com/bahikhata/app/ui/settings/SettingsViewModel.kt): `app/src/main/java/com/bahikhata/app/ui/settings/SettingsViewModel.kt`
- [Quick-add widget](https://github.com/udbhav-44/bahikhata/blob/master/app/src/main/java/com/bahikhata/app/widget/QuickAddWidgetProvider.kt): `app/src/main/java/com/bahikhata/app/widget/QuickAddWidgetProvider.kt`
- [Reminder worker](https://github.com/udbhav-44/bahikhata/blob/master/app/src/main/java/com/bahikhata/app/work/ReminderWorker.kt): `app/src/main/java/com/bahikhata/app/work/ReminderWorker.kt`

### Other components

- **Household user**
- **Android notifications**
- **User-selected file**

## Connections

- Household user → Main activity: opens
- Main activity → App navigation: hosts
- Main activity → Dependency container: gets services
- App navigation → Home dashboard: shows
- App navigation → Expense form: routes to
- App navigation → Transactions: routes to
- App navigation → Grocery catalog: routes to
- App navigation → Expense categories: routes to
- App navigation → Monthly budgets: routes to
- App navigation → Spending reports: routes to
- Home dashboard → Home state: collects state
- Expense form → Expense state: submits form
- Grocery catalog → Catalog state: edits catalog
- Transactions → Transaction state: requests history
- Expense categories → Category state: edits categories
- Monthly budgets → Budget state: edits limits
- Spending reports → Report state: requests reports
- Item spending → Item spending state: requests details
- Home state → Ledger repository: observes ledger
- Expense state → Ledger repository: saves expense
- Catalog state → Ledger repository: manages catalog
- Transaction state → Ledger repository: queries entries
- Category state → Ledger repository: manages categories
- Budget state → Ledger repository: queries budgets
- Report state → Ledger repository: queries totals
- Item spending state → Ledger repository: queries item spend
- Dependency container → Room database: creates
- Dependency container → Ledger repository: provides
- Dependency container → Preferences store: provides
- Ledger repository → Ledger DAOs: queries and writes
- Ledger DAOs → Room database: accesses
- More and settings → Settings: opens
- Settings → Settings state: updates options
- Settings state → Preferences store: reads and writes
- Main activity → Preferences store: observes theme
- More and settings → Export and backup: starts export
- Export and backup → Ledger repository: loads ledger data
- Export and backup → User-selected file: writes output
- Quick-add widget → Preferences store: reads widget config
- Quick-add widget → Ledger repository: adds grocery entry
- Reminder worker → Android notifications: posts reminder
- Household user → Quick-add widget: uses
- Household user → More and settings: opens tools
