# shwan26/sabaib-android architecture

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

- Interactive diagram: https://gitdiagram.com/shwan26/sabaib-android
- Repository: https://github.com/shwan26/sabaib-android

## Overview

SabaiB is an Android receipt-based bill-splitting app. Users scan or enter a receipt, review its items and charges, invite participants by code or QR, coordinate item claims or an even split, then settle and track payments. BillViewModel is the central session layer connecting UI stages to persistence. The README provides no product details, so this map relies on the supplied source index and excerpts; unsampled capabilities and connections are shown conservatively.

Main entry points: [`app/src/main/java/com/smnc/sabaib/viewmodel/BillViewModel.kt`](https://github.com/shwan26/sabaib-android/blob/main/app/src/main/java/com/smnc/sabaib/viewmodel/BillViewModel.kt) (Bill session), [`app/src/main/java/com/smnc/sabaib/ui/scan/ScanScreen.kt`](https://github.com/shwan26/sabaib-android/blob/main/app/src/main/java/com/smnc/sabaib/ui/scan/ScanScreen.kt) (Receipt scanning), [`app/src/main/java/com/smnc/sabaib/ui/review/ReviewScreen.kt`](https://github.com/shwan26/sabaib-android/blob/main/app/src/main/java/com/smnc/sabaib/ui/review/ReviewScreen.kt) (Receipt review), [`app/src/main/java/com/smnc/sabaib/ui/join/JoinBillScreen.kt`](https://github.com/shwan26/sabaib-android/blob/main/app/src/main/java/com/smnc/sabaib/ui/join/JoinBillScreen.kt) (Join by code or QR)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_entry["App and accounts"]
  node_main["App entry<br/>[MainActivity.kt]"]
  node_navigation["Navigation<br/>[AppNavHost.kt]"]
  node_auth["Authentication<br/>[AuthRepository.kt]"]
  node_profile["Profile and plan"]
end

subgraph group_receipt["Receipt preparation"]
  node_scan["Receipt scanning<br/>[ScanScreen.kt]"]
  node_ocr["Receipt OCR"]
  node_parser["Receipt parsing<br/>[ReceiptParser.kt]"]
  node_review["Receipt review<br/>[ReviewScreen.kt]"]
  node_receipt_editor["Item editor"]
end

subgraph group_collaboration["Shared bill"]
  node_bill_session["Bill session<br/>[BillViewModel.kt]"]
  node_bill_model["Bill state<br/>[Bill.kt]"]
  node_join["Join by code or QR<br/>[JoinBillScreen.kt]"]
  node_groups["Groups and bills<br/>[GroupsViewModel.kt]"]
end

subgraph group_settlement["Split and settle"]
  node_split["Item splitting<br/>[SplitScreen.kt]"]
  node_charges["Charge calculation"]
  node_payments["Payment experience<br/>[PaymentScreen.kt]"]
end

subgraph group_services["Data services"]
  node_bill_storage["Bill persistence<br/>[BillRepository.kt]"]
  node_billing["Plans and billing"]
  node_supabase["Supabase backend"]
end

node_user(("Bill participants"))
node_database[("Supabase data store")]
node_gemini["Gemini service"]

node_user -->|"opens app"| node_main
node_main -->|"starts"| node_navigation
node_user -.->|"scans receipt"| node_scan
node_scan -->|"scans image"| node_ocr
node_scan -->|"fallback parses"| node_parser
node_scan -->|"updates items"| node_bill_session
node_user -.->|"edits receipt"| node_review
node_review -->|"renders items"| node_receipt_editor
node_review -->|"calculates charges"| node_charges
node_review -->|"updates bill"| node_bill_session
node_user -.->|"joins bill"| node_join
node_join -->|"adopts participant"| node_bill_session
node_join -->|"looks up bill"| node_bill_storage
node_join -->|"resolves user"| node_auth
node_bill_session -->|"loads and saves"| node_bill_storage
node_bill_session -->|"holds state"| node_bill_model
node_bill_storage -->|"reads and writes"| node_database
node_user -.->|"claims items"| node_split
node_split -->|"updates claims"| node_bill_session
node_user -.->|"settles share"| node_payments
node_payments -->|"reads bill state"| node_bill_session
node_profile -->|"checks session"| node_auth
node_profile -.->|"loads profile"| node_database
node_supabase -.->|"configures access"| node_database
node_user -.->|"browses bills"| node_groups
node_user -.->|"manages plan"| node_billing

click node_main "https://github.com/shwan26/sabaib-android/blob/main/app/src/main/java/com/smnc/sabaib/MainActivity.kt"
click node_navigation "https://github.com/shwan26/sabaib-android/blob/main/app/src/main/java/com/smnc/sabaib/navigation/AppNavHost.kt"
click node_auth "https://github.com/shwan26/sabaib-android/blob/main/app/src/main/java/com/smnc/sabaib/data/AuthRepository.kt"
click node_profile "https://github.com/shwan26/sabaib-android/blob/main/app/src/main/java/com/smnc/sabaib/ui/profile/ProfileViewModel.kt"
click node_scan "https://github.com/shwan26/sabaib-android/blob/main/app/src/main/java/com/smnc/sabaib/ui/scan/ScanScreen.kt"
click node_ocr "https://github.com/shwan26/sabaib-android/blob/main/app/src/main/java/com/smnc/sabaib/domain/scan/GeminiReceiptScanner.kt"
click node_parser "https://github.com/shwan26/sabaib-android/blob/main/app/src/main/java/com/smnc/sabaib/domain/scan/ReceiptParser.kt"
click node_review "https://github.com/shwan26/sabaib-android/blob/main/app/src/main/java/com/smnc/sabaib/ui/review/ReviewScreen.kt"
click node_receipt_editor "https://github.com/shwan26/sabaib-android/blob/main/app/src/main/java/com/smnc/sabaib/ui/review/EditableReceiptItem.kt"
click node_bill_session "https://github.com/shwan26/sabaib-android/blob/main/app/src/main/java/com/smnc/sabaib/viewmodel/BillViewModel.kt"
click node_bill_model "https://github.com/shwan26/sabaib-android/blob/main/app/src/main/java/com/smnc/sabaib/model/Bill.kt"
click node_bill_storage "https://github.com/shwan26/sabaib-android/blob/main/app/src/main/java/com/smnc/sabaib/data/BillRepository.kt"
click node_join "https://github.com/shwan26/sabaib-android/blob/main/app/src/main/java/com/smnc/sabaib/ui/join/JoinBillScreen.kt"
click node_groups "https://github.com/shwan26/sabaib-android/blob/main/app/src/main/java/com/smnc/sabaib/ui/groups/GroupsViewModel.kt"
click node_split "https://github.com/shwan26/sabaib-android/blob/main/app/src/main/java/com/smnc/sabaib/ui/split/SplitScreen.kt"
click node_charges "https://github.com/shwan26/sabaib-android/blob/main/app/src/main/java/com/smnc/sabaib/domain/charges/ChargeCalculator.kt"
click node_payments "https://github.com/shwan26/sabaib-android/blob/main/app/src/main/java/com/smnc/sabaib/ui/payment/PaymentScreen.kt"
click node_billing "https://github.com/shwan26/sabaib-android/blob/main/app/src/main/java/com/smnc/sabaib/data/BillingRepository.kt"
click node_supabase "https://github.com/shwan26/sabaib-android/blob/main/app/src/main/java/com/smnc/sabaib/data/SupabaseProvider.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_main,node_navigation,node_auth,node_profile toneBlue
class node_scan,node_ocr,node_parser,node_review,node_receipt_editor,node_database toneAmber
class node_bill_session,node_bill_model,node_join,node_groups toneMint
class node_split,node_charges,node_payments toneRose
class node_bill_storage,node_billing,node_supabase,node_user,node_gemini toneIndigo
```

## Components

### App and accounts

- [App entry](https://github.com/shwan26/sabaib-android/blob/main/app/src/main/java/com/smnc/sabaib/MainActivity.kt): `app/src/main/java/com/smnc/sabaib/MainActivity.kt`
- [Navigation](https://github.com/shwan26/sabaib-android/blob/main/app/src/main/java/com/smnc/sabaib/navigation/AppNavHost.kt): `app/src/main/java/com/smnc/sabaib/navigation/AppNavHost.kt`
- [Authentication](https://github.com/shwan26/sabaib-android/blob/main/app/src/main/java/com/smnc/sabaib/data/AuthRepository.kt): `app/src/main/java/com/smnc/sabaib/data/AuthRepository.kt`
- [Profile and plan](https://github.com/shwan26/sabaib-android/blob/main/app/src/main/java/com/smnc/sabaib/ui/profile/ProfileViewModel.kt): `app/src/main/java/com/smnc/sabaib/ui/profile/ProfileViewModel.kt`

### Receipt preparation

- [Receipt scanning](https://github.com/shwan26/sabaib-android/blob/main/app/src/main/java/com/smnc/sabaib/ui/scan/ScanScreen.kt): `app/src/main/java/com/smnc/sabaib/ui/scan/ScanScreen.kt`
- [Receipt OCR](https://github.com/shwan26/sabaib-android/blob/main/app/src/main/java/com/smnc/sabaib/domain/scan/GeminiReceiptScanner.kt): `app/src/main/java/com/smnc/sabaib/domain/scan/GeminiReceiptScanner.kt`
- [Receipt parsing](https://github.com/shwan26/sabaib-android/blob/main/app/src/main/java/com/smnc/sabaib/domain/scan/ReceiptParser.kt): `app/src/main/java/com/smnc/sabaib/domain/scan/ReceiptParser.kt`
- [Receipt review](https://github.com/shwan26/sabaib-android/blob/main/app/src/main/java/com/smnc/sabaib/ui/review/ReviewScreen.kt): `app/src/main/java/com/smnc/sabaib/ui/review/ReviewScreen.kt`
- [Item editor](https://github.com/shwan26/sabaib-android/blob/main/app/src/main/java/com/smnc/sabaib/ui/review/EditableReceiptItem.kt): `app/src/main/java/com/smnc/sabaib/ui/review/EditableReceiptItem.kt`

### Shared bill

- [Bill session](https://github.com/shwan26/sabaib-android/blob/main/app/src/main/java/com/smnc/sabaib/viewmodel/BillViewModel.kt): `app/src/main/java/com/smnc/sabaib/viewmodel/BillViewModel.kt`
- [Bill state](https://github.com/shwan26/sabaib-android/blob/main/app/src/main/java/com/smnc/sabaib/model/Bill.kt): `app/src/main/java/com/smnc/sabaib/model/Bill.kt`
- [Join by code or QR](https://github.com/shwan26/sabaib-android/blob/main/app/src/main/java/com/smnc/sabaib/ui/join/JoinBillScreen.kt): `app/src/main/java/com/smnc/sabaib/ui/join/JoinBillScreen.kt`
- [Groups and bills](https://github.com/shwan26/sabaib-android/blob/main/app/src/main/java/com/smnc/sabaib/ui/groups/GroupsViewModel.kt): `app/src/main/java/com/smnc/sabaib/ui/groups/GroupsViewModel.kt`

### Split and settle

- [Item splitting](https://github.com/shwan26/sabaib-android/blob/main/app/src/main/java/com/smnc/sabaib/ui/split/SplitScreen.kt): `app/src/main/java/com/smnc/sabaib/ui/split/SplitScreen.kt`
- [Charge calculation](https://github.com/shwan26/sabaib-android/blob/main/app/src/main/java/com/smnc/sabaib/domain/charges/ChargeCalculator.kt): `app/src/main/java/com/smnc/sabaib/domain/charges/ChargeCalculator.kt`
- [Payment experience](https://github.com/shwan26/sabaib-android/blob/main/app/src/main/java/com/smnc/sabaib/ui/payment/PaymentScreen.kt): `app/src/main/java/com/smnc/sabaib/ui/payment/PaymentScreen.kt`

### Data services

- [Bill persistence](https://github.com/shwan26/sabaib-android/blob/main/app/src/main/java/com/smnc/sabaib/data/BillRepository.kt): `app/src/main/java/com/smnc/sabaib/data/BillRepository.kt`
- [Plans and billing](https://github.com/shwan26/sabaib-android/blob/main/app/src/main/java/com/smnc/sabaib/data/BillingRepository.kt): `app/src/main/java/com/smnc/sabaib/data/BillingRepository.kt`
- [Supabase backend](https://github.com/shwan26/sabaib-android/blob/main/app/src/main/java/com/smnc/sabaib/data/SupabaseProvider.kt): `app/src/main/java/com/smnc/sabaib/data/SupabaseProvider.kt`

### Other components

- **Bill participants**
- **Supabase data store**
- **Gemini service**

## Connections

- Bill participants → App entry: opens app
- App entry → Navigation: starts (evidence: `app/src/main/java/com/smnc/sabaib/MainActivity.kt`)
- Bill participants → Receipt scanning: scans receipt
- Receipt scanning → Receipt OCR: scans image (evidence: `app/src/main/java/com/smnc/sabaib/ui/scan/ScanScreen.kt`)
- Receipt scanning → Receipt parsing: fallback parses (evidence: `app/src/main/java/com/smnc/sabaib/ui/scan/ScanScreen.kt`)
- Receipt scanning → Bill session: updates items (evidence: `app/src/main/java/com/smnc/sabaib/ui/scan/ScanScreen.kt`)
- Bill participants → Receipt review: edits receipt
- Receipt review → Item editor: renders items (evidence: `app/src/main/java/com/smnc/sabaib/ui/review/ReviewScreen.kt`)
- Receipt review → Charge calculation: calculates charges (evidence: `app/src/main/java/com/smnc/sabaib/ui/review/ReviewScreen.kt`)
- Receipt review → Bill session: updates bill (evidence: `app/src/main/java/com/smnc/sabaib/ui/review/ReviewScreen.kt`)
- Bill participants → Join by code or QR: joins bill
- Join by code or QR → Bill session: adopts participant (evidence: `app/src/main/java/com/smnc/sabaib/ui/join/JoinBillScreen.kt`)
- Join by code or QR → Bill persistence: looks up bill (evidence: `app/src/main/java/com/smnc/sabaib/ui/join/JoinBillScreen.kt`)
- Join by code or QR → Authentication: resolves user (evidence: `app/src/main/java/com/smnc/sabaib/ui/join/JoinBillScreen.kt`)
- Bill session → Bill persistence: loads and saves (evidence: `app/src/main/java/com/smnc/sabaib/viewmodel/BillViewModel.kt`)
- Bill session → Bill state: holds state (evidence: `app/src/main/java/com/smnc/sabaib/viewmodel/BillViewModel.kt`)
- Bill persistence → Supabase data store: reads and writes (evidence: `app/src/main/java/com/smnc/sabaib/data/BillRepository.kt`)
- Bill participants → Item splitting: claims items
- Item splitting → Bill session: updates claims (evidence: `app/src/main/java/com/smnc/sabaib/ui/split/SplitScreen.kt`)
- Bill participants → Payment experience: settles share
- Payment experience → Bill session: reads bill state
- Profile and plan → Authentication: checks session (evidence: `app/src/main/java/com/smnc/sabaib/ui/profile/ProfileViewModel.kt`)
- Profile and plan → Supabase data store: loads profile
- Supabase backend → Supabase data store: configures access
- Bill participants → Groups and bills: browses bills
- Bill participants → Plans and billing: manages plan
