What's Changed
⚡ A noticeably faster app
MoneyMatter is quicker across the board this release. The dashboard loads faster, pages you visit often now open instantly instead of making you wait, and the first screen appears sooner when you open the app. Investments and stats pages in particular got a solid speed boost.
📥 Imports can now update your account balances
CSV and Wallet imports have a new optional setting: Update account balances from imported transactions. Turn it on and your balances are brought up to date from what you're importing — with a preview showing each account's before, after, and the change, so you can check it before committing. Older transactions are treated as backfill and won't disturb your current balances, which means you can import years of history without throwing your numbers off. Your choice is remembered next time.
Importing a CSV also now asks you to confirm the date format — whether 12.01.2026 means 12 January or 1 December — right on the mapping step, with a preview of how your dates will be read. Previously, when a file's dates were ambiguous (every day in the file being 12 or lower), the format was guessed from your app language and could import every date wrong with no warning at all. Files with unambiguous dates like 2026-01-12 are still handled automatically, and files with mixed signals no longer block the whole import.
🔁 Recurring charges: sorting, filtering, and planning ahead
Recurring charges are now ordered by when they're actually due, so what's coming next sits at the top. A new filter narrows the list to the next 7 days, 30 days, 3 months, 6 months, next year, or all time. Paused items have their own section, charges with a linked transaction show a badge, and the list is much easier to use on a phone. Detected subscriptions were also redesigned to show how confident the match is before you accept it.
📊 Dashboard, sidebar & transaction groups
The sidebar now shows real totals in your base currency instead of just counting accounts, and you can hide zero-balance accounts to keep it tidy. The Balance Trend tooltip explains what actually drove each change, making spikes easier to understand. Transaction groups now open with a summary at the top showing the group's count and net amount.
🌏 Indonesian, and translations open to contributors
Indonesian (Bahasa) is now available in the language selector, contributed by @rizalibnu. Translations have moved to Crowdin, so anyone can now help translate or correct a language — the language settings page links to where to pitch in.
❤️ Support the project
MoneyMatter now has a donation button, if you'd like to support development.
🐛 Bug Fixes & Improvements
- Your subscription costs were being understated. If a subscription used a currency you hadn't connected in Settings → Currencies, it was silently left out of the monthly/yearly totals and the percentage-of-income figure — no error, just a number that was too low. Subscriptions now connect their currency automatically, existing ones have been corrected, and if a conversion ever fails you'll be told which currency to connect instead of shown a wrong total.
- Inviting someone to your household no longer gets rejected as invalid input. Sharing individual accounts and budgets was never affected.
- Editing a category budget that has no spending limit set no longer fails to save. Any edit — even just renaming it — was rejected with an error; budgets that already had a limit saved fine, and nothing was ever saved incorrectly.
- Uploading a CSV containing a stray quote mark in a field (a note like
5' 8" tall, for example) no longer fails outright — those files now import normally, and a genuinely broken file explains what's wrong instead of just erroring. - The transactions list inside a group's dialog now renders correctly.
- The transactions list no longer loads endlessly on mobile in list view.
- The dashboard's latest-records widget now shows the true size of a transaction group — it previously counted only the group's most recent members, so larger groups looked smaller than they were.
- In the import wizard, going back to change your mapping and then clicking ahead to a later step no longer lets you submit with incomplete details.
- New payees now appear in the transaction form's suggestions right after a CSV import or a bank sync, instead of only after a page reload.
- Lists like accounts, categories and currencies now refresh themselves when you open the app, so a change made on another device shows up straight away rather than potentially lagging behind.
- After wiping your data, accounts, currencies and categories from before the wipe no longer reappear on the reload.
- Clicking a link right after a new version ships now takes you where you meant to go, instead of refreshing the page you were already on and needing a second click.
📝 Code Changes
- feat: Dashboard UI/UX improvements by @letehaha in #368
- feat: Donation button by @letehaha in #369
- fix: Improve platform stability by @letehaha in #370
- fix(sse): swallow transient pre-open connection failure on init by @letehaha in #371
- fix: Improve transaction groups UI & fix txs loading issues by @letehaha in #372
- feat: Sort recurring charges by due date and refresh list UX by @letehaha in #373
- feat: Add period selection for recurring charges by @letehaha in #374
- perf: Improve performance by @letehaha in #375
- perf: Client-side cache optimizations by @letehaha in #376
- feat: Sidebar setting to hide zero-balance accounts by @letehaha in #377
- fix: Harden payees connections logic and other minor fixes by @letehaha in #378
- refactor: Code cleanup and simplifications by @letehaha in #379
- feat: add Indonesian (id) locale support by @rizalibnu in #381
- fix(share): coerce resourceId string to number in zod schema by @rizalibnu in #383
- chore: Harden preview teardown workflow guard by @letehaha in #384
- feat: Opt-in balance recalculation functionality upon CSV import by @letehaha in #385
- chore: Maintain non-English locales in Crowdin by @letehaha in #386
- chore: Link feature board from language contribute note by @letehaha in #387
- fix(fe): Revalidate persisted query cache after restore by @letehaha in #388
Full Changelog: v0.21.0...v0.22.0