Stash
A companion dashboard for Actual Budget, covering the views the ledger itself does not surface: what each obligation still needs this month, where the money should go next, and what the debt actually costs.
The boundary
Actual Budget owns the ledger. Stash reads and writes it through the Actual API rather than reaching into its database, so there is one writer and one schema owner, and an Actual upgrade cannot silently break the dashboard’s assumptions. Dashboard-only state, tax assignments, project reserves, the debt annotation log, lives in a separate SQLite file that Actual never sees. The dependency runs one way: Stash reads and writes Actual, and Actual never touches Stash.

Obligations before wants
Categories are annotated with template rules that classify them as obligations or flexible spend. Funding a month walks the obligations first and reports what is left, which turns budgeting from an arithmetic exercise into an ordering decision. Where a category is bound to a schedule, the due date drives the ask.

Ingest, then confirm
Bank notifications are captured and parsed into proposed transactions with a merchant, an amount, and a mapped account. Nothing posts on its own: a parsed row sits in a review queue until it is confirmed, rejected, or marked duplicate. Where a rule does not match, the row says so and asks. The parser is per-institution and imperfect by design, which is exactly why the review queue sits in front of it.

Stack
Next.js in an Nx workspace, React front end with API routes, the Actual API client in companion mode, and SQLite for dashboard-only configuration. Containerised and deployed to the home lab beside the Actual sync-server it reads, behind single sign-on.