← Portfolio

Thrifty

A local-only finance tracker that syncs bank, brokerage, and credit card accounts to track net worth, spending, and portfolio allocation.

Date: April 2026 Tech: Python, FastAPI, React, TypeScript, SQLite, Recharts Topics: finance, data visualization, privacy

Details

Thrifty is the successor to Matcha, a budgeting app I built in 2016. Matcha used Plaid, which kept breaking as banks tightened API access, and stored everything in a cloud database. The core lesson: own your data pipeline and keep the data local.

Every number in the screenshots is fake (Numbers are illustrative.)

What it tracks

Three views: net worth over time, cash flow breakdown, and portfolio allocation. Cash flow has the most depth- spending by category, a waterfall chart of income vs. expenses, a spending calendar, a Sankey chart, and a treemap. Transactions are categorized via a deterministic rules file.

Data syncs from SimpleFIN Bridge (banks and credit cards), SnapTrade (brokerages and retirement accounts), and a Bilt Chrome extension for the Bilt card. Amazon orders get their own treatment- a Chrome extension scrapes the payments page, matches each transaction to its order items, and imports them with line-item detail so “Amazon.com” becomes the actual things I bought.

Amazon item categorization uses a local embedding model (qwen3-embedding:0.6b via Ollama) as a centroid classifier- it embeds known labeled items to build per-category centroids, then classifies new items by nearest cosine distance. No API costs, runs offline.

Stack

Python/FastAPI backend with SQLite, React 19 + TypeScript frontend. All the finance math lives in an isolated finance/ module with 50 unit and property-based tests- kept separate from the charts so the logic is testable without rendering anything.

Source on GitHub.

Net worth over time by account Cash flow breakdown with income and spending categories Spending treemap by category Cash runway projection and Sankey chart Transaction table with categorization Spending calendar heatmap