github securo-finance/securo v0.14.3

3 hours ago

In this release we separated current balances from forecasts across the app, added installments for manual transactions and a rule action that normalizes noisy imported descriptions, gave payees the contact and fiscal data an invoice needs, and fixed a payee uniqueness constraint that broke bank sync for anyone using more than one workspace.

Features

  • Installments on manual transactions. A single transaction fans out into 2 to 360 installments, weekly, monthly, quarterly or yearly, without going through recurring. Part of #505, by @panga (#524) ๐ŸŽ‰
  • Current balances separated from forecasts. Current balance is posted-only for manual accounts and the provider snapshot for connected ones, while pending rows, future installments and recurring projections are treated as forecast across dashboard, goals, reports, budgets and calendar. Future-dated transactions now use the latest real FX rate instead of a 1:1 fallback, by @panga (#582) ๐ŸŽ‰
  • Description normalization on import. A rule action can replace imported descriptions and match against the raw payee, with the bank-provided text preserved and shown in the transaction details. It runs before recurring matching, so transactions whose descriptions carry changing IDs match again, and the original text is now kept through sync, import and placeholder promotion. Closes #494, by @seraphblade2010 and @gaamelu (#586) ๐ŸŽ‰
  • Account detail and transaction layouts. Responsive rework of the account page, and pending transactions now read the same way in the list, calendar, account detail and dashboard. Closes #526, by @panga (#579) ๐ŸŽ‰
  • Contact and fiscal data on payees. Payees carry contacts, addresses and tax IDs, stored as typed rows rather than numbered fields, so the counterparty holds what an invoice needs instead of living twice (#602)

Fixes

  • Payee uniqueness was still user-scoped. Payees moved to workspaces in migration 052 but the database constraint did not follow, so sync inserted a counterparty it correctly could not find and collided with a row the same person owns in another workspace, failing the connection with a duplicate key error. Migration 072 merges the duplicates and swaps the constraint. Closes #616 (#629)
  • Write routes reachable read-only. The bank reconnect token, the MCP token and agent chat resolved the workspace with the read dependency, so a viewer could reach all three (#613)
  • Previous balance query. A missing join left accounts as an independent FROM, aggregating every transaction once per account and returning wrong balances when currencies differ, by @chrislopez24 (#593) ๐ŸŽ‰
  • Enable Banking consent is capped at 179 days, since building it at the exact 180-day boundary left no margin and could be rejected, by @chrislopez24 (#594) ๐ŸŽ‰
  • Account pickers are ordered by display name. Closes #589, by @panga (#590) ๐ŸŽ‰

Under the hood

A Prepare Release workflow now bumps the version in pyproject.toml, uv.lock, package.json and the Helm chart before the tag is cut, so published images stop reporting 0.1.0, reported by @pjrm (#619, #626, #627) ยท migration 072 runs automatically on upgrade ยท dependency and GitHub Actions updates (#578, #600)

Thanks @panga, @seraphblade2010, @gaamelu and @chrislopez24 for the code and the reviews, and @lsamoieda, @suzarte and @pjrm for the reports ๐Ÿ’œ

Full Changelog: v0.14.2...v0.14.3

Don't miss a new securo release

NewReleases is sending notifications on new releases.