← back case study

personal finance · data · visualization

$$$ Tracker Jun 2026

I wanted a clearer view of what I spent and earned each month, not just net change in a spreadsheet. Import a bank CSV for categories, splits, investing, and a monthly score.

C++ HTML / CSS / JS IndexedDB CSV parsing keyword classification charts

// before → after

spreadsheet vs real picture

Before
Spreadsheet only
I kept a spreadsheet, but it was inconsistent and only showed net change, not how much I spent or earned.
After
Spend + earn + score
Import the CSV, categorize automatically, compare income vs spend, keep investing separate, handle splits, and get a monthly score.

// demo

walkthrough

Demo video coming soon Walkthrough: CSV import → categories → monthly report → score.

// how it works

pipeline

01 · input
Bank CSV + keywords.csv
Statement export goes in. keywords.csv maps merchants to categories so the same places stay consistent.
02 · classify · C++
analyze.cpp
Reads each row, matches keywords, and sorts amounts into spend, earn, investing, and related buckets. Outputs totals for the dashboard.
03 · visualize · JS
dashboard.html
Drag-drop import, charts, teaching new keywords, payback splits, and IndexedDB so data persists without a backend.
out
Monthly report
Spent vs earned by category, not just one net number.
out
Splits & investing
Custom paybacks. Investing is tracked separately from spend.
out
0-100 score
Score based on save-rate, mix, and trends, explained in plain language.

// stack

languages · libraries

// concepts

Concepts applied

analyze.cpp

Transaction classification

Each bank row is matched against keywords.csv and sorted into a category (food, bills, investing, earn, etc.) so I don’t have to tag everything manually.

monthly report

Spend vs earn

Income and spend are shown separately. Investing has its own bucket so brokerage transfers don’t look like everyday spending.

payback UI

Custom splits

Shared charges can be split across people so I can track who owes what without another spreadsheet.

score + IndexedDB

Local persistence

The score uses simple heuristics. IndexedDB stores months and keywords locally, so nothing depends on a server.