Budget - Releases

← App details

Nextcloud 34

Budget 2.28.3
Release Details
UpdatedJune 12, 2026, 1:14 a.m.
Changelog

Security

  • The recurring-income update endpoint no longer passes the raw request body through to the entity layer — a crafted payload could previously set internal fields such as the owning user (mass assignment, integrity only — no data disclosure). Update keys are now allowlisted like the other endpoints

Fixed

  • Auto-derived recurring budgets (#269) are now consistent across all surfaces: the dashboard "Budget Remaining" hero, Budget Progress/Breakdown widgets, Budget Health score, and budget alerts now apply the same recurring fallback as the Budget view — a category funded only by recurring bills can now trigger alerts and is counted in headline totals
  • Auto-derived budgets now respect bill start/end dates: a bill that hasn't started (or has ended) no longer counts toward today's budget, avoiding double-counting during a planned cost change (#268)
  • Recurring income summaries (Income view header, dashboard Income Tracking widget): semi-monthly income was counted at half its value, and a one-time income at full value every month until received
  • Transfers page monthly total: semi-monthly and semi-annual transfers were converted incorrectly
  • Live forecast cache: cache invalidation never matched the stored key (changes such as toggling "exclude from forecast" appeared to do nothing for up to 5 minutes), and the cache key ignored shared-account visibility, letting a share-restricted viewer briefly see the owner's totals
  • Editing a bill's amount without updating its split template is now rejected when the stored splits no longer match (the payment would have silently imported unsplit and uncategorized); setting a split template via the API now clears the bill-level category, matching creation
  • Multi-account import partial failures (e.g. a deleted destination account) are now reported in the UI instead of masquerading as a full success
  • Import preview now also flags repeated bank transaction IDs for accounts that will be created by the import
  • Long OFX FITID hashing threshold raised so every previously-imported FITID keeps its exact ID (re-import dedup continuity)
  • Auto-derived category budgets (#269) now handle every supported frequency correctly: semi-annual bills were over-counted 6×, semi-monthly halved, custom-schedule bills counted every month, and one-time bills inflated the budget monthly until marked paid (now excluded). Frequency math is delegated to the shared calculator, which also gained the missing semi-monthly conversion
  • Auto-derived budgets no longer apply to past months — they reflect today's recurring bills/income and were rewriting history (including overriding explicitly-zeroed snapshot budgets)
  • Multi-account import: an invalid destination account mid-import no longer aborts the batch, and deferred balance recomputes now always run for already-imported rows
  • Bank sync: the post-import balance recompute now keys on transaction creation, not the import counter, so a row persisted just before a non-fatal error still gets its balance update
  • The scheduled-transactions background job now recomputes balances from the ledger (it was the last remaining hand-computed balance delta, and could race concurrent imports)
  • Import preview now flags a repeated bank transaction ID (OFX FITID) within one file as the duplicate it is, matching what import actually does; per-account preview counts include rows that will import with skip-duplicates off
  • Marking a bill paid by linking an existing transaction now warns if the link silently failed (no money movement recorded)
  • Extremely long OFX FITIDs are hashed to stay within the import-ID column
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIEATCCAukCAhNXMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNjAzMTA1MDE5WhcNMzYwOTA4MTA1MDE5WjARMQ8wDQYD
VQQDDAZidWRnZXQwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDNKchk
gsYxcNMufIP/m82JAeIA/fFibi4mGwKEkXwWLXDDAMiwaHmrpkCcC7BYNw0iOk/K
/xYMlEw738UrhQtu5PHAi/fecIAwh7H/ij7jGcwROe7cOcwK0sdmT76po8Ry4Of0
1wE8f+/Rmw9+rRPLE5dRluuHhiO0Eg6pO+KnqxgWID7CY4Ij7xuQtyUsYKkArjEq
irooV6OPmvQHDyQHMbgKhYr+47LZZ0YuNzZd0jhd5JIMWXV6aUgW9R23c9T7JgMG
pPOhHSWxZOBlRWzRVtCEzSug3J39n9eZqVP1PFIZI/pq0mOOt7LTz5IUX0xF0lJ+
JM7lPsTuJibESiWXKo9neTvy9BUWDIV9D/i8CH1uz0+xVala0uQRSNbrdWV4cN4v
oVaYwoXm+kYeGSz27f9CxJgLEA5sxuFWlbmm2+AXOFQPyyUDVXDCvAB/rzDZpFNo
HxM0OxyfmbmLmu+j31qW3JnvJvb6eroYxlvwgVeOCTihhIh6HKQzNFKv0iq3qc4Z
2a2czDyqt5h52CO+hwjsB5jjGNgS7AIxgBmDiw2V10meNGR/ZBVP9zew4FA3IEdY
GVuFBP52xdStrDgFpE3RK799n2i0fXvZE+9zzRlZ7DNRxZXMvBBpR35IhmyqVPDF
PbUmCKV8/Rm7ryZPanmAt78CrI5RVmPz+rrGHQIDAQABMA0GCSqGSIb3DQEBCwUA
A4IBAQCD72IK7rP8TSFVLvja0VU56do2E6q4UTVAtUikqVnVszEv6lJUNqcHT+it
vgD3JtuybukU1pRsbjdu2iLjx2fStYfvapmjMa8rHqAiD6IKVkjOsq5w4Jc4HSR4
JTU9u40YR0Ly1+lHZmGDbBjK9JqJPZBHzPWlJ1sDE+DmgR9Fid9Dfv/uavkx3uuc
FPnWzoxoQx8JQs6DAHzBL6qHfbFoncPRrztRbTmkrAUhJI98nuEGUD1+T51qU5cu
pj8q262ZYKwYWvOyk1AmiokbMiBVd0Obewqj7IiY6T5S+zORLOj1IhzaZ83P9pgM
mq0/oJk8aQYC3vgYCmY2aNWXUX18
-----END CERTIFICATE-----
Signaturefa7u8mWcwya82OCYZOh+XZFPRJH94oqiBM5WUtEtvU3Dh6Lq+pMs8A7e2aCOa0Y6AbwWH7TF6ZRtwanfSh2PjQMwAaDFlR5anBdAvr89L/fn3eK0uSrZetqNGmAT7Itlc0mT5KowbTvtWDRdK46oR4jjqgXKay6JeO7caGbAcKmyfhJARbfTXsb5etz/yhMX72X33ayUYtCo8nQrtxLTGO5AAPIcFbq1pa3W3d1SHuQ7Ibksv3WXrZe79ngT4pQpGp6xtz3ervqo86vrI8qH8DDg6g9IJE8D1iseOiVzRv/KI/N06LnY0OvUHNZwGrJph5Jh3BrYg2/5rSYzEP5VzaGyZm+AS0DO1bXf9BC5OqbRl3s/FsM+4UgowriYD0S2Zwc4/2j/W3mDRjOdGf0MJxd8SOxv7uW2P5JL0TImjA7mTgppSipw1ShGTl8BU7q11cCtFmuCmwGfvPlRLQtMqEdr93gNkY84rAja08K9Ro1/ySZtrEWVRh/lYzQqmpazsjlw1V4x+KYtn65LHr9Zxd46ToleV5kv1tEZJ1u7nFXeNnrfThyz78EqvLbVxzcqphrfrImGOD9/VhUwryM58KtVz7+tXmLjn3SsSmM8sz9DEljbEKK4zTV9mQgIxviGwzNuIGEFD+HaW6HRIsAzRNtXow5oT7Kgpqa3BnJ3HxM=
Signature digestsha512
Dependencies
Required Nextcloud versions >=30.0.0,<36.0.0
Minimum Integer bits32
PHP>=8.1.0
PHP extensions bcmath
Budget 2.28.2
Release Details
UpdatedJune 11, 2026, 6:33 p.m.
Changelog

Fixed

  • Dashboard could render half-empty (hero tiles only, widget grid invisible): a Chart.js resize on a hidden tile's detached canvas threw during initialization, and the widget grid was never revealed. Chart resizing now skips detached canvases and the grid is revealed before the resize pass. Likely also behind "nothing happens" reports after certain actions (#273)
  • Dashboard tiles with a saved account selection pointing at a deleted account (e.g. after factory reset + import re-numbered accounts) no longer error with 404s and stay empty — stale selections fall back to all accounts
  • Account balances are now derived from the ledger instead of running deltas — the root cause behind every historical balance-discrepancy report (#3, #89, #124, #163, #187, #194, #274). The stored balance was a running total that each transaction code path adjusted by hand; any missed or mis-signed delta corrupted it permanently. Every transaction create/update/delete (and retroactive rule run, repair action, import and bank sync) now recomputes balance = opening balance + net of non-scheduled transactions, making drift impossible and self-healing past inconsistencies on the next write. A one-time migration backfills the opening balance so displayed balances do not change on upgrade (#274)
  • Marking a bill as paid now warns loudly when no transaction was recorded (bill without an account, or transaction creation failed) — previously the bill was advanced silently and the account balance never reflected the payment, drifting from the real bank balance every cycle (#89, #274)
  • The app's own export→import now preserves transaction status (scheduled transactions no longer silently become balance-affecting after a migration) and restores the opening-balance invariant for imported accounts
  • "Skip Duplicate Transactions" off is now honored: previously rows whose import ID already existed were still rejected deeper in the stack (duplicate-ID guard + unique index), so parts of the batch silently failed to import. Intentional duplicates now get a uniquified import ID and the entire batch imports (#275)
  • Import duplicate detection no longer gives false positives for legitimately identical rows — e.g. two same-priced purchases on the same day with the same description. Identical rows within one file now import as distinct transactions (occurrence-aware import IDs), while re-importing the same statement still skips everything it already imported. Re-importing an older statement also recovers transactions the previous logic wrongly skipped (#276)
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIEATCCAukCAhNXMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNjAzMTA1MDE5WhcNMzYwOTA4MTA1MDE5WjARMQ8wDQYD
VQQDDAZidWRnZXQwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDNKchk
gsYxcNMufIP/m82JAeIA/fFibi4mGwKEkXwWLXDDAMiwaHmrpkCcC7BYNw0iOk/K
/xYMlEw738UrhQtu5PHAi/fecIAwh7H/ij7jGcwROe7cOcwK0sdmT76po8Ry4Of0
1wE8f+/Rmw9+rRPLE5dRluuHhiO0Eg6pO+KnqxgWID7CY4Ij7xuQtyUsYKkArjEq
irooV6OPmvQHDyQHMbgKhYr+47LZZ0YuNzZd0jhd5JIMWXV6aUgW9R23c9T7JgMG
pPOhHSWxZOBlRWzRVtCEzSug3J39n9eZqVP1PFIZI/pq0mOOt7LTz5IUX0xF0lJ+
JM7lPsTuJibESiWXKo9neTvy9BUWDIV9D/i8CH1uz0+xVala0uQRSNbrdWV4cN4v
oVaYwoXm+kYeGSz27f9CxJgLEA5sxuFWlbmm2+AXOFQPyyUDVXDCvAB/rzDZpFNo
HxM0OxyfmbmLmu+j31qW3JnvJvb6eroYxlvwgVeOCTihhIh6HKQzNFKv0iq3qc4Z
2a2czDyqt5h52CO+hwjsB5jjGNgS7AIxgBmDiw2V10meNGR/ZBVP9zew4FA3IEdY
GVuFBP52xdStrDgFpE3RK799n2i0fXvZE+9zzRlZ7DNRxZXMvBBpR35IhmyqVPDF
PbUmCKV8/Rm7ryZPanmAt78CrI5RVmPz+rrGHQIDAQABMA0GCSqGSIb3DQEBCwUA
A4IBAQCD72IK7rP8TSFVLvja0VU56do2E6q4UTVAtUikqVnVszEv6lJUNqcHT+it
vgD3JtuybukU1pRsbjdu2iLjx2fStYfvapmjMa8rHqAiD6IKVkjOsq5w4Jc4HSR4
JTU9u40YR0Ly1+lHZmGDbBjK9JqJPZBHzPWlJ1sDE+DmgR9Fid9Dfv/uavkx3uuc
FPnWzoxoQx8JQs6DAHzBL6qHfbFoncPRrztRbTmkrAUhJI98nuEGUD1+T51qU5cu
pj8q262ZYKwYWvOyk1AmiokbMiBVd0Obewqj7IiY6T5S+zORLOj1IhzaZ83P9pgM
mq0/oJk8aQYC3vgYCmY2aNWXUX18
-----END CERTIFICATE-----
Signaturekx2VkgWxozCE2LPp/nzgQQiqFxk/83sOdycv738Ly/uEwn/MhxF/kNtBlP4DMQbhmtkcHdt+kDIlQK1S5q1WHJWZQxjLc/ZCkj/ZEPkNBrDhHwdQCRh4TsRVJyfrIxXUTOCAKJLYk+0DXlnJB3kMhR81adns3wWNH9RkC4b62k3gXtzMR4n+jz/QJDGEAOXRpDUzxEm2TKqFot6sGRt3u0+rVo0bng6nogDJha0APeFI5Ujt+3mECw9MlxNt9nKbQlIGjAnraLVUFz0bXNLK7dbBS3PSzjLsUxhoNhAqMivfHEfLViOvIlCFNHzoWGxFnHK0flI2zJXUlOnaidOEyfhZWbqNpHZL4RZLIZWYQaztJgATNsK+L5aO0Md+Np1hgE8jkdY90gugiV06JqoPEWqCo/qSyaO9N3xYpeXrwfiL37JJqkigwg69RZN3OD1DfBT8ue7QlhT93dfg+39ERzbVY9QBu0gT+bwIs8tyE1MVXOaSjHKUkHab5dpGU3NQhvu/E1CO1BWA3dYvUUqvrvXKB96gm7IqNQEAkRi4JJHDPGtgzjERM+k8z/JA2xeJmPp7V3TZ/1WiKOoKMPz88soCJBMuj/LWnSpekLAGo4RJDy1JBlOm835e3ieJFVHwIwqG9YP7oRB/puFvYV6aaEXCnSkUcZV+z+2NXmHB8KM=
Signature digestsha512
Dependencies
Required Nextcloud versions >=30.0.0,<36.0.0
Minimum Integer bits32
PHP>=8.1.0
PHP extensions bcmath
Budget 2.28.1
Release Details
UpdatedJune 8, 2026, 12:13 p.m.
Changelog

Fixed

  • Install/upgrade aborted on Nextcloud 32 and earlier with "Primary index name on oc_budget_import_templates is too long". The budget_import_templates migration created its primary key without an explicit name, so Nextcloud derived a default name and hit the Oracle-compatibility identifier limit (the unprefixed table name is exactly 23 characters). The primary key now has an explicit short name. Thanks to @TheUnderdev for the report and fix (#272)
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIEATCCAukCAhNXMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNjAzMTA1MDE5WhcNMzYwOTA4MTA1MDE5WjARMQ8wDQYD
VQQDDAZidWRnZXQwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDNKchk
gsYxcNMufIP/m82JAeIA/fFibi4mGwKEkXwWLXDDAMiwaHmrpkCcC7BYNw0iOk/K
/xYMlEw738UrhQtu5PHAi/fecIAwh7H/ij7jGcwROe7cOcwK0sdmT76po8Ry4Of0
1wE8f+/Rmw9+rRPLE5dRluuHhiO0Eg6pO+KnqxgWID7CY4Ij7xuQtyUsYKkArjEq
irooV6OPmvQHDyQHMbgKhYr+47LZZ0YuNzZd0jhd5JIMWXV6aUgW9R23c9T7JgMG
pPOhHSWxZOBlRWzRVtCEzSug3J39n9eZqVP1PFIZI/pq0mOOt7LTz5IUX0xF0lJ+
JM7lPsTuJibESiWXKo9neTvy9BUWDIV9D/i8CH1uz0+xVala0uQRSNbrdWV4cN4v
oVaYwoXm+kYeGSz27f9CxJgLEA5sxuFWlbmm2+AXOFQPyyUDVXDCvAB/rzDZpFNo
HxM0OxyfmbmLmu+j31qW3JnvJvb6eroYxlvwgVeOCTihhIh6HKQzNFKv0iq3qc4Z
2a2czDyqt5h52CO+hwjsB5jjGNgS7AIxgBmDiw2V10meNGR/ZBVP9zew4FA3IEdY
GVuFBP52xdStrDgFpE3RK799n2i0fXvZE+9zzRlZ7DNRxZXMvBBpR35IhmyqVPDF
PbUmCKV8/Rm7ryZPanmAt78CrI5RVmPz+rrGHQIDAQABMA0GCSqGSIb3DQEBCwUA
A4IBAQCD72IK7rP8TSFVLvja0VU56do2E6q4UTVAtUikqVnVszEv6lJUNqcHT+it
vgD3JtuybukU1pRsbjdu2iLjx2fStYfvapmjMa8rHqAiD6IKVkjOsq5w4Jc4HSR4
JTU9u40YR0Ly1+lHZmGDbBjK9JqJPZBHzPWlJ1sDE+DmgR9Fid9Dfv/uavkx3uuc
FPnWzoxoQx8JQs6DAHzBL6qHfbFoncPRrztRbTmkrAUhJI98nuEGUD1+T51qU5cu
pj8q262ZYKwYWvOyk1AmiokbMiBVd0Obewqj7IiY6T5S+zORLOj1IhzaZ83P9pgM
mq0/oJk8aQYC3vgYCmY2aNWXUX18
-----END CERTIFICATE-----
SignatureXdUz/Pc10uA7L3R+vTa/cI52W9X8nDyH33zElCWeS/xWeYgonfr0GwLhn4ywE7rtUQF8e1Y8GhETbSd60otnPduP+4rXp7+5+b+iMTa3qfYi6gAd3Y1YJJrZqK0yx2Fdqld/nhQLfFpVkUSQl/JQ78RZanEh779Af5RejNl7lolRlJYg7ZNrLrFasWrpyrLNsg4+Tf74/vMpKWDXf0FEIqjnXZ0LKJm7Yjig4uazy+a5vDcDOrfq6fLU56d9ML/jBJK+9A2loT3I5HP7H2cngdLpwk6+MNLiYQDsdNzLGJJK9TK4hn0Cj+AV80mAQ45beagh4H0SmEoDTPvR/hC7LLlU5rtioE1Rg1tCvlZfHBuPcH9LZMq11Q3HVbZnvzkTdG3lKQlKeFhP86QOIjiAg1Frm0yuOt4nMSdG36N+k1C5szF7HrCoH+u1XgdY6fKI6WW71RkqXJ2IhwOorxcijLVQc2l3wyDLqoQrHtJA2yWGsI9NXlq+d5ZLJ03T7xvcLBPgSDTz91KqBABqJYRdCGhzAuQPe9M814mDu5XgdoCJNUKNrAl6YGvLvJXyj5j8I09qImqsQx09AmEBxi8YTZDbxuO8U/g3yKO14aBgGu3Z+v8+h6xyqJyNsPEbHHxpjfSbwAF/9FlvjA64nOTqPam3fPOjZAdqne5bgf05gFY=
Signature digestsha512
Dependencies
Required Nextcloud versions >=30.0.0,<36.0.0
Minimum Integer bits32
PHP>=8.1.0
PHP extensions bcmath
Budget 2.28.0
Release Details
UpdatedJune 7, 2026, 9:59 p.m.
Changelog

Added

  • Shared savings goals — share a savings goal with another Nextcloud user. Recipients see a "Shared" badge and can view progress; with write permission they can edit the goal and add money, while only the owner can delete it (#255)
  • Auto-derived budgets from recurring items — a (sub-)category with no manually-set budget now shows its committed recurring total (active recurring bills + recurring income, normalized to the budget period) as an automatic budget limit, marked "auto". Typing a value always overrides it (#269)
  • Exclude extraordinary/one-time items from the forecast — a per-transaction "exclude from forecast" flag (with a "No forecast" list badge), the same flag on recurring bills/income (propagated to generated transactions), and a matching import-rule action. Flagged amounts still affect your balance but are kept out of the projection averages (#270)
  • Reusable CSV import templates — save column mappings and import options and reapply them to future imports (#247)
  • OFX/QIF import account routing — route multi-account OFX/QIF files to the right Budget accounts, remembered across subsequent imports
  • Bank sync: pending transactions — option to import not-yet-posted (pending) transactions, automatically reconciled when they clear (#257)
  • Bill start dates — a bill only occurs on or after its start date, making it easy to change a recurring cost mid-year by ending one bill and starting another (#268)
  • "Shared with me" expenses view — recipients can now see expenses that have been shared with them (#248)
  • Dashboard period indicator — chart tiles now show a read-only indicator of the period they cover (#250)

Fixed

  • Dashboard now collapses to a single full-width column on phones, independent of your configured desktop column count (#249)
  • "Excluded from reports" categories no longer appear in the Budget view (#266, #267)
  • Category spending chart shows income as positive with the correct label (#265)
  • Tag-linked savings goals now sum net realized contributions (credits minus debits, excluding scheduled) (#264)
  • Recurring income description is now persisted on create (#263)
  • Transfers are now excluded from dashboard income/expense totals (#262)
  • Account Breakdown report now uses each account's own currency instead of a single assumed one (#256)
  • Fixed a PageController crash (TypeError) on unauthenticated requests (#259)
  • Quick Add date field normalization on iOS (#235)

Docs

  • Documented the standalone Quick Add page and the iOS home-screen workaround
  • Noted that GoCardless no longer accepts new bank-sync sign-ups; EU/UK self-hosters without an existing account are pointed to manual import (#271)
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIEATCCAukCAhNXMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNjAzMTA1MDE5WhcNMzYwOTA4MTA1MDE5WjARMQ8wDQYD
VQQDDAZidWRnZXQwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDNKchk
gsYxcNMufIP/m82JAeIA/fFibi4mGwKEkXwWLXDDAMiwaHmrpkCcC7BYNw0iOk/K
/xYMlEw738UrhQtu5PHAi/fecIAwh7H/ij7jGcwROe7cOcwK0sdmT76po8Ry4Of0
1wE8f+/Rmw9+rRPLE5dRluuHhiO0Eg6pO+KnqxgWID7CY4Ij7xuQtyUsYKkArjEq
irooV6OPmvQHDyQHMbgKhYr+47LZZ0YuNzZd0jhd5JIMWXV6aUgW9R23c9T7JgMG
pPOhHSWxZOBlRWzRVtCEzSug3J39n9eZqVP1PFIZI/pq0mOOt7LTz5IUX0xF0lJ+
JM7lPsTuJibESiWXKo9neTvy9BUWDIV9D/i8CH1uz0+xVala0uQRSNbrdWV4cN4v
oVaYwoXm+kYeGSz27f9CxJgLEA5sxuFWlbmm2+AXOFQPyyUDVXDCvAB/rzDZpFNo
HxM0OxyfmbmLmu+j31qW3JnvJvb6eroYxlvwgVeOCTihhIh6HKQzNFKv0iq3qc4Z
2a2czDyqt5h52CO+hwjsB5jjGNgS7AIxgBmDiw2V10meNGR/ZBVP9zew4FA3IEdY
GVuFBP52xdStrDgFpE3RK799n2i0fXvZE+9zzRlZ7DNRxZXMvBBpR35IhmyqVPDF
PbUmCKV8/Rm7ryZPanmAt78CrI5RVmPz+rrGHQIDAQABMA0GCSqGSIb3DQEBCwUA
A4IBAQCD72IK7rP8TSFVLvja0VU56do2E6q4UTVAtUikqVnVszEv6lJUNqcHT+it
vgD3JtuybukU1pRsbjdu2iLjx2fStYfvapmjMa8rHqAiD6IKVkjOsq5w4Jc4HSR4
JTU9u40YR0Ly1+lHZmGDbBjK9JqJPZBHzPWlJ1sDE+DmgR9Fid9Dfv/uavkx3uuc
FPnWzoxoQx8JQs6DAHzBL6qHfbFoncPRrztRbTmkrAUhJI98nuEGUD1+T51qU5cu
pj8q262ZYKwYWvOyk1AmiokbMiBVd0Obewqj7IiY6T5S+zORLOj1IhzaZ83P9pgM
mq0/oJk8aQYC3vgYCmY2aNWXUX18
-----END CERTIFICATE-----
SignatureiQMjVEdG/FWcc56MAPwvDd04E0ERl5pUWkrRWtdYdgbboBj0+7YAo+rDODFz5qC3EPqWBr7XRkjXOfvn9+m61v0w88Qy8SZQIZRHTAwRJuK5jDQbpfce5dropQgKW8btEIzI3BPE+DFBIDeV+qLNQEYT25ApMkUAz44PumVV0sJMibCGo0JBgIxHCPyem1NNjYaX3qQDt41eg8I5rH8wLCWGa7lNTtGyp8vaJ4ck0sh4J9sPuVzMdJoXQDHfGe5S8YY3GTwgvwyloNJQAFO+SQzm5WX6mC/IKAfpxwG82cQAEMm6B4geyHwaYGSFDEgrBuHOZj2fQmvQgzoarRN+U76bOhjQI0IqU76Pno3qM17eF+UKW8peDiqFBXpepGYfDoeyjQsF2GqxIK3C0bNUR5bp9RjNxkWckwvS2ihvP/2rg4lr05MuDDmIdBYG9Ny+PT9dEWBssQkXzIVX28Ox6P8xkorH0n5EoSRl3j+KMXbM34QteNMt1+jgsHAxcS8H57CwV3MC0uqZnhxUu/LbwIGHzvKbC6vN3F/3l6F+35rWM7UaQhdvr2W/1q5Swj5F2sp2Bq5jgrxbWIuUB9+pzftASgVUEmtd6blOUlJuuJj1wmaIrA9jx21+Bg8t/OmrQqB97ZHzint0WTdo7KTOviKZGnoZVXeoQthPmSyW7Wc=
Signature digestsha512
Dependencies
Required Nextcloud versions >=30.0.0,<36.0.0
Minimum Integer bits32
PHP>=8.1.0
PHP extensions bcmath

Nextcloud 33

Budget 2.28.3
Release Details
UpdatedJune 12, 2026, 1:14 a.m.
Changelog

Security

  • The recurring-income update endpoint no longer passes the raw request body through to the entity layer — a crafted payload could previously set internal fields such as the owning user (mass assignment, integrity only — no data disclosure). Update keys are now allowlisted like the other endpoints

Fixed

  • Auto-derived recurring budgets (#269) are now consistent across all surfaces: the dashboard "Budget Remaining" hero, Budget Progress/Breakdown widgets, Budget Health score, and budget alerts now apply the same recurring fallback as the Budget view — a category funded only by recurring bills can now trigger alerts and is counted in headline totals
  • Auto-derived budgets now respect bill start/end dates: a bill that hasn't started (or has ended) no longer counts toward today's budget, avoiding double-counting during a planned cost change (#268)
  • Recurring income summaries (Income view header, dashboard Income Tracking widget): semi-monthly income was counted at half its value, and a one-time income at full value every month until received
  • Transfers page monthly total: semi-monthly and semi-annual transfers were converted incorrectly
  • Live forecast cache: cache invalidation never matched the stored key (changes such as toggling "exclude from forecast" appeared to do nothing for up to 5 minutes), and the cache key ignored shared-account visibility, letting a share-restricted viewer briefly see the owner's totals
  • Editing a bill's amount without updating its split template is now rejected when the stored splits no longer match (the payment would have silently imported unsplit and uncategorized); setting a split template via the API now clears the bill-level category, matching creation
  • Multi-account import partial failures (e.g. a deleted destination account) are now reported in the UI instead of masquerading as a full success
  • Import preview now also flags repeated bank transaction IDs for accounts that will be created by the import
  • Long OFX FITID hashing threshold raised so every previously-imported FITID keeps its exact ID (re-import dedup continuity)
  • Auto-derived category budgets (#269) now handle every supported frequency correctly: semi-annual bills were over-counted 6×, semi-monthly halved, custom-schedule bills counted every month, and one-time bills inflated the budget monthly until marked paid (now excluded). Frequency math is delegated to the shared calculator, which also gained the missing semi-monthly conversion
  • Auto-derived budgets no longer apply to past months — they reflect today's recurring bills/income and were rewriting history (including overriding explicitly-zeroed snapshot budgets)
  • Multi-account import: an invalid destination account mid-import no longer aborts the batch, and deferred balance recomputes now always run for already-imported rows
  • Bank sync: the post-import balance recompute now keys on transaction creation, not the import counter, so a row persisted just before a non-fatal error still gets its balance update
  • The scheduled-transactions background job now recomputes balances from the ledger (it was the last remaining hand-computed balance delta, and could race concurrent imports)
  • Import preview now flags a repeated bank transaction ID (OFX FITID) within one file as the duplicate it is, matching what import actually does; per-account preview counts include rows that will import with skip-duplicates off
  • Marking a bill paid by linking an existing transaction now warns if the link silently failed (no money movement recorded)
  • Extremely long OFX FITIDs are hashed to stay within the import-ID column
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIEATCCAukCAhNXMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNjAzMTA1MDE5WhcNMzYwOTA4MTA1MDE5WjARMQ8wDQYD
VQQDDAZidWRnZXQwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDNKchk
gsYxcNMufIP/m82JAeIA/fFibi4mGwKEkXwWLXDDAMiwaHmrpkCcC7BYNw0iOk/K
/xYMlEw738UrhQtu5PHAi/fecIAwh7H/ij7jGcwROe7cOcwK0sdmT76po8Ry4Of0
1wE8f+/Rmw9+rRPLE5dRluuHhiO0Eg6pO+KnqxgWID7CY4Ij7xuQtyUsYKkArjEq
irooV6OPmvQHDyQHMbgKhYr+47LZZ0YuNzZd0jhd5JIMWXV6aUgW9R23c9T7JgMG
pPOhHSWxZOBlRWzRVtCEzSug3J39n9eZqVP1PFIZI/pq0mOOt7LTz5IUX0xF0lJ+
JM7lPsTuJibESiWXKo9neTvy9BUWDIV9D/i8CH1uz0+xVala0uQRSNbrdWV4cN4v
oVaYwoXm+kYeGSz27f9CxJgLEA5sxuFWlbmm2+AXOFQPyyUDVXDCvAB/rzDZpFNo
HxM0OxyfmbmLmu+j31qW3JnvJvb6eroYxlvwgVeOCTihhIh6HKQzNFKv0iq3qc4Z
2a2czDyqt5h52CO+hwjsB5jjGNgS7AIxgBmDiw2V10meNGR/ZBVP9zew4FA3IEdY
GVuFBP52xdStrDgFpE3RK799n2i0fXvZE+9zzRlZ7DNRxZXMvBBpR35IhmyqVPDF
PbUmCKV8/Rm7ryZPanmAt78CrI5RVmPz+rrGHQIDAQABMA0GCSqGSIb3DQEBCwUA
A4IBAQCD72IK7rP8TSFVLvja0VU56do2E6q4UTVAtUikqVnVszEv6lJUNqcHT+it
vgD3JtuybukU1pRsbjdu2iLjx2fStYfvapmjMa8rHqAiD6IKVkjOsq5w4Jc4HSR4
JTU9u40YR0Ly1+lHZmGDbBjK9JqJPZBHzPWlJ1sDE+DmgR9Fid9Dfv/uavkx3uuc
FPnWzoxoQx8JQs6DAHzBL6qHfbFoncPRrztRbTmkrAUhJI98nuEGUD1+T51qU5cu
pj8q262ZYKwYWvOyk1AmiokbMiBVd0Obewqj7IiY6T5S+zORLOj1IhzaZ83P9pgM
mq0/oJk8aQYC3vgYCmY2aNWXUX18
-----END CERTIFICATE-----
Signaturefa7u8mWcwya82OCYZOh+XZFPRJH94oqiBM5WUtEtvU3Dh6Lq+pMs8A7e2aCOa0Y6AbwWH7TF6ZRtwanfSh2PjQMwAaDFlR5anBdAvr89L/fn3eK0uSrZetqNGmAT7Itlc0mT5KowbTvtWDRdK46oR4jjqgXKay6JeO7caGbAcKmyfhJARbfTXsb5etz/yhMX72X33ayUYtCo8nQrtxLTGO5AAPIcFbq1pa3W3d1SHuQ7Ibksv3WXrZe79ngT4pQpGp6xtz3ervqo86vrI8qH8DDg6g9IJE8D1iseOiVzRv/KI/N06LnY0OvUHNZwGrJph5Jh3BrYg2/5rSYzEP5VzaGyZm+AS0DO1bXf9BC5OqbRl3s/FsM+4UgowriYD0S2Zwc4/2j/W3mDRjOdGf0MJxd8SOxv7uW2P5JL0TImjA7mTgppSipw1ShGTl8BU7q11cCtFmuCmwGfvPlRLQtMqEdr93gNkY84rAja08K9Ro1/ySZtrEWVRh/lYzQqmpazsjlw1V4x+KYtn65LHr9Zxd46ToleV5kv1tEZJ1u7nFXeNnrfThyz78EqvLbVxzcqphrfrImGOD9/VhUwryM58KtVz7+tXmLjn3SsSmM8sz9DEljbEKK4zTV9mQgIxviGwzNuIGEFD+HaW6HRIsAzRNtXow5oT7Kgpqa3BnJ3HxM=
Signature digestsha512
Dependencies
Required Nextcloud versions >=30.0.0,<36.0.0
Minimum Integer bits32
PHP>=8.1.0
PHP extensions bcmath
Budget 2.28.2
Release Details
UpdatedJune 11, 2026, 6:33 p.m.
Changelog

Fixed

  • Dashboard could render half-empty (hero tiles only, widget grid invisible): a Chart.js resize on a hidden tile's detached canvas threw during initialization, and the widget grid was never revealed. Chart resizing now skips detached canvases and the grid is revealed before the resize pass. Likely also behind "nothing happens" reports after certain actions (#273)
  • Dashboard tiles with a saved account selection pointing at a deleted account (e.g. after factory reset + import re-numbered accounts) no longer error with 404s and stay empty — stale selections fall back to all accounts
  • Account balances are now derived from the ledger instead of running deltas — the root cause behind every historical balance-discrepancy report (#3, #89, #124, #163, #187, #194, #274). The stored balance was a running total that each transaction code path adjusted by hand; any missed or mis-signed delta corrupted it permanently. Every transaction create/update/delete (and retroactive rule run, repair action, import and bank sync) now recomputes balance = opening balance + net of non-scheduled transactions, making drift impossible and self-healing past inconsistencies on the next write. A one-time migration backfills the opening balance so displayed balances do not change on upgrade (#274)
  • Marking a bill as paid now warns loudly when no transaction was recorded (bill without an account, or transaction creation failed) — previously the bill was advanced silently and the account balance never reflected the payment, drifting from the real bank balance every cycle (#89, #274)
  • The app's own export→import now preserves transaction status (scheduled transactions no longer silently become balance-affecting after a migration) and restores the opening-balance invariant for imported accounts
  • "Skip Duplicate Transactions" off is now honored: previously rows whose import ID already existed were still rejected deeper in the stack (duplicate-ID guard + unique index), so parts of the batch silently failed to import. Intentional duplicates now get a uniquified import ID and the entire batch imports (#275)
  • Import duplicate detection no longer gives false positives for legitimately identical rows — e.g. two same-priced purchases on the same day with the same description. Identical rows within one file now import as distinct transactions (occurrence-aware import IDs), while re-importing the same statement still skips everything it already imported. Re-importing an older statement also recovers transactions the previous logic wrongly skipped (#276)
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIEATCCAukCAhNXMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNjAzMTA1MDE5WhcNMzYwOTA4MTA1MDE5WjARMQ8wDQYD
VQQDDAZidWRnZXQwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDNKchk
gsYxcNMufIP/m82JAeIA/fFibi4mGwKEkXwWLXDDAMiwaHmrpkCcC7BYNw0iOk/K
/xYMlEw738UrhQtu5PHAi/fecIAwh7H/ij7jGcwROe7cOcwK0sdmT76po8Ry4Of0
1wE8f+/Rmw9+rRPLE5dRluuHhiO0Eg6pO+KnqxgWID7CY4Ij7xuQtyUsYKkArjEq
irooV6OPmvQHDyQHMbgKhYr+47LZZ0YuNzZd0jhd5JIMWXV6aUgW9R23c9T7JgMG
pPOhHSWxZOBlRWzRVtCEzSug3J39n9eZqVP1PFIZI/pq0mOOt7LTz5IUX0xF0lJ+
JM7lPsTuJibESiWXKo9neTvy9BUWDIV9D/i8CH1uz0+xVala0uQRSNbrdWV4cN4v
oVaYwoXm+kYeGSz27f9CxJgLEA5sxuFWlbmm2+AXOFQPyyUDVXDCvAB/rzDZpFNo
HxM0OxyfmbmLmu+j31qW3JnvJvb6eroYxlvwgVeOCTihhIh6HKQzNFKv0iq3qc4Z
2a2czDyqt5h52CO+hwjsB5jjGNgS7AIxgBmDiw2V10meNGR/ZBVP9zew4FA3IEdY
GVuFBP52xdStrDgFpE3RK799n2i0fXvZE+9zzRlZ7DNRxZXMvBBpR35IhmyqVPDF
PbUmCKV8/Rm7ryZPanmAt78CrI5RVmPz+rrGHQIDAQABMA0GCSqGSIb3DQEBCwUA
A4IBAQCD72IK7rP8TSFVLvja0VU56do2E6q4UTVAtUikqVnVszEv6lJUNqcHT+it
vgD3JtuybukU1pRsbjdu2iLjx2fStYfvapmjMa8rHqAiD6IKVkjOsq5w4Jc4HSR4
JTU9u40YR0Ly1+lHZmGDbBjK9JqJPZBHzPWlJ1sDE+DmgR9Fid9Dfv/uavkx3uuc
FPnWzoxoQx8JQs6DAHzBL6qHfbFoncPRrztRbTmkrAUhJI98nuEGUD1+T51qU5cu
pj8q262ZYKwYWvOyk1AmiokbMiBVd0Obewqj7IiY6T5S+zORLOj1IhzaZ83P9pgM
mq0/oJk8aQYC3vgYCmY2aNWXUX18
-----END CERTIFICATE-----
Signaturekx2VkgWxozCE2LPp/nzgQQiqFxk/83sOdycv738Ly/uEwn/MhxF/kNtBlP4DMQbhmtkcHdt+kDIlQK1S5q1WHJWZQxjLc/ZCkj/ZEPkNBrDhHwdQCRh4TsRVJyfrIxXUTOCAKJLYk+0DXlnJB3kMhR81adns3wWNH9RkC4b62k3gXtzMR4n+jz/QJDGEAOXRpDUzxEm2TKqFot6sGRt3u0+rVo0bng6nogDJha0APeFI5Ujt+3mECw9MlxNt9nKbQlIGjAnraLVUFz0bXNLK7dbBS3PSzjLsUxhoNhAqMivfHEfLViOvIlCFNHzoWGxFnHK0flI2zJXUlOnaidOEyfhZWbqNpHZL4RZLIZWYQaztJgATNsK+L5aO0Md+Np1hgE8jkdY90gugiV06JqoPEWqCo/qSyaO9N3xYpeXrwfiL37JJqkigwg69RZN3OD1DfBT8ue7QlhT93dfg+39ERzbVY9QBu0gT+bwIs8tyE1MVXOaSjHKUkHab5dpGU3NQhvu/E1CO1BWA3dYvUUqvrvXKB96gm7IqNQEAkRi4JJHDPGtgzjERM+k8z/JA2xeJmPp7V3TZ/1WiKOoKMPz88soCJBMuj/LWnSpekLAGo4RJDy1JBlOm835e3ieJFVHwIwqG9YP7oRB/puFvYV6aaEXCnSkUcZV+z+2NXmHB8KM=
Signature digestsha512
Dependencies
Required Nextcloud versions >=30.0.0,<36.0.0
Minimum Integer bits32
PHP>=8.1.0
PHP extensions bcmath
Budget 2.28.1
Release Details
UpdatedJune 8, 2026, 12:13 p.m.
Changelog

Fixed

  • Install/upgrade aborted on Nextcloud 32 and earlier with "Primary index name on oc_budget_import_templates is too long". The budget_import_templates migration created its primary key without an explicit name, so Nextcloud derived a default name and hit the Oracle-compatibility identifier limit (the unprefixed table name is exactly 23 characters). The primary key now has an explicit short name. Thanks to @TheUnderdev for the report and fix (#272)
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIEATCCAukCAhNXMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNjAzMTA1MDE5WhcNMzYwOTA4MTA1MDE5WjARMQ8wDQYD
VQQDDAZidWRnZXQwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDNKchk
gsYxcNMufIP/m82JAeIA/fFibi4mGwKEkXwWLXDDAMiwaHmrpkCcC7BYNw0iOk/K
/xYMlEw738UrhQtu5PHAi/fecIAwh7H/ij7jGcwROe7cOcwK0sdmT76po8Ry4Of0
1wE8f+/Rmw9+rRPLE5dRluuHhiO0Eg6pO+KnqxgWID7CY4Ij7xuQtyUsYKkArjEq
irooV6OPmvQHDyQHMbgKhYr+47LZZ0YuNzZd0jhd5JIMWXV6aUgW9R23c9T7JgMG
pPOhHSWxZOBlRWzRVtCEzSug3J39n9eZqVP1PFIZI/pq0mOOt7LTz5IUX0xF0lJ+
JM7lPsTuJibESiWXKo9neTvy9BUWDIV9D/i8CH1uz0+xVala0uQRSNbrdWV4cN4v
oVaYwoXm+kYeGSz27f9CxJgLEA5sxuFWlbmm2+AXOFQPyyUDVXDCvAB/rzDZpFNo
HxM0OxyfmbmLmu+j31qW3JnvJvb6eroYxlvwgVeOCTihhIh6HKQzNFKv0iq3qc4Z
2a2czDyqt5h52CO+hwjsB5jjGNgS7AIxgBmDiw2V10meNGR/ZBVP9zew4FA3IEdY
GVuFBP52xdStrDgFpE3RK799n2i0fXvZE+9zzRlZ7DNRxZXMvBBpR35IhmyqVPDF
PbUmCKV8/Rm7ryZPanmAt78CrI5RVmPz+rrGHQIDAQABMA0GCSqGSIb3DQEBCwUA
A4IBAQCD72IK7rP8TSFVLvja0VU56do2E6q4UTVAtUikqVnVszEv6lJUNqcHT+it
vgD3JtuybukU1pRsbjdu2iLjx2fStYfvapmjMa8rHqAiD6IKVkjOsq5w4Jc4HSR4
JTU9u40YR0Ly1+lHZmGDbBjK9JqJPZBHzPWlJ1sDE+DmgR9Fid9Dfv/uavkx3uuc
FPnWzoxoQx8JQs6DAHzBL6qHfbFoncPRrztRbTmkrAUhJI98nuEGUD1+T51qU5cu
pj8q262ZYKwYWvOyk1AmiokbMiBVd0Obewqj7IiY6T5S+zORLOj1IhzaZ83P9pgM
mq0/oJk8aQYC3vgYCmY2aNWXUX18
-----END CERTIFICATE-----
SignatureXdUz/Pc10uA7L3R+vTa/cI52W9X8nDyH33zElCWeS/xWeYgonfr0GwLhn4ywE7rtUQF8e1Y8GhETbSd60otnPduP+4rXp7+5+b+iMTa3qfYi6gAd3Y1YJJrZqK0yx2Fdqld/nhQLfFpVkUSQl/JQ78RZanEh779Af5RejNl7lolRlJYg7ZNrLrFasWrpyrLNsg4+Tf74/vMpKWDXf0FEIqjnXZ0LKJm7Yjig4uazy+a5vDcDOrfq6fLU56d9ML/jBJK+9A2loT3I5HP7H2cngdLpwk6+MNLiYQDsdNzLGJJK9TK4hn0Cj+AV80mAQ45beagh4H0SmEoDTPvR/hC7LLlU5rtioE1Rg1tCvlZfHBuPcH9LZMq11Q3HVbZnvzkTdG3lKQlKeFhP86QOIjiAg1Frm0yuOt4nMSdG36N+k1C5szF7HrCoH+u1XgdY6fKI6WW71RkqXJ2IhwOorxcijLVQc2l3wyDLqoQrHtJA2yWGsI9NXlq+d5ZLJ03T7xvcLBPgSDTz91KqBABqJYRdCGhzAuQPe9M814mDu5XgdoCJNUKNrAl6YGvLvJXyj5j8I09qImqsQx09AmEBxi8YTZDbxuO8U/g3yKO14aBgGu3Z+v8+h6xyqJyNsPEbHHxpjfSbwAF/9FlvjA64nOTqPam3fPOjZAdqne5bgf05gFY=
Signature digestsha512
Dependencies
Required Nextcloud versions >=30.0.0,<36.0.0
Minimum Integer bits32
PHP>=8.1.0
PHP extensions bcmath
Budget 2.28.0
Release Details
UpdatedJune 7, 2026, 9:59 p.m.
Changelog

Added

  • Shared savings goals — share a savings goal with another Nextcloud user. Recipients see a "Shared" badge and can view progress; with write permission they can edit the goal and add money, while only the owner can delete it (#255)
  • Auto-derived budgets from recurring items — a (sub-)category with no manually-set budget now shows its committed recurring total (active recurring bills + recurring income, normalized to the budget period) as an automatic budget limit, marked "auto". Typing a value always overrides it (#269)
  • Exclude extraordinary/one-time items from the forecast — a per-transaction "exclude from forecast" flag (with a "No forecast" list badge), the same flag on recurring bills/income (propagated to generated transactions), and a matching import-rule action. Flagged amounts still affect your balance but are kept out of the projection averages (#270)
  • Reusable CSV import templates — save column mappings and import options and reapply them to future imports (#247)
  • OFX/QIF import account routing — route multi-account OFX/QIF files to the right Budget accounts, remembered across subsequent imports
  • Bank sync: pending transactions — option to import not-yet-posted (pending) transactions, automatically reconciled when they clear (#257)
  • Bill start dates — a bill only occurs on or after its start date, making it easy to change a recurring cost mid-year by ending one bill and starting another (#268)
  • "Shared with me" expenses view — recipients can now see expenses that have been shared with them (#248)
  • Dashboard period indicator — chart tiles now show a read-only indicator of the period they cover (#250)

Fixed

  • Dashboard now collapses to a single full-width column on phones, independent of your configured desktop column count (#249)
  • "Excluded from reports" categories no longer appear in the Budget view (#266, #267)
  • Category spending chart shows income as positive with the correct label (#265)
  • Tag-linked savings goals now sum net realized contributions (credits minus debits, excluding scheduled) (#264)
  • Recurring income description is now persisted on create (#263)
  • Transfers are now excluded from dashboard income/expense totals (#262)
  • Account Breakdown report now uses each account's own currency instead of a single assumed one (#256)
  • Fixed a PageController crash (TypeError) on unauthenticated requests (#259)
  • Quick Add date field normalization on iOS (#235)

Docs

  • Documented the standalone Quick Add page and the iOS home-screen workaround
  • Noted that GoCardless no longer accepts new bank-sync sign-ups; EU/UK self-hosters without an existing account are pointed to manual import (#271)
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIEATCCAukCAhNXMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNjAzMTA1MDE5WhcNMzYwOTA4MTA1MDE5WjARMQ8wDQYD
VQQDDAZidWRnZXQwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDNKchk
gsYxcNMufIP/m82JAeIA/fFibi4mGwKEkXwWLXDDAMiwaHmrpkCcC7BYNw0iOk/K
/xYMlEw738UrhQtu5PHAi/fecIAwh7H/ij7jGcwROe7cOcwK0sdmT76po8Ry4Of0
1wE8f+/Rmw9+rRPLE5dRluuHhiO0Eg6pO+KnqxgWID7CY4Ij7xuQtyUsYKkArjEq
irooV6OPmvQHDyQHMbgKhYr+47LZZ0YuNzZd0jhd5JIMWXV6aUgW9R23c9T7JgMG
pPOhHSWxZOBlRWzRVtCEzSug3J39n9eZqVP1PFIZI/pq0mOOt7LTz5IUX0xF0lJ+
JM7lPsTuJibESiWXKo9neTvy9BUWDIV9D/i8CH1uz0+xVala0uQRSNbrdWV4cN4v
oVaYwoXm+kYeGSz27f9CxJgLEA5sxuFWlbmm2+AXOFQPyyUDVXDCvAB/rzDZpFNo
HxM0OxyfmbmLmu+j31qW3JnvJvb6eroYxlvwgVeOCTihhIh6HKQzNFKv0iq3qc4Z
2a2czDyqt5h52CO+hwjsB5jjGNgS7AIxgBmDiw2V10meNGR/ZBVP9zew4FA3IEdY
GVuFBP52xdStrDgFpE3RK799n2i0fXvZE+9zzRlZ7DNRxZXMvBBpR35IhmyqVPDF
PbUmCKV8/Rm7ryZPanmAt78CrI5RVmPz+rrGHQIDAQABMA0GCSqGSIb3DQEBCwUA
A4IBAQCD72IK7rP8TSFVLvja0VU56do2E6q4UTVAtUikqVnVszEv6lJUNqcHT+it
vgD3JtuybukU1pRsbjdu2iLjx2fStYfvapmjMa8rHqAiD6IKVkjOsq5w4Jc4HSR4
JTU9u40YR0Ly1+lHZmGDbBjK9JqJPZBHzPWlJ1sDE+DmgR9Fid9Dfv/uavkx3uuc
FPnWzoxoQx8JQs6DAHzBL6qHfbFoncPRrztRbTmkrAUhJI98nuEGUD1+T51qU5cu
pj8q262ZYKwYWvOyk1AmiokbMiBVd0Obewqj7IiY6T5S+zORLOj1IhzaZ83P9pgM
mq0/oJk8aQYC3vgYCmY2aNWXUX18
-----END CERTIFICATE-----
SignatureiQMjVEdG/FWcc56MAPwvDd04E0ERl5pUWkrRWtdYdgbboBj0+7YAo+rDODFz5qC3EPqWBr7XRkjXOfvn9+m61v0w88Qy8SZQIZRHTAwRJuK5jDQbpfce5dropQgKW8btEIzI3BPE+DFBIDeV+qLNQEYT25ApMkUAz44PumVV0sJMibCGo0JBgIxHCPyem1NNjYaX3qQDt41eg8I5rH8wLCWGa7lNTtGyp8vaJ4ck0sh4J9sPuVzMdJoXQDHfGe5S8YY3GTwgvwyloNJQAFO+SQzm5WX6mC/IKAfpxwG82cQAEMm6B4geyHwaYGSFDEgrBuHOZj2fQmvQgzoarRN+U76bOhjQI0IqU76Pno3qM17eF+UKW8peDiqFBXpepGYfDoeyjQsF2GqxIK3C0bNUR5bp9RjNxkWckwvS2ihvP/2rg4lr05MuDDmIdBYG9Ny+PT9dEWBssQkXzIVX28Ox6P8xkorH0n5EoSRl3j+KMXbM34QteNMt1+jgsHAxcS8H57CwV3MC0uqZnhxUu/LbwIGHzvKbC6vN3F/3l6F+35rWM7UaQhdvr2W/1q5Swj5F2sp2Bq5jgrxbWIuUB9+pzftASgVUEmtd6blOUlJuuJj1wmaIrA9jx21+Bg8t/OmrQqB97ZHzint0WTdo7KTOviKZGnoZVXeoQthPmSyW7Wc=
Signature digestsha512
Dependencies
Required Nextcloud versions >=30.0.0,<36.0.0
Minimum Integer bits32
PHP>=8.1.0
PHP extensions bcmath

Nextcloud 32

Budget 2.28.3
Release Details
UpdatedJune 12, 2026, 1:14 a.m.
Changelog

Security

  • The recurring-income update endpoint no longer passes the raw request body through to the entity layer — a crafted payload could previously set internal fields such as the owning user (mass assignment, integrity only — no data disclosure). Update keys are now allowlisted like the other endpoints

Fixed

  • Auto-derived recurring budgets (#269) are now consistent across all surfaces: the dashboard "Budget Remaining" hero, Budget Progress/Breakdown widgets, Budget Health score, and budget alerts now apply the same recurring fallback as the Budget view — a category funded only by recurring bills can now trigger alerts and is counted in headline totals
  • Auto-derived budgets now respect bill start/end dates: a bill that hasn't started (or has ended) no longer counts toward today's budget, avoiding double-counting during a planned cost change (#268)
  • Recurring income summaries (Income view header, dashboard Income Tracking widget): semi-monthly income was counted at half its value, and a one-time income at full value every month until received
  • Transfers page monthly total: semi-monthly and semi-annual transfers were converted incorrectly
  • Live forecast cache: cache invalidation never matched the stored key (changes such as toggling "exclude from forecast" appeared to do nothing for up to 5 minutes), and the cache key ignored shared-account visibility, letting a share-restricted viewer briefly see the owner's totals
  • Editing a bill's amount without updating its split template is now rejected when the stored splits no longer match (the payment would have silently imported unsplit and uncategorized); setting a split template via the API now clears the bill-level category, matching creation
  • Multi-account import partial failures (e.g. a deleted destination account) are now reported in the UI instead of masquerading as a full success
  • Import preview now also flags repeated bank transaction IDs for accounts that will be created by the import
  • Long OFX FITID hashing threshold raised so every previously-imported FITID keeps its exact ID (re-import dedup continuity)
  • Auto-derived category budgets (#269) now handle every supported frequency correctly: semi-annual bills were over-counted 6×, semi-monthly halved, custom-schedule bills counted every month, and one-time bills inflated the budget monthly until marked paid (now excluded). Frequency math is delegated to the shared calculator, which also gained the missing semi-monthly conversion
  • Auto-derived budgets no longer apply to past months — they reflect today's recurring bills/income and were rewriting history (including overriding explicitly-zeroed snapshot budgets)
  • Multi-account import: an invalid destination account mid-import no longer aborts the batch, and deferred balance recomputes now always run for already-imported rows
  • Bank sync: the post-import balance recompute now keys on transaction creation, not the import counter, so a row persisted just before a non-fatal error still gets its balance update
  • The scheduled-transactions background job now recomputes balances from the ledger (it was the last remaining hand-computed balance delta, and could race concurrent imports)
  • Import preview now flags a repeated bank transaction ID (OFX FITID) within one file as the duplicate it is, matching what import actually does; per-account preview counts include rows that will import with skip-duplicates off
  • Marking a bill paid by linking an existing transaction now warns if the link silently failed (no money movement recorded)
  • Extremely long OFX FITIDs are hashed to stay within the import-ID column
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIEATCCAukCAhNXMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNjAzMTA1MDE5WhcNMzYwOTA4MTA1MDE5WjARMQ8wDQYD
VQQDDAZidWRnZXQwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDNKchk
gsYxcNMufIP/m82JAeIA/fFibi4mGwKEkXwWLXDDAMiwaHmrpkCcC7BYNw0iOk/K
/xYMlEw738UrhQtu5PHAi/fecIAwh7H/ij7jGcwROe7cOcwK0sdmT76po8Ry4Of0
1wE8f+/Rmw9+rRPLE5dRluuHhiO0Eg6pO+KnqxgWID7CY4Ij7xuQtyUsYKkArjEq
irooV6OPmvQHDyQHMbgKhYr+47LZZ0YuNzZd0jhd5JIMWXV6aUgW9R23c9T7JgMG
pPOhHSWxZOBlRWzRVtCEzSug3J39n9eZqVP1PFIZI/pq0mOOt7LTz5IUX0xF0lJ+
JM7lPsTuJibESiWXKo9neTvy9BUWDIV9D/i8CH1uz0+xVala0uQRSNbrdWV4cN4v
oVaYwoXm+kYeGSz27f9CxJgLEA5sxuFWlbmm2+AXOFQPyyUDVXDCvAB/rzDZpFNo
HxM0OxyfmbmLmu+j31qW3JnvJvb6eroYxlvwgVeOCTihhIh6HKQzNFKv0iq3qc4Z
2a2czDyqt5h52CO+hwjsB5jjGNgS7AIxgBmDiw2V10meNGR/ZBVP9zew4FA3IEdY
GVuFBP52xdStrDgFpE3RK799n2i0fXvZE+9zzRlZ7DNRxZXMvBBpR35IhmyqVPDF
PbUmCKV8/Rm7ryZPanmAt78CrI5RVmPz+rrGHQIDAQABMA0GCSqGSIb3DQEBCwUA
A4IBAQCD72IK7rP8TSFVLvja0VU56do2E6q4UTVAtUikqVnVszEv6lJUNqcHT+it
vgD3JtuybukU1pRsbjdu2iLjx2fStYfvapmjMa8rHqAiD6IKVkjOsq5w4Jc4HSR4
JTU9u40YR0Ly1+lHZmGDbBjK9JqJPZBHzPWlJ1sDE+DmgR9Fid9Dfv/uavkx3uuc
FPnWzoxoQx8JQs6DAHzBL6qHfbFoncPRrztRbTmkrAUhJI98nuEGUD1+T51qU5cu
pj8q262ZYKwYWvOyk1AmiokbMiBVd0Obewqj7IiY6T5S+zORLOj1IhzaZ83P9pgM
mq0/oJk8aQYC3vgYCmY2aNWXUX18
-----END CERTIFICATE-----
Signaturefa7u8mWcwya82OCYZOh+XZFPRJH94oqiBM5WUtEtvU3Dh6Lq+pMs8A7e2aCOa0Y6AbwWH7TF6ZRtwanfSh2PjQMwAaDFlR5anBdAvr89L/fn3eK0uSrZetqNGmAT7Itlc0mT5KowbTvtWDRdK46oR4jjqgXKay6JeO7caGbAcKmyfhJARbfTXsb5etz/yhMX72X33ayUYtCo8nQrtxLTGO5AAPIcFbq1pa3W3d1SHuQ7Ibksv3WXrZe79ngT4pQpGp6xtz3ervqo86vrI8qH8DDg6g9IJE8D1iseOiVzRv/KI/N06LnY0OvUHNZwGrJph5Jh3BrYg2/5rSYzEP5VzaGyZm+AS0DO1bXf9BC5OqbRl3s/FsM+4UgowriYD0S2Zwc4/2j/W3mDRjOdGf0MJxd8SOxv7uW2P5JL0TImjA7mTgppSipw1ShGTl8BU7q11cCtFmuCmwGfvPlRLQtMqEdr93gNkY84rAja08K9Ro1/ySZtrEWVRh/lYzQqmpazsjlw1V4x+KYtn65LHr9Zxd46ToleV5kv1tEZJ1u7nFXeNnrfThyz78EqvLbVxzcqphrfrImGOD9/VhUwryM58KtVz7+tXmLjn3SsSmM8sz9DEljbEKK4zTV9mQgIxviGwzNuIGEFD+HaW6HRIsAzRNtXow5oT7Kgpqa3BnJ3HxM=
Signature digestsha512
Dependencies
Required Nextcloud versions >=30.0.0,<36.0.0
Minimum Integer bits32
PHP>=8.1.0
PHP extensions bcmath
Budget 2.28.2
Release Details
UpdatedJune 11, 2026, 6:33 p.m.
Changelog

Fixed

  • Dashboard could render half-empty (hero tiles only, widget grid invisible): a Chart.js resize on a hidden tile's detached canvas threw during initialization, and the widget grid was never revealed. Chart resizing now skips detached canvases and the grid is revealed before the resize pass. Likely also behind "nothing happens" reports after certain actions (#273)
  • Dashboard tiles with a saved account selection pointing at a deleted account (e.g. after factory reset + import re-numbered accounts) no longer error with 404s and stay empty — stale selections fall back to all accounts
  • Account balances are now derived from the ledger instead of running deltas — the root cause behind every historical balance-discrepancy report (#3, #89, #124, #163, #187, #194, #274). The stored balance was a running total that each transaction code path adjusted by hand; any missed or mis-signed delta corrupted it permanently. Every transaction create/update/delete (and retroactive rule run, repair action, import and bank sync) now recomputes balance = opening balance + net of non-scheduled transactions, making drift impossible and self-healing past inconsistencies on the next write. A one-time migration backfills the opening balance so displayed balances do not change on upgrade (#274)
  • Marking a bill as paid now warns loudly when no transaction was recorded (bill without an account, or transaction creation failed) — previously the bill was advanced silently and the account balance never reflected the payment, drifting from the real bank balance every cycle (#89, #274)
  • The app's own export→import now preserves transaction status (scheduled transactions no longer silently become balance-affecting after a migration) and restores the opening-balance invariant for imported accounts
  • "Skip Duplicate Transactions" off is now honored: previously rows whose import ID already existed were still rejected deeper in the stack (duplicate-ID guard + unique index), so parts of the batch silently failed to import. Intentional duplicates now get a uniquified import ID and the entire batch imports (#275)
  • Import duplicate detection no longer gives false positives for legitimately identical rows — e.g. two same-priced purchases on the same day with the same description. Identical rows within one file now import as distinct transactions (occurrence-aware import IDs), while re-importing the same statement still skips everything it already imported. Re-importing an older statement also recovers transactions the previous logic wrongly skipped (#276)
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIEATCCAukCAhNXMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNjAzMTA1MDE5WhcNMzYwOTA4MTA1MDE5WjARMQ8wDQYD
VQQDDAZidWRnZXQwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDNKchk
gsYxcNMufIP/m82JAeIA/fFibi4mGwKEkXwWLXDDAMiwaHmrpkCcC7BYNw0iOk/K
/xYMlEw738UrhQtu5PHAi/fecIAwh7H/ij7jGcwROe7cOcwK0sdmT76po8Ry4Of0
1wE8f+/Rmw9+rRPLE5dRluuHhiO0Eg6pO+KnqxgWID7CY4Ij7xuQtyUsYKkArjEq
irooV6OPmvQHDyQHMbgKhYr+47LZZ0YuNzZd0jhd5JIMWXV6aUgW9R23c9T7JgMG
pPOhHSWxZOBlRWzRVtCEzSug3J39n9eZqVP1PFIZI/pq0mOOt7LTz5IUX0xF0lJ+
JM7lPsTuJibESiWXKo9neTvy9BUWDIV9D/i8CH1uz0+xVala0uQRSNbrdWV4cN4v
oVaYwoXm+kYeGSz27f9CxJgLEA5sxuFWlbmm2+AXOFQPyyUDVXDCvAB/rzDZpFNo
HxM0OxyfmbmLmu+j31qW3JnvJvb6eroYxlvwgVeOCTihhIh6HKQzNFKv0iq3qc4Z
2a2czDyqt5h52CO+hwjsB5jjGNgS7AIxgBmDiw2V10meNGR/ZBVP9zew4FA3IEdY
GVuFBP52xdStrDgFpE3RK799n2i0fXvZE+9zzRlZ7DNRxZXMvBBpR35IhmyqVPDF
PbUmCKV8/Rm7ryZPanmAt78CrI5RVmPz+rrGHQIDAQABMA0GCSqGSIb3DQEBCwUA
A4IBAQCD72IK7rP8TSFVLvja0VU56do2E6q4UTVAtUikqVnVszEv6lJUNqcHT+it
vgD3JtuybukU1pRsbjdu2iLjx2fStYfvapmjMa8rHqAiD6IKVkjOsq5w4Jc4HSR4
JTU9u40YR0Ly1+lHZmGDbBjK9JqJPZBHzPWlJ1sDE+DmgR9Fid9Dfv/uavkx3uuc
FPnWzoxoQx8JQs6DAHzBL6qHfbFoncPRrztRbTmkrAUhJI98nuEGUD1+T51qU5cu
pj8q262ZYKwYWvOyk1AmiokbMiBVd0Obewqj7IiY6T5S+zORLOj1IhzaZ83P9pgM
mq0/oJk8aQYC3vgYCmY2aNWXUX18
-----END CERTIFICATE-----
Signaturekx2VkgWxozCE2LPp/nzgQQiqFxk/83sOdycv738Ly/uEwn/MhxF/kNtBlP4DMQbhmtkcHdt+kDIlQK1S5q1WHJWZQxjLc/ZCkj/ZEPkNBrDhHwdQCRh4TsRVJyfrIxXUTOCAKJLYk+0DXlnJB3kMhR81adns3wWNH9RkC4b62k3gXtzMR4n+jz/QJDGEAOXRpDUzxEm2TKqFot6sGRt3u0+rVo0bng6nogDJha0APeFI5Ujt+3mECw9MlxNt9nKbQlIGjAnraLVUFz0bXNLK7dbBS3PSzjLsUxhoNhAqMivfHEfLViOvIlCFNHzoWGxFnHK0flI2zJXUlOnaidOEyfhZWbqNpHZL4RZLIZWYQaztJgATNsK+L5aO0Md+Np1hgE8jkdY90gugiV06JqoPEWqCo/qSyaO9N3xYpeXrwfiL37JJqkigwg69RZN3OD1DfBT8ue7QlhT93dfg+39ERzbVY9QBu0gT+bwIs8tyE1MVXOaSjHKUkHab5dpGU3NQhvu/E1CO1BWA3dYvUUqvrvXKB96gm7IqNQEAkRi4JJHDPGtgzjERM+k8z/JA2xeJmPp7V3TZ/1WiKOoKMPz88soCJBMuj/LWnSpekLAGo4RJDy1JBlOm835e3ieJFVHwIwqG9YP7oRB/puFvYV6aaEXCnSkUcZV+z+2NXmHB8KM=
Signature digestsha512
Dependencies
Required Nextcloud versions >=30.0.0,<36.0.0
Minimum Integer bits32
PHP>=8.1.0
PHP extensions bcmath
Budget 2.28.1
Release Details
UpdatedJune 8, 2026, 12:13 p.m.
Changelog

Fixed

  • Install/upgrade aborted on Nextcloud 32 and earlier with "Primary index name on oc_budget_import_templates is too long". The budget_import_templates migration created its primary key without an explicit name, so Nextcloud derived a default name and hit the Oracle-compatibility identifier limit (the unprefixed table name is exactly 23 characters). The primary key now has an explicit short name. Thanks to @TheUnderdev for the report and fix (#272)
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIEATCCAukCAhNXMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNjAzMTA1MDE5WhcNMzYwOTA4MTA1MDE5WjARMQ8wDQYD
VQQDDAZidWRnZXQwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDNKchk
gsYxcNMufIP/m82JAeIA/fFibi4mGwKEkXwWLXDDAMiwaHmrpkCcC7BYNw0iOk/K
/xYMlEw738UrhQtu5PHAi/fecIAwh7H/ij7jGcwROe7cOcwK0sdmT76po8Ry4Of0
1wE8f+/Rmw9+rRPLE5dRluuHhiO0Eg6pO+KnqxgWID7CY4Ij7xuQtyUsYKkArjEq
irooV6OPmvQHDyQHMbgKhYr+47LZZ0YuNzZd0jhd5JIMWXV6aUgW9R23c9T7JgMG
pPOhHSWxZOBlRWzRVtCEzSug3J39n9eZqVP1PFIZI/pq0mOOt7LTz5IUX0xF0lJ+
JM7lPsTuJibESiWXKo9neTvy9BUWDIV9D/i8CH1uz0+xVala0uQRSNbrdWV4cN4v
oVaYwoXm+kYeGSz27f9CxJgLEA5sxuFWlbmm2+AXOFQPyyUDVXDCvAB/rzDZpFNo
HxM0OxyfmbmLmu+j31qW3JnvJvb6eroYxlvwgVeOCTihhIh6HKQzNFKv0iq3qc4Z
2a2czDyqt5h52CO+hwjsB5jjGNgS7AIxgBmDiw2V10meNGR/ZBVP9zew4FA3IEdY
GVuFBP52xdStrDgFpE3RK799n2i0fXvZE+9zzRlZ7DNRxZXMvBBpR35IhmyqVPDF
PbUmCKV8/Rm7ryZPanmAt78CrI5RVmPz+rrGHQIDAQABMA0GCSqGSIb3DQEBCwUA
A4IBAQCD72IK7rP8TSFVLvja0VU56do2E6q4UTVAtUikqVnVszEv6lJUNqcHT+it
vgD3JtuybukU1pRsbjdu2iLjx2fStYfvapmjMa8rHqAiD6IKVkjOsq5w4Jc4HSR4
JTU9u40YR0Ly1+lHZmGDbBjK9JqJPZBHzPWlJ1sDE+DmgR9Fid9Dfv/uavkx3uuc
FPnWzoxoQx8JQs6DAHzBL6qHfbFoncPRrztRbTmkrAUhJI98nuEGUD1+T51qU5cu
pj8q262ZYKwYWvOyk1AmiokbMiBVd0Obewqj7IiY6T5S+zORLOj1IhzaZ83P9pgM
mq0/oJk8aQYC3vgYCmY2aNWXUX18
-----END CERTIFICATE-----
SignatureXdUz/Pc10uA7L3R+vTa/cI52W9X8nDyH33zElCWeS/xWeYgonfr0GwLhn4ywE7rtUQF8e1Y8GhETbSd60otnPduP+4rXp7+5+b+iMTa3qfYi6gAd3Y1YJJrZqK0yx2Fdqld/nhQLfFpVkUSQl/JQ78RZanEh779Af5RejNl7lolRlJYg7ZNrLrFasWrpyrLNsg4+Tf74/vMpKWDXf0FEIqjnXZ0LKJm7Yjig4uazy+a5vDcDOrfq6fLU56d9ML/jBJK+9A2loT3I5HP7H2cngdLpwk6+MNLiYQDsdNzLGJJK9TK4hn0Cj+AV80mAQ45beagh4H0SmEoDTPvR/hC7LLlU5rtioE1Rg1tCvlZfHBuPcH9LZMq11Q3HVbZnvzkTdG3lKQlKeFhP86QOIjiAg1Frm0yuOt4nMSdG36N+k1C5szF7HrCoH+u1XgdY6fKI6WW71RkqXJ2IhwOorxcijLVQc2l3wyDLqoQrHtJA2yWGsI9NXlq+d5ZLJ03T7xvcLBPgSDTz91KqBABqJYRdCGhzAuQPe9M814mDu5XgdoCJNUKNrAl6YGvLvJXyj5j8I09qImqsQx09AmEBxi8YTZDbxuO8U/g3yKO14aBgGu3Z+v8+h6xyqJyNsPEbHHxpjfSbwAF/9FlvjA64nOTqPam3fPOjZAdqne5bgf05gFY=
Signature digestsha512
Dependencies
Required Nextcloud versions >=30.0.0,<36.0.0
Minimum Integer bits32
PHP>=8.1.0
PHP extensions bcmath
Budget 2.28.0
Release Details
UpdatedJune 7, 2026, 9:59 p.m.
Changelog

Added

  • Shared savings goals — share a savings goal with another Nextcloud user. Recipients see a "Shared" badge and can view progress; with write permission they can edit the goal and add money, while only the owner can delete it (#255)
  • Auto-derived budgets from recurring items — a (sub-)category with no manually-set budget now shows its committed recurring total (active recurring bills + recurring income, normalized to the budget period) as an automatic budget limit, marked "auto". Typing a value always overrides it (#269)
  • Exclude extraordinary/one-time items from the forecast — a per-transaction "exclude from forecast" flag (with a "No forecast" list badge), the same flag on recurring bills/income (propagated to generated transactions), and a matching import-rule action. Flagged amounts still affect your balance but are kept out of the projection averages (#270)
  • Reusable CSV import templates — save column mappings and import options and reapply them to future imports (#247)
  • OFX/QIF import account routing — route multi-account OFX/QIF files to the right Budget accounts, remembered across subsequent imports
  • Bank sync: pending transactions — option to import not-yet-posted (pending) transactions, automatically reconciled when they clear (#257)
  • Bill start dates — a bill only occurs on or after its start date, making it easy to change a recurring cost mid-year by ending one bill and starting another (#268)
  • "Shared with me" expenses view — recipients can now see expenses that have been shared with them (#248)
  • Dashboard period indicator — chart tiles now show a read-only indicator of the period they cover (#250)

Fixed

  • Dashboard now collapses to a single full-width column on phones, independent of your configured desktop column count (#249)
  • "Excluded from reports" categories no longer appear in the Budget view (#266, #267)
  • Category spending chart shows income as positive with the correct label (#265)
  • Tag-linked savings goals now sum net realized contributions (credits minus debits, excluding scheduled) (#264)
  • Recurring income description is now persisted on create (#263)
  • Transfers are now excluded from dashboard income/expense totals (#262)
  • Account Breakdown report now uses each account's own currency instead of a single assumed one (#256)
  • Fixed a PageController crash (TypeError) on unauthenticated requests (#259)
  • Quick Add date field normalization on iOS (#235)

Docs

  • Documented the standalone Quick Add page and the iOS home-screen workaround
  • Noted that GoCardless no longer accepts new bank-sync sign-ups; EU/UK self-hosters without an existing account are pointed to manual import (#271)
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIEATCCAukCAhNXMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNjAzMTA1MDE5WhcNMzYwOTA4MTA1MDE5WjARMQ8wDQYD
VQQDDAZidWRnZXQwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDNKchk
gsYxcNMufIP/m82JAeIA/fFibi4mGwKEkXwWLXDDAMiwaHmrpkCcC7BYNw0iOk/K
/xYMlEw738UrhQtu5PHAi/fecIAwh7H/ij7jGcwROe7cOcwK0sdmT76po8Ry4Of0
1wE8f+/Rmw9+rRPLE5dRluuHhiO0Eg6pO+KnqxgWID7CY4Ij7xuQtyUsYKkArjEq
irooV6OPmvQHDyQHMbgKhYr+47LZZ0YuNzZd0jhd5JIMWXV6aUgW9R23c9T7JgMG
pPOhHSWxZOBlRWzRVtCEzSug3J39n9eZqVP1PFIZI/pq0mOOt7LTz5IUX0xF0lJ+
JM7lPsTuJibESiWXKo9neTvy9BUWDIV9D/i8CH1uz0+xVala0uQRSNbrdWV4cN4v
oVaYwoXm+kYeGSz27f9CxJgLEA5sxuFWlbmm2+AXOFQPyyUDVXDCvAB/rzDZpFNo
HxM0OxyfmbmLmu+j31qW3JnvJvb6eroYxlvwgVeOCTihhIh6HKQzNFKv0iq3qc4Z
2a2czDyqt5h52CO+hwjsB5jjGNgS7AIxgBmDiw2V10meNGR/ZBVP9zew4FA3IEdY
GVuFBP52xdStrDgFpE3RK799n2i0fXvZE+9zzRlZ7DNRxZXMvBBpR35IhmyqVPDF
PbUmCKV8/Rm7ryZPanmAt78CrI5RVmPz+rrGHQIDAQABMA0GCSqGSIb3DQEBCwUA
A4IBAQCD72IK7rP8TSFVLvja0VU56do2E6q4UTVAtUikqVnVszEv6lJUNqcHT+it
vgD3JtuybukU1pRsbjdu2iLjx2fStYfvapmjMa8rHqAiD6IKVkjOsq5w4Jc4HSR4
JTU9u40YR0Ly1+lHZmGDbBjK9JqJPZBHzPWlJ1sDE+DmgR9Fid9Dfv/uavkx3uuc
FPnWzoxoQx8JQs6DAHzBL6qHfbFoncPRrztRbTmkrAUhJI98nuEGUD1+T51qU5cu
pj8q262ZYKwYWvOyk1AmiokbMiBVd0Obewqj7IiY6T5S+zORLOj1IhzaZ83P9pgM
mq0/oJk8aQYC3vgYCmY2aNWXUX18
-----END CERTIFICATE-----
SignatureiQMjVEdG/FWcc56MAPwvDd04E0ERl5pUWkrRWtdYdgbboBj0+7YAo+rDODFz5qC3EPqWBr7XRkjXOfvn9+m61v0w88Qy8SZQIZRHTAwRJuK5jDQbpfce5dropQgKW8btEIzI3BPE+DFBIDeV+qLNQEYT25ApMkUAz44PumVV0sJMibCGo0JBgIxHCPyem1NNjYaX3qQDt41eg8I5rH8wLCWGa7lNTtGyp8vaJ4ck0sh4J9sPuVzMdJoXQDHfGe5S8YY3GTwgvwyloNJQAFO+SQzm5WX6mC/IKAfpxwG82cQAEMm6B4geyHwaYGSFDEgrBuHOZj2fQmvQgzoarRN+U76bOhjQI0IqU76Pno3qM17eF+UKW8peDiqFBXpepGYfDoeyjQsF2GqxIK3C0bNUR5bp9RjNxkWckwvS2ihvP/2rg4lr05MuDDmIdBYG9Ny+PT9dEWBssQkXzIVX28Ox6P8xkorH0n5EoSRl3j+KMXbM34QteNMt1+jgsHAxcS8H57CwV3MC0uqZnhxUu/LbwIGHzvKbC6vN3F/3l6F+35rWM7UaQhdvr2W/1q5Swj5F2sp2Bq5jgrxbWIuUB9+pzftASgVUEmtd6blOUlJuuJj1wmaIrA9jx21+Bg8t/OmrQqB97ZHzint0WTdo7KTOviKZGnoZVXeoQthPmSyW7Wc=
Signature digestsha512
Dependencies
Required Nextcloud versions >=30.0.0,<36.0.0
Minimum Integer bits32
PHP>=8.1.0
PHP extensions bcmath

Nextcloud 31

Budget 2.28.3
Release Details
UpdatedJune 12, 2026, 1:14 a.m.
Changelog

Security

  • The recurring-income update endpoint no longer passes the raw request body through to the entity layer — a crafted payload could previously set internal fields such as the owning user (mass assignment, integrity only — no data disclosure). Update keys are now allowlisted like the other endpoints

Fixed

  • Auto-derived recurring budgets (#269) are now consistent across all surfaces: the dashboard "Budget Remaining" hero, Budget Progress/Breakdown widgets, Budget Health score, and budget alerts now apply the same recurring fallback as the Budget view — a category funded only by recurring bills can now trigger alerts and is counted in headline totals
  • Auto-derived budgets now respect bill start/end dates: a bill that hasn't started (or has ended) no longer counts toward today's budget, avoiding double-counting during a planned cost change (#268)
  • Recurring income summaries (Income view header, dashboard Income Tracking widget): semi-monthly income was counted at half its value, and a one-time income at full value every month until received
  • Transfers page monthly total: semi-monthly and semi-annual transfers were converted incorrectly
  • Live forecast cache: cache invalidation never matched the stored key (changes such as toggling "exclude from forecast" appeared to do nothing for up to 5 minutes), and the cache key ignored shared-account visibility, letting a share-restricted viewer briefly see the owner's totals
  • Editing a bill's amount without updating its split template is now rejected when the stored splits no longer match (the payment would have silently imported unsplit and uncategorized); setting a split template via the API now clears the bill-level category, matching creation
  • Multi-account import partial failures (e.g. a deleted destination account) are now reported in the UI instead of masquerading as a full success
  • Import preview now also flags repeated bank transaction IDs for accounts that will be created by the import
  • Long OFX FITID hashing threshold raised so every previously-imported FITID keeps its exact ID (re-import dedup continuity)
  • Auto-derived category budgets (#269) now handle every supported frequency correctly: semi-annual bills were over-counted 6×, semi-monthly halved, custom-schedule bills counted every month, and one-time bills inflated the budget monthly until marked paid (now excluded). Frequency math is delegated to the shared calculator, which also gained the missing semi-monthly conversion
  • Auto-derived budgets no longer apply to past months — they reflect today's recurring bills/income and were rewriting history (including overriding explicitly-zeroed snapshot budgets)
  • Multi-account import: an invalid destination account mid-import no longer aborts the batch, and deferred balance recomputes now always run for already-imported rows
  • Bank sync: the post-import balance recompute now keys on transaction creation, not the import counter, so a row persisted just before a non-fatal error still gets its balance update
  • The scheduled-transactions background job now recomputes balances from the ledger (it was the last remaining hand-computed balance delta, and could race concurrent imports)
  • Import preview now flags a repeated bank transaction ID (OFX FITID) within one file as the duplicate it is, matching what import actually does; per-account preview counts include rows that will import with skip-duplicates off
  • Marking a bill paid by linking an existing transaction now warns if the link silently failed (no money movement recorded)
  • Extremely long OFX FITIDs are hashed to stay within the import-ID column
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIEATCCAukCAhNXMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNjAzMTA1MDE5WhcNMzYwOTA4MTA1MDE5WjARMQ8wDQYD
VQQDDAZidWRnZXQwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDNKchk
gsYxcNMufIP/m82JAeIA/fFibi4mGwKEkXwWLXDDAMiwaHmrpkCcC7BYNw0iOk/K
/xYMlEw738UrhQtu5PHAi/fecIAwh7H/ij7jGcwROe7cOcwK0sdmT76po8Ry4Of0
1wE8f+/Rmw9+rRPLE5dRluuHhiO0Eg6pO+KnqxgWID7CY4Ij7xuQtyUsYKkArjEq
irooV6OPmvQHDyQHMbgKhYr+47LZZ0YuNzZd0jhd5JIMWXV6aUgW9R23c9T7JgMG
pPOhHSWxZOBlRWzRVtCEzSug3J39n9eZqVP1PFIZI/pq0mOOt7LTz5IUX0xF0lJ+
JM7lPsTuJibESiWXKo9neTvy9BUWDIV9D/i8CH1uz0+xVala0uQRSNbrdWV4cN4v
oVaYwoXm+kYeGSz27f9CxJgLEA5sxuFWlbmm2+AXOFQPyyUDVXDCvAB/rzDZpFNo
HxM0OxyfmbmLmu+j31qW3JnvJvb6eroYxlvwgVeOCTihhIh6HKQzNFKv0iq3qc4Z
2a2czDyqt5h52CO+hwjsB5jjGNgS7AIxgBmDiw2V10meNGR/ZBVP9zew4FA3IEdY
GVuFBP52xdStrDgFpE3RK799n2i0fXvZE+9zzRlZ7DNRxZXMvBBpR35IhmyqVPDF
PbUmCKV8/Rm7ryZPanmAt78CrI5RVmPz+rrGHQIDAQABMA0GCSqGSIb3DQEBCwUA
A4IBAQCD72IK7rP8TSFVLvja0VU56do2E6q4UTVAtUikqVnVszEv6lJUNqcHT+it
vgD3JtuybukU1pRsbjdu2iLjx2fStYfvapmjMa8rHqAiD6IKVkjOsq5w4Jc4HSR4
JTU9u40YR0Ly1+lHZmGDbBjK9JqJPZBHzPWlJ1sDE+DmgR9Fid9Dfv/uavkx3uuc
FPnWzoxoQx8JQs6DAHzBL6qHfbFoncPRrztRbTmkrAUhJI98nuEGUD1+T51qU5cu
pj8q262ZYKwYWvOyk1AmiokbMiBVd0Obewqj7IiY6T5S+zORLOj1IhzaZ83P9pgM
mq0/oJk8aQYC3vgYCmY2aNWXUX18
-----END CERTIFICATE-----
Signaturefa7u8mWcwya82OCYZOh+XZFPRJH94oqiBM5WUtEtvU3Dh6Lq+pMs8A7e2aCOa0Y6AbwWH7TF6ZRtwanfSh2PjQMwAaDFlR5anBdAvr89L/fn3eK0uSrZetqNGmAT7Itlc0mT5KowbTvtWDRdK46oR4jjqgXKay6JeO7caGbAcKmyfhJARbfTXsb5etz/yhMX72X33ayUYtCo8nQrtxLTGO5AAPIcFbq1pa3W3d1SHuQ7Ibksv3WXrZe79ngT4pQpGp6xtz3ervqo86vrI8qH8DDg6g9IJE8D1iseOiVzRv/KI/N06LnY0OvUHNZwGrJph5Jh3BrYg2/5rSYzEP5VzaGyZm+AS0DO1bXf9BC5OqbRl3s/FsM+4UgowriYD0S2Zwc4/2j/W3mDRjOdGf0MJxd8SOxv7uW2P5JL0TImjA7mTgppSipw1ShGTl8BU7q11cCtFmuCmwGfvPlRLQtMqEdr93gNkY84rAja08K9Ro1/ySZtrEWVRh/lYzQqmpazsjlw1V4x+KYtn65LHr9Zxd46ToleV5kv1tEZJ1u7nFXeNnrfThyz78EqvLbVxzcqphrfrImGOD9/VhUwryM58KtVz7+tXmLjn3SsSmM8sz9DEljbEKK4zTV9mQgIxviGwzNuIGEFD+HaW6HRIsAzRNtXow5oT7Kgpqa3BnJ3HxM=
Signature digestsha512
Dependencies
Required Nextcloud versions >=30.0.0,<36.0.0
Minimum Integer bits32
PHP>=8.1.0
PHP extensions bcmath
Budget 2.28.2
Release Details
UpdatedJune 11, 2026, 6:33 p.m.
Changelog

Fixed

  • Dashboard could render half-empty (hero tiles only, widget grid invisible): a Chart.js resize on a hidden tile's detached canvas threw during initialization, and the widget grid was never revealed. Chart resizing now skips detached canvases and the grid is revealed before the resize pass. Likely also behind "nothing happens" reports after certain actions (#273)
  • Dashboard tiles with a saved account selection pointing at a deleted account (e.g. after factory reset + import re-numbered accounts) no longer error with 404s and stay empty — stale selections fall back to all accounts
  • Account balances are now derived from the ledger instead of running deltas — the root cause behind every historical balance-discrepancy report (#3, #89, #124, #163, #187, #194, #274). The stored balance was a running total that each transaction code path adjusted by hand; any missed or mis-signed delta corrupted it permanently. Every transaction create/update/delete (and retroactive rule run, repair action, import and bank sync) now recomputes balance = opening balance + net of non-scheduled transactions, making drift impossible and self-healing past inconsistencies on the next write. A one-time migration backfills the opening balance so displayed balances do not change on upgrade (#274)
  • Marking a bill as paid now warns loudly when no transaction was recorded (bill without an account, or transaction creation failed) — previously the bill was advanced silently and the account balance never reflected the payment, drifting from the real bank balance every cycle (#89, #274)
  • The app's own export→import now preserves transaction status (scheduled transactions no longer silently become balance-affecting after a migration) and restores the opening-balance invariant for imported accounts
  • "Skip Duplicate Transactions" off is now honored: previously rows whose import ID already existed were still rejected deeper in the stack (duplicate-ID guard + unique index), so parts of the batch silently failed to import. Intentional duplicates now get a uniquified import ID and the entire batch imports (#275)
  • Import duplicate detection no longer gives false positives for legitimately identical rows — e.g. two same-priced purchases on the same day with the same description. Identical rows within one file now import as distinct transactions (occurrence-aware import IDs), while re-importing the same statement still skips everything it already imported. Re-importing an older statement also recovers transactions the previous logic wrongly skipped (#276)
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIEATCCAukCAhNXMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNjAzMTA1MDE5WhcNMzYwOTA4MTA1MDE5WjARMQ8wDQYD
VQQDDAZidWRnZXQwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDNKchk
gsYxcNMufIP/m82JAeIA/fFibi4mGwKEkXwWLXDDAMiwaHmrpkCcC7BYNw0iOk/K
/xYMlEw738UrhQtu5PHAi/fecIAwh7H/ij7jGcwROe7cOcwK0sdmT76po8Ry4Of0
1wE8f+/Rmw9+rRPLE5dRluuHhiO0Eg6pO+KnqxgWID7CY4Ij7xuQtyUsYKkArjEq
irooV6OPmvQHDyQHMbgKhYr+47LZZ0YuNzZd0jhd5JIMWXV6aUgW9R23c9T7JgMG
pPOhHSWxZOBlRWzRVtCEzSug3J39n9eZqVP1PFIZI/pq0mOOt7LTz5IUX0xF0lJ+
JM7lPsTuJibESiWXKo9neTvy9BUWDIV9D/i8CH1uz0+xVala0uQRSNbrdWV4cN4v
oVaYwoXm+kYeGSz27f9CxJgLEA5sxuFWlbmm2+AXOFQPyyUDVXDCvAB/rzDZpFNo
HxM0OxyfmbmLmu+j31qW3JnvJvb6eroYxlvwgVeOCTihhIh6HKQzNFKv0iq3qc4Z
2a2czDyqt5h52CO+hwjsB5jjGNgS7AIxgBmDiw2V10meNGR/ZBVP9zew4FA3IEdY
GVuFBP52xdStrDgFpE3RK799n2i0fXvZE+9zzRlZ7DNRxZXMvBBpR35IhmyqVPDF
PbUmCKV8/Rm7ryZPanmAt78CrI5RVmPz+rrGHQIDAQABMA0GCSqGSIb3DQEBCwUA
A4IBAQCD72IK7rP8TSFVLvja0VU56do2E6q4UTVAtUikqVnVszEv6lJUNqcHT+it
vgD3JtuybukU1pRsbjdu2iLjx2fStYfvapmjMa8rHqAiD6IKVkjOsq5w4Jc4HSR4
JTU9u40YR0Ly1+lHZmGDbBjK9JqJPZBHzPWlJ1sDE+DmgR9Fid9Dfv/uavkx3uuc
FPnWzoxoQx8JQs6DAHzBL6qHfbFoncPRrztRbTmkrAUhJI98nuEGUD1+T51qU5cu
pj8q262ZYKwYWvOyk1AmiokbMiBVd0Obewqj7IiY6T5S+zORLOj1IhzaZ83P9pgM
mq0/oJk8aQYC3vgYCmY2aNWXUX18
-----END CERTIFICATE-----
Signaturekx2VkgWxozCE2LPp/nzgQQiqFxk/83sOdycv738Ly/uEwn/MhxF/kNtBlP4DMQbhmtkcHdt+kDIlQK1S5q1WHJWZQxjLc/ZCkj/ZEPkNBrDhHwdQCRh4TsRVJyfrIxXUTOCAKJLYk+0DXlnJB3kMhR81adns3wWNH9RkC4b62k3gXtzMR4n+jz/QJDGEAOXRpDUzxEm2TKqFot6sGRt3u0+rVo0bng6nogDJha0APeFI5Ujt+3mECw9MlxNt9nKbQlIGjAnraLVUFz0bXNLK7dbBS3PSzjLsUxhoNhAqMivfHEfLViOvIlCFNHzoWGxFnHK0flI2zJXUlOnaidOEyfhZWbqNpHZL4RZLIZWYQaztJgATNsK+L5aO0Md+Np1hgE8jkdY90gugiV06JqoPEWqCo/qSyaO9N3xYpeXrwfiL37JJqkigwg69RZN3OD1DfBT8ue7QlhT93dfg+39ERzbVY9QBu0gT+bwIs8tyE1MVXOaSjHKUkHab5dpGU3NQhvu/E1CO1BWA3dYvUUqvrvXKB96gm7IqNQEAkRi4JJHDPGtgzjERM+k8z/JA2xeJmPp7V3TZ/1WiKOoKMPz88soCJBMuj/LWnSpekLAGo4RJDy1JBlOm835e3ieJFVHwIwqG9YP7oRB/puFvYV6aaEXCnSkUcZV+z+2NXmHB8KM=
Signature digestsha512
Dependencies
Required Nextcloud versions >=30.0.0,<36.0.0
Minimum Integer bits32
PHP>=8.1.0
PHP extensions bcmath
Budget 2.28.1
Release Details
UpdatedJune 8, 2026, 12:13 p.m.
Changelog

Fixed

  • Install/upgrade aborted on Nextcloud 32 and earlier with "Primary index name on oc_budget_import_templates is too long". The budget_import_templates migration created its primary key without an explicit name, so Nextcloud derived a default name and hit the Oracle-compatibility identifier limit (the unprefixed table name is exactly 23 characters). The primary key now has an explicit short name. Thanks to @TheUnderdev for the report and fix (#272)
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIEATCCAukCAhNXMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNjAzMTA1MDE5WhcNMzYwOTA4MTA1MDE5WjARMQ8wDQYD
VQQDDAZidWRnZXQwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDNKchk
gsYxcNMufIP/m82JAeIA/fFibi4mGwKEkXwWLXDDAMiwaHmrpkCcC7BYNw0iOk/K
/xYMlEw738UrhQtu5PHAi/fecIAwh7H/ij7jGcwROe7cOcwK0sdmT76po8Ry4Of0
1wE8f+/Rmw9+rRPLE5dRluuHhiO0Eg6pO+KnqxgWID7CY4Ij7xuQtyUsYKkArjEq
irooV6OPmvQHDyQHMbgKhYr+47LZZ0YuNzZd0jhd5JIMWXV6aUgW9R23c9T7JgMG
pPOhHSWxZOBlRWzRVtCEzSug3J39n9eZqVP1PFIZI/pq0mOOt7LTz5IUX0xF0lJ+
JM7lPsTuJibESiWXKo9neTvy9BUWDIV9D/i8CH1uz0+xVala0uQRSNbrdWV4cN4v
oVaYwoXm+kYeGSz27f9CxJgLEA5sxuFWlbmm2+AXOFQPyyUDVXDCvAB/rzDZpFNo
HxM0OxyfmbmLmu+j31qW3JnvJvb6eroYxlvwgVeOCTihhIh6HKQzNFKv0iq3qc4Z
2a2czDyqt5h52CO+hwjsB5jjGNgS7AIxgBmDiw2V10meNGR/ZBVP9zew4FA3IEdY
GVuFBP52xdStrDgFpE3RK799n2i0fXvZE+9zzRlZ7DNRxZXMvBBpR35IhmyqVPDF
PbUmCKV8/Rm7ryZPanmAt78CrI5RVmPz+rrGHQIDAQABMA0GCSqGSIb3DQEBCwUA
A4IBAQCD72IK7rP8TSFVLvja0VU56do2E6q4UTVAtUikqVnVszEv6lJUNqcHT+it
vgD3JtuybukU1pRsbjdu2iLjx2fStYfvapmjMa8rHqAiD6IKVkjOsq5w4Jc4HSR4
JTU9u40YR0Ly1+lHZmGDbBjK9JqJPZBHzPWlJ1sDE+DmgR9Fid9Dfv/uavkx3uuc
FPnWzoxoQx8JQs6DAHzBL6qHfbFoncPRrztRbTmkrAUhJI98nuEGUD1+T51qU5cu
pj8q262ZYKwYWvOyk1AmiokbMiBVd0Obewqj7IiY6T5S+zORLOj1IhzaZ83P9pgM
mq0/oJk8aQYC3vgYCmY2aNWXUX18
-----END CERTIFICATE-----
SignatureXdUz/Pc10uA7L3R+vTa/cI52W9X8nDyH33zElCWeS/xWeYgonfr0GwLhn4ywE7rtUQF8e1Y8GhETbSd60otnPduP+4rXp7+5+b+iMTa3qfYi6gAd3Y1YJJrZqK0yx2Fdqld/nhQLfFpVkUSQl/JQ78RZanEh779Af5RejNl7lolRlJYg7ZNrLrFasWrpyrLNsg4+Tf74/vMpKWDXf0FEIqjnXZ0LKJm7Yjig4uazy+a5vDcDOrfq6fLU56d9ML/jBJK+9A2loT3I5HP7H2cngdLpwk6+MNLiYQDsdNzLGJJK9TK4hn0Cj+AV80mAQ45beagh4H0SmEoDTPvR/hC7LLlU5rtioE1Rg1tCvlZfHBuPcH9LZMq11Q3HVbZnvzkTdG3lKQlKeFhP86QOIjiAg1Frm0yuOt4nMSdG36N+k1C5szF7HrCoH+u1XgdY6fKI6WW71RkqXJ2IhwOorxcijLVQc2l3wyDLqoQrHtJA2yWGsI9NXlq+d5ZLJ03T7xvcLBPgSDTz91KqBABqJYRdCGhzAuQPe9M814mDu5XgdoCJNUKNrAl6YGvLvJXyj5j8I09qImqsQx09AmEBxi8YTZDbxuO8U/g3yKO14aBgGu3Z+v8+h6xyqJyNsPEbHHxpjfSbwAF/9FlvjA64nOTqPam3fPOjZAdqne5bgf05gFY=
Signature digestsha512
Dependencies
Required Nextcloud versions >=30.0.0,<36.0.0
Minimum Integer bits32
PHP>=8.1.0
PHP extensions bcmath
Budget 2.28.0
Release Details
UpdatedJune 7, 2026, 9:59 p.m.
Changelog

Added

  • Shared savings goals — share a savings goal with another Nextcloud user. Recipients see a "Shared" badge and can view progress; with write permission they can edit the goal and add money, while only the owner can delete it (#255)
  • Auto-derived budgets from recurring items — a (sub-)category with no manually-set budget now shows its committed recurring total (active recurring bills + recurring income, normalized to the budget period) as an automatic budget limit, marked "auto". Typing a value always overrides it (#269)
  • Exclude extraordinary/one-time items from the forecast — a per-transaction "exclude from forecast" flag (with a "No forecast" list badge), the same flag on recurring bills/income (propagated to generated transactions), and a matching import-rule action. Flagged amounts still affect your balance but are kept out of the projection averages (#270)
  • Reusable CSV import templates — save column mappings and import options and reapply them to future imports (#247)
  • OFX/QIF import account routing — route multi-account OFX/QIF files to the right Budget accounts, remembered across subsequent imports
  • Bank sync: pending transactions — option to import not-yet-posted (pending) transactions, automatically reconciled when they clear (#257)
  • Bill start dates — a bill only occurs on or after its start date, making it easy to change a recurring cost mid-year by ending one bill and starting another (#268)
  • "Shared with me" expenses view — recipients can now see expenses that have been shared with them (#248)
  • Dashboard period indicator — chart tiles now show a read-only indicator of the period they cover (#250)

Fixed

  • Dashboard now collapses to a single full-width column on phones, independent of your configured desktop column count (#249)
  • "Excluded from reports" categories no longer appear in the Budget view (#266, #267)
  • Category spending chart shows income as positive with the correct label (#265)
  • Tag-linked savings goals now sum net realized contributions (credits minus debits, excluding scheduled) (#264)
  • Recurring income description is now persisted on create (#263)
  • Transfers are now excluded from dashboard income/expense totals (#262)
  • Account Breakdown report now uses each account's own currency instead of a single assumed one (#256)
  • Fixed a PageController crash (TypeError) on unauthenticated requests (#259)
  • Quick Add date field normalization on iOS (#235)

Docs

  • Documented the standalone Quick Add page and the iOS home-screen workaround
  • Noted that GoCardless no longer accepts new bank-sync sign-ups; EU/UK self-hosters without an existing account are pointed to manual import (#271)
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIEATCCAukCAhNXMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNjAzMTA1MDE5WhcNMzYwOTA4MTA1MDE5WjARMQ8wDQYD
VQQDDAZidWRnZXQwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDNKchk
gsYxcNMufIP/m82JAeIA/fFibi4mGwKEkXwWLXDDAMiwaHmrpkCcC7BYNw0iOk/K
/xYMlEw738UrhQtu5PHAi/fecIAwh7H/ij7jGcwROe7cOcwK0sdmT76po8Ry4Of0
1wE8f+/Rmw9+rRPLE5dRluuHhiO0Eg6pO+KnqxgWID7CY4Ij7xuQtyUsYKkArjEq
irooV6OPmvQHDyQHMbgKhYr+47LZZ0YuNzZd0jhd5JIMWXV6aUgW9R23c9T7JgMG
pPOhHSWxZOBlRWzRVtCEzSug3J39n9eZqVP1PFIZI/pq0mOOt7LTz5IUX0xF0lJ+
JM7lPsTuJibESiWXKo9neTvy9BUWDIV9D/i8CH1uz0+xVala0uQRSNbrdWV4cN4v
oVaYwoXm+kYeGSz27f9CxJgLEA5sxuFWlbmm2+AXOFQPyyUDVXDCvAB/rzDZpFNo
HxM0OxyfmbmLmu+j31qW3JnvJvb6eroYxlvwgVeOCTihhIh6HKQzNFKv0iq3qc4Z
2a2czDyqt5h52CO+hwjsB5jjGNgS7AIxgBmDiw2V10meNGR/ZBVP9zew4FA3IEdY
GVuFBP52xdStrDgFpE3RK799n2i0fXvZE+9zzRlZ7DNRxZXMvBBpR35IhmyqVPDF
PbUmCKV8/Rm7ryZPanmAt78CrI5RVmPz+rrGHQIDAQABMA0GCSqGSIb3DQEBCwUA
A4IBAQCD72IK7rP8TSFVLvja0VU56do2E6q4UTVAtUikqVnVszEv6lJUNqcHT+it
vgD3JtuybukU1pRsbjdu2iLjx2fStYfvapmjMa8rHqAiD6IKVkjOsq5w4Jc4HSR4
JTU9u40YR0Ly1+lHZmGDbBjK9JqJPZBHzPWlJ1sDE+DmgR9Fid9Dfv/uavkx3uuc
FPnWzoxoQx8JQs6DAHzBL6qHfbFoncPRrztRbTmkrAUhJI98nuEGUD1+T51qU5cu
pj8q262ZYKwYWvOyk1AmiokbMiBVd0Obewqj7IiY6T5S+zORLOj1IhzaZ83P9pgM
mq0/oJk8aQYC3vgYCmY2aNWXUX18
-----END CERTIFICATE-----
SignatureiQMjVEdG/FWcc56MAPwvDd04E0ERl5pUWkrRWtdYdgbboBj0+7YAo+rDODFz5qC3EPqWBr7XRkjXOfvn9+m61v0w88Qy8SZQIZRHTAwRJuK5jDQbpfce5dropQgKW8btEIzI3BPE+DFBIDeV+qLNQEYT25ApMkUAz44PumVV0sJMibCGo0JBgIxHCPyem1NNjYaX3qQDt41eg8I5rH8wLCWGa7lNTtGyp8vaJ4ck0sh4J9sPuVzMdJoXQDHfGe5S8YY3GTwgvwyloNJQAFO+SQzm5WX6mC/IKAfpxwG82cQAEMm6B4geyHwaYGSFDEgrBuHOZj2fQmvQgzoarRN+U76bOhjQI0IqU76Pno3qM17eF+UKW8peDiqFBXpepGYfDoeyjQsF2GqxIK3C0bNUR5bp9RjNxkWckwvS2ihvP/2rg4lr05MuDDmIdBYG9Ny+PT9dEWBssQkXzIVX28Ox6P8xkorH0n5EoSRl3j+KMXbM34QteNMt1+jgsHAxcS8H57CwV3MC0uqZnhxUu/LbwIGHzvKbC6vN3F/3l6F+35rWM7UaQhdvr2W/1q5Swj5F2sp2Bq5jgrxbWIuUB9+pzftASgVUEmtd6blOUlJuuJj1wmaIrA9jx21+Bg8t/OmrQqB97ZHzint0WTdo7KTOviKZGnoZVXeoQthPmSyW7Wc=
Signature digestsha512
Dependencies
Required Nextcloud versions >=30.0.0,<36.0.0
Minimum Integer bits32
PHP>=8.1.0
PHP extensions bcmath

Nextcloud 30

Budget 2.28.3
Release Details
UpdatedJune 12, 2026, 1:14 a.m.
Changelog

Security

  • The recurring-income update endpoint no longer passes the raw request body through to the entity layer — a crafted payload could previously set internal fields such as the owning user (mass assignment, integrity only — no data disclosure). Update keys are now allowlisted like the other endpoints

Fixed

  • Auto-derived recurring budgets (#269) are now consistent across all surfaces: the dashboard "Budget Remaining" hero, Budget Progress/Breakdown widgets, Budget Health score, and budget alerts now apply the same recurring fallback as the Budget view — a category funded only by recurring bills can now trigger alerts and is counted in headline totals
  • Auto-derived budgets now respect bill start/end dates: a bill that hasn't started (or has ended) no longer counts toward today's budget, avoiding double-counting during a planned cost change (#268)
  • Recurring income summaries (Income view header, dashboard Income Tracking widget): semi-monthly income was counted at half its value, and a one-time income at full value every month until received
  • Transfers page monthly total: semi-monthly and semi-annual transfers were converted incorrectly
  • Live forecast cache: cache invalidation never matched the stored key (changes such as toggling "exclude from forecast" appeared to do nothing for up to 5 minutes), and the cache key ignored shared-account visibility, letting a share-restricted viewer briefly see the owner's totals
  • Editing a bill's amount without updating its split template is now rejected when the stored splits no longer match (the payment would have silently imported unsplit and uncategorized); setting a split template via the API now clears the bill-level category, matching creation
  • Multi-account import partial failures (e.g. a deleted destination account) are now reported in the UI instead of masquerading as a full success
  • Import preview now also flags repeated bank transaction IDs for accounts that will be created by the import
  • Long OFX FITID hashing threshold raised so every previously-imported FITID keeps its exact ID (re-import dedup continuity)
  • Auto-derived category budgets (#269) now handle every supported frequency correctly: semi-annual bills were over-counted 6×, semi-monthly halved, custom-schedule bills counted every month, and one-time bills inflated the budget monthly until marked paid (now excluded). Frequency math is delegated to the shared calculator, which also gained the missing semi-monthly conversion
  • Auto-derived budgets no longer apply to past months — they reflect today's recurring bills/income and were rewriting history (including overriding explicitly-zeroed snapshot budgets)
  • Multi-account import: an invalid destination account mid-import no longer aborts the batch, and deferred balance recomputes now always run for already-imported rows
  • Bank sync: the post-import balance recompute now keys on transaction creation, not the import counter, so a row persisted just before a non-fatal error still gets its balance update
  • The scheduled-transactions background job now recomputes balances from the ledger (it was the last remaining hand-computed balance delta, and could race concurrent imports)
  • Import preview now flags a repeated bank transaction ID (OFX FITID) within one file as the duplicate it is, matching what import actually does; per-account preview counts include rows that will import with skip-duplicates off
  • Marking a bill paid by linking an existing transaction now warns if the link silently failed (no money movement recorded)
  • Extremely long OFX FITIDs are hashed to stay within the import-ID column
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIEATCCAukCAhNXMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNjAzMTA1MDE5WhcNMzYwOTA4MTA1MDE5WjARMQ8wDQYD
VQQDDAZidWRnZXQwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDNKchk
gsYxcNMufIP/m82JAeIA/fFibi4mGwKEkXwWLXDDAMiwaHmrpkCcC7BYNw0iOk/K
/xYMlEw738UrhQtu5PHAi/fecIAwh7H/ij7jGcwROe7cOcwK0sdmT76po8Ry4Of0
1wE8f+/Rmw9+rRPLE5dRluuHhiO0Eg6pO+KnqxgWID7CY4Ij7xuQtyUsYKkArjEq
irooV6OPmvQHDyQHMbgKhYr+47LZZ0YuNzZd0jhd5JIMWXV6aUgW9R23c9T7JgMG
pPOhHSWxZOBlRWzRVtCEzSug3J39n9eZqVP1PFIZI/pq0mOOt7LTz5IUX0xF0lJ+
JM7lPsTuJibESiWXKo9neTvy9BUWDIV9D/i8CH1uz0+xVala0uQRSNbrdWV4cN4v
oVaYwoXm+kYeGSz27f9CxJgLEA5sxuFWlbmm2+AXOFQPyyUDVXDCvAB/rzDZpFNo
HxM0OxyfmbmLmu+j31qW3JnvJvb6eroYxlvwgVeOCTihhIh6HKQzNFKv0iq3qc4Z
2a2czDyqt5h52CO+hwjsB5jjGNgS7AIxgBmDiw2V10meNGR/ZBVP9zew4FA3IEdY
GVuFBP52xdStrDgFpE3RK799n2i0fXvZE+9zzRlZ7DNRxZXMvBBpR35IhmyqVPDF
PbUmCKV8/Rm7ryZPanmAt78CrI5RVmPz+rrGHQIDAQABMA0GCSqGSIb3DQEBCwUA
A4IBAQCD72IK7rP8TSFVLvja0VU56do2E6q4UTVAtUikqVnVszEv6lJUNqcHT+it
vgD3JtuybukU1pRsbjdu2iLjx2fStYfvapmjMa8rHqAiD6IKVkjOsq5w4Jc4HSR4
JTU9u40YR0Ly1+lHZmGDbBjK9JqJPZBHzPWlJ1sDE+DmgR9Fid9Dfv/uavkx3uuc
FPnWzoxoQx8JQs6DAHzBL6qHfbFoncPRrztRbTmkrAUhJI98nuEGUD1+T51qU5cu
pj8q262ZYKwYWvOyk1AmiokbMiBVd0Obewqj7IiY6T5S+zORLOj1IhzaZ83P9pgM
mq0/oJk8aQYC3vgYCmY2aNWXUX18
-----END CERTIFICATE-----
Signaturefa7u8mWcwya82OCYZOh+XZFPRJH94oqiBM5WUtEtvU3Dh6Lq+pMs8A7e2aCOa0Y6AbwWH7TF6ZRtwanfSh2PjQMwAaDFlR5anBdAvr89L/fn3eK0uSrZetqNGmAT7Itlc0mT5KowbTvtWDRdK46oR4jjqgXKay6JeO7caGbAcKmyfhJARbfTXsb5etz/yhMX72X33ayUYtCo8nQrtxLTGO5AAPIcFbq1pa3W3d1SHuQ7Ibksv3WXrZe79ngT4pQpGp6xtz3ervqo86vrI8qH8DDg6g9IJE8D1iseOiVzRv/KI/N06LnY0OvUHNZwGrJph5Jh3BrYg2/5rSYzEP5VzaGyZm+AS0DO1bXf9BC5OqbRl3s/FsM+4UgowriYD0S2Zwc4/2j/W3mDRjOdGf0MJxd8SOxv7uW2P5JL0TImjA7mTgppSipw1ShGTl8BU7q11cCtFmuCmwGfvPlRLQtMqEdr93gNkY84rAja08K9Ro1/ySZtrEWVRh/lYzQqmpazsjlw1V4x+KYtn65LHr9Zxd46ToleV5kv1tEZJ1u7nFXeNnrfThyz78EqvLbVxzcqphrfrImGOD9/VhUwryM58KtVz7+tXmLjn3SsSmM8sz9DEljbEKK4zTV9mQgIxviGwzNuIGEFD+HaW6HRIsAzRNtXow5oT7Kgpqa3BnJ3HxM=
Signature digestsha512
Dependencies
Required Nextcloud versions >=30.0.0,<36.0.0
Minimum Integer bits32
PHP>=8.1.0
PHP extensions bcmath
Budget 2.28.2
Release Details
UpdatedJune 11, 2026, 6:33 p.m.
Changelog

Fixed

  • Dashboard could render half-empty (hero tiles only, widget grid invisible): a Chart.js resize on a hidden tile's detached canvas threw during initialization, and the widget grid was never revealed. Chart resizing now skips detached canvases and the grid is revealed before the resize pass. Likely also behind "nothing happens" reports after certain actions (#273)
  • Dashboard tiles with a saved account selection pointing at a deleted account (e.g. after factory reset + import re-numbered accounts) no longer error with 404s and stay empty — stale selections fall back to all accounts
  • Account balances are now derived from the ledger instead of running deltas — the root cause behind every historical balance-discrepancy report (#3, #89, #124, #163, #187, #194, #274). The stored balance was a running total that each transaction code path adjusted by hand; any missed or mis-signed delta corrupted it permanently. Every transaction create/update/delete (and retroactive rule run, repair action, import and bank sync) now recomputes balance = opening balance + net of non-scheduled transactions, making drift impossible and self-healing past inconsistencies on the next write. A one-time migration backfills the opening balance so displayed balances do not change on upgrade (#274)
  • Marking a bill as paid now warns loudly when no transaction was recorded (bill without an account, or transaction creation failed) — previously the bill was advanced silently and the account balance never reflected the payment, drifting from the real bank balance every cycle (#89, #274)
  • The app's own export→import now preserves transaction status (scheduled transactions no longer silently become balance-affecting after a migration) and restores the opening-balance invariant for imported accounts
  • "Skip Duplicate Transactions" off is now honored: previously rows whose import ID already existed were still rejected deeper in the stack (duplicate-ID guard + unique index), so parts of the batch silently failed to import. Intentional duplicates now get a uniquified import ID and the entire batch imports (#275)
  • Import duplicate detection no longer gives false positives for legitimately identical rows — e.g. two same-priced purchases on the same day with the same description. Identical rows within one file now import as distinct transactions (occurrence-aware import IDs), while re-importing the same statement still skips everything it already imported. Re-importing an older statement also recovers transactions the previous logic wrongly skipped (#276)
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIEATCCAukCAhNXMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNjAzMTA1MDE5WhcNMzYwOTA4MTA1MDE5WjARMQ8wDQYD
VQQDDAZidWRnZXQwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDNKchk
gsYxcNMufIP/m82JAeIA/fFibi4mGwKEkXwWLXDDAMiwaHmrpkCcC7BYNw0iOk/K
/xYMlEw738UrhQtu5PHAi/fecIAwh7H/ij7jGcwROe7cOcwK0sdmT76po8Ry4Of0
1wE8f+/Rmw9+rRPLE5dRluuHhiO0Eg6pO+KnqxgWID7CY4Ij7xuQtyUsYKkArjEq
irooV6OPmvQHDyQHMbgKhYr+47LZZ0YuNzZd0jhd5JIMWXV6aUgW9R23c9T7JgMG
pPOhHSWxZOBlRWzRVtCEzSug3J39n9eZqVP1PFIZI/pq0mOOt7LTz5IUX0xF0lJ+
JM7lPsTuJibESiWXKo9neTvy9BUWDIV9D/i8CH1uz0+xVala0uQRSNbrdWV4cN4v
oVaYwoXm+kYeGSz27f9CxJgLEA5sxuFWlbmm2+AXOFQPyyUDVXDCvAB/rzDZpFNo
HxM0OxyfmbmLmu+j31qW3JnvJvb6eroYxlvwgVeOCTihhIh6HKQzNFKv0iq3qc4Z
2a2czDyqt5h52CO+hwjsB5jjGNgS7AIxgBmDiw2V10meNGR/ZBVP9zew4FA3IEdY
GVuFBP52xdStrDgFpE3RK799n2i0fXvZE+9zzRlZ7DNRxZXMvBBpR35IhmyqVPDF
PbUmCKV8/Rm7ryZPanmAt78CrI5RVmPz+rrGHQIDAQABMA0GCSqGSIb3DQEBCwUA
A4IBAQCD72IK7rP8TSFVLvja0VU56do2E6q4UTVAtUikqVnVszEv6lJUNqcHT+it
vgD3JtuybukU1pRsbjdu2iLjx2fStYfvapmjMa8rHqAiD6IKVkjOsq5w4Jc4HSR4
JTU9u40YR0Ly1+lHZmGDbBjK9JqJPZBHzPWlJ1sDE+DmgR9Fid9Dfv/uavkx3uuc
FPnWzoxoQx8JQs6DAHzBL6qHfbFoncPRrztRbTmkrAUhJI98nuEGUD1+T51qU5cu
pj8q262ZYKwYWvOyk1AmiokbMiBVd0Obewqj7IiY6T5S+zORLOj1IhzaZ83P9pgM
mq0/oJk8aQYC3vgYCmY2aNWXUX18
-----END CERTIFICATE-----
Signaturekx2VkgWxozCE2LPp/nzgQQiqFxk/83sOdycv738Ly/uEwn/MhxF/kNtBlP4DMQbhmtkcHdt+kDIlQK1S5q1WHJWZQxjLc/ZCkj/ZEPkNBrDhHwdQCRh4TsRVJyfrIxXUTOCAKJLYk+0DXlnJB3kMhR81adns3wWNH9RkC4b62k3gXtzMR4n+jz/QJDGEAOXRpDUzxEm2TKqFot6sGRt3u0+rVo0bng6nogDJha0APeFI5Ujt+3mECw9MlxNt9nKbQlIGjAnraLVUFz0bXNLK7dbBS3PSzjLsUxhoNhAqMivfHEfLViOvIlCFNHzoWGxFnHK0flI2zJXUlOnaidOEyfhZWbqNpHZL4RZLIZWYQaztJgATNsK+L5aO0Md+Np1hgE8jkdY90gugiV06JqoPEWqCo/qSyaO9N3xYpeXrwfiL37JJqkigwg69RZN3OD1DfBT8ue7QlhT93dfg+39ERzbVY9QBu0gT+bwIs8tyE1MVXOaSjHKUkHab5dpGU3NQhvu/E1CO1BWA3dYvUUqvrvXKB96gm7IqNQEAkRi4JJHDPGtgzjERM+k8z/JA2xeJmPp7V3TZ/1WiKOoKMPz88soCJBMuj/LWnSpekLAGo4RJDy1JBlOm835e3ieJFVHwIwqG9YP7oRB/puFvYV6aaEXCnSkUcZV+z+2NXmHB8KM=
Signature digestsha512
Dependencies
Required Nextcloud versions >=30.0.0,<36.0.0
Minimum Integer bits32
PHP>=8.1.0
PHP extensions bcmath
Budget 2.28.1
Release Details
UpdatedJune 8, 2026, 12:13 p.m.
Changelog

Fixed

  • Install/upgrade aborted on Nextcloud 32 and earlier with "Primary index name on oc_budget_import_templates is too long". The budget_import_templates migration created its primary key without an explicit name, so Nextcloud derived a default name and hit the Oracle-compatibility identifier limit (the unprefixed table name is exactly 23 characters). The primary key now has an explicit short name. Thanks to @TheUnderdev for the report and fix (#272)
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIEATCCAukCAhNXMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNjAzMTA1MDE5WhcNMzYwOTA4MTA1MDE5WjARMQ8wDQYD
VQQDDAZidWRnZXQwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDNKchk
gsYxcNMufIP/m82JAeIA/fFibi4mGwKEkXwWLXDDAMiwaHmrpkCcC7BYNw0iOk/K
/xYMlEw738UrhQtu5PHAi/fecIAwh7H/ij7jGcwROe7cOcwK0sdmT76po8Ry4Of0
1wE8f+/Rmw9+rRPLE5dRluuHhiO0Eg6pO+KnqxgWID7CY4Ij7xuQtyUsYKkArjEq
irooV6OPmvQHDyQHMbgKhYr+47LZZ0YuNzZd0jhd5JIMWXV6aUgW9R23c9T7JgMG
pPOhHSWxZOBlRWzRVtCEzSug3J39n9eZqVP1PFIZI/pq0mOOt7LTz5IUX0xF0lJ+
JM7lPsTuJibESiWXKo9neTvy9BUWDIV9D/i8CH1uz0+xVala0uQRSNbrdWV4cN4v
oVaYwoXm+kYeGSz27f9CxJgLEA5sxuFWlbmm2+AXOFQPyyUDVXDCvAB/rzDZpFNo
HxM0OxyfmbmLmu+j31qW3JnvJvb6eroYxlvwgVeOCTihhIh6HKQzNFKv0iq3qc4Z
2a2czDyqt5h52CO+hwjsB5jjGNgS7AIxgBmDiw2V10meNGR/ZBVP9zew4FA3IEdY
GVuFBP52xdStrDgFpE3RK799n2i0fXvZE+9zzRlZ7DNRxZXMvBBpR35IhmyqVPDF
PbUmCKV8/Rm7ryZPanmAt78CrI5RVmPz+rrGHQIDAQABMA0GCSqGSIb3DQEBCwUA
A4IBAQCD72IK7rP8TSFVLvja0VU56do2E6q4UTVAtUikqVnVszEv6lJUNqcHT+it
vgD3JtuybukU1pRsbjdu2iLjx2fStYfvapmjMa8rHqAiD6IKVkjOsq5w4Jc4HSR4
JTU9u40YR0Ly1+lHZmGDbBjK9JqJPZBHzPWlJ1sDE+DmgR9Fid9Dfv/uavkx3uuc
FPnWzoxoQx8JQs6DAHzBL6qHfbFoncPRrztRbTmkrAUhJI98nuEGUD1+T51qU5cu
pj8q262ZYKwYWvOyk1AmiokbMiBVd0Obewqj7IiY6T5S+zORLOj1IhzaZ83P9pgM
mq0/oJk8aQYC3vgYCmY2aNWXUX18
-----END CERTIFICATE-----
SignatureXdUz/Pc10uA7L3R+vTa/cI52W9X8nDyH33zElCWeS/xWeYgonfr0GwLhn4ywE7rtUQF8e1Y8GhETbSd60otnPduP+4rXp7+5+b+iMTa3qfYi6gAd3Y1YJJrZqK0yx2Fdqld/nhQLfFpVkUSQl/JQ78RZanEh779Af5RejNl7lolRlJYg7ZNrLrFasWrpyrLNsg4+Tf74/vMpKWDXf0FEIqjnXZ0LKJm7Yjig4uazy+a5vDcDOrfq6fLU56d9ML/jBJK+9A2loT3I5HP7H2cngdLpwk6+MNLiYQDsdNzLGJJK9TK4hn0Cj+AV80mAQ45beagh4H0SmEoDTPvR/hC7LLlU5rtioE1Rg1tCvlZfHBuPcH9LZMq11Q3HVbZnvzkTdG3lKQlKeFhP86QOIjiAg1Frm0yuOt4nMSdG36N+k1C5szF7HrCoH+u1XgdY6fKI6WW71RkqXJ2IhwOorxcijLVQc2l3wyDLqoQrHtJA2yWGsI9NXlq+d5ZLJ03T7xvcLBPgSDTz91KqBABqJYRdCGhzAuQPe9M814mDu5XgdoCJNUKNrAl6YGvLvJXyj5j8I09qImqsQx09AmEBxi8YTZDbxuO8U/g3yKO14aBgGu3Z+v8+h6xyqJyNsPEbHHxpjfSbwAF/9FlvjA64nOTqPam3fPOjZAdqne5bgf05gFY=
Signature digestsha512
Dependencies
Required Nextcloud versions >=30.0.0,<36.0.0
Minimum Integer bits32
PHP>=8.1.0
PHP extensions bcmath
Budget 2.28.0
Release Details
UpdatedJune 7, 2026, 9:59 p.m.
Changelog

Added

  • Shared savings goals — share a savings goal with another Nextcloud user. Recipients see a "Shared" badge and can view progress; with write permission they can edit the goal and add money, while only the owner can delete it (#255)
  • Auto-derived budgets from recurring items — a (sub-)category with no manually-set budget now shows its committed recurring total (active recurring bills + recurring income, normalized to the budget period) as an automatic budget limit, marked "auto". Typing a value always overrides it (#269)
  • Exclude extraordinary/one-time items from the forecast — a per-transaction "exclude from forecast" flag (with a "No forecast" list badge), the same flag on recurring bills/income (propagated to generated transactions), and a matching import-rule action. Flagged amounts still affect your balance but are kept out of the projection averages (#270)
  • Reusable CSV import templates — save column mappings and import options and reapply them to future imports (#247)
  • OFX/QIF import account routing — route multi-account OFX/QIF files to the right Budget accounts, remembered across subsequent imports
  • Bank sync: pending transactions — option to import not-yet-posted (pending) transactions, automatically reconciled when they clear (#257)
  • Bill start dates — a bill only occurs on or after its start date, making it easy to change a recurring cost mid-year by ending one bill and starting another (#268)
  • "Shared with me" expenses view — recipients can now see expenses that have been shared with them (#248)
  • Dashboard period indicator — chart tiles now show a read-only indicator of the period they cover (#250)

Fixed

  • Dashboard now collapses to a single full-width column on phones, independent of your configured desktop column count (#249)
  • "Excluded from reports" categories no longer appear in the Budget view (#266, #267)
  • Category spending chart shows income as positive with the correct label (#265)
  • Tag-linked savings goals now sum net realized contributions (credits minus debits, excluding scheduled) (#264)
  • Recurring income description is now persisted on create (#263)
  • Transfers are now excluded from dashboard income/expense totals (#262)
  • Account Breakdown report now uses each account's own currency instead of a single assumed one (#256)
  • Fixed a PageController crash (TypeError) on unauthenticated requests (#259)
  • Quick Add date field normalization on iOS (#235)

Docs

  • Documented the standalone Quick Add page and the iOS home-screen workaround
  • Noted that GoCardless no longer accepts new bank-sync sign-ups; EU/UK self-hosters without an existing account are pointed to manual import (#271)
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIEATCCAukCAhNXMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNjAzMTA1MDE5WhcNMzYwOTA4MTA1MDE5WjARMQ8wDQYD
VQQDDAZidWRnZXQwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDNKchk
gsYxcNMufIP/m82JAeIA/fFibi4mGwKEkXwWLXDDAMiwaHmrpkCcC7BYNw0iOk/K
/xYMlEw738UrhQtu5PHAi/fecIAwh7H/ij7jGcwROe7cOcwK0sdmT76po8Ry4Of0
1wE8f+/Rmw9+rRPLE5dRluuHhiO0Eg6pO+KnqxgWID7CY4Ij7xuQtyUsYKkArjEq
irooV6OPmvQHDyQHMbgKhYr+47LZZ0YuNzZd0jhd5JIMWXV6aUgW9R23c9T7JgMG
pPOhHSWxZOBlRWzRVtCEzSug3J39n9eZqVP1PFIZI/pq0mOOt7LTz5IUX0xF0lJ+
JM7lPsTuJibESiWXKo9neTvy9BUWDIV9D/i8CH1uz0+xVala0uQRSNbrdWV4cN4v
oVaYwoXm+kYeGSz27f9CxJgLEA5sxuFWlbmm2+AXOFQPyyUDVXDCvAB/rzDZpFNo
HxM0OxyfmbmLmu+j31qW3JnvJvb6eroYxlvwgVeOCTihhIh6HKQzNFKv0iq3qc4Z
2a2czDyqt5h52CO+hwjsB5jjGNgS7AIxgBmDiw2V10meNGR/ZBVP9zew4FA3IEdY
GVuFBP52xdStrDgFpE3RK799n2i0fXvZE+9zzRlZ7DNRxZXMvBBpR35IhmyqVPDF
PbUmCKV8/Rm7ryZPanmAt78CrI5RVmPz+rrGHQIDAQABMA0GCSqGSIb3DQEBCwUA
A4IBAQCD72IK7rP8TSFVLvja0VU56do2E6q4UTVAtUikqVnVszEv6lJUNqcHT+it
vgD3JtuybukU1pRsbjdu2iLjx2fStYfvapmjMa8rHqAiD6IKVkjOsq5w4Jc4HSR4
JTU9u40YR0Ly1+lHZmGDbBjK9JqJPZBHzPWlJ1sDE+DmgR9Fid9Dfv/uavkx3uuc
FPnWzoxoQx8JQs6DAHzBL6qHfbFoncPRrztRbTmkrAUhJI98nuEGUD1+T51qU5cu
pj8q262ZYKwYWvOyk1AmiokbMiBVd0Obewqj7IiY6T5S+zORLOj1IhzaZ83P9pgM
mq0/oJk8aQYC3vgYCmY2aNWXUX18
-----END CERTIFICATE-----
SignatureiQMjVEdG/FWcc56MAPwvDd04E0ERl5pUWkrRWtdYdgbboBj0+7YAo+rDODFz5qC3EPqWBr7XRkjXOfvn9+m61v0w88Qy8SZQIZRHTAwRJuK5jDQbpfce5dropQgKW8btEIzI3BPE+DFBIDeV+qLNQEYT25ApMkUAz44PumVV0sJMibCGo0JBgIxHCPyem1NNjYaX3qQDt41eg8I5rH8wLCWGa7lNTtGyp8vaJ4ck0sh4J9sPuVzMdJoXQDHfGe5S8YY3GTwgvwyloNJQAFO+SQzm5WX6mC/IKAfpxwG82cQAEMm6B4geyHwaYGSFDEgrBuHOZj2fQmvQgzoarRN+U76bOhjQI0IqU76Pno3qM17eF+UKW8peDiqFBXpepGYfDoeyjQsF2GqxIK3C0bNUR5bp9RjNxkWckwvS2ihvP/2rg4lr05MuDDmIdBYG9Ny+PT9dEWBssQkXzIVX28Ox6P8xkorH0n5EoSRl3j+KMXbM34QteNMt1+jgsHAxcS8H57CwV3MC0uqZnhxUu/LbwIGHzvKbC6vN3F/3l6F+35rWM7UaQhdvr2W/1q5Swj5F2sp2Bq5jgrxbWIuUB9+pzftASgVUEmtd6blOUlJuuJj1wmaIrA9jx21+Bg8t/OmrQqB97ZHzint0WTdo7KTOviKZGnoZVXeoQthPmSyW7Wc=
Signature digestsha512
Dependencies
Required Nextcloud versions >=30.0.0,<36.0.0
Minimum Integer bits32
PHP>=8.1.0
PHP extensions bcmath