back to work
01

Ledger

Every bank transaction pings you on WhatsApp within minutes, already categorized — and you reply in plain English to fix it.

Next.jsSupabasePlaidTwilioClaudeQStash

Why I built it

Existing finance tools do three things badly. They tell you nothing in real time — you have to remember to open an app. Editing a transaction means tapping through menus. And their auto-categorization is a coin flip that never learns. I wanted money to feel like a conversation: a message the second something posts, and a plain-English reply to fix it.

What it does

  • A WhatsApp message on every posted transaction, category already applied — no app to open
  • Reply in free text to recategorize, split, note, exclude, or attach a receipt; an LLM parses the intent, including combined actions like “travel and split half”
  • Three-tier categorization (Plaid → learned rules → LLM) with transfer and refund pairing that learns from your corrections
  • A web dashboard: period-aware spend / income / net-flow, live net worth, top merchants, 12-month trends, and a filterable transaction list
  • Realtime dashboard updates, and a per-transaction detail view with a split editor and the full WhatsApp conversation log

How it works

Two webhooks drive everything — Plaid for bank data, Twilio for WhatsApp replies. Each stores the raw payload, returns 200 immediately, and hands the real work to an HTTP job queue. From there every step — sync, categorize, pair transfers, notify, parse a reply — is its own idempotent, signature-verified worker with retries. The app is Next.js on Vercel; Supabase provides Postgres with row-level security, auth, realtime, and encrypted storage for Plaid tokens.

New transaction
Your reply

The web dashboard

overviewThe dashboard
this month · values illustrative
spent$2,418.37▲ 12%pace $3,200.00 by EOM
income$4,250.00▲ 5%$4,000.00 prior period
net cash flow+$1,831.63+$200.00saving · income covered spend
categoriesWhere it goes
this month
total$2,418.37
  • Rent$1,100.00
  • Groceries$412.30
  • Eating Out$296.40
  • Travel$255.67
  • Subscriptions$184.00
  • Other$170.00
trendsMonthly spend
last 12 months
AugJul
cash flowNet cash flow
last 12 months · spent − income
Aug burning savingJul
the climbNet worth
last 90 days
live · $12,345.67 · +$832.00 30d
receiptsTop merchants
top 5 by spend
United AirlinesTravel × 1$412.30
EquinoxFitness × 1$205.00
Trader Joe'sGroceries × 3$168.40
Con EdisonUtilities × 1$96.12
SweetgreenEating Out × 3$49.20
activityRecent activity
live via Plaid webhooks
Jul 4Trader Joe'sGroceries$84.20
Jul 3SweetgreenEating Out$16.40
Jul 3Venmo refundRefund+$28.07
Jul 1Blue BottleCoffee$6.75
Jul 1PayrollIncome+$4,250.00
one transactionThe detail view
split editor · notes · the paper trail
Trader Joe'sAmex Gold · ···1234
$84.20Groceries
no splitpercentfixedratio · 1/3
your share · $28.07 of $84.20
reimbursable — roommates owe two thirds
posted
Apr 23
category source
AI · 92%
last WhatsApp ping
2h ago · $84.20

The hard part

Every external event — a bank webhook, a WhatsApp reply — had to be acknowledged in under two seconds, survive being delivered twice, and never double-apply a change. So nothing runs inline: webhooks just enqueue, and each worker is idempotent and signature-verified with its own retry policy. The fiddliest bit was the pending→posted transition — re-notifying only when the amount moved more than 5% or the category changed, so you're not spammed for every pending charge that settles.

Status

Live at ledger.mananvyas.com, public repo, running on free / hobby tiers (~$3–10/mo, mostly Twilio). Built solo, then grew multi-user with per-user WhatsApp routing and QR-code pairing.