25 Versions Later: What Building My Own Investment Tracker Taught Me About AI (And Finance)
It started with a broken pivot table.
One Saturday morning I was staring at a portfolio spreadsheet that had decided to stop refreshing. Twenty minutes in, it hit me: I'm a CPA. I work with AI every single day. Why am I sitting here fighting a pivot table? I'll just build my own tool.
Twenty-three deployment versions later, I have a fully working personal investment portfolio tracker — live prices in AUD, ATO-style capital gains estimates using the FIFO method, analyst ratings pulled from Yahoo Finance, technical buy/sell signals, a watchlist with timing verdicts, and a viewer mode for my partner. Built entirely through vibe coding with AI. Zero traditional development experience.
I'm not writing this as a tutorial. I'm writing it because what I learned across those 25 versions says something important about what AI actually is — and how finance professionals are uniquely positioned to use it well.
|
25
Deployment versions from "test sorting" to a working live portfolio dashboard — each one a lesson in how vibe coding actually works
|
$0
Monthly hosting or infrastructure cost — the entire app runs inside my own Google account, data never leaves my control
|
|
×32
The rogue multiplier that made my Silver ETF holdings look like $3M instead of ~$126K — spotted because the numbers "felt off"
|
5
Versions required to fix one chart sorting bug — because bar chart libraries render arrays bottom-up, not top-down, and a "reverse: true" axis just cancelled itself out
|
What the Finished Thing Actually Does
Before I get into the war stories, it's worth describing what Version 25 actually is. The dashboard shows my total portfolio value, unrealised gain, and AU versus US split — all updated with live prices converted to AUD. Holdings display as a table on desktop and as cards on mobile. Each stock has a traffic-light technical signal showing RSI, 50 and 200-day moving averages, 52-week range position, and MACD momentum. Click any holding to expand the detail.
The CGT tax report uses a FIFO parcel methodology — one of several methods the ATO accepts for share disposals — with a 50% discount toggle and a financial year selector. It's useful for rough planning conversations and building intuition around disposal timing decisions. It's not a tax return and not a substitute for advice from a registered tax agent. The disclaimer is prominent in the tool. Analyst ratings pull from Yahoo Finance: average rating, mean score, number of analysts covering, and target price in AUD. There's a watchlist where I track stocks I don't own yet, with technical timing indicators based on the same signal framework. A portfolio news feed surfaces relevant headlines weighted by position size. CSV import and export. Viewer mode with a separate password for my partner.
The whole thing runs on Google Apps Script and Google Sheets. No third-party SaaS applications, no separate hosting bill, no authentication layer to manage beyond Google's own. My data stays within my own Google environment — I'm not piping it to external applications or services. It deploys in one click.
The 25-Version Journey (The Honest Version)
The deployment history tells the real story of how vibe coding works in practice. It reads like this: "test sorting" → "fixed sorting" → "fixed sorting 2" → "revert icons" → "fix sorting" → "add analysts" → "fix analysts" → "add watchlist" → "fixed watchlist" → all the way to "fixed watchlist 4" at Version 25.
There are four bugs from that journey that I keep coming back to, because each one taught me something specific.
The SLV ×32 bug. My Silver ETF (SLV) is priced in ounces. Somewhere in the code, a rogue multiplier of 32 had crept in — converting ounces to something else, presumably. The result: my portfolio was displaying at roughly $3 million instead of approximately $126,000. I caught it not because I reviewed the code, but because the number felt wrong. Finance instinct. Twenty years of knowing roughly what a number should be before you look too closely. That instinct, not the AI, was the control.
The FX direction bug. The RBA publishes the AUD/USD rate as "USD per 1 AUD" — for example, 0.7121. For about a week, I had the conversion backwards: dividing when I should have been multiplying. Every USD holding was mispriced. The fix was trivial once I found it. Finding it required me to know enough about how exchange rates are quoted to smell that something was off.
The sorting saga. Versions 8 through 13 were consumed by a single chart bug. The bar chart library I was using renders arrays bottom-up rather than top-down. Combined with a "reverse: true" setting on the axis, the sort direction kept cancelling itself out. Five versions. One bug. This is what vibe coding actually feels like at the sharp end — you're describing what you want, the AI writes code that seems right, and then something subtle in the library's rendering logic breaks the outcome in a way that isn't obvious until you look at it from the right angle.
The deployment confusion. For longer than I'd like to admit, I kept creating new deployments instead of updating the existing one. The result: each "fix" got a new URL, so I was always testing the old broken version. The fix was working in the right place — not a code problem at all. This is a classic beginner mistake that no amount of AI assistance could prevent, because the AI doesn't know which URL you're looking at.
Why I'm Not Selling It (And Why That's Actually the Right Call)
I thought about monetising it. I thought about open-sourcing it. I decided against both, for reasons that are worth being transparent about.
The data sources I'm using — Yahoo Finance's unofficial API, GOOGLEFINANCE — are not licensed for commercial redistribution. Building on unofficial APIs and redistributing derived data commercially creates potential licensing and commercial-use issues that aren't worth taking on for a side project, regardless of how many disclaimers you attach.
The second issue is more specific to my situation. A tool that displays real-time market data, technical indicators, and capital gains estimates — with my name and professional title attached — is something I want to be careful about framing. Describing technical signals as "buy" or "sell" recommendations, even on a personal tool, creates ambiguity I'd rather not carry. The right approach: clear framing that these are technical indicators, not advice, with a disclaimer that's impossible to miss. Keeping it personal-use-only removes any question about whether ASIC's financial advice framework is engaged.
What Vibe Coding Actually Feels Like (For a Finance Person)
The framing that resonates most for me: you're the product manager, the AI is the developer. Your job is to know what you want to build and why. The AI's job is to write the code. The gap between a good outcome and a frustrating one usually lives in the quality of your brief — not in the AI's capability.
What surprised me most is how much my finance background helped. When the SLV multiplier bug appeared, I caught it because $3 million felt wrong. When the FX conversion was backwards, I caught it because I understand how exchange rates are quoted. When the CGT calculation was off, I caught it because I know what the FIFO method should produce. A developer without that domain knowledge might have shipped all three bugs undetected.
Twenty years of knowing what financial numbers should look like made me a better vibe coder than most developers would be — because I had an instinctive control framework that the AI couldn't replicate. The AI wrote the code. Finance experience was the audit.
If a CPA with no development background can build a live portfolio dashboard with CGT estimates and technical signals across 25 versions, imagine what the same approach can do for the finance functions running NDIS, aged care, and SME organisations. At PFL, we apply exactly this thinking to the automation challenges our clients face every day. The what and why, done well, with the how handled by the right tools.
See what PFL builds →
Comments
Post a Comment