Case Study
Budget & Savings Goals: A Local-First Money Planner
Most budgeting apps ask you to hand over bank access and trust a server with your money data. I built the opposite: a private, local-first planner that separates planning from tracking, runs entirely in the browser, and keeps every profile's data on the user's own device. I owned the full build — data model, financial calculations, and UI — with no framework and no backend.

The dashboard opens on an at-a-glance summary — monthly income, planned commitments, actual spending, and a live “safe to spend” figure — plus a guided setup checklist for new users.
Problem and goal
Spreadsheets are flexible but easy to break, and most budgeting apps trade privacy for convenience by syncing everything to a server. I wanted a tool that was genuinely useful for everyday planning without asking anyone to connect a bank or create an account.
The goal was to separate two things that most budgets muddle together: planning the month before it happens, and tracking what actually did happen. Keeping those distinct is what makes a “safe to spend” number trustworthy.
It also had to be durable. Because there is no backend, the app treats the user's data as precious — with backups, recovery points, and CSV export so nothing is ever locked in or lost.
Challenge and solution
The hardest part was state: with no database, every profile, month, category, savings pot, and sinking fund lives in structured localStorage that has to stay consistent across monthly rollover and recurring items. I solved it with a single source-of-truth data model per profile, pure calculation functions that derive every summary figure on read, and a versioned backup/restore layer with recovery points so a bad edit is never destructive.
Core product decisions
Plan and track kept separate
Planning sets intended income, categories, savings, and sinking funds; tracking records what actually happened. The gap between them drives an honest “safe to spend” number.
Deterministic allocation engine
“This month's plan” distributes income in a fixed order — giving, essentials, sinking funds, savings, then free money — and confirms when the month is debt-free and covered.
Sinking funds with schedules
Known future costs get a target month and value, and the app computes the per-month amount required and whether each fund is on track or behind.
Private, portable data
Multiple passcode-protected profiles, plus JSON backup/restore with recovery points and CSV import/export, keep data private on-device yet never locked in.
What this project demonstrates
- Building a genuinely complex app in vanilla JS — no framework, no runtime dependencies.
- Designing a consistent client-side data model that survives monthly rollover and recurring items.
- Writing pure, testable financial calculations that derive every summary figure on read.
- Treating data durability as a feature: backups, recovery points, and open CSV/JSON formats.
Next improvements
- Optional encrypted cloud sync so profiles can move between devices.
- Richer analytics with historical trend charts across saved months.
- Shared budget rooms with per-member permissions.
- Automated test coverage around the allocation and rollover logic.
Product walkthrough screenshots
End-to-end flow from planning the month through the allocation waterfall, savings pots, sinking funds, and locally calculated tracking insights.








