(01) Tauri 2, Rust,
React and TypeScript.
Architecture
One window, a Rust core, local workers.
The desktop app is built with Tauri 2, Rust, React and TypeScript. The interface is deliberately thin. Everything that touches money, files or the model lives in the Rust core.
The language model and the OCR worker run as local sidecar processes over pipes. No loopback server is bound, and no worker opens a network socket.
Where to look
A map of the repository.
- Interface and typed command callssrc
- Native application and IPC commandssrc-tauri/srcsrc-tauri/src/commands.rs
- Financial arithmetic and reconciliationsrc-tauri/src/finance
- Database and workspace lifecyclesrc-tauri/src/dbsrc-tauri/src/workspace_store.rs
- Local model and grounded answerssrc-tauri/src/ai
- Document ingestionsrc-tauri/src/ingestion
- OCR workerworkers/ocr
- Design decisions and test evidenceDocsDocs/evidence
How a question is answered
Five steps between you and the model.
The model is the last step, not the first. That ordering is what keeps a generated sentence from becoming a ledger entry.
- Classify the questionAn allow-listed intent parser decides what is being asked. Free-form instructions cannot reach the database.
- Compute from recordsThe Rust core calculates the figure in integer minor units and collects the transactions it used.
- Cite the evidenceThe answer carries identifiers for each supporting invoice or transaction, which open in the evidence inspector.
- Let the model write wordsThe local model may phrase the answer, but it cannot change a figure or write to the ledger.
- Label the resultThe interface marks the answer Verified when SAAR calculated it, or Not verified when the model wrote it.
Exact money
Integer minor units, checked.
Amounts are signed 64-bit integers in the currency's minor unit, with checked arithmetic that refuses to overflow and a currency mismatch that cannot be added. Totals are grouped by currency, never converted without a recorded rate.