ideas.
April 28, 2026 3 min read webconsumerfinanceprivacy

Local-first personal finance tracker

A browser-based finance tool that imports bank CSV exports, auto-categorizes transactions, and shows spending trends — no account linking, no cloud, no subscription.

The idea

A single-page web app that runs entirely in your browser and never sends your financial data anywhere. You export a CSV from your bank, drag it in, and the app categorizes each transaction, tracks budgets per category, and shows monthly trend charts. All data lives in IndexedDB on your machine. A second bank? Import another CSV and the app merges the transactions into one ledger.

Why build this

Most personal finance tools require either connecting to your bank via Plaid (which charges per user and has had repeated data-handling controversies) or paying a subscription for something like YNAB. The percentage of people who actually want to link their live bank account to a third-party app is smaller than the market assumes — privacy-conscious users, people with non-US banks, and anyone who was burned by a Mint shutdown just want to work from exports.

Every major bank already supports CSV or OFX export. The friction point isn't getting the data; it's having a lightweight tool that handles the messy reality of bank CSVs — inconsistent date formats, varying column names, duplicate transactions from overlapping export windows — without requiring you to write a spreadsheet formula.

Stack sketch

  • Framework: SvelteKit compiled to a fully static site. Deployable as a single folder on any static host or opened directly via file://.
  • Local storage: Dexie.js over IndexedDB — structured queries, cursor support, adequate for tens of thousands of transactions without perceptible lag.
  • CSV parsing: PapaParse with auto-detect headers; OFX via a small custom parser (the format is SGML-like and documented well enough to handle in ~200 lines).
  • Categorization: A rule engine where each rule is {pattern: /regex/, category: "Groceries"}. Rules run in order; first match wins. The user adds and reorders rules from a dedicated UI. No LLM dependency in v1 — regex patterns alone handle 80–90% of real transactions accurately for anyone willing to spend 15 minutes tuning their ruleset.
  • Charts: Chart.js — bar charts for monthly spending per category, a line chart for running balance over time.
  • Backup: JSON.stringify of the full Dexie database, downloadable as a single file and re-importable on a new device.

Scope for v1

In: - CSV import with header auto-detection; let the user map columns (date, description, amount) once per bank format, then save the mapping by bank name for future imports. - Duplicate detection based on date + description + amount hash, so re-importing an overlapping export range doesn't create phantom transactions. - Rule-based categorization with a built-in starter ruleset covering common payee name patterns and a full rule editor. - Monthly budget targets per category with a simple over/under indicator on the dashboard. - Three views: transaction list with search and category filter, monthly category breakdown, and a 12-month spending trend chart. - JSON backup and restore. - No login, no server, no outbound network calls.

Out of v1: - OFX/QFX import (add in v1.1 once the CSV path is solid). - Multi-currency support. - Recurring transaction detection or subscription tracking. - Any multi-user or shared-budget concept.

Where it could go

The most-requested follow-on will be OFX/QFX support — direct bank exports in these formats avoid the column-mapping step entirely because the schema is standardized. Adding a parser turns the import flow from "map your columns" to "drag and done" for users whose banks support it, which dramatically lowers the onboarding friction.

After that, LLM-assisted categorization becomes worthwhile: send the uncategorized transaction descriptions to a local Ollama instance or the Claude API, get category suggestions back, and let the user approve them as permanent rules. This keeps the default experience fully offline while giving power users a faster way to handle edge cases — no training data, no model, just a one-shot API call that writes rules rather than replacing the rule engine.

Watch out for

The column-mapping step for CSV imports is the highest-friction moment in the entire flow. Bank formats vary wildly — some use "Transaction Date", some use "Date", some split debits and credits into separate columns, some encode amounts as negative numbers. If the mapping UI is clunky, users will bounce before they see any value. Auto-detect common formats by heuristic, show a live preview table immediately after upload, and let the user fix the mapping with instant feedback on how the first ten rows parse.