← Back to Projects

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.

Vanilla JavaScriptNo frameworklocalStorageFinancial calculationsCSV / JSON backup
Budget & Savings dashboard with monthly summary cards

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.

Planning view with monthly income and tithe
Planning starts with income so every budget and savings figure can be checked against available money.
Budget categories with budgeted vs actual
Budget categories compare planned commitments against actual spend, with a running total and difference.
Savings allocation across pots
Savings allocation sets aside income across named pots and priorities for the month.
Sinking funds with target month and monthly requirement
Sinking funds schedule known future costs and compute the monthly amount needed to stay on track.
This month's plan allocation waterfall
The allocation waterfall distributes income in order and confirms when the month is debt-free and covered.
Monthly insights and tracking view
Tracking surfaces locally calculated insights — savings rate, unallocated income, and upcoming planned costs.
Actual spending against plan per category
Actual spending compares logged purchases against each category's plan, with per-category progress bars and remaining amounts.
Monthly summary with where-the-money-went donut chart
The monthly summary reviews giving, saving, spending, and cash remaining, with a hand-built donut chart breaking down where income went.
Savings goals progress tracking
Progress view tracks longer-term savings goals with targets, monthly contributions, and estimated completion.