← All experiments Personal experiment · Beta Refinement

M²W²

A from-scratch replacement for a 13-year-old family finance spreadsheet — and a hands-on lab for full-stack and applied-AI development.

Node.jsExpressMySQLAngularLocal LLM (Ollama)

Overview

M²W² replaces a thirteen-year-old household finance spreadsheet with a real application—and doubles as a hands-on testbed for full-stack and applied-AI development. It is a personal experiment now transitioning from parallel use toward becoming the household’s financial source of truth.

The problem

A household builds its own private taxonomy for money over time — this is a “want,” that’s a “need,” this vendor is actually three different kinds of purchase depending on what was bought. A thirteen-year-old spreadsheet had absorbed all of that judgment into a tangle of formulas that only made sense to the person who wrote them, which meant every fix required understanding the whole history of decisions that came before it.

A generic budgeting app doesn’t solve this, because the taxonomy isn’t generic — it’s specific to how one household actually thinks about its own spending, and no off-the-shelf category list matches that.

The idea

Rather than force spending into somebody else’s categories, M²W² keeps a household-specific hierarchy — Major, Minor, Sub1, Sub2 — as the foundation, and uses a small local model for the one part that’s genuinely tedious: reading a new transaction and guessing where it belongs in that hierarchy. The bet was that categorization is a good AI problem and arithmetic is not, so the model never touches a dollar amount, only a label.

How it thinks

Financial categorization flow — how a raw transaction becomes a categorized, explainable line item.
Diagram

Financial categorization flow — how a raw transaction becomes a categorized, explainable line item.

Each imported transaction first passes through the household’s saved alias rules. Familiar merchants take the deterministic path; unfamiliar transactions are sent to the local model for a suggested category. Human review resolves the remaining uncertainty, while SQL—not the model—remains responsible for every total computed downstream.

In practice

Reasoned detection of the category a given transaction belongs in and providing the user an opportunity to save similar transactions to the same category at a later time.
Screenshot

Reasoned detection of the category a given transaction belongs in and providing the user an opportunity to save similar transactions to the same category at a later time.

The import workflow lets a user review each proposed classification and preserve recurring merchant behavior as an alias. Once saved, future matching transactions can bypass model reasoning and follow the known rule immediately.

From notebook to product

An early sketch of the manual transaction-classification problem—and the first question that led to aliases and local model reasoning.
Notebook

An early sketch of the manual transaction-classification problem—and the first question that led to aliases and local model reasoning.

Lessons learned

The categorization model was never the hard part — it’s right often enough to be genuinely useful. The hard part was everything the spreadsheet had been quietly handling for thirteen years without anyone noticing: credit card payments that aren’t really expenses, transfers between accounts that look like income, the same vendor meaning three different things depending on context. Replacing a spreadsheet means replacing all its undocumented judgment calls, not just its formulas.

What’s next

The next test is operational rather than architectural: whether the import-and-correction workflow remains disciplined once the spreadsheet is no longer available as a fallback.

Sole developer — backend, frontend, AI integration, data model — Andy Markowitz