The ledger doesn't round in your favour

Most money apps are quietly optimistic. A budget bar that stops at 100% instead of showing how far past it you went. A net worth figure that treats a currency it couldn't convert as zero. A gold price with no indication of whether it was fetched this morning or last March.
None of that is a bug. It's a series of small decisions, each defensible on its own, that add up to a number you can't quite trust.
TrackedWallet is the app I'm building to avoid making those decisions. It's a local-only personal finance ledger — cash accounts, credit cards, transactions, budgets, and precious metals in a single net-worth view. No account, no sync, no server. It's in development, and this is a note about the four rules it's built on rather than a feature list.
Rule one: budgets read no price, ever
A budget is a claim about spending. The moment it starts reading market prices, it stops being that.
Say you buy half an ounce of gold for 1,192.30$. Money left your checking account, so it looks like spending. It isn't — you converted one asset into another, and your net worth didn't move. If that transaction counts against a budget, the budget is now measuring your portfolio allocation and calling it groceries.
So: transfers between your own accounts never count, buying or selling metals never counts, and a realized gain on a sale is never income. That last one matters more than it sounds. If selling gold at a profit could fill an income budget, you could "earn" your way to a healthy month by liquidating the thing you were saving.
Budgets in TrackedWallet see expenses, in the main currency, and nothing else.
Rule two: a breach is the first thing on the screen
The standard pattern is one list of budget categories, with the over-budget ones tinted red. The information is technically present. You still have to scan for it.
Over-budget categories get lifted into their own group above everything else instead. If Food & Drinks is at 111%, that's the first thing you see when the screen opens — not the fourth row down in a list sorted by something else.

Two smaller decisions ride along with it.
Left to spend goes negative. When you're 45.46$ past a 400$ limit, the screen says −45.46$. Clamping at zero would be tidier and would hide the size of the breach, which is the one thing you actually need to know.
The header compares spend against elapsed time, not just against the limit. 2,070.07$ of 2,800.00$ is 74% — which sounds fine until you notice there are eleven days left in the month. So the card says it plainly: spending is ahead of the month; at this rate you'd finish 408.61$ over. A progress bar on its own can't tell you that.
There's a third case that took the longest to settle: categories with no budget at all. They're spending, so leaving them off the screen is dishonest. They're not budgeted, so folding them into "729.93$ left" would turn that figure into a promise the ledger can't keep. They get their own row — three categories, 550.27$ spent — listed by name, deliberately outside the totals, and one tap from becoming a budget.
Rule three: every price carries how old it is
A quote with no timestamp is a guess wearing a suit.
Metals and crypto prices come from CoinGecko and metals.dev, and sometimes from you typing a number in by hand. Those are very different levels of confidence, and the app never flattens them into one clean figure. Under every price sits the same small line: as of 6h ago · hand-entered, or as of 20m ago, or whatever is true.

The same discipline applies to the holding itself. Quantity, average cost, cost basis, unrealized gain and realized gain are five different facts, so they're shown as five different numbers. Collapsing them into one "return" figure would be easier to read and would quietly bury which part of your gain you've actually banked.
Rule four: what can't be valued is named, not zeroed
You hold 1,250 CHF. There's no exchange rate available right now. What does the total say?
The convenient answer is to leave it out and print a clean number. The total is then wrong, and nothing on screen admits it. The other convenient answer is to count it as zero, which is wrong in a way that looks even more confident.
TrackedWallet lists the balance, flags it as excluded, and keeps it out of the sum — visibly. Same for an asset with no price: platinum with no quote appears as unvalued rather than disappearing. And the headline figure inherits the age of its stalest input, so as of 6h ago · oldest input is the honest description of a number assembled from many sources at many times.

Local-only, and what that costs
Everything lives on the device. No account to create, no sync, no server holding your ledger. Import a CSV to get started, export the same shape back out whenever you want.
The honest cost is that this cuts both ways, and the app says so where it matters. The settings screen's danger zone doesn't say "this cannot be undone" — it says nothing leaves this device, so nothing can be restored. That's the actual trade you're making, stated once, in the place where it's about to matter.
Main currency works the same way. It's chosen when you first set the app up and then fixed, because price history is kept in it. So it isn't shown as a field you could edit — it's a reported value with a line underneath explaining why it can't change. A greyed-out dropdown would just look like something still loading.
Where it is
TrackedWallet is in development — Kotlin and Compose, on-device storage, prices from CoinGecko and metals.dev. There's no signup, because there's nothing to sign up for yet.
The design is further along than the code, which is the right order for something like this. Rules like these are cheap to argue about in a mockup and expensive to retrofit into a ledger that has already made the opposite choice a hundred times.
You can see the full set of screens on the [TrackedWallet project page](/lab/tracked-wallet).
---
TrackedWallet is a CraftedPxl project. Following along, or want to tell me one of these rules is wrong? [Get in touch](mailto:info@craftedpxl.com).
About the Author
CraftedPxl is a digital playground exploring the intersection of design, code, and photography.