What this series is
A step-by-step build log of the pipeline that runs my household's finances. Each part has a short video, the text to read instead, one diagram, and a few minutes of audio for the walk. The code is in the repo; the mistakes are in the text.
The eight parts
1The pictureStart here. Why a household needs an ETL pipeline, and the shape of the one I built.
2The boxA Hetzner VM, Docker Compose, Postgres, Metabase, and Caddy, provisioned in an hour.
3Landing the dataPull the budget from the YNAB API and store every response as it arrived, forever.
4ModelingNormalized tables, soft deletes, and pure SQL transforms that can be replayed.
5The hourly loopA shell script, a systemd timer, sealed secrets, reconciliation, and the four-day outage.
6Seeing itDashboards defined in SQL, plus the FIRE layer that turns balances into dates.
7Acting on itThe cadenced action system and the Signal bot that puts it in the family group.
8Asking itA local model over a read-only tool server, and what comes next.
Principles that held
- Land raw first, append only, replayable.
- Transform in pure SQL, idempotently, inside one transaction.
- One read-only role for everything that reads.
- Reconcile on every run and make drift loud.
- Secrets sealed in files the process can read and nothing else can see.
- Dashboards and checks are code, applied the same way as the schema.
Audio · 2 minWhy I am publishing this