Summary
Off: this dashboard shows your actual income, expenses and savings only. On: actuals are compared with the plan (projected).
Cumulative balance β actual
Monthly income vs expenses β actual
By category Β·
Daily spending Β·
Month by month
| Month | Income (plan) | Expenses (plan) | Predicted net | Actual net | Variance | Predicted balance | Actual balance |
|---|
Edit a month β planned & actual
Copy actions copy recurring planned income/expenses only β one-offs are never copied. Changes save automatically. In the Actual view, expense fields for a month with daily-log entries come from the daily log rollup (see Daily expenses) and are shown read-only there.
Daily expenses
Add what you actually spent, each day. The category fills in automatically (Gemini when a key is set, otherwise keyword rules) and you can always override it. Each month's daily total rolls up into that month's actual expenses. Sharing an expense (roommate, friends)? Fill in My share with just your portion β actuals count only that; the split itself lives in Splitwise.
Credit cards β statement cycles
A credit card bill is due in a later month β and often a different paycheck β than the spending itself. Add each card with its statement start and end dates: expenses you tag with that card on the Daily expenses tab and that fall inside the statement window group here, and their total is the estimated statement balance for that cycle.
Add a card
Settings
Gemini auto-categorization
Checkingβ¦
Two ways to configure the key: paste it here (stored only in the database, used only by the categorize function, and never displayed again β you'll see just its last 4 characters), or set the GEMINI_API_KEY secret on the Cloudflare Pages project, which takes precedence. Without any key, categories fall back to keyword rules. Never commit a key to git β see the README for how to get one and how to restrict it.
Security β access code & devices
Your budget is protected by an access code. Each device that signs in gets its own session (90 days, renewed as you use it) β revoke any device here and it is signed out immediately. Changing the code signs out every other device.
Automation (Plaid sync)
To connect the automatic expense sync, open a pairing window and give the one-time code to the sync script. The code works once and expires in 10 minutes. A paired script can only add and list expenses and update card statement dates β it can't read your plan, change settings, or manage devices β and it stays paired for 180 days.
Automation pairing request
Plaid sync asked to connect on .
Fingerprint: β approve only if the sync script printed exactly this. Approving adds it below as a sync session; it never sees your access code, and you can revoke it any time.
Signed-in devices
Your data
Export JSON (in the Month editor tab) downloads everything β plan, actuals, daily expenses, credit cards and baseline. Import JSON restores it, saving through the database when in Database mode; older exports without cards still import fine. The exported file is named budget-data.json and is git-ignored by design.