Budget Ledger

Sign in to see what you hold.

Budget Ledger

Loading…

Add

A foreign card paying a peso bill takes two amounts and an optional rate: 124 transport wise usd 2.05 at 61.2716. Money between your own accounts, or back from someone who owed it: 2000 from wise php to cash. Between currencies, use the Full form.

Needs attention

Net position

Goals

A jar named after the goal is created inside the account you pick — no money moves, part of that balance is simply spoken for. Give a spend date only for something you will buy and be done with; leave it empty for money that stays, like an emergency fund.

Reports

Accounts

Recent see all →

Help

Settings

The default currency is what a bare amount means — 25 groceries cash records 25 of it. It is also what lands in the expense category when a foreign card pays a local bill.
Listing currencies turns on enforcement: anything outside the list is refused rather than splitting a category across two currencies that no report will combine without a rate. Leave it empty to accept any.
The timezone decides what today is. An evening entry recorded in the wrong zone lands on the wrong day, and nothing later can tell.

Accounts and categories

  • Loading…
Retired accounts
  • Loading…
Saying what is in an account now records it as an opening balance — one entry, against the account the ledger keeps for exactly this. Leave it blank if the account starts empty. If you get it wrong, check on the Accounts card books the difference rather than editing anything.
A card's rate and smallest payment are what the payoff comparison needs to work. Without them a card still records spending perfectly; it just cannot be modelled. Cards usually bill whichever is larger of a fixed amount and a percentage — fill in both and the model takes the greater, exactly as the statement does.
The credit limit is the one number here the ledger cannot work out for itself: it knows what you owe, but the limit is a term of the agreement. Give it and every list shows what is left on the card as well as what is on it. A loan you cannot redraw has no limit.
Categories live under Expense or Income. An account put inside another is a jar — GCash A:Glasses is money set aside in an account you really hold, not a second bank account.
Nothing here is created for you while recording an entry, which is why Groceries, Grocery and groceries do not all end up existing. A name that differs from an existing one only in case is refused for the same reason.
Accounts cannot be deleted: entries point at them, and removing one would change figures already reported. Opening balances have their own account and are not created here.

Projects

  • None yet.
A project earmarks entries across every category: a trip, a rental property, a client. An entry belongs to at most one, and leaving it unset is the normal case.

People

  • Loading…
viewer sees everything and changes nothing — the accountant. recorder records entries and reverses their own mistakes, but not goals, plans or schedules. editor does all of that as well. None of them can change settings, take a backup, or invite anybody: that stays with you.
They get a link that works once. Until they open it and choose a password their account cannot be signed into by anyone, including you.
This puts them in your ledger, seeing your entries and your balances. Somebody who should have books of their own is a different thing entirely — that needs a ledger creating, which is a command rather than a button: npm run users add <username>.

Connected apps

  • None yet.
An AI you have connected to this ledger, and what you allowed it to do. Revoking one stops it within a few minutes and cannot be undone — the app would have to ask again. Nothing it recorded is affected: entries stay on the record either way.

Guided tour

Six stops on the page you already have, with your own figures in it. It runs by itself on a first visit; this button is how you get it back.

Appearance

Nine schemes, each with a light and a dark side. Money colours stay the same in every one — green in, red out — because an amount's direction is information, not decoration. This choice is remembered on this device.

Your own palette

A palette is fourteen colours, twice — once for light, once for dark. It is stored with the ledger rather than on this device, so it follows you to another browser and any client that reads your settings can use it. Presentation only: nothing here can change a figure.

Your data

Every leg as a spreadsheet row, or the complete JSON. Yours to keep, open anywhere, and take elsewhere. Neither is a backup — a nightly encrypted backup runs separately and includes things an export cannot carry.

Budget

  • Loading…
What you expect each month. This is what Plan vs actual measures against, what Free to spend deducts, and what the Projection extrapolates — until a category has a line here, it is reported as unplanned rather than measured.
Publishing makes a new plan version; earlier ones are kept, so "what was I planning in March" stays answerable. Goal instalments are set on each goal's card.

Schedules

  • None yet. Rent and subscriptions belong here.
Occurrences appear under Needs attention when due, and post only when you approve them.

Tags

  • None yet. Add one above, or tag an entry in the Entries view.
Tags are labels, not money: rename or delete them freely — no figure changes.

Envelopes

  • Loading…
An envelope's unspent budget rolls forward instead of resetting each month. The balance shows on the Plan vs actual tab.
Toggling changes no data, ever: the balance is recomputed from your plan and spending, not stored — turn an envelope off and back on and it returns identical. The monthly amount itself lives in the plan, which is where it is edited.

Backups

Loading…
    Every ledger, encrypted with your passphrase and committed to a private repository, at 3:20 each morning. This list is read from that repository rather than from any record this app keeps — the only question worth answering is whether there is a file you could restore from.
    A run that failed and a schedule that never fired look identical from here: both leave no file. The age of the newest backup is the number that matters either way.

    Schema

    Loading…
      What the deployed code expects each database to have, against what it actually has. Pending means a deploy went out in front of its migration — run npm run migrate --all. Ahead means the opposite: a migration has run and the code that needs it has not been deployed yet.
      Deploys are manual and migrations are separate, so these two can disagree in either direction. This is the panel that says which.

      Everyone

      Loading…
        Every account on every ledger. Rows sharing a ledger are one set of books with guests on it — invite and remove those from Settings → People, on the ledger they belong to.
        Giving somebody books of their own is a command, because it creates a database and runs the migrations against it: npm run users add <username> "Their Name". Then npm run users list shows what this panel shows.

        Ask

        The microphone works here the same way it does for an entry: press it, ask your question out loud, and the words appear in the box. Unlike an entry it goes ahead and answers — asking changes nothing, so there is nothing to confirm. If it mis-heard you, the words are right there to correct.
        Every figure in an answer comes out of your own ledger — the wording is written by an AI, the numbers are not. Open figures used under an answer to see exactly what it was given. It can only read; it cannot record, change or delete anything.

        Things to try

        Entries

        • Choose a range and search.