Your bank account shows one number, and that number lies. Rent is in there, the savings you promised yourself you wouldn't touch, and what's actually free to spend. Walletko separates the three.
How it works
You create buckets, each with a share: Fun 30%, Emergencies 20%, Car 10%. The total always comes to 100.
Every time money comes in, the amount splits itself across the buckets by their share. An expense draws from the buckets you pick, and an empty bucket pays nothing. Money moves from one bucket to another only if you move it. It's the envelope system, digital.
A bucket is also a goal. Mine is called Car, it takes 10%, and I can see where I stand without working anything out.
What it does
Buckets: percentage shares, computed balances, transfers, archiving.
Transactions: income, expenses, transfers between buckets.
Cancel, never delete: you can't erase income you've already spent, so the balances stay honest.
The rest: tags, saved views, a dashboard with balances and a yearly chart, passwordless login.
The 100% rule
Everything rests on one invariant: the shares add up to 100, at all times. Adding a bucket, archiving one, redistributing, every operation goes through the same validation and refuses if the numbers don't add up. That validation lives in the domain, not in a form. The interface can't produce an inconsistent state, even when I get something wrong inside it.
Migrating from Finance
Finance is another budget app I wrote. If you use it and want to move to Walletko, there's a tool for that: it reads the Finance database directly and recreates everything in Walletko, users, tags, and transactions. Each one gets a default bucket at 100%, and you can run it as many times as you like without ever duplicating anything.
