# adjutorium/diurnum architecture

> Architecture diagram of the GitHub repository adjutorium/diurnum, 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/adjutorium/diurnum
- Repository: https://github.com/adjutorium/diurnum
- Video tour (about a minute): https://gitdiagram.com/adjutorium/diurnum/video

## Overview

Diurnum is a local-first desktop accounting app: users open a workspace, import statement data, review suggested entries, and approve changes into Beancount files they own. The React app calls the Rust workspace commands through its API bridge; Rust modules implement accounting and workspace operations. The product also includes AI-assisted review, reports, a ledger editor, documents, categorization rules, and Git features. The excerpts establish the command boundary and selected calls; some feature wiring is documented or visible only in the tree, so uncertain internal links are omitted.

Main entry points: [`src-tauri/src/commands/workspace.rs`](https://github.com/adjutorium/diurnum/blob/main/src-tauri/src/commands/workspace.rs) (Tauri commands), [`src-tauri/src/workspace`](https://github.com/adjutorium/diurnum/tree/main/src-tauri/src/workspace) (Workspace SQLite), [`src/App.tsx`](https://github.com/adjutorium/diurnum/blob/main/src/App.tsx) (App coordinator), [`src-tauri/src/workspace/approval.rs`](https://github.com/adjutorium/diurnum/blob/main/src-tauri/src/workspace/approval.rs) (Entry approval)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_desktop["Desktop app"]
  node_app["App coordinator<br/>[App.tsx]"]
  node_screens["Workspace screens"]
  node_session["Workspace session<br/>[session.ts]"]
  node_api["Workspace API<br/>[api.ts]"]
  node_commands["Tauri commands<br/>[workspace.rs]"]
end

subgraph group_accounting["Accounting workflow"]
  node_imports["CSV imports<br/>[imports.rs]"]
  node_source_accounts["Source accounts<br/>[source_accounts.rs]"]
  node_approval["Entry approval<br/>[approval.rs]"]
  node_rules["Categorization rules"]
  node_ai_assist["AI assist<br/>[ai_assist.rs]"]
end

subgraph group_ledger["Ledger and insights"]
  node_ledger["Ledger editing<br/>[ledger_editor.rs]"]
  node_validation["Ledger validation<br/>[validation.rs]"]
  node_reports["Accounting reports<br/>[reports.rs]"]
end

subgraph group_workspace["Workspace features"]
  node_workspace_core["Workspace lifecycle<br/>[create.rs]"]
  node_documents["Documents<br/>[documents.rs]"]
  node_git["Git integration<br/>[git.rs]"]
  node_view["Workspace view<br/>[view.rs]"]
end

subgraph group_storage["Local data and integrations"]
  node_adapter["AI adapter<br/>[ai_adapter.rs]"]
  node_sqlite[("Workspace SQLite")]
  node_ledger_files["Beancount files"]
end

node_user(("User"))
node_ai_process(("Adapter process"))

node_user -->|"uses"| node_app
node_app -->|"renders"| node_screens
node_app -->|"manages state"| node_session
node_session -->|"calls"| node_api
node_api -->|"invokes"| node_commands
node_commands -->|"dispatches"| node_workspace_core
node_commands -->|"dispatches"| node_imports
node_commands -->|"dispatches"| node_source_accounts
node_commands -->|"dispatches"| node_approval
node_commands -->|"dispatches"| node_rules
node_commands -->|"dispatches"| node_ai_assist
node_commands -->|"dispatches"| node_ledger
node_commands -->|"dispatches"| node_validation
node_commands -->|"dispatches"| node_reports
node_commands -->|"dispatches"| node_documents
node_commands -->|"dispatches"| node_git
node_commands -->|"dispatches"| node_view
node_ai_assist -->|"uses"| node_adapter
node_adapter -.->|"invokes"| node_ai_process
node_workspace_core -->|"reads/writes"| node_sqlite
node_imports -->|"stages rows"| node_sqlite
node_approval -->|"writes entries"| node_ledger_files
node_approval -->|"updates state"| node_sqlite
node_ledger -->|"reads/writes"| node_ledger_files
node_validation -->|"validates"| node_ledger_files
node_reports -->|"reads"| node_ledger_files
node_documents -->|"uses metadata"| node_sqlite
node_git -->|"tracks changes"| node_ledger_files

click node_app "https://github.com/adjutorium/diurnum/blob/main/src/App.tsx"
click node_screens "https://github.com/adjutorium/diurnum/tree/main/src/features/workspace"
click node_session "https://github.com/adjutorium/diurnum/blob/main/src/lib/workspace/session.ts"
click node_api "https://github.com/adjutorium/diurnum/blob/main/src/lib/workspace/api.ts"
click node_commands "https://github.com/adjutorium/diurnum/blob/main/src-tauri/src/commands/workspace.rs"
click node_workspace_core "https://github.com/adjutorium/diurnum/blob/main/src-tauri/src/workspace/create.rs"
click node_imports "https://github.com/adjutorium/diurnum/blob/main/src-tauri/src/workspace/imports.rs"
click node_source_accounts "https://github.com/adjutorium/diurnum/blob/main/src-tauri/src/workspace/source_accounts.rs"
click node_approval "https://github.com/adjutorium/diurnum/blob/main/src-tauri/src/workspace/approval.rs"
click node_rules "https://github.com/adjutorium/diurnum/blob/main/src-tauri/src/workspace/categorization_rules.rs"
click node_ai_assist "https://github.com/adjutorium/diurnum/blob/main/src-tauri/src/workspace/ai_assist.rs"
click node_adapter "https://github.com/adjutorium/diurnum/blob/main/src-tauri/src/workspace/ai_adapter.rs"
click node_ledger "https://github.com/adjutorium/diurnum/blob/main/src-tauri/src/workspace/ledger_editor.rs"
click node_validation "https://github.com/adjutorium/diurnum/blob/main/src-tauri/src/workspace/validation.rs"
click node_reports "https://github.com/adjutorium/diurnum/blob/main/src-tauri/src/workspace/reports.rs"
click node_documents "https://github.com/adjutorium/diurnum/blob/main/src-tauri/src/workspace/documents.rs"
click node_git "https://github.com/adjutorium/diurnum/blob/main/src-tauri/src/workspace/git.rs"
click node_view "https://github.com/adjutorium/diurnum/blob/main/src-tauri/src/workspace/view.rs"
click node_sqlite "https://github.com/adjutorium/diurnum/tree/main/src-tauri/src/workspace"

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_app,node_screens,node_session,node_api,node_commands,node_user toneBlue
class node_imports,node_source_accounts,node_approval,node_rules,node_ai_assist toneAmber
class node_ledger,node_validation,node_reports toneMint
class node_workspace_core,node_documents,node_git,node_view toneRose
class node_adapter,node_sqlite,node_ledger_files,node_ai_process toneIndigo
```

## Components

### Desktop app

- [App coordinator](https://github.com/adjutorium/diurnum/blob/main/src/App.tsx): `src/App.tsx`
- [Workspace screens](https://github.com/adjutorium/diurnum/tree/main/src/features/workspace): `src/features/workspace`
- [Workspace session](https://github.com/adjutorium/diurnum/blob/main/src/lib/workspace/session.ts): `src/lib/workspace/session.ts`
- [Workspace API](https://github.com/adjutorium/diurnum/blob/main/src/lib/workspace/api.ts): `src/lib/workspace/api.ts`
- [Tauri commands](https://github.com/adjutorium/diurnum/blob/main/src-tauri/src/commands/workspace.rs): `src-tauri/src/commands/workspace.rs`

### Accounting workflow

- [CSV imports](https://github.com/adjutorium/diurnum/blob/main/src-tauri/src/workspace/imports.rs): `src-tauri/src/workspace/imports.rs`
- [Source accounts](https://github.com/adjutorium/diurnum/blob/main/src-tauri/src/workspace/source_accounts.rs): `src-tauri/src/workspace/source_accounts.rs`
- [Entry approval](https://github.com/adjutorium/diurnum/blob/main/src-tauri/src/workspace/approval.rs): `src-tauri/src/workspace/approval.rs`
- [Categorization rules](https://github.com/adjutorium/diurnum/blob/main/src-tauri/src/workspace/categorization_rules.rs): `src-tauri/src/workspace/categorization_rules.rs`
- [AI assist](https://github.com/adjutorium/diurnum/blob/main/src-tauri/src/workspace/ai_assist.rs): `src-tauri/src/workspace/ai_assist.rs`

### Ledger and insights

- [Ledger editing](https://github.com/adjutorium/diurnum/blob/main/src-tauri/src/workspace/ledger_editor.rs): `src-tauri/src/workspace/ledger_editor.rs`
- [Ledger validation](https://github.com/adjutorium/diurnum/blob/main/src-tauri/src/workspace/validation.rs): `src-tauri/src/workspace/validation.rs`
- [Accounting reports](https://github.com/adjutorium/diurnum/blob/main/src-tauri/src/workspace/reports.rs): `src-tauri/src/workspace/reports.rs`

### Workspace features

- [Workspace lifecycle](https://github.com/adjutorium/diurnum/blob/main/src-tauri/src/workspace/create.rs): `src-tauri/src/workspace/create.rs`
- [Documents](https://github.com/adjutorium/diurnum/blob/main/src-tauri/src/workspace/documents.rs): `src-tauri/src/workspace/documents.rs`
- [Git integration](https://github.com/adjutorium/diurnum/blob/main/src-tauri/src/workspace/git.rs): `src-tauri/src/workspace/git.rs`
- [Workspace view](https://github.com/adjutorium/diurnum/blob/main/src-tauri/src/workspace/view.rs): `src-tauri/src/workspace/view.rs`

### Local data and integrations

- [AI adapter](https://github.com/adjutorium/diurnum/blob/main/src-tauri/src/workspace/ai_adapter.rs): `src-tauri/src/workspace/ai_adapter.rs`
- [Workspace SQLite](https://github.com/adjutorium/diurnum/tree/main/src-tauri/src/workspace): `src-tauri/src/workspace`
- **Beancount files**

### Other components

- **User**
- **Adapter process**

## Connections

- User → App coordinator: uses
- App coordinator → Workspace screens: renders
- App coordinator → Workspace session: manages state
- Workspace session → Workspace API: calls
- Workspace API → Tauri commands: invokes
- Tauri commands → Workspace lifecycle: dispatches
- Tauri commands → CSV imports: dispatches
- Tauri commands → Source accounts: dispatches
- Tauri commands → Entry approval: dispatches
- Tauri commands → Categorization rules: dispatches
- Tauri commands → AI assist: dispatches
- Tauri commands → Ledger editing: dispatches
- Tauri commands → Ledger validation: dispatches
- Tauri commands → Accounting reports: dispatches
- Tauri commands → Documents: dispatches
- Tauri commands → Git integration: dispatches
- Tauri commands → Workspace view: dispatches
- AI assist → AI adapter: uses
- AI adapter → Adapter process: invokes
- Workspace lifecycle → Workspace SQLite: reads/writes
- CSV imports → Workspace SQLite: stages rows
- Entry approval → Beancount files: writes entries
- Entry approval → Workspace SQLite: updates state
- Ledger editing → Beancount files: reads/writes
- Ledger validation → Beancount files: validates
- Accounting reports → Beancount files: reads
- Documents → Workspace SQLite: uses metadata
- Git integration → Beancount files: tracks changes
