Budgitt
A self-hosted household budget and 13-month cash-flow forecasting app that replaced my long-running Excel workbook, with a spreadsheet-style budget grid, loan and interest modelling, statement import and an AI assistant connector.
The centrepiece is the Budget Grid, a dense, spreadsheet-like view where any cell can be clicked and edited, with income, outgoings, net and running balance along the footer. Around it sit a forecast overview with a cash-flow calendar, goals, and a Monthly Review that measures a locked month against its locked plan. Each account uses one of four interest models (amortising loan, compound, revolving credit and simple), and loans get a life-of-loan amortisation ledger.
Bank statements can be imported from CSV, with transactions categorised by learned rules, and insights flag things like subscription price increases. Budgitt also exposes an MCP server, so an AI assistant can read accounts and forecasts, import a statement after showing a preview, and help categorise transactions.
Case Study
The Challenge
A household budget spreadsheet answers one question in every cell, what number should I show here, but the answer depends on whether money has actually moved, whether I have manually adjusted that month, or whether it comes from a recurring rule, and it has to stay right as rules change, interest accrues and statements arrive. Getting that into a web app without losing the speed and density of a spreadsheet, while keeping money exact, keeping each household's data separate, and modelling real debts such as mortgages, credit cards and family loans accurately, was the hard part.
The Solution
I built it on Laravel 13 with Inertia, Vue 3 and PrimeVue, organised into bounded contexts with domain and application layers and decisions recorded as Architecture Decision Records. Every cell read goes through a single forecast resolver with three layers of precedence (Actual, then Override, then Rule), and architecture tests enforce that nothing reads transactions, overrides or rules around it. Money is never a float: amounts use Brick Money and integer minor units, with an architecture test forbidding floats in the domain. Households are the tenancy boundary through a global scope, model writes that touch money are audit-logged, and a payday-aware MonthKey type is the only way months are represented. The codebase is test-driven with Pest, Vitest and Playwright, PHPStan at level 8 and a 90% coverage gate, and the MCP server authenticates assistants with OAuth via Laravel Passport or personal access tokens.
The Outcome
Budgitt is in use as my own household budgeting tool, deployed to an OVH server managed by Ploi with every merge to main deploying to production, and versioned releases generated by release-please (currently in the 2.x series). It remains in active development and is a private, invite-only app rather than a public product.
Technologies Used
More Projects You Might Like
Jetboost.tech
An all-in-one platform for UK tradespeople, sole traders, small businesses and clubs: customers, quotes, jobs, invoicing, payments and bookings in one app, with VAT, CIS and the domestic reverse charge built in.
The Peters Collection
An archive management and image licensing platform for a collection of vintage photographs by John Peters, spanning the 1960s to the early 2000s, with a searchable public gallery, protected images and online licence sales.
Nowvella
A web-based manuscript editor for long-form fiction, built as a modern, more detailed take on the desktop tool Manuskript, with an outline, story bible, revisions, export and an MCP server for AI assistants.