MONEY: Your Accounts, Kept Where You Can See Them
A book of personal accounts that runs in this tab. Add transactions, transfer between accounts, categorise, budget, import a statement as CSV or OFX, and reconcile against the paper until the difference is zero. Every figure is held as a whole number of pence or cents, so the totals are exact. Nothing is uploaded, and there is no account to make.
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.
Due, and waiting for you
A recurring entry falls due and is proposed here. Nothing is written to the book until you accept it.
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.
Add a transaction
Accounts
Every account has its own currency and totals in it. An account with no transactions can be deleted; one with transactions cannot, so that a figure never loses the entries behind it.
Add an account
Reconcile an account
Take the statement, type the closing date and the closing balance, then tick off what the statement shows. The difference stays on screen until it is zero.
Tick off what the statement shows
- Starting balance, from the last reconcile
- 0.00
- Ticked off here
- 0.00
- Which makes the account
- 0.00
- The statement says
- 0.00
- Difference
- 0.00
Budgets
One figure per category per month, against what actually happened. A budget belongs to one currency, because nothing here is converted.
Reports
Spending by category
Money out less any refunds into the same category, for the period. Only categories with a net outflow appear.
Money in against money out, by month
Running balance
All accounts in this currency added together, on every day a transaction happened.
Payees by total
Recurring transactions
A definition, not an entry. When one falls due it is proposed on the Transactions tab and waits for you to accept it.
Add a recurring transaction
Categories
Two levels: a group, and the categories inside it. A category in use cannot be deleted until the transactions using it are moved.
Import a statement
CSV from a bank or a spreadsheet, or OFX and QFX as most banks and Quicken write them. The file is read here and is not uploaded.
Drop a .csv, .ofx or .qfx file here, or
Which column is which
What that gives
What the OFX file holds
Take the book out
Every figure written from the whole number of pence, cents or other minor units it is held in. No number here has ever been a decimal fraction inside the machine.
The book already in this browser could not be read
An encrypted backup
AES-256-GCM with a key stretched from your passphrase by PBKDF2-SHA256 over 600,000 rounds and a fresh 16-byte salt, through the browser's own WebCrypto. Lose the passphrase and the file is gone; there is no recovery.
Put a backup back
A JSON book or an encrypted backup. This replaces everything in the browser, so it asks first.
Drop the backup file here, or
Start again
Removes the whole book from this browser. There is no undo and no copy anywhere else.
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.