Case study · macOS desktop app · Built for one user, me

Budget Tracker

A Mac app that answers one question every morning: how much can I actually spend today?

I stopped renting finance apps and built the one I wanted. AI is the leverage: I can now design and ship custom software for an audience of one, and this is what that looks like when it is done properly.

RolePM and builder, end to end
UsersOne. On purpose.
SubscriptionNone, ever
The cheapest finance app is the one you own
Scroll
100 percent of data stays on deviceNo accounts, no server, no telemetryZero rupees a month, foreverTouch ID plus a hashed PINOne JSON file is the whole database 100 percent of data stays on deviceNo accounts, no server, no telemetryZero rupees a month, foreverTouch ID plus a hashed PINOne JSON file is the whole database
01 · The problem

Every finance app wanted my bank login.

I did not want a budgeting philosophy or a monthly subscription. I wanted one number every morning, honest and current. But every app in the category asks you to hand your banking credentials to an aggregator, or hosts your financial history on someone else's server, and charges you for the privilege.

That is a bad trade for a problem this small. Typing an expense takes about five seconds. So the brief was four lines: answer the one question, keep every rupee of data on this Mac, no accounts, and never send me an invoice.

Link your bankhand credentials to an aggregator, host your financial history elsewhere, and pay monthly for it
Five seconds of typingmanual entry, zero credentials shared, and a number that is right because you watched it happen
02 · Why this exists

Software for an audience of one used to be irrational.

Building a native app for a single user could never justify the engineering. That maths changed. With AI as the engineering team, the expensive part is no longer the code, it is knowing what to build and what to refuse. This app is a small, honest demonstration of that shift, and the same method scales straight to building it for other people.

The old trade

Rent software, accept its opinions.

Every subscription tool arrives with a worldview, a data policy, and a price. You bend your habits around someone else's roadmap.

₹0what I now pay per month for personal finance software
The new trade

Own the tool, own the decisions.

The product judgment is mine and the code arrives in days. Privacy stopped being a policy I trusted and became an architecture I chose.

1user this was scoped for, which made every decision obvious
Why it generalises

One user, or ten thousand.

Nothing here is a toy: real auth, a real data model, a real release. Point the same method at a market and it becomes a product, which is exactly what my other case studies are.

5routed screens plus a lock screen, running daily on my Mac
03 · What shipped

A real Mac app, not a browser tab in disguise.

budget tracker · overview
The Budget Tracker overview with disposable income, daily budget, and category charts

One glance, then get on with the day.

Disposable income for the month, today's spending allowance, category donut, and per category budgets framed as amount left rather than amount overspent. Currency renders in Lakhs and Crores, because international notation reads wrong to Indian eyes.

Demo data throughout
budget tracker · investments
The investments screen with holdings, allocation donut, and liquid savings

Where the money is working.

Stocks, crypto and liquid savings with per holding profit and loss, platform tags, and an allocation donut. Current values are typed in by hand on purpose: live price feeds would mean network calls, API keys, and an app that stops being fully offline.

Demo data throughout
The rule the whole app rests on

Never store a number you can calculate.

Every headline figure, disposable income, remaining budget, daily allowance, is derived live from the transaction ledger on each render. Nothing is cached, so a stored balance can never drift out of sync with the transactions beneath it. That single rule makes an entire class of finance app bugs structurally impossible, and it is why the safety buffer is stored as an ordinary transaction rather than a special field: one pipeline, zero special cases.

Remaining = income − buffer − fixed − spentDaily = remaining ÷ days leftOne hook owns all money math
04 · The calls

Five decisions, each with the road not taken.

Scoping for exactly one user does not make the decisions easier. It makes the wrong ones cheaper to spot.

01

Privacy as architecture, not policy.

Rejected: bank linking through an aggregator

There is no server, no account, and no telemetry, so there is nothing to breach and no policy to trust. The whole database is one local JSON file on my machine. The cost is manual entry, about five seconds per expense, and that was the honest trade.

02

A real desktop app, not a web page.

Rejected: a plain web app in a browser tab

A browser tab never becomes a daily habit, and it cannot do Touch ID or real file storage. Electron plus React buys a dock icon, native unlock, and file access at web speed, accepting a heavier bundle as the price.

03

The lock protects the screen, and I say so.

Rejected: implying the data file is encrypted

Touch ID with a PIN fallback, and only a salted hash of that PIN is ever stored, so full access to the file reveals no credential. But the file itself is plain text, and the case study says that plainly. Encryption at rest sits on the roadmap, not in the marketing.

04

Money math lives in exactly one place.

Rejected: each screen computing its own totals

A single hook owns every calculation and every screen reads from it. Any value computed in two places eventually disagrees, and in a finance app that disagreement is the product failing at its only job.

05

Updates merge, they never overwrite.

Rejected: replacing saved data with the new defaults

New default categories shipped in a later version merge into the saved file rather than replacing it. The user of this app is me, and I refuse to be the developer who erases his own data on an update.

05 · Deliberately not built

Every feature faced one question.

Does this serve one private user on one Mac? These did not, so they never shipped.

Cloud sync

For a single user a server is a liability, not a feature: cost, accounts, and attack surface to solve a problem I do not have.

Bank account linking

Aggregators mean handing credentials to a third party, which kills the entire premise. Five seconds of typing was the better trade.

Live market prices

Live quotes need network calls and API keys. Updating a value by hand keeps the app fully offline and keeps me consciously engaged with my own money.

Accounts and login

There is one user and the Mac is already the identity. Touch ID plus a PIN protects the screen without inventing an auth stack.

The roadmap holds the rest: code signing so installs stop needing a right click, encryption of the data file tied to the existing PIN, an offline CSV import, and a Windows build the packaging already allows. Each waits for evidence, not enthusiasm.

06 · How it was built

AI wrote the code. The judgment was mine.

The method

A four line brief, then cuts.

I named the one question the app had to answer, chose the architecture, and spent most of the effort deciding what would never be built. Claude Code was the engineering team under that direction.

The build

Locked doors by default.

The interface runs sandboxed and can reach the operating system through exactly four whitelisted functions. Everything else, file access included, stays on the other side of that boundary.

The craft

Even the icon is code.

The app icon is generated programmatically from HTML and CSS rather than drawn in a design tool, so the entire product, icon included, rebuilds from source with zero binary design assets.

07 · The numbers
0of financial data stays on the device, permanently, by architecture
0per month, forever. No hosting, no APIs, no subscriptions.
0JSON file is the entire database, human readable and backed up by copying it
0whitelisted functions are all the interface can reach in the operating system
0lines of source across about 20 files, five screens plus a lock screen
0authentication layers: native Touch ID, and a salted hash PIN as fallback

"When you build for yourself, you cannot fake product market fit. The app either earns a place in your morning routine, or it quietly proves you scoped the wrong thing."

The closing lesson · Budget Tracker
Next case study

Saffron Leads

The same method, pointed at a business. A manufacturer running its pipeline on WhatsApp now runs 490+ leads through a six stage CRM that costs zero rupees to operate.

Read it