AI-native personal finance tool. Connect your bank via Teller or upload CSVs (Chase, Amex, Venmo), get AI-powered categorization, and see where your money goes.

The tool handles the boring part — syncing transactions from banks + Venmo and classifying them with AI. Once your data lands as structured rows, you build whatever you want on top.
The feedback loop is the key insight: more data + prompt refinement = better classification over time.
- Overview page — Monthly burn at a glance. Stacked bar chart color-coded by category over 12 months. Click any month to drill down to individual transactions with AI reasoning.
- Ask Agent — Chat with your financial data: "what did I spend on travel last quarter?", "am I on track for my savings goal?"
- Settings — Classification prompt editor, category management with color swatches, Teller bank connection, CSV upload.
Once your transactions are classified, the structured data is yours to build on:
- Find & cancel subscriptions — "Which recurring charges haven't I used in 3 months?"
- Budget guardrails — Cron that texts you when a category exceeds your monthly budget.
- Smart digest emails — Weekly email: "You spent $X this month, up 15% from last month."
- Custom automations — Val Town crons + Claude + your categorized data = any workflow.
- Remix this project on Val Town.
- Set
ANTHROPIC_API_KEYin Settings > Environment Variables (anthropic.com). - Open the dashboard. Upload a CSV (Chase, Amex, Venmo) or connect a bank via Teller.
- Hit Preview Classification on the banner to categorize transactions with AI.
Set TELLER_APP_ID to enable automatic bank sync. Get a free App ID from teller.io (free up to 100 accounts, no credit card required). Sandbox mode works without mTLS certificates — just use the test credentials shown on the Settings page.
For production bank connections, you'll also need TELLER_CERT and TELLER_KEY (mTLS certificate PEMs from Teller's dashboard).
AI classification — Claude Haiku batch-classifies uncategorized transactions using Anthropic tool use with JSON schema enforcement. The category field is constrained to an enum — no hallucinated categories possible.
Interactive flow:
- Click "Review & Classify" banner — drawer opens with unclassified transactions
- Review/edit the classification prompt — click "Preview Classification"
- Review results with color-coded category pills + confidence scores
- Edit prompt inline and "Retry" or "Approve All" to commit
Default categories: Housing, Food, Transportation, Shopping, Entertainment, Health, Subscriptions, Bills, Travel, Investments, Transfers, Salary, Income, Gifts, Other
Customizable on the Settings page — add, rename, reorder, assign colors, or remove categories. Removing a category sends its transactions back to unclassified for re-review. Manual overrides on individual transactions are never re-classified.
| Source | Provider | Cost | Best For |
|---|---|---|---|
| Banks & credit cards | Teller | Free (up to 100 accounts) | Chase, BofA, Amex, etc. |
| CSV upload | Built-in | Free | Any bank, manual import |
| File | Type | Purpose |
|---|---|---|
app.ts | http | Dashboard, settings, API routes |
db.ts | script | SQLite schema, config helpers, default categories |
lib.ts | script | Formatting, HTML shell, category colors, Settings JS |
classify-engine.ts | script | LLM classification engine (tool use with JSON schema) |
classify-ui.ts | script | Classification drawer UI |
classify.ts | interval (daily) | Thin cron wrapper — calls runClassification() |
sync-engine.ts | script | Teller mTLS sync logic |
sync.ts | interval (15min) | Thin cron wrapper — calls runSync() |
- Teller: Free (up to 100 accounts)
- Claude Haiku: ~$0.01/day for ~100 transactions
- Val Town: Free tier works for personal use