Dispatch № 09 · pennybox
Pennybox
Local-first, plain-text personal finance toolkit
- Python
- pytest
- CLI
- Markdown
A personal finance toolkit that stores money as plain-text Markdown ledgers — readable in an Obsidian vault, diffable in git, and parseable by code — with no vendor database and no runtime dependencies.
By the numbers
- Kept financial records vendor-neutral and git-diffable via a zero-runtime-dependency Python package parsing Markdown ledgers into typed models, verified by 18 tests across parser, store, importer, and report paths.
- Removed cross-tool reconciliation by collapsing 3 incompatible bank export schemas into one transaction model behind a 6-command CLI with JSON output.
Why plain text
Every finance app eventually locks your history inside its own database. Pennybox inverts that: transactions live in Markdown tables you can read, edit, and version in git. The same file renders cleanly in Obsidian and parses deterministically in Python, so the data outlives whatever tool reads it.
Zero runtime dependencies
The package is standard library only — re, decimal, pathlib, datetime, argparse. Money is Decimal end to end, never float, so cents never drift. That constraint keeps the install trivial and the supply chain empty, which matters more for financial records than for most software.
Importers
YNAB, Origin, and Rocket Money each export a different CSV shape with different column names, date formats, and sign conventions for debits. Normalizing importers collapse all three into one Transaction model, so downstream reporting never has to know which bank a row came from.
Interface and testing
A 6-command CLI covers report, accounts, balances, transactions, add, and import, with JSON output so it can be scripted or driven programmatically. 18 unit tests cover the parser, store, importers, and reporting paths, and the whole suite runs in under a tenth of a second.