✓ A transaction can now be in several projects (for example "83 Haslam Renovations" and "Benjamin improvements" at the same time). The toolbar's Project menu adds the selected transactions to a project or removes them from one; the transactions list shows a tag for every project
✓ A category can be linked to several projects: on the Categories page, add projects with "+ project" and remove one with its ×. Every transaction of the category counts in each linked project
✓ Existing project assignments and category links are kept as they were
v1.17.1
2026-10-10
✓ Duplicate finder: a supplementary card linked through the cardholder's own bank login (a second connection to the same bank) is now recognised as the same charge as on the primary card
v1.17.0
2026-10-10
✓ Give any transaction your own description (double-click it, use the pencil, or right-click / long-press and choose Edit description). The bank's description is kept and shown underneath; the undo button restores it. Search finds either text, exports have both, and category rules keep matching the bank's text
✓ When a pending transaction settles, your description, manual category and project now move to the settled transaction. Before, Plaid's settled copy replaced the pending one and a category set by hand was lost (rule categories only looked kept because the rules ran again)
v1.16.1
2026-10-10
✓ Transaction filters use as few rows as the screen allows: one row on a wide screen (dates, category, project, amounts and the export/clear buttons side by side), wrapping only when they do not fit
v1.16.0
2026-10-10
✓ Phone layout: the header is one row of icon buttons under the search box; tabs are a single row of compact pills; transactions are shown as cards (date and amount, description, account and category) instead of a clipped table; the transaction filters fold behind a Filters button; wide report tables scroll sideways inside their card. Tablet and desktop layouts are unchanged
v1.15.1
2026-10-10
✓ CSV import: "+ New account in <institution>" adds another account (for example a second card) to an institution you created for CSV imports, and imports the file into it
v1.15.0
2026-10-10
✓ CSV import reads files without a header row and files separated by tabs, semicolons or pipes (for example Home Depot / Citi card exports): the columns are detected as Date, Amount, Description and Type
✓ CSV import can create a new institution for a bank Plaid cannot connect: choose "New institution" as the destination and give its name, account type (credit card, chequing, savings, line of credit) and last 4 digits. It is created as CSV only
✓ Duplicate finder: also catches the same charge on two cards of one bank when the description or the day differs slightly (a supplementary card mirrored on the primary card), and keeps the primary card's row. Identical rows from one CSV statement are no longer flagged. Every group shows why it was flagged, groups can be unticked, and only the approved rows are removed
v1.14.1
2026-10-10
✓ Money amounts no longer wrap: a large negative amount in a narrow column (for example -CA$35,000.00) showed the minus sign on its own line above the number. Applies to the transactions table, the selected subtotal, balances, spending totals and project cards
v1.14.0
2026-10-10
✓ CSV import checks the amount signs before saving anything. If the file would be stored reversed (rows matching existing transactions with the opposite sign, card payments or refunds saved as money out, or a card statement that is mostly money in), the import stops and offers to switch the sign setting, or to import as chosen after a second confirmation. The machine API import does the same and accepts sign_confirmed
✓ Machine API: list and create projects (GET/POST /api/v1/projects) and assign transactions to a project (PATCH /api/v1/transactions/bulk-project), with the same rules as the dashboard
v1.13.0
2026-10-10
✓ Transactions list shows the net total of every transaction matching the current filters (all pages, not just the one on screen), next to the transaction count
✓ When transactions are selected, the toolbar shows the subtotal of the selected rows next to the selected count
v1.12.0
2026-10-09
✓ Projects: group any set of transactions into a named project (for example a trip or a renovation). A transaction belongs to at most one project; deleting a project keeps its transactions and only unassigns them
✓ New Projects tab on the Dashboard: create, rename, recolor and delete projects, and see each project's net total with year and month subtotals (years appear when a project spans more than one year, months when it spans more than one month). Click any total to open exactly those transactions
✓ Select transactions and use Assign project in the toolbar to add them to a project, start a new one, or remove them from their project; rows show a project tag
✓ The transactions list and its CSV/Excel export can be filtered by project (or No project); splitting a transaction copies its project onto the split parts
✓ A category can be linked to one project (Categories list, Project column): every transaction of that category then counts in the project too, while a transaction assigned to a project by hand keeps its own. Project cards list the categories they include
✓ Project cards are laid out side by side (two or more per row, depending on the screen)
✓ Regression test: re-applying category rules never reverses a manual category or a split
v1.11.0
2026-10-08
✓ CSV import now tolerates a metadata preamble before the real header row, and maps columns by scored alias matching instead of the first alias that happens to overlap, so a field like transaction amount resolves to amount rather than description
✓ Quoted account and card numbers are normalized with their quote characters stripped; before this, a quoted card number produced an account whose stored mask ended in a stray quote and no rows matched it
✓ New amount_sign import option with values 'as_is' (default) and 'invert' for files that write spending as positive while ExMint stores money out as negative; such files used to import with the sign inverted, which also made the cross-source dedup unable to match already-synced rows since it compares amounts for exact equality
✓ The import modal now asks which sign convention the file uses
✓ Dedup is now count-aware so a statement containing the same date, amount and description twice stores both rows instead of dropping the second, while re-importing a byte-identical file still inserts nothing, and the Plaid-overlap guard keeps a per-key budget for the run
✓ Analyze now returns date_candidates and the modal warns when a file carries more than one date column, since only the mapped column decides the ledger date and synced credit-card rows are dated by posting date
v1.10.5
2026-10-08
✓ Plaid sync fix: reconnecting a paused (soft-disconnected) institution now discards the stored transactions cursor when Plaid assigns a new Item. A Plaid cursor is scoped to the Item that produced it, so replaying a cursor from a removed Item causes errors or an incomplete transaction history; the reconnect now drops it and the next sync bootstraps a fresh cursor.
v1.10.4
2026-10-08
✓ Security patch: bumped Flask 3.1.3, Werkzeug 3.1.9, Jinja2 3.1.6, Mako 1.4.3, urllib3 2.8.0, requests 2.34.2, idna 3.15, PyJWT 2.15.1, Flask-Cors 6.0.5, cryptography 50.0.2, filelock 3.20.3 to clear 100 open OSV advisories (incl. PyJWT critical token-forgery CVE-2026-102268 and six urllib3 HIGH decompression-bomb/redirect issues)
v1.10.3
2026-10-07
✓ Spending Report: a category with a budget but no spending in the displayed month now shows its real trailing 6-month average instead of 0 (fixes budget-only rows showing 6M Average = 0)
v1.10.2
2026-10-07
✓ Auto-categorize on a transaction that was categorized by a rule now jumps to the exact rule row that decided it (the specificity winner), not just the category
v1.10.1
2026-10-07
✓ Fixes the v1.10.0 regression that broke the Automatic rules tab and the Auto-categorize transaction menu (missing Vue state and conflict-fetch method in the release commit)
v1.10.0
2026-10-07
✓ Hidden (eye) categories are now hidden from Income too, not just from Expenses: excluded categories appear dimmed in the income section with their own toggle and no longer inflate the income subtotal
✓ Automatic rules now resolve conflicts by specificity instead of creation order: amount-bounded rules beat unbounded ones, longer match text beats shorter, so 'PAYMENT FROM' >= $1000 wins over a bare 'Deposit' rule
✓ New overlap alerts: when two rules match the same transactions but target different categories, the rules page shows a warning listing each overlap with affected counts and sample transactions, a warning icon marks the overridden rule, and saving a new overlapping rule shows an immediate notice so you can adjust rules to keep them unique
v1.9.0
2026-09-15
✓ CSV import can auto-create accounts for unrecognised account numbers (opt-in)
✓ New-account institution is inferred from the file when every matched row belongs to one institution; otherwise the user must choose — the import never guesses
✓ Auto-created accounts use an idempotent get-or-create: re-importing a file reuses the account instead of duplicating it
✓ New optional 'account type' CSV mapping sets the subtype of accounts the import creates (existing accounts are never modified)
✓ Plaid linking now recognises CSV-auto-created accounts by institution + mask, re-parenting them instead of creating a duplicate
v1.8.2
2026-09-15
✓ CSV import no longer 500s on rows whose account number matches no account — such rows are reported per-row instead of aborting the import
✓ A failed row no longer poisons the whole import: the SQLAlchemy session is rolled back per row
✓ Row errors now name the offending account number so the bad row is easy to find
✓ The import dialog offers a fallback account so rows with an unmatched account number can still be imported
✓ Import failures now show a readable message instead of a JSON parse error
v1.8.1
2026-07-13
✓ Excluded categories now stay visible in table (strikethrough+dim) instead of disappearing
✓ Override-to-excluded leak fixed — transactions overridden to excluded categories (e.g. Vehicle→Transfer) now properly excluded
✓ Duplicate Everything Else row fixed — budget-only lines no longer add EE, handled solely by dedicated section
✓ Everything Else now shows even with $0 uncategorized spending (if a budget exists)
✓ Header labels reordered: Total → Budget → Remainder
✓ Remainder turns green (positive) or red (negative) instead of always orange
✓ Remainder now calculated as Budget − Total (not sum of per-category remainders)
✓ Clicking Everything Else searches uncategorized transactions (instead of returning no results)
✓ Budget-exclusion check honours transaction overrides (not just custom_category_id)
v1.8.0
2026-07-13
✓ Flexible budget system with rollover — monthly surplus rolls to next month proportionally
✓ Net-gate rollover: surplus only distributes if total spending stays under total budget
✓ Everything Else virtual bucket — aggregates budget-excluded categories into one line item