Settings

Where the book is kept

In this browser, in local storage, under the key obscura_money_v1. Nothing is sent anywhere and there is no copy on a server.

Clearing site data deletes the book. So does a browser set to wipe storage on exit, a private window closing, and some "clean up my computer" tools. There is no way to get it back from us, because we never had it. Take a file backup from the Export tab and keep it somewhere you control.

Where you stand

Each currency is totalled on its own. Nothing is converted.

Transactions

Search understands payee:tesco, cat:food, acct:current, >100, <50, =9.99, cleared:no, after:2026-01-01, before:2026-04-01 and 2026-01-01..2026-03-31. Anything else is matched against the payee, the note and the category.

What this is, and what it is not

No amount here is ever a decimal fraction. A pound is held as the integer 100 and a penny as the integer 1. Ten pence plus twenty pence is 10 + 20 = 30, where a program using floating point gets 0.30000000000000004 and hides the difference behind a rounded display. The decimal point exists only in the text you read and the text you type, and both are converted by working on the digits rather than by parseFloat. The exported CSV carries each amount twice, written out and as the whole number of minor units, so anything you check it with can add it up the same way.

Rounding happens in exactly one place, and it is stated. If you type more decimal places than the currency has, the extra digits are rounded half away from zero: 1.005 in a two-place currency becomes 101 minor units, and -1.005 becomes -101. Nothing else rounds, because nothing else needs to: every total is a sum of integers. A currency's number of places comes from a small table, so yen has none and Kuwaiti dinar has three.

Currencies are never converted. A conversion needs a rate, a rate needs a live source, and this page makes no network call of any kind. So each account totals in its own currency, the summary shows one line per currency, and reports and budgets ask which currency they are about. A transfer between two accounts in different currencies asks you for both figures, because only you know what actually arrived.

A transfer is one thing written twice. Both sides carry the same link, so editing one edits both and deleting one deletes both after asking. That is what stops money appearing in one account without leaving another. Transfers are left out of the spending and income reports, because moving your own money between your own pockets is not spending.

The reconcile starts from the last one that agreed. Not from the opening balance, and not from what the book happens to say now. Tick what the statement shows, watch the difference, and finish only when it is zero. When it is not, the page names the mistake that difference usually is: an entry that matches it exactly, an entry with the wrong sign when the difference is twice an amount, or two digits swapped when the difference divides by nine.

The import shows its working and asks about the date. For CSV you pick the columns and see what the mapping produces before anything is written. The date format is offered as a choice rather than guessed, and where both day-first and month-first read the column without error the page says so instead of picking one. OFX and QFX are read straight through; repeats are found by the bank's own FITID where there is one and by date, amount and payee where there is not, and a flagged row is yours to take or leave.

Clearing site data deletes the book. It lives in this browser's local storage under obscura_money_v1 and nowhere else. A cleared cache, a private window closing, a browser set to wipe storage on exit, or a tidy-up tool will take it, and nobody can get it back because nobody else ever had it. Take the file export and keep it somewhere you control. The encrypted backup uses AES-256-GCM with a key stretched from your passphrase by PBKDF2-SHA256 over 600,000 rounds and a fresh 16-byte salt; if your browser will not give us WebCrypto, the page offers plain JSON and says so, rather than offering something weaker and calling it encryption.

Questions people ask

Is any of this sent anywhere?

No. There is no server side to this page. Open your browser's network tab and use the whole tool: nothing goes out. That is also why there are no live exchange rates, no bank connections and no sync between your devices, and why a file export is the only backup.

Why will the reconcile not let me finish?

Because the book and the statement do not agree yet, and finishing while they disagree records a balance that is wrong and carries the error into every reconcile after it. The difference is on screen the whole time, and the page suggests what a difference of that shape usually means. If the statement is genuinely right and the book is missing something, add it with the button there and the entry joins the list.

My bank's CSV has separate paid-in and paid-out columns. Will that work?

Yes. Switch the amounts setting to two columns and pick them. A value in the money-out column becomes a negative amount and a value in the money-in column a positive one, whichever way round the file writes the signs. If the file signs them the other way, the signs setting turns them round.

What happens to a transaction I import twice?

It is flagged, not blocked. A row whose date, amount and payee all match something already in that account is shown with the flag and left unticked, and you decide. For OFX the bank's FITID is checked first, which is more reliable than the three fields, because a coffee really can be bought twice in a day for the same amount at the same shop.

Can I get my data into something else?

Yes: CSV of every transaction, JSON of the whole book, and QIF for one account at a time. The JSON is the complete book, minor units and all, and is what to keep if you may come back to it. QIF dates are written month first, as Quicken wrote them, because QIF never agreed on an order.

What if I lose the passphrase on an encrypted backup?

The file is gone. There is no recovery, no reset and no copy, which is what makes the encryption worth anything. AES-GCM checks the file against its own tag, so a wrong passphrase fails outright rather than quietly producing nonsense.

Related tools