# alysibak/mizan architecture

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

- Interactive diagram: https://gitdiagram.com/alysibak/mizan
- Repository: https://github.com/alysibak/mizan

## Overview

Mizan is a personal zakat ledger and annual reckoning application: users configure their school, calendar, nisab standard and metal prices; record wealth and liabilities; assess zakat; track giving; then freeze a yearly snapshot and produce a statement. The graph also preserves the documented manual stock-screening, trust, and satellite calculation tools. Sampled API handlers show user-scoped persistence; other feature wiring follows README descriptions and the tree, so unsampled call relationships are left out.

Main entry points: [`src/db/index.ts`](https://github.com/alysibak/mizan/blob/master/src/db/index.ts) (SQLite database), [`src/app/(app)/settings/page.tsx`](https://github.com/alysibak/mizan/blob/master/src/app/(app)/settings/page.tsx) (Settings), [`src/components/AssetManager.tsx`](https://github.com/alysibak/mizan/blob/master/src/components/AssetManager.tsx) (Asset ledger), [`src/app/api/snapshots/route.ts`](https://github.com/alysibak/mizan/blob/master/src/app/api/snapshots/route.ts) (Snapshot endpoints)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_account["Account and setup"]
  node_register["Register<br/>[page.tsx]"]
  node_login["Sign in<br/>[page.tsx]"]
  node_auth_api["Auth endpoints<br/>[route.ts]"]
  node_setup["Begin wizard<br/>[BeginWizard.tsx]"]
  node_settings_ui["Settings<br/>[page.tsx]"]
  node_settings_api["Settings API<br/>[route.ts]"]
end

subgraph group_ledger["Wealth and assessment"]
  node_ledger_ui["Asset ledger<br/>[AssetManager.tsx]"]
  node_import_ui["Ledger import<br/>[AssetImport.tsx]"]
  node_assets_api["Asset endpoints<br/>[route.ts]"]
  node_liabilities_api["Liability endpoints<br/>[route.ts]"]
  node_zakat_ui["Zakat assessment<br/>[page.tsx]"]
  node_hawl["Hawl calendar<br/>[hijri.ts]"]
  node_metals_api["Metal suggestions<br/>[route.ts]"]
end

subgraph group_annual["Annual reckoning"]
  node_year_ui["Yearly reckoning<br/>[page.tsx]"]
  node_snapshot_api["Snapshot endpoints<br/>[route.ts]"]
  node_statement["Statement<br/>[page.tsx]"]
  node_backup["Backup import/export<br/>[route.ts]"]
  node_src_app_api_import["Import endpoint<br/>[route.ts]"]
end

subgraph group_giving["Giving and tools"]
  node_giving_ui["Giving log<br/>[GivingManager.tsx]"]
  node_giving_api["Giving endpoints<br/>[route.ts]"]
  node_tools["Calculation tools"]
  node_screening["Stock screening<br/>[page.tsx]"]
  node_trust["Trust guidance<br/>[page.tsx]"]
end

subgraph group_persistence["Persistence and calculations"]
  node_zakat_engine["Zakat engine<br/>[zakat.ts]"]
  node_db[("SQLite database<br/>[index.ts]")]
  node_schema["Data schema<br/>[schema.ts]"]
  node_validation["Input validation<br/>[validation.ts]"]
  node_session["Session services<br/>[session.ts]"]
end

node_person(("Account holder"))
node_metals_provider["Free price sources"]

node_person -->|"creates account"| node_register
node_person -->|"signs in"| node_login
node_register -->|"submits details"| node_auth_api
node_auth_api -->|"creates session"| node_session
node_login -->|"submits credentials"| node_auth_api
node_person -->|"sets up ledger"| node_setup
node_person -->|"sets preferences"| node_settings_ui
node_settings_ui -->|"saves settings"| node_settings_api
node_person -->|"records wealth"| node_ledger_ui
node_ledger_ui -->|"submits assets"| node_assets_api
node_ledger_ui -->|"submits debts"| node_liabilities_api
node_import_ui -->|"uploads backup"| node_src_app_api_import
node_person -->|"reviews assessment"| node_zakat_ui
node_zakat_ui -->|"calculates zakat"| node_zakat_engine
node_person -->|"closes year"| node_year_ui
node_year_ui -->|"freezes snapshot"| node_snapshot_api
node_person -->|"prints statement"| node_statement
node_person -->|"records payment"| node_giving_ui
node_giving_ui -->|"submits gift"| node_giving_api
node_person -->|"uses tools"| node_tools
node_person -->|"screens holdings"| node_screening
node_person -->|"reviews guidance"| node_trust
node_person -->|"exports backup"| node_backup
node_backup -->|"reads records"| node_db
node_snapshot_api -->|"calculates snapshot"| node_zakat_engine
node_snapshot_api -->|"reads and writes"| node_db
node_assets_api -->|"reads and writes"| node_db
node_liabilities_api -->|"reads and writes"| node_db
node_giving_api -->|"reads and writes"| node_db
node_settings_api -->|"reads and writes"| node_db
node_backup -->|"restores backup"| node_src_app_api_import
node_settings_ui -.->|"requests suggestion"| node_metals_api
node_metals_api -.->|"fetches prices"| node_metals_provider

click node_register "https://github.com/alysibak/mizan/blob/master/src/app/(auth)/register/page.tsx"
click node_login "https://github.com/alysibak/mizan/blob/master/src/app/(auth)/login/page.tsx"
click node_auth_api "https://github.com/alysibak/mizan/blob/master/src/app/api/auth/register/route.ts"
click node_setup "https://github.com/alysibak/mizan/blob/master/src/components/BeginWizard.tsx"
click node_settings_ui "https://github.com/alysibak/mizan/blob/master/src/app/(app)/settings/page.tsx"
click node_settings_api "https://github.com/alysibak/mizan/blob/master/src/app/api/settings/route.ts"
click node_ledger_ui "https://github.com/alysibak/mizan/blob/master/src/components/AssetManager.tsx"
click node_import_ui "https://github.com/alysibak/mizan/blob/master/src/components/AssetImport.tsx"
click node_assets_api "https://github.com/alysibak/mizan/blob/master/src/app/api/giving/route.ts"
click node_liabilities_api "https://github.com/alysibak/mizan/blob/master/src/app/api/liabilities/route.ts"
click node_zakat_ui "https://github.com/alysibak/mizan/blob/master/src/app/(app)/zakat/page.tsx"
click node_zakat_engine "https://github.com/alysibak/mizan/blob/master/src/lib/zakat.ts"
click node_hawl "https://github.com/alysibak/mizan/blob/master/src/lib/hijri.ts"
click node_year_ui "https://github.com/alysibak/mizan/blob/master/src/app/(app)/year/page.tsx"
click node_snapshot_api "https://github.com/alysibak/mizan/blob/master/src/app/api/snapshots/route.ts"
click node_statement "https://github.com/alysibak/mizan/blob/master/src/app/(app)/statement/page.tsx"
click node_giving_ui "https://github.com/alysibak/mizan/blob/master/src/components/GivingManager.tsx"
click node_giving_api "https://github.com/alysibak/mizan/blob/master/src/app/api/giving/route.ts"
click node_tools "https://github.com/alysibak/mizan/tree/master/src/app/(app)/tools"
click node_screening "https://github.com/alysibak/mizan/blob/master/src/app/(app)/screening/page.tsx"
click node_trust "https://github.com/alysibak/mizan/blob/master/src/app/trust/page.tsx"
click node_backup "https://github.com/alysibak/mizan/blob/master/src/app/api/export/route.ts"
click node_db "https://github.com/alysibak/mizan/blob/master/src/db/index.ts"
click node_schema "https://github.com/alysibak/mizan/blob/master/src/db/schema.ts"
click node_validation "https://github.com/alysibak/mizan/blob/master/src/lib/validation.ts"
click node_session "https://github.com/alysibak/mizan/blob/master/src/lib/session.ts"
click node_metals_api "https://github.com/alysibak/mizan/blob/master/src/app/api/metals/route.ts"
click node_src_app_api_import "https://github.com/alysibak/mizan/blob/master/src/app/api/import/route.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_register,node_login,node_auth_api,node_setup,node_settings_ui,node_settings_api toneBlue
class node_ledger_ui,node_import_ui,node_assets_api,node_liabilities_api,node_zakat_ui,node_hawl,node_metals_api toneAmber
class node_year_ui,node_snapshot_api,node_statement,node_backup,node_src_app_api_import toneMint
class node_giving_ui,node_giving_api,node_tools,node_screening,node_trust toneRose
class node_zakat_engine,node_db,node_schema,node_validation,node_session,node_person,node_metals_provider toneIndigo
```

## Components

### Account and setup

- [Register](https://github.com/alysibak/mizan/blob/master/src/app/(auth)/register/page.tsx): `src/app/(auth)/register/page.tsx`
- [Sign in](https://github.com/alysibak/mizan/blob/master/src/app/(auth)/login/page.tsx): `src/app/(auth)/login/page.tsx`
- [Auth endpoints](https://github.com/alysibak/mizan/blob/master/src/app/api/auth/register/route.ts): `src/app/api/auth/register/route.ts`
- [Begin wizard](https://github.com/alysibak/mizan/blob/master/src/components/BeginWizard.tsx): `src/components/BeginWizard.tsx`
- [Settings](https://github.com/alysibak/mizan/blob/master/src/app/(app)/settings/page.tsx): `src/app/(app)/settings/page.tsx`
- [Settings API](https://github.com/alysibak/mizan/blob/master/src/app/api/settings/route.ts): `src/app/api/settings/route.ts`

### Wealth and assessment

- [Asset ledger](https://github.com/alysibak/mizan/blob/master/src/components/AssetManager.tsx): `src/components/AssetManager.tsx`
- [Ledger import](https://github.com/alysibak/mizan/blob/master/src/components/AssetImport.tsx): `src/components/AssetImport.tsx`
- [Asset endpoints](https://github.com/alysibak/mizan/blob/master/src/app/api/giving/route.ts): `src/app/api/giving/route.ts`
- [Liability endpoints](https://github.com/alysibak/mizan/blob/master/src/app/api/liabilities/route.ts): `src/app/api/liabilities/route.ts`
- [Zakat assessment](https://github.com/alysibak/mizan/blob/master/src/app/(app)/zakat/page.tsx): `src/app/(app)/zakat/page.tsx`
- [Hawl calendar](https://github.com/alysibak/mizan/blob/master/src/lib/hijri.ts): `src/lib/hijri.ts`
- [Metal suggestions](https://github.com/alysibak/mizan/blob/master/src/app/api/metals/route.ts): `src/app/api/metals/route.ts`

### Annual reckoning

- [Yearly reckoning](https://github.com/alysibak/mizan/blob/master/src/app/(app)/year/page.tsx): `src/app/(app)/year/page.tsx`
- [Snapshot endpoints](https://github.com/alysibak/mizan/blob/master/src/app/api/snapshots/route.ts): `src/app/api/snapshots/route.ts`
- [Statement](https://github.com/alysibak/mizan/blob/master/src/app/(app)/statement/page.tsx): `src/app/(app)/statement/page.tsx`
- [Backup import/export](https://github.com/alysibak/mizan/blob/master/src/app/api/export/route.ts): `src/app/api/export/route.ts`
- [Import endpoint](https://github.com/alysibak/mizan/blob/master/src/app/api/import/route.ts): `src/app/api/import/route.ts`

### Giving and tools

- [Giving log](https://github.com/alysibak/mizan/blob/master/src/components/GivingManager.tsx): `src/components/GivingManager.tsx`
- [Giving endpoints](https://github.com/alysibak/mizan/blob/master/src/app/api/giving/route.ts): `src/app/api/giving/route.ts`
- [Calculation tools](https://github.com/alysibak/mizan/tree/master/src/app/(app)/tools): `src/app/(app)/tools`
- [Stock screening](https://github.com/alysibak/mizan/blob/master/src/app/(app)/screening/page.tsx): `src/app/(app)/screening/page.tsx`
- [Trust guidance](https://github.com/alysibak/mizan/blob/master/src/app/trust/page.tsx): `src/app/trust/page.tsx`

### Persistence and calculations

- [Zakat engine](https://github.com/alysibak/mizan/blob/master/src/lib/zakat.ts): `src/lib/zakat.ts`
- [SQLite database](https://github.com/alysibak/mizan/blob/master/src/db/index.ts): `src/db/index.ts`
- [Data schema](https://github.com/alysibak/mizan/blob/master/src/db/schema.ts): `src/db/schema.ts`
- [Input validation](https://github.com/alysibak/mizan/blob/master/src/lib/validation.ts): `src/lib/validation.ts`
- [Session services](https://github.com/alysibak/mizan/blob/master/src/lib/session.ts): `src/lib/session.ts`

### Other components

- **Account holder**
- **Free price sources**

## Connections

- Account holder → Register: creates account
- Account holder → Sign in: signs in
- Register → Auth endpoints: submits details
- Auth endpoints → Session services: creates session
- Sign in → Auth endpoints: submits credentials
- Account holder → Begin wizard: sets up ledger
- Account holder → Settings: sets preferences
- Settings → Settings API: saves settings
- Account holder → Asset ledger: records wealth
- Asset ledger → Asset endpoints: submits assets
- Asset ledger → Liability endpoints: submits debts
- Ledger import → Import endpoint: uploads backup
- Account holder → Zakat assessment: reviews assessment
- Zakat assessment → Zakat engine: calculates zakat
- Account holder → Yearly reckoning: closes year
- Yearly reckoning → Snapshot endpoints: freezes snapshot
- Account holder → Statement: prints statement
- Account holder → Giving log: records payment
- Giving log → Giving endpoints: submits gift
- Account holder → Calculation tools: uses tools
- Account holder → Stock screening: screens holdings
- Account holder → Trust guidance: reviews guidance
- Account holder → Backup import/export: exports backup
- Backup import/export → SQLite database: reads records
- Snapshot endpoints → Zakat engine: calculates snapshot
- Snapshot endpoints → SQLite database: reads and writes
- Asset endpoints → SQLite database: reads and writes
- Liability endpoints → SQLite database: reads and writes
- Giving endpoints → SQLite database: reads and writes
- Settings API → SQLite database: reads and writes
- Backup import/export → Import endpoint: restores backup
- Settings → Metal suggestions: requests suggestion
- Metal suggestions → Free price sources: fetches prices
