Building a Finance CLI with Claude Code
2025-11-15
I don't trust cloud finance apps with my data. Every budgeting app wants bank credentials, API access, or at minimum an account where my transaction history sits on someone else's server. Offledger is the opposite: a personal finance CLI that runs entirely locally. SQLite database in iCloud Drive, operated through Claude Code slash commands. No server, no cloud sync, no data leaving my machine. The entire financial history lives in a single file I control.
The insight that unlocked the project was realising Claude Code is already a sophisticated UI. Instead of building a web dashboard with charts and tables, I built slash commands: /import for bank CSVs, /categorise for AI-powered transaction tagging, /budget for planning against actuals, /context for understanding spending patterns in natural language. Want to know how much I spent on coffee shops in the last quarter? That's a natural language query over my own SQLite database, processed locally, with zero API calls to any external service. The AI reads the schema, writes the SQL, returns the answer.
The /categorise command is where the AI earns its keep. Bank transaction descriptions are notoriously cryptic -- "POS 4829 WHOLEFDS MKT" means nothing to a rule-based system without explicit mappings. Claude reads the description, infers the merchant and category, and applies it. First pass accuracy is around 85%. I correct the misses, and those corrections feed back into the prompt context for future runs. After three months of transactions, accuracy is above 95% for recurring merchants. The whole system improves from my corrections without any cloud training pipeline.
The trade-off is real: no collaboration, no shared budgets, no mobile app. For personal finance, I'm fine with that. I open the terminal, run a command, get my answer, and close it. The interaction model is closer to a calculator than an app. Financial tools have been over-designed for years -- dashboards with 40 widgets when all you need is "am I spending more than I earn" and "where is the money going." SQLite handles the storage, Claude Code handles the interface, and I handle the data. That's the entire stack.