Two things set PocketSmith apart from a spreadsheet: a calendar that lays recurring income and bills over each account to show the balance years ahead, and bank feeds that fill in the transactions. The forecast engine, with recurring rules, month-end handling, category rules and a few currencies, is a weekend for an agent on SQLite, and importing a statement file each month replaces the feed. The feeds themselves can't be copied: they come from aggregators with bank agreements. A personal version also has no mobile app.
Before you buildPocketSmith Free keeps 2 accounts, 12 budgets and a 6-month projection. If you only track one current account and one card, it may already be enough.
Build me a personal cash-flow forecaster to replace PocketSmith. Requirements: - Node.js 22 + TypeScript: Fastify with server-rendered pages (Eta) and a little vanilla JS. `npm start` serves http://localhost:4860. - Storage: better-sqlite3 in ./data/money.db: accounts (name, currency, opening balance), nestable categories, transactions (date, amount in minor units, payee, category, account, note), recurring events (account, amount, category, start date, rule: weekly, every N weeks, monthly on a day or the last day, yearly, optional end date) and category rules (payee contains or regex, then category). - Import: drop a CSV or OFX file on an account. CSV through `papaparse` with a column-mapping step remembered per account; OFX through `ofx-js`. Skip rows already stored (same date, amount and payee) and show "n new, m duplicates" before saving. Apply the category rules while importing. - Forecast engine: an account's balance on each day from its last real transaction up to 10 years ahead is the last balance plus the recurring events falling on that day. An event on a day a month doesn't have (the 31st) moves to the month's last day. One occurrence can be skipped or overridden. Unit tests for month-end, leap years and every-N-weeks rules. - Calendar: a month grid showing each day's expected balance and the bills due, coloured when the balance falls below a threshold set per account; click a day to add a one-off event. - Reports (`chart.js`): net worth over time, income against expenses per month by category, and a cash-flow table with months as columns and categories as rows, past actuals next to future projections. - Multi-currency: each account has its own currency, one base currency in settings, rates from the free Frankfurter API (https://api.frankfurter.dev) cached for a day in SQLite. - Single user. No accounts, no telemetry, local-first. Network only for exchange rates. - Out of scope: bank feeds, a mobile app, sharing with a partner, envelope budgets, investment tracking. - README: how to download statements from your bank, and a note that the forecast is only as good as the recurring events you enter.
Opens your agent with the prompt filled in, you press enter. Or copy it and paste it into an empty folder.
The first prompt builds the core. Run these one at a time in the same folder to grow it into your own PocketSmith.
Extend the cash-flow forecaster in this folder. Requirements: - Scan the last 12 months of transactions per account and propose recurring events: same payee (normalised), amounts within 5% and an interval of 7, 14, 28 to 31, or 365 days, at least 3 occurrences. - Show proposals on a page with the matched transactions; Accept creates a recurring event, Dismiss hides it for good. - Unit tests with synthetic data for weekly, monthly and irregular payees. - Update the README.
Add scenarios to the cash-flow forecaster in this folder. Requirements: - A Scenarios page where you copy the current recurring events into a named scenario and edit amounts, add events or end events without touching the real data. - The calendar and the net worth chart show the real forecast and one chosen scenario as a second line. - Deleting a scenario never changes real events. - Update the README.
Add alerts to the cash-flow forecaster in this folder. Requirements: - A daily job (node-cron) checks every account's projected balance for the next 60 days against its threshold. - If a day falls below, send one email per account via SMTP from .env with the day, the balance and the events that cause it; don't repeat the same alert within 7 days. - A Settings switch per account to turn alerts off. - Update the README.
The forecast only helps when transactions arrive on their own, and the bank feeds supply that. On top of it, the calendar turns known bills and pay days into a view of future balances that envelope-style trackers don't give.
Estimate · It runs on your own computer and the exchange-rate API is free. The build is token usage on your agent plan.
| Plan | Monthly | Annual, per month | What you get |
|---|---|---|---|
| Free | $0 | $0 | 2 accounts, 12 budgets, 2 dashboards, 6 months of projection, automatic bank feeds and manual imports. |
| Foundation | $14.95 | $9.99 | Unlimited accounts and budgets, 6 dashboards, 10 years of projection, 6 connected banks from 1 country, email support. |
| Flourish | $24.95 | $16.66 | Unlimited accounts and budgets, 18 dashboards, 30 years of projection, 18 connected banks from all countries, email support. |
| Fortune | $39.95 | $26.66 | Unlimited banks from all countries, unlimited dashboards, 60 years of projection, unlimited accounts and budgets, priority email support. |
Free covers 2 accounts, 12 budgets, 2 dashboards and a 6-month projection, with automatic bank feeds and manual imports.
Kinda. The core is a weekend build with the prompt on this page, but real gaps remain: Automatic bank feeds, from 6 banks to unlimited, across countries, The mobile apps.
About $14.95 a month on the Foundation plan, $179.40 a year (checked 2026-10-19).
Automatic bank feeds, from 6 banks to unlimited, across countries; The mobile apps; Collaborator access for a partner, family member or coach; Saved searches, attachments and dashboards you can switch between; Importers for other finance apps and bank file formats. If any of those matter to you, keep paying.
Yes: Actual Budget (open source), Firefly III (open source), Sure (open source).