A keyboard-first viewer/triage tool for Lunch Money — get every transaction categorized fast, see where your money actually goes, and let Claude do the first pass for you.
Built by Raj (with Claude Code). Shared as-is — it's a personal tool, but a genuinely useful one.
- Transaction list with vim-style keys —
j/kto move, everything reachable without a mouse - Fast categorization — fuzzy category picker (
c), bulk-categorize every transaction from a payee at once (C), instant digit hotkeys1-9,0for your top categories - AI first pass — Claude proposes a category for every uncategorized payee; you just approve with
y(one) /Y(all from that payee) or reject withn - Spending analytics (
a) — category × month table for the last 6 months, plus Claude-written plain-English summaries of what was happening each month, plus a "most needs review" list - Amazon enrichment — import your Amazon data export and "Amazon $43.90" becomes "cat litter + USB cables", with item-aware category proposals (handles split shipments, digital orders, even foreign-currency orders)
- Filters/sorts for triage — uncategorized-only (
x), heaviest-outflows-first (o), month stepping ([]), payee search (/)
-
Get a Lunch Money account — lunchmoney.app (paid, has a free trial; it syncs your bank accounts via Plaid and has a great API). Then create an API token at my.lunchmoney.app/developers.
-
Run the app:
git clone https://github.com/rajlego/okane-public && cd okane-public npm install cp .env.example .env # then paste your token into .env npm run dev # → http://localhost:43117
Leave
.envuntouched to poke around against Lunch Money's mock server (fake data) first.Your token stays in
.env(gitignored) and is injected server-side by the Vite dev proxy — it never reaches browser code. -
Press
sto sync, then just drive with the keyboard. The help line at the top shows every key.
The AI scripts run on your Claude Code subscription via the claude CLI — no API key, no per-call cost. Install Claude Code, log in, then:
node scripts/suggest-categories.mjs # Claude proposes a category per payee → approve in-app with y/Y/n
node scripts/month-summaries.mjs # Claude writes what-happened-this-month summaries → shown in the analytics pane (a)- Request your data: amazon.com → Account → Request Your Information → "Your Orders" → confirm via the email they send
- When the ZIP arrives (hours–days), extract it to
data/amazon/in this repo (gitignored) node scripts/amazon-match.mjs— matches your card charges to actual items (exact amounts, split shipments, digital orders, FX for foreign Amazon sites) and upgrades the category proposals to item-level
| Key | Action |
|---|---|
↑↓ / jk |
move |
c |
categorize (fuzzy picker) |
C |
bulk categorize all loaded txns with same payee |
y / Y / n |
approve AI suggestion (one / all from payee) / reject |
1-9,0 |
instant-assign top ten categories |
r |
toggle reviewed |
u / x |
unreviewed-only / uncategorized-only filters |
o |
sort by date ↔ heaviest outflows first |
[ / ] |
step through months |
a |
analytics pane (spend split, summaries, needs-review) |
/ |
payee search |
s |
sync |
This runs locally. If you want to put it on the internet for yourself/others, don't deploy the static build as-is — your Lunch Money token would have to reach the browser. Put an authenticated serverless proxy in front (verify a login, hold the token server-side, forward requests). That's how Raj's hosted instance works.