(01) Each claim links
to the file behind it.

Security

Private by construction, checkable in the source.

SAAR is designed to keep financial data on the user's machine. These are the specific mechanisms, each linked to the file that implements it, and the threats the project wrote down before building.

No independent security audit is claimed here. The project's own egress audit was run on Debian, and the repository states that a source build alone does not verify an installer or a disconnected target machine.

Threat model

Eight threats, written before the code.

The threat model sits next to a registry of ten synthetic test fixtures, so each mitigation can be exercised against a known input.

Docs/ADR/0002-threat-model-and-fixture-registry.md

  • TM-01Prompt injection through document textHostile text in an invoice cannot give the model authority. The model never writes to the ledger, and a defence layer intercepts instruction overrides and fence escapes.
  • TM-02Malicious PDFsDocuments are parsed by memory-bounded, unprivileged code with page limits, so decompression bombs and malformed files fail safely.
  • TM-03Path traversal and ingestion abuseFile names are sanitised and ignored as storage keys. Files are stored by content hash.
  • TM-04Data at restThe master key comes from your passphrase through Argon2id. The database and the document blobs are encrypted, and the passphrase is never written to disk.
  • TM-05Network egress and telemetryNo runtime network access. The web view policy blocks every connection, and there are no telemetry or updater plugins.
  • TM-06Floating-point errorAmounts are integer minor units with checked arithmetic, so totals cannot drift.
  • TM-07Worker crashes and out-of-memoryThe OCR and model workers run under supervision with timeouts and recovery.
  • TM-08Backup tamperingBackups are authenticated and encrypted. An archive that fails its integrity check is rejected.

Before real data

What you should still do.

Review the threat model and the code before using real financial records in a new environment. Model weights and native sidecars are provided separately, so check their hashes: the expected model SHA-256 is recorded in the Rust runtime source.

src-tauri/src/ai/llm_engine.rs