Back

Pachi

Pachi is a personal finance app built around an agent. It reads my ledger every morning, flags what changed, answers questions about my money and handles the categorizing. I review its work: every figure traces back to a transaction, and every change it makes can be undone.

Role

Solo-built

Tools

Claude Code
Claude Agent SDK
Braintrust
Timestral

Stack

React
TypeScript
Hono
SQLite
Plaid

Timeline

June 2026 – present

Why I built this

v1 replaced the budget spreadsheet I updated every Sunday, but it only looked backward. It could show where my money went. It couldn't answer what I actually wanted to know, like whether I could afford a trip to Peru in April while maxing out my ESPP. Its advisor read a precomputed snapshot, so it could only answer questions I had anticipated in a database trigger.

For v2 I started from the question instead of the dashboard. The app is a set of tools that the agent and I share, over one ledger on my laptop: two years of statements, a daily bank sync, my net-worth spreadsheet and Venmo memos from Gmail. That changed the division of labor. Pachi does the routine work, and I review it. The Decide tab below shows it answering the Peru question.

What it can do

Questions in plain language, answered from the ledger. The model chooses the tool and describes the chart, and the server computes every figure. The answer adds context a raw list wouldn't, like separating recurring spending from a one-off home project.

What I see in Pachi

What were my top merchants last quarter?

Last quarter I took as Jul 1 – Sep 30. Rent to Northwind dominates it, at $5,550 of the $9,710 total, which is more than half and works out to $1,850 a month.

Top merchants, Q3 2026

  • NORTHWIND RENT$5,550.00

    57% of the total

  • VERDANT GROCERS$861.62

    9% of the total

  • WILLOWWOOD FURNISHINGS$423.00

    4% of the total

  • HEARTH & HANDLE HARDWARE$420.50

    4% of the total

  • CITY POWER & LIGHT$350.90

    4% of the total

  • GOLDEN GINKGO KITCHEN$275.95

    3% of the total

  • SUMMIT FUEL STOP$261.02

    3% of the total

  • SALT & SPOON BISTRO$223.82

    2% of the total

  • SWIFTBITE DELIVERY$217.58

    2% of the total

  • LATTICE INTERNET$209.97

    2% of the total

  • Other$916.00

    9% of the total

Jul 1 – Sep 30, 2026 · 14 more groups are folded into Other.

Below rent, Verdant Grocers is the only recurring habit that stands out at $862. Willowwood Furnishings ($423) and Hearth & Handle Hardware ($420.50) look like a home project, about $843 together, so they probably won't repeat.

  • Drawing a chart · Jul 1 – Sep 30, 2026

What Braintrust logged

Trace/chat turn
Duration 8.32sTokens 105,577Est. cost $0.144
chat turn8.32s
Claude Agent8.32s
anthropic.messages.create52.5k tok
pachi/query_chart2ms
anthropic.messages.create53.1k tok
pachi/query_charttool
Duration 2msStart +4.17s
Input
{
  "from": "2026-07-01",
  "groupBy": "merchant",
  "title": "Top merchants, Q3 2026",
  "to": "2026-09-30",
  "top": 10,
  "type": "bar"
}
Output
"Top merchants, Q3 2026" — total $9,710.36, Jul 1 – Sep 30, 2026:
Drawn as a bar chart of spend.
NORTHWIND RENT: $5,550.00
VERDANT GROCERS: $861.62
WILLOWWOOD FURNISHINGS: $423.00
HEARTH & HANDLE HARDWARE: $420.50
CITY POWER & LIGHT: $350.90
GOLDEN GINKGO KITCHEN: $275.95
SUMMIT FUEL STOP: $261.02
SALT & SPOON BISTRO: $223.82
SWIFTBITE DELIVERY: $217.58
LATTICE INTERNET: $209.97
Other: $916.00
Notes shown on the card: 14 more groups are folded into Other.
The card shows these figures; don't repeat them as a list. Say what the chart shows — the trend, the biggest slice, the outlier — in a sentence or two.
Cards drawn: c1 (Top merchants, Q3 2026). To show one, write [[card:<id>]] alone on its …

