How it works

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.

Connectors

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.

ownpursesync
$ 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
The record

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.

Append-only

Database triggers refuse updates and deletes on history.

Hash-chained

Each row carries the hash of the one before it.

Exact to the cent

Decimals, never floats. Parity with the source on every account.

Accrual or cash

Both bases from the same facts, as of any date.

Daemon

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.

TUIAgentsYour tools
ownpurse daemonsyncs · serves · notifies
The recordone SQLite file
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.

CommandWhat it does
ownpurse loginOne browser consent for every organisation you tick. Read access by default.
ownpurse syncFetch what changed and append it to the record, within the daily call budget.
ownpurse tb · gl · pl · bsTrial balance, general ledger, profit and loss, balance sheet; accrual or cash.
ownpurse parityCompare the rebuilt ledger with the source, account by account.
ownpurse icMatch intercompany balances between your organisations.
ownpurse list · showAny mirrored entity, or one record with its full version history.
ownpurse history · attachmentsA document’s history, notes and files, into the record.
ownpurse exportA file for your accountant, straight from the record.
ownpurse classifySuggest projects and treatments with local rules; labels never leave your machine.
ownpurse manifest · writeCollect changes, plan them into a sealed package, approve before anything is sent.
ownpurse uiLet an agent read and drive the running terminal UI.
ownpurse doctorCheck the setup and print a fix for every problem.
Full CLI reference
Terminal UI

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.

ownpurse0.17 · roast, household · Ledger
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
Writes and moves

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.

DateSourceBookAccountDebitCredit
09-03sheethouseholdHome upkeep32.80
09-03sheethouseholdGroceries32.80
Balanced32.8032.80
Plan
One manual journal moves 32.80 from Groceries to Home upkeep in the household book. Nothing is sent until you approve it.

Try it offline in one command.

ownpurse demoGet started