Everything in the lab
InInvestmentsPersonal tool

Experiment

In daily use

Investments

My money sat across Zerodha, a bond platform, bank FDs and a fund bought somewhere else, and none of them could tell me if I was sticking to my own plan. Now one page does, and it checks the plan for me.

Role
Design + build, solo
Apparatus
Next.js · React · TypeScript · MySQL · Kite Connect · PWA · Claude Code
Tags
  • Personal finance
  • Goal tracking
  • Plan checks
The Investments home screen in a browser window, showing net worth, today's change, progress towards a goal and what's coming up. Beside it, the Plan screen on a phone, with each goal's pessimistic, expected and optimistic dates.

The problem

I had a written plan for my money. Which funds, roughly how much in each, when to move money out of a liquid fund into equity, when a goal fund should start shifting into debt, and a short list of rules I'd promised myself I'd keep.

The money itself was spread across two Zerodha accounts, Coin for mutual funds, a bond platform, a few bank FDs and one fund bought outside Zerodha. "Am I on track?" meant opening five apps and doing sums. And nothing checked the rules, so I'd only find out I'd broken one much later.

The questions it answers

  • "What am I worth today?"Before: adding up five apps. Now: net worth on the first screen, with today's change and all-time return.
  • "Am I on track?"Before: a feeling. Now: every goal shows when I'll reach it on a bad, normal and good run, and whether that beats the date I set.
  • "Am I keeping my own rules?"Before: I'd notice months later. Now: the plan's rules run as checks, and anything off is flagged.
  • "What do I need to do next?"Before: dates in my head. Now: an action calendar, with FD and bond maturities added on their own, and a notification on the morning.
The home screen on a laptop: net worth, today's change and all-time return, a sparkline, progress towards a goal, four summary tiles and the next three things to do
Home. Where I stand, then what's coming up.

Where the numbers come from

  • ZerodhaStocks, Coin mutual funds and SIPs, through Kite Connect. One read-only app per account. The login lasts until 6am the next day.
  • AMFIEvery fund's latest NAV and category, from the public daily file. No login.
  • Stock pricesA public quote feed, so stock values move between logins too.
  • NAV history1, 3 and 5-year returns per fund, and the full history of the fund bought outside Zerodha.
  • BondsImported from the bond platform's holdings spreadsheet. The spreadsheet never leaves my laptop.
  • By handFDs, cash, and the purchases Zerodha can't see.

Between logins

I don’t log in to Zerodha every day, so the app fills the gap. Each SIP that falls due is counted as bought at that day’s NAV. Each monthly transfer out of the liquid fund is counted on both sides: sold from one fund, bought into the other. The next real sync replaces the estimates with what actually happened.

The home screen on a phone: net worth, today's change, a goal's progress and four tiles
On the phone it installs like an app.
The Plan screen on a phone: each goal with pessimistic, expected and optimistic dates
Every goal gets three dates, not one.
The Holdings screen on a phone: funds, stocks, and FDs, bonds and cash, then every holding with its account and return
Every fund, stock, FD and bond in one list.

The plan, as checks

The written plan had rules like “Direct plans only”, “no fund above a set share of my equity”, “exit the overlapping single stocks by December” and “a goal fund moves into debt year by year”. Each one is now a check with a plain-English result: fine, worth a look, or something to fix, and what to do about it.

The health checks: Direct plans only, single-stock exit progress, one fund's share of equity, number of core funds, the liquid fund pipeline, LTCG to harvest, a goal fund's shift to debt, bonds' share, and the emergency buffer
The plan's rules, checked against the real holdings.

Keeping it private

  • LockedA PIN, with wrong guesses limited per network and per day.
  • UnlistedNothing is indexed, and no page can be cached on the way.
  • On the deviceThe offline copy lives only on my phone and is wiped when I tap Lock.
  • Read-onlyIt can see my holdings. It can't buy or sell anything.

What I learned

  • A plan you can’t check is a wish. Writing the rules down was the easy part. Turning them into checks is what made me keep them.
  • Show a range, not a number. One forecast line is easy to believe. Three dates make the uncertainty hard to miss.
  • Free public data goes a long way. Only the holdings need a login. Everything else refreshes on its own.

What happened

  • 9 checks run against my own plan every time I open it, from "Direct plans only" to "don't touch the emergency FD".
  • 3 hours between automatic price refreshes, from public fund and stock data. No broker login needed.
  • ₹0 extra a month. It runs on hosting I already pay for.
  • 12 automated tests on the maths. FD interest, XIRR, goal dates and the forecast.

The honest note

The forecast is arithmetic on assumptions I chose, not a prediction. That's why every goal shows a pessimistic, an expected and an optimistic date, so I don't read the middle one as a promise.

I tried connecting the other platform's API too. Every holdings call came back with the same error, so I dropped it. Those purchases are typed in by hand, and the app rebuilds that fund's history from public NAVs.

While tightening it up, I found the CDN in front of my hosting had been serving an old copy of the PIN screen whose scripts no longer existed. Anyone signed out couldn't log in. Now every page is marked uncacheable, and each deploy checks the login screen before it calls itself done.

The screenshots are from a copy running on made-up data. None of the amounts are mine.

Not built yet

  • Placing orders. It only reads from Zerodha, on purpose.
  • Fixing the forecast chart, where goal labels overlap when goals sit close together.