Personal finance app, 2026

Sixpence

A ledger for income, budgets and savings goals that never asks for a bank login.

Role
Solo developer
Type
Personal finance app, 2026
Status
Live
The Sixpence budgets page: three active budgets with a marker for where an even pace would be today, one flagged as spending fast, and a past month that went over.
Sixpence / github.com / README image 17 Sep 2026
Problem

Finance apps want a bank login before they will show you anything, and the mid-month figure they show you is usually flattering: a running total this month set against a finished one last month, which always reads as progress. The honest alternative, a spreadsheet, tells you what you spent and never whether you are on pace to overspend.

What I built

Everything is entered by hand, so there is no bank connection to trust and nothing to leak. PHP 8 with no framework and no Composer dependencies, one entry point, prepared statements throughout, per-session CSRF tokens on every form, and five failed sign-ins locking an account for fifteen minutes. Budgets are pace-aware: they answer what is left per day rather than what is left in total, and month-to-date is compared against the same point last month rather than the whole of it. The PDF exporter and the SMTP client are written from scratch for the same reason as the rest, which is that there is then no dependency to audit. The interface works with JavaScript switched off.

How it works
  1. 1Every request enters through one file, public/index.php
  2. 2The router resolves a clean URL to a single page handler
  3. 3Session, CSRF token and ownership checked before any write
  4. 4Post, redirect, get, so a refresh never posts twice
  5. 5Schema migrations run on the first database connection
Result

Deployed and open to sign up for, with twelve display currencies, CSV and PDF export, and email and in-app alerts. A 68-test suite covers the money arithmetic, recurrence, migrations and the security properties, and runs against PHP 8.1 through 8.4 and PostgreSQL 16 on every push.

Stack

PHP 8, PostgreSQL, Chart.js, Docker