localfiscal
Local-first, private receipt + invoice + ledger for solopreneurs and small businesses — money is exact, amounts are never invented, exports import cleanly.
Open source (MIT) · Local-first sqlite · Exact money (never floats) · Optional local Ollama vision · One-command Docker.
Watch localfiscal in action
Recorded localfiscal v0.2.0 output, edited as a replay with fictional transactions in a new scratch SQLite database. No bank connection. Locally synthesized Dan narration.
Read the transcript
Localfiscal keeps a receipt and transaction ledger on your own machine. In a fresh scratch database, I add fictional client income and an office expense. No bank account or cloud service is involved. The generated report keeps the currencies separate and represents the amounts as integer minor units. This small example is a local bookkeeping demonstration, not financial or tax advice. Then export the same two transactions as CSV. This records and reports what I supplied; it does not reconcile a bank account. The source and local setup are linked below.
The problem
Solopreneurs and small teams drown in paper and digital receipts, manual categorization, invoice chasing, and painful tax prep. Existing tools are either dated desktop apps, heavy self-hosted platforms, or cloud SaaS that lock you in and exfiltrate your data. And the ones that handle money often do it with floats — so the numbers quietly disagree. localfiscal stays on your machine and gets the boring, important parts right.
A local-first Python CLI + minimal web UI that runs entirely on your machine. Ingest receipts (images/PDFs) with a locale-aware heuristic parser (and optional local Ollama vision) — amounts are stored as exact integer minor units with an explicit currency, and a receipt it cannot read is flagged needs-review rather than given a fabricated amount. Keep a private sqlite ledger, generate invoice PDFs, produce signed income / expense / net reports, and export real CSV (RFC-4180) and OFX/QFX. One-command Docker, non-root, loopback-only by default. Nothing leaves your device unless you explicitly export.
Demo flow
Ingest or add entries, generate invoices on demand, and produce signed reports — everything stays in your local sqlite file.
# 1. Ingest a receipt (or use the web UI)localfiscal ingest ~/Downloads/coffee-receipt.jpgINGESTED: 1 | 2026-06-28 | Demo Cafe | $12.50 | meals# 2. Add income, then list (newest first)localfiscal add 2026-06-28 "Acme Client" 1200 --incomeADDED: 2 | $1,200.00 | incomelocalfiscal list-tx --limit 22 | 2026-06-28 | Acme Client | $1,200.00 | general | income1 | 2026-06-28 | Demo Cafe | $12.50 | meals | expense# 3. Invoice + signed report (income / expense / net — never a false total)localfiscal invoice "Acme Client" 1200 --out invoice.pdfINVOICE: invoice.pdflocalfiscal report --fmt mdREPORT: data/report-now.md## USD- **Income:** $1,200.00- **Expenses:** $12.50- **Net:** $1,187.50
Quickstart
Run via Docker (recommended) or install from source. Core has no mandatory external services.
git clone https://github.com/OrionArchitekton/localfiscal
cd localfiscal
docker compose up --build
# open http://127.0.0.1:8080 (binds loopback only)git clone https://github.com/OrionArchitekton/localfiscal
cd localfiscal
python -m venv .venv && source .venv/bin/activate
pip install -e '.[dev]'
localfiscal --helplocalfiscal ingest receipt.jpg
localfiscal add 2026-06-28 "Acme Co" 1200 --income
localfiscal report --fmt mdCommand surface
- ingest
- Read a receipt image/PDF. A locale-aware parser extracts vendor / amount / date / category into the ledger; an unreadable amount is flagged needs-review, never invented. Optional local Ollama vision with --vision.
- add
- Manually add a transaction to the private sqlite ledger (--income for income, otherwise expense). Amounts are parsed exactly to integer minor units.
- list-tx
- List recent transactions from the local ledger (newest first).
- invoice
- Generate a clean professional invoice PDF for a client.
- report
- Produce signed income / expense / net reports per currency (Markdown, JSON, or CSV) — all derived from one exact integer source, so they always agree.
- export
- Export the full ledger as real CSV (RFC-4180) or OFX/QFX for your accountant or accounting software.
- health
- Quick health check and DB status.
Why it is different
Truly local-first & private
Everything lives in a single sqlite file on your machine. Optional local Ollama vision for better receipt OCR is off by default — with no endpoint configured there is no network call, ever. Data never leaves unless you explicitly export.
Correct & honest about money
Amounts are exact integer minor units with an explicit ISO-4217 currency — never floats. Markdown, JSON, and CSV reports always agree to the cent, and mixed currencies are reported separately instead of summed into a false total.
Honest by construction
A receipt it cannot parse is flagged needs-review, never given an invented amount, and the web upload is path-traversal-safe. The v0.2 "harden & honest" release makes every claim on this page true and tested — exports included.
Solopreneur & SMB friendly
Simple CLI + web. One-command, non-root Docker. Real CSV and OFX/QFX exports accountants actually use. No subscriptions, no vendor lock-in, no data hostage situation.