v1.2.0 — Savings & Debt Linking, Transfers, Inline Editing, Mobile Nav, Docs
What's new in v1.2.0
Highlights
Savings bucket allocation — allocate a paycheck or any credit transaction across multiple savings goals in one step. Contributions are linked back to the source transaction for a full audit trail.
Savings withdrawal linking — when you spend from a savings goal, link the debit transaction to that goal so your savings balance and transaction history stay in sync.
Debt payment linkage — link any expense transaction to a debt. Tally records the payment against the balance, creates a payment history entry, and auto-categorises as "Debt Payment". Unlink at any time to reverse.
Transfer workflow — record money moving between your own accounts as a transfer. The FAB on Transactions now has an Expense / Transfer toggle. Transfers create a matched debit-and-credit pair and are excluded from budget calculations.
Transfer pair linking — link two existing transactions as a transfer pair after the fact (and unlink them if needed).
Inline category editing — click the category cell on any transaction row to change it immediately, without opening an edit form.
Bulk category update — select multiple transactions and set their category in one action from the bulk action bar.
Sortable transaction columns — click Date, Account, Amount, or Status headers to sort. Direction toggles with each click.
Closed account status — mark an account as closed instead of deleting it. Closed accounts are hidden by default and shown in a collapsible section; you can reopen them at any time.
Mobile navigation — hamburger menu and slide-in drawer on small screens. Desktop layout unchanged.
Logo and favicon — custom Dracula-themed logo (tally mark + dollar sign) across all device sizes.
Admin account recovery — locked out? Set RECOVERY_TOKEN and call POST /api/auth/recover. No email or SMTP needed. The container logs a startup warning if the token is active — remove it after use.
Full documentation — 12-page docs/ directory covering every feature.
Changed
- Budget spending totals now exclude transfers, debt payments, and savings transfers — only true expenses count.
- Import reconciliation skips non-expense transactions.
- Savings goals and contribution history update immediately after changes in Settings (no logout needed).
- Currency selector in Settings applies site-wide without a page reload.
Fixed
- PDF import now selects the largest table by row count, fixing multi-page PDFs where the first page is an account summary.
- Virgin Money Cr/Dr amount suffix parsing (
$2,000.00 Cr/$91.34 Dr). - Deleting a transaction linked to a debt payment or savings contribution no longer fails with a constraint error.
- Bulk delete errors are now shown in the confirmation modal.
- Static file server correctly serves favicons, manifests, and root-level assets.
- ING debit double-negation fixed.
Security
RECOVERY_TOKENuses constant-time comparison (secrets.compare_digest) to prevent timing attacks. Returns 404 (not 401) when no token is configured._safe_path()path traversal fix — now requires a trailing slash or exact match before accepting a path as within the base directory.transaction_typeremoved from theTransactionUpdateschema — the field can only be set via the dedicated link/unlink endpoints, preventing arbitrary type reassignment via PATCH.
Upgrading
Pull the new image and restart — startup migrations run automatically.
docker pull jaydenroberts/tally:1.2.0No manual database steps required.