# vishnuvardhangupthajavvaji/split-even architecture

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

- Interactive diagram: https://gitdiagram.com/vishnuvardhangupthajavvaji/split-even
- Repository: https://github.com/vishnuvardhangupthajavvaji/split-even

## Overview

SplitEven is a group-expense ledger: people create a group, add members, record expenses with configurable splits, inspect per-currency balances and optimized settlement transfers, then record payments. The React interface calls a Django REST API; expense splitting and balance/debt calculations are separate domain layers, while Django models persist the ledger. README also documents activity history, CSV export, and recurring-expense templates/scheduled generation. Some frontend and backend modules were not sampled, so those branches use documented capabilities and tree-supported paths; no scheduler is shown as deployed.

Main entry points: [`backend/ledger/views.py`](https://github.com/vishnuvardhangupthajavvaji/split-even/blob/main/backend/ledger/views.py) (API operations), [`frontend/src/api.js`](https://github.com/vishnuvardhangupthajavvaji/split-even/blob/main/frontend/src/api.js) (HTTP API client), [`frontend/src/pages/GroupPage.jsx`](https://github.com/vishnuvardhangupthajavvaji/split-even/blob/main/frontend/src/pages/GroupPage.jsx) (Group workspace), [`backend/config/settings.py`](https://github.com/vishnuvardhangupthajavvaji/split-even/blob/main/backend/config/settings.py) (Ledger database)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_frontend["React interface"]
  node_browser["Browser app<br/>[main.jsx]"]
  node_routes["Page routing<br/>[App.jsx]"]
  node_groups_page["Groups home<br/>[GroupsHome.jsx]"]
  node_group_page["Group workspace<br/>[GroupPage.jsx]"]
  node_expense_form["Expense entry<br/>[ExpenseForm.jsx]"]
  node_balances_ui["Balances &amp; settle<br/>[BalancesTab.jsx]"]
  node_activity_ui["Activity feed<br/>[ActivityFeed.jsx]"]
  node_api_client["HTTP API client<br/>[api.js]"]
end

subgraph group_api["REST API"]
  node_url_routes["API routing<br/>[urls.py]"]
  node_views["API operations<br/>[views.py]"]
  node_serializers["Request serialization<br/>[serializers.py]"]
end

subgraph group_ledger["Ledger domain"]
  node_groups_members["Groups &amp; members<br/>[models.py]"]
  node_expenses["Expenses &amp; splits<br/>[models.py]"]
  node_settlements["Payments<br/>[models.py]"]
  node_recurring["Recurring templates<br/>[models.py]"]
  node_activity_log["Activity history<br/>[models.py]"]
  node_database[("Ledger database<br/>[settings.py]")]
end

subgraph group_support["Ledger services"]
  node_split_math["Split calculation<br/>[splitting.py]"]
  node_balance_math["Balance &amp; simplification<br/>[balances.py]"]
  node_activity_service["Activity logging<br/>[utils.py]"]
  node_csv_export["Ledger CSV export<br/>[views.py]"]
  node_recurring_runner["Due expense generation"]
end

node_person(("Group participant"))

node_person -->|"uses"| node_browser
node_browser -->|"renders"| node_routes
node_routes -->|"routes"| node_groups_page
node_routes -->|"routes"| node_group_page
node_group_page -->|"renders"| node_expense_form
node_group_page -->|"renders"| node_balances_ui
node_group_page -->|"renders"| node_activity_ui
node_groups_page -->|"requests groups"| node_api_client
node_group_page -->|"loads group ledger"| node_api_client
node_expense_form -->|"creates or edits"| node_api_client
node_balances_ui -->|"loads balances; records payment"| node_api_client
node_activity_ui -->|"loads activity"| node_api_client
node_api_client -->|"HTTP requests"| node_url_routes
node_url_routes -->|"dispatches"| node_views
node_views -->|"validates and formats"| node_serializers
node_views -->|"reads and writes"| node_groups_members
node_views -->|"reads and writes"| node_expenses
node_views -->|"reads and writes"| node_settlements
node_views -->|"reads and writes"| node_recurring
node_views -->|"reads"| node_activity_log
node_views -->|"computes expense splits"| node_split_math
node_views -->|"computes balances and transfers"| node_balance_math
node_views -->|"logs events"| node_activity_service
node_views -->|"serves CSV"| node_csv_export
node_csv_export -->|"reads ledger"| node_expenses
node_csv_export -->|"reads payments"| node_settlements
node_activity_service -->|"writes events"| node_activity_log
node_recurring_runner -->|"reads due templates"| node_recurring
node_recurring_runner -->|"computes splits"| node_split_math
node_recurring_runner -->|"creates expenses and splits"| node_expenses
node_recurring_runner -->|"logs generated events"| node_activity_service
node_groups_members -->|"persists"| node_database
node_expenses -->|"persists"| node_database
node_settlements -->|"persists"| node_database
node_recurring -->|"persists"| node_database
node_activity_log -->|"persists"| node_database

click node_browser "https://github.com/vishnuvardhangupthajavvaji/split-even/blob/main/frontend/src/main.jsx"
click node_routes "https://github.com/vishnuvardhangupthajavvaji/split-even/blob/main/frontend/src/App.jsx"
click node_groups_page "https://github.com/vishnuvardhangupthajavvaji/split-even/blob/main/frontend/src/pages/GroupsHome.jsx"
click node_group_page "https://github.com/vishnuvardhangupthajavvaji/split-even/blob/main/frontend/src/pages/GroupPage.jsx"
click node_expense_form "https://github.com/vishnuvardhangupthajavvaji/split-even/blob/main/frontend/src/components/ExpenseForm.jsx"
click node_balances_ui "https://github.com/vishnuvardhangupthajavvaji/split-even/blob/main/frontend/src/components/BalancesTab.jsx"
click node_activity_ui "https://github.com/vishnuvardhangupthajavvaji/split-even/blob/main/frontend/src/components/ActivityFeed.jsx"
click node_api_client "https://github.com/vishnuvardhangupthajavvaji/split-even/blob/main/frontend/src/api.js"
click node_url_routes "https://github.com/vishnuvardhangupthajavvaji/split-even/blob/main/backend/ledger/urls.py"
click node_views "https://github.com/vishnuvardhangupthajavvaji/split-even/blob/main/backend/ledger/views.py"
click node_serializers "https://github.com/vishnuvardhangupthajavvaji/split-even/blob/main/backend/ledger/serializers.py"
click node_groups_members "https://github.com/vishnuvardhangupthajavvaji/split-even/blob/main/backend/ledger/models.py"
click node_expenses "https://github.com/vishnuvardhangupthajavvaji/split-even/blob/main/backend/ledger/models.py"
click node_settlements "https://github.com/vishnuvardhangupthajavvaji/split-even/blob/main/backend/ledger/models.py"
click node_recurring "https://github.com/vishnuvardhangupthajavvaji/split-even/blob/main/backend/ledger/models.py"
click node_activity_log "https://github.com/vishnuvardhangupthajavvaji/split-even/blob/main/backend/ledger/models.py"
click node_database "https://github.com/vishnuvardhangupthajavvaji/split-even/blob/main/backend/config/settings.py"
click node_split_math "https://github.com/vishnuvardhangupthajavvaji/split-even/blob/main/backend/ledger/splitting.py"
click node_balance_math "https://github.com/vishnuvardhangupthajavvaji/split-even/blob/main/backend/ledger/balances.py"
click node_activity_service "https://github.com/vishnuvardhangupthajavvaji/split-even/blob/main/backend/ledger/utils.py"
click node_csv_export "https://github.com/vishnuvardhangupthajavvaji/split-even/blob/main/backend/ledger/views.py"
click node_recurring_runner "https://github.com/vishnuvardhangupthajavvaji/split-even/blob/main/backend/ledger/management/commands/run_recurring_expenses.py"

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_browser,node_routes,node_groups_page,node_group_page,node_expense_form,node_balances_ui,node_activity_ui,node_api_client toneBlue
class node_url_routes,node_views,node_serializers toneAmber
class node_groups_members,node_expenses,node_settlements,node_recurring,node_activity_log,node_database toneMint
class node_split_math,node_balance_math,node_activity_service,node_csv_export,node_recurring_runner toneRose
class node_person toneIndigo
```

## Components

### React interface

- [Browser app](https://github.com/vishnuvardhangupthajavvaji/split-even/blob/main/frontend/src/main.jsx): `frontend/src/main.jsx`
- [Page routing](https://github.com/vishnuvardhangupthajavvaji/split-even/blob/main/frontend/src/App.jsx): `frontend/src/App.jsx`
- [Groups home](https://github.com/vishnuvardhangupthajavvaji/split-even/blob/main/frontend/src/pages/GroupsHome.jsx): `frontend/src/pages/GroupsHome.jsx`
- [Group workspace](https://github.com/vishnuvardhangupthajavvaji/split-even/blob/main/frontend/src/pages/GroupPage.jsx): `frontend/src/pages/GroupPage.jsx`
- [Expense entry](https://github.com/vishnuvardhangupthajavvaji/split-even/blob/main/frontend/src/components/ExpenseForm.jsx): `frontend/src/components/ExpenseForm.jsx`
- [Balances & settle](https://github.com/vishnuvardhangupthajavvaji/split-even/blob/main/frontend/src/components/BalancesTab.jsx): `frontend/src/components/BalancesTab.jsx`
- [Activity feed](https://github.com/vishnuvardhangupthajavvaji/split-even/blob/main/frontend/src/components/ActivityFeed.jsx): `frontend/src/components/ActivityFeed.jsx`
- [HTTP API client](https://github.com/vishnuvardhangupthajavvaji/split-even/blob/main/frontend/src/api.js): `frontend/src/api.js`

### REST API

- [API routing](https://github.com/vishnuvardhangupthajavvaji/split-even/blob/main/backend/ledger/urls.py): `backend/ledger/urls.py`
- [API operations](https://github.com/vishnuvardhangupthajavvaji/split-even/blob/main/backend/ledger/views.py): `backend/ledger/views.py`
- [Request serialization](https://github.com/vishnuvardhangupthajavvaji/split-even/blob/main/backend/ledger/serializers.py): `backend/ledger/serializers.py`

### Ledger domain

- [Groups & members](https://github.com/vishnuvardhangupthajavvaji/split-even/blob/main/backend/ledger/models.py): `backend/ledger/models.py`
- [Expenses & splits](https://github.com/vishnuvardhangupthajavvaji/split-even/blob/main/backend/ledger/models.py): `backend/ledger/models.py`
- [Payments](https://github.com/vishnuvardhangupthajavvaji/split-even/blob/main/backend/ledger/models.py): `backend/ledger/models.py`
- [Recurring templates](https://github.com/vishnuvardhangupthajavvaji/split-even/blob/main/backend/ledger/models.py): `backend/ledger/models.py`
- [Activity history](https://github.com/vishnuvardhangupthajavvaji/split-even/blob/main/backend/ledger/models.py): `backend/ledger/models.py`
- [Ledger database](https://github.com/vishnuvardhangupthajavvaji/split-even/blob/main/backend/config/settings.py): `backend/config/settings.py`

### Ledger services

- [Split calculation](https://github.com/vishnuvardhangupthajavvaji/split-even/blob/main/backend/ledger/splitting.py): `backend/ledger/splitting.py`
- [Balance & simplification](https://github.com/vishnuvardhangupthajavvaji/split-even/blob/main/backend/ledger/balances.py): `backend/ledger/balances.py`
- [Activity logging](https://github.com/vishnuvardhangupthajavvaji/split-even/blob/main/backend/ledger/utils.py): `backend/ledger/utils.py`
- [Ledger CSV export](https://github.com/vishnuvardhangupthajavvaji/split-even/blob/main/backend/ledger/views.py): `backend/ledger/views.py`
- [Due expense generation](https://github.com/vishnuvardhangupthajavvaji/split-even/blob/main/backend/ledger/management/commands/run_recurring_expenses.py): `backend/ledger/management/commands/run_recurring_expenses.py`

### Other components

- **Group participant**

## Connections

- Group participant → Browser app: uses
- Browser app → Page routing: renders
- Page routing → Groups home: routes
- Page routing → Group workspace: routes
- Group workspace → Expense entry: renders
- Group workspace → Balances & settle: renders
- Group workspace → Activity feed: renders
- Groups home → HTTP API client: requests groups
- Group workspace → HTTP API client: loads group ledger
- Expense entry → HTTP API client: creates or edits
- Balances & settle → HTTP API client: loads balances; records payment
- Activity feed → HTTP API client: loads activity
- HTTP API client → API routing: HTTP requests
- API routing → API operations: dispatches
- API operations → Request serialization: validates and formats
- API operations → Groups & members: reads and writes
- API operations → Expenses & splits: reads and writes
- API operations → Payments: reads and writes
- API operations → Recurring templates: reads and writes
- API operations → Activity history: reads
- API operations → Split calculation: computes expense splits
- API operations → Balance & simplification: computes balances and transfers
- API operations → Activity logging: logs events
- API operations → Ledger CSV export: serves CSV
- Ledger CSV export → Expenses & splits: reads ledger
- Ledger CSV export → Payments: reads payments
- Activity logging → Activity history: writes events
- Due expense generation → Recurring templates: reads due templates
- Due expense generation → Split calculation: computes splits
- Due expense generation → Expenses & splits: creates expenses and splits
- Due expense generation → Activity logging: logs generated events
- Groups & members → Ledger database: persists
- Expenses & splits → Ledger database: persists
- Payments → Ledger database: persists
- Recurring templates → Ledger database: persists
- Activity history → Ledger database: persists