Key decisions

  1. One chat, and Pachi can start it

    Pachi only responded when asked. I wanted it to surface things on its own, like a fund falling behind or charges sitting in review, without turning into a stream of notifications.

    • Chosen: An agent that posts into the main chat

      Each morning an agent reads the ledger with the same tools the chat uses and posts a few insights, or none. The server verifies every figure against the agent's own tool results and tracks what it has already said. Clicking an insight lets me ask how it was calculated, and the answer draws on the queries that produced it.

    • Rejected: A rule-based daily digest in its own thread

      I built this first. It could only report the four patterns I had written rules for, in fixed sentences, in a separate thread I had to remember to open. I replaced it the next day.

    • Rejected: An insights feed above the chat

      Another surface to check, which defeats the purpose.

    From Pachi · Today, 9:00 AM

    Apartment Refresh is $329 over its $800 budget

    The project has $1,129.20 tagged across 5 charges against an $800.00 budget. The September Willowwood and Hearth & Handle charges were most of it. Home & Furnishings is also $85.70 over its monthly limit in October.

    October income hit $9,368, $3,119 above a normal month

    A lump month like May: net is $5,582.22 so far against a $3,310.80 normal month. Spend is $3,785.82, up from $3,831.82 in September and well above the $2,889.72 to $2,978.96 of April to August. The Emergency Fund sits at $7,000 of $15,000.

    Dining and groceries are understated: $89.40 sits in review

    Six charges are waiting in the queue and count in no total, including $89.40 at Harborline Oyster Bar and $87.55 at Verdant Grocers. Five of the six have no category guess. Groceries show $83.35 left, which the queue could shrink.

    Wedding fund is $70.91 behind with the wedding Nov 19

    $420.00 is saved of $600.00, and $180.00 a month keeps it on schedule. The $250.00 banquet hall deposit on Oct 26 has already come out of it. The balance is $170.00.

  2. The dashboard reports, the ledger corrects

    There were two nearly identical transaction tables, one under the dashboard and one on a Review tab. The dashboard was trying to be both a summary and a workspace.

    • Chosen: One Ledger for corrections, a dashboard for insight

      The dashboard became a set of cards that explain what changed and why. The Ledger is the one place to fix things, with rows awaiting review pinned at the top.

    • Rejected: Keep both tables

      Two places to fix the same row, and a dashboard that still required reading every line.

    • Rejected: Handle corrections in chat

      Works for one charge, not for fifty, and there's no view of what's left.

    Pachi's dashboard for October: total spending, spotlight, net income and budget cards, with an Ask Pachi card
  3. Pachi posts what it's confident about

    Imported charges counted toward spending before anyone had checked them, but reviewing every charge by hand is the work I wanted Pachi to take over.

    • Chosen: A holding pen above the ledger

      Charges Pachi categorizes with high confidence post automatically. The rest wait above the ledger, outside every total, as a finite list to clear. I only see the judgment calls.

    • Rejected: A review flag on every transaction

      Every query, now and forever, has to remember to skip flagged rows. One omission is a silent wrong number.

    • Rejected: Triage them in chat

      Fine for five rows, unworkable for fifty, and impossible to pick back up tomorrow.

    Pachi's Ledger: seven rows awaiting review pinned above four pending holds
  4. The model never types a number

    Chat could draw nine fixed card types. Anything else, like coffee by month or one card against another, came back as a paragraph.

    • Chosen: The model describes the chart; the server computes it

      A small query grammar for what to measure, how to slice it and how to draw it. The server supplies every figure, so any number in chat traces back to the rows behind it.

    • Rejected: Let the model send the data points

      A wrong chart does more damage than a wrong sentence, and nothing would check the figures.

    • Rejected: Let the model write SQL

      It could skip the rules for splits and overrides, and it means running generated code next to live bank tokens.

    Chat chart card: Food and Drink subcategories by month in 2026, as stacked bars with a total for each subcategory and an Add to dashboard link
  5. A sandbox for open-ended questions

    The chart grammar covered common questions, but every new one meant adding a measure. I spent ten days doing that, one question at a time, and anything outside the grammar still came back as a table with the arithmetic done in the model's head.

    • Chosen: A temporary sandbox for each chat turn

      Each turn gets a fresh database populated with what Pachi's services have already computed, never raw tables and never the live ledger. The agent can run any query, create what-if tables and chart the result, and the SQL is attached to the card so I can check it. The chart grammar remains the faster, tested path for common questions.

    • Rejected: Keep adding measures

      Each is safe and tested, but each covers one question. The list never catches up.

    • Rejected: Let it run SQL on the live ledger

      The rules for splits, refunds spread across months and payroll live in code. Queries on raw tables would re-derive them inconsistently, leaving two definitions of spending.

    • Rejected: Hosted code execution

      It would send my transactions to a remote container, which rules it out.

    Do I spend more on weekends than on weekdays? Chart my average spend per day for each, by month since April.

    Weekdays cost you more per day in six of the seven months. Typical weekends run about $20–$55 a day against $110–$150 on weekdays.

    Average spend per day: weekdays vs weekends

    $0$100$200$300AprMayJunJulAugSepOct
    WeekdayWeekend

    Total spend on weekdays (Mon–Fri) and weekends (Sat–Sun) in each month, divided by the number of such days in that month, April–October 2026 (October through the 30th), by posted date.

    August is the exception, and it's rent timing. The $1,850 rent posted on Saturday, Aug 1, which lifted that month's weekend figure to $231.56 a day. Without it, weekends would have been about $46 a day. Weekdays that month dropped to $30.84, probably because rent lands on a weekday in the other months.

    Weekday spend is also climbing, from $111 a day in April to $152.70 in October (through the 30th). That's the larger pattern to look at, more than anything about weekends.

    I used each charge's posted date, so bills count on the day they hit your account. Daily averages divide by calendar days, not days with a charge.

    • Query data
    • Query data
    • Query data
    • Chart data
  6. A forecast learned from my own net worth

    The net worth card's future was one line, compounded from assumed growth rates and an average monthly contribution. Nothing in it came from my actual net worth, and a single line two years out implies a precision nobody has.

    • Chosen: Mistral's Timestral, run locally

      An open-weights time-series model reads three years of my snapshots on my laptop and returns a median with likely and possible ranges. In a backtest, its 12-month ranges caught 83% and 50% of outcomes, almost exactly their targets, though its median ran below the simple drift model. I chose it for the honest ranges and kept drift as the fallback. A what-if from chat now shifts the forecast instead of modelling a separate future.

    • Rejected: Keep the projection and add a band

      The band would only be the spread between my own assumptions, not a probability.

    • Rejected: A statistical fan from my own history

      Drift and volatility fitted to my snapshots: pure code and easy to explain. I built it anyway, as the yardstick for everything else and the fallback when the model can't run.

    • Rejected: A hosted forecasting service

      It would send my net worth off my laptop, which rules it out.

    Net worth card: history to late 2026, then a forecast to November 2028 drawn as a median line inside likely and possible ranges
  7. Every change is reversible and recorded

    An agent that can write to my books will sometimes write the wrong thing. Mistakes needed to be easy to undo and easy to explain.

    • Chosen: Undo on every write, plus an audit log

      Every write from chat returns with its own Undo, and every change is recorded with who made it, when and why. Pachi can tell me whether a charge was categorized by me, a rule or the model.

    • Rejected: Have the model ask before every write

      A prompt rule is least reliable on the turn that matters most, and constant confirmations train me to approve without reading.

    • Rejected: Give the agent a shell

      Every command becomes available to get one job done.

    Ledger rows with a toast reading Voided wanderlust gear, and an Undo button

Check it out