← Projects
web app2026

Ledger.

Reviewing a few thousand transactions without hating it.

Running personal and business spend across a stack of cards means thousands of transactions a year, and none of the off-the-shelf tools let me tag them fast enough to keep up. This one is built for one person and optimized for speed, because the only version of this that works is the one I actually keep current.

01

Built around the keyboard

Review has two modes. Detail mode gives one transaction at a time with type, card, category, tags, notes, and a points multiplier, all reachable without touching the mouse: arrows for type, number keys for category, letters for tags, enter to save and advance. Swipe mode strips it down to a single field per card for when there is a backlog to burn through.

Ledger's review screen with the keyboard shortcut overlay open over a transaction being categorized as personal or business.
Every field is a keystroke away.
02

Statements in, transactions out

Drop in an Amex PDF or CSV and it parses the file, works out which card and closing date it belongs to, stores the original, and inserts the transactions. Re-importing the same statement doesn't duplicate anything. Refunds can be linked back to the original purchases they reverse, including the messy case where one credit reverses items from several different charges.

The statements page with a drop zone for PDF and CSV files, plus lists of missing, upcoming, and imported statements.
Card and closing date are detected from the file.
03

The rules that decide the next application

It computes Chase 5/24, Amex 2/90, and the Amex five-card limit from the portfolio itself rather than from a note somewhere, alongside total credit extended and what the annual fees add up to.

The cards page showing Chase 5/24 and Amex 2/90 counters, the Amex card limits, and totals for credit extended and annual fees.
Computed from the portfolio, not a note somewhere.
04

Credits that would otherwise expire

A calendar tracks recurring credits, subscriptions, and memberships on monthly through annual cadences, and marks them used by matching them against real transactions. Some credits never show up as a transaction, so there is a manual override for those rather than pretending the automation catches everything.

The credits calendar listing recurring credits with the merchant pattern each one matches, days remaining, amount, and a mark used button.
What's still left to claim this month.
Built with
Next.js·React·TypeScript·Tailwind·Postgres·Drizzle·Neon
Notes

Single user and gated behind Cloudflare Access, since it is a complete picture of my finances.