Nest
Private, self-hosted household finance and debt-payoff app for a couple. Tracks debts, accounts and spending, models the fastest route to debt-free with a tested payoff engine, and runs an inter-person ledger. Manual monthly review, no bank-data upload, by design.
Tech Stack
About
Nest is a private household finance dashboard, self-hosted on a Mac Mini and reachable only over Tailscale. It gives a couple one honest picture of their money and the route to debt-free, then a house deposit.
After a first build that leaned on uploading PDFs and AI-extracting them, the data layer was rebuilt from scratch in June 2026. The lesson was simple: for accuracy-critical money, a disciplined manual review beats any automated extractor. So the app has no upload and no import of any kind, by design.
Architecture
| Layer | Technology |
|---|---|
| Frontend | Next.js 16 App Router, React 19, TypeScript strict, Tailwind CSS v4 |
| Data | better-sqlite3 (one local file), Drizzle ORM, integer pence throughout |
| Engine | Pure, unit-tested avalanche / snowball / hybrid payoff engine (17 tests) |
| Charts | Recharts |
| Hosting | launchd service on a Mac Mini, nightly SQLite backup, password gate, Tailscale-private |
Pages
| Page | What |
|---|---|
| Overview | The road to zero: debt-free date, cards-cleared date, total owed, interest burn, the one move to make |
| Debts | The full register with provenance and a plan-vs-actual debt-over-time chart |
| Money | Real cashflow, with internal transfers separated from spend |
| Mark & Kelly | The inter-person ledger: who owes whom, logged and settled |
| Review | The monthly manual update, the only way data gets in |
How the data stays accurate
- One declared source per account; dedupe enforced by a database constraint; transaction flow type set at ingest so internal transfers never leak into spend.
- Every debt figure carries a confidence and an as-of date; anything over a month old is flagged amber so the numbers never silently drift.
- Cards and loans are one entity with their terms attached, no double-counting.
- A frozen plan baseline lets the dashboard show actual vs plan, not just a moving projection.