A record of facts, and everything you need to work with it.
Connectors turn sources into facts. The record keeps them. A small daemon serves them. The CLI and the terminal UI let you and your agents ask anything and change things carefully.
Sources become facts.
A connector reads a source and writes what it saw as facts, each tagged with where it came from. The Xero connector covers every organisation you tick in one login, watches its daily call budget, and fetches only what changed since the last sync.
Because a connector only has to describe a source, your agent can write one for your bank's export or your household sheet, and everything above it works unchanged.
$ ownpurse sync roast,hold roast invoices 12 · bills 31 · bank 88 · journals 2 hold bills 1 · bank 6 · journals 1 141 new versions · 3 changed · 0 removed calls 46 used · 954 left today chain ● verified hint: ownpurse parity roast
One file. Append-only. Provably untouched.
The record is a single SQLite file. Every version of every document becomes a new row, triggers refuse edits and deletes, and a SHA-256 chain links each row to the one before. Amounts keep the source's own digits as exact decimals.
ownpurse rebuilds the ledger from those documents and checks it against Xero's own trial balance, P&L and balance sheet, account by account, to the cent.
Database triggers refuse updates and deletes on history.
Each row carries the hash of the one before it.
Decimals, never floats. Parity with the source on every account.
Both bases from the same facts, as of any date.
A small process that keeps the record company.
The daemon runs on your laptop or your own server. It schedules syncs, serves facts and live updates to whatever is listening, and gives every tool and agent the same view of the record. It does nothing you can't also do from the CLI.
Everything, from one command line.
The CLI covers the whole surface, written for agents first: compact output, a count on every list, structured errors with stable exit codes, no prompts, and a hint for the next step. Add --json to anything.
| Command | What it does |
|---|---|
| ownpurse login | One browser consent for every organisation you tick. Read access by default. |
| ownpurse sync | Fetch what changed and append it to the record, within the daily call budget. |
| ownpurse tb · gl · pl · bs | Trial balance, general ledger, profit and loss, balance sheet; accrual or cash. |
| ownpurse parity | Compare the rebuilt ledger with the source, account by account. |
| ownpurse ic | Match intercompany balances between your organisations. |
| ownpurse list · show | Any mirrored entity, or one record with its full version history. |
| ownpurse history · attachments | A document’s history, notes and files, into the record. |
| ownpurse export | A file for your accountant, straight from the record. |
| ownpurse classify | Suggest projects and treatments with local rules; labels never leave your machine. |
| ownpurse manifest · write | Collect changes, plan them into a sealed package, approve before anything is sent. |
| ownpurse ui | Let an agent read and drive the running terminal UI. |
| ownpurse doctor | Check the setup and print a fix for every problem. |
One state. Every screen derived. Your agent can drive it.
The terminal UI ships with ownpurse and is built on caretline. It follows the Elm architecture: a single state value, messages that change it, and every screen derived from it. That makes each view reproducible, and it means an agent can read the state and send the same keys you would.
So your agent can do more than answer. It can open the ledger, filter to the card, put two books side by side and walk you through what it found, on your screen.
1 Overview 2 Ledger 3 Intercompany 4 Activity 5 System ───────────────────────────────────────────── filter: card 4417 3 rows 09-03 roast 6420 Repairs 53.60 ▸ 09-03 household Home upkeep 32.80 ◌ held 09-30 bank card 4417 (86.40) ───────────────────────────────────────────── agent The household half is held. Post it? / filter v compare d as-of ? help
Changes go out as planned, recorded operations.
Reading never changes anything. When you or an agent want to post a journal, create a bank transaction or attach a receipt, ownpurse collects the change into a manifest, plans it into a sealed package, and shows exactly what will be sent. Nothing reaches the source before you approve it. Each landed write leaves a note in the document's history, so anyone looking in Xero can see where it came from.
Moving to a new provider uses the same path in bulk: the facts are already yours, so a connector for the new system replays them there.
| Date | Source | Book | Account | Debit | Credit |
|---|---|---|---|---|---|
| 09-03 | sheet | household | Home upkeep | 32.80 | |
| 09-03 | sheet | household | Groceries | 32.80 | |
| Balanced | 32.80 | 32.80 | |||