What's Changed
🌐 Spanish locale & in-app update banner
MoneyMatter now ships with a full Spanish (es) translation – pick it from Preferences → Language.
The app also detects when a new version has been deployed and surfaces an in-app banner so you can reload into the latest build without leaving the page. No more stale UI after a release goes out.
📊 Subs & Bills widget: % of average income
The Subs & Bills widget now shows your recurring spend as a percentage of your average income, color-coded green / yellow / red against per-type thresholds, so you can see at a glance whether subscriptions are quietly eating your paycheck. The All / Subs / Bills filter and the income-window setting moved out of layout-editing mode into the widget's gear-icon popover, so they're reachable without entering edit mode.
📈 Investments improvements
- Search securities by ISIN: looking up a security by its ISIN (e.g.
IE00B53L3W79) now returns the right ticker from Yahoo instead of zero results, and duplicate hits across providers are deduped. Reported by @yonicsurny in #324, fixed by @letehaha. - Closed positions and new-holding flow: smoother ergonomics around adding a new holding and a cleaner presentation of already-closed positions in the holdings table.
🏠 Self-hosting reliability
A bundle of fixes for users running their own MoneyMatter instance:
- Fresh deploys no longer fail on sign-up / sign-in – the configured
AUTH_ORIGINis now seeded into the Express CORS allow-list, and localhost is auto-allowed in dev with sharper network error messages. Reported by @yonicsurny in #319, fixed by @letehaha. - Subscription logos stop 401-ing when
VITE_LOGO_DEV_TOKENis unset – the frontend skips the logo.dev request entirely instead of attempting an unauthenticated call. Reported by @yonicsurny in #322, fixed by @letehaha. - Crypto security search now surfaces a clear hint when
COINGECKO_API_KEYis missing instead of silently returning empty results. Reported by @yonicsurny in #320, fixed by @letehaha. - AI API key validation stops failing on Anthropic for users on the now-retired
claude-3-5-haiku-latestmodel – retired models are dropped from the picker and existing user settings are silently upgraded to a supported replacement. Reported by @yonicsurny in #317, fixed by @letehaha. - The
.env.templateis corrected and env-variable presence checks are tightened end-to-end via a newisEnvConfiguredutil, so misconfigurations fail loudly instead of at runtime in unexpected places.
Huge thanks to @yonicsurny for the thorough self-hosting reports and improvement suggestions across this release.
🏦 Bank & crypto sync improvements
- Enable Banking initial sync now auto-shrinks the lookback window when a bank caps it below the 3-year default (e.g. BNP Paribas Fortis BE), so the first sync stops failing on those banks. Reported by @yonicsurny in #318, fixed by @letehaha.
- Crypto prices refresh every 15 minutes by default (was hourly), so portfolio values track market moves much faster.
- Bank providers were unified around a single Balances-table update path with a
(date, accountId)unique index, closing a write race that occasionally produced duplicate balance rows. Sync becomes noticeably more reliable across Monobank, Enable Banking, and SimpleFIN. - Monobank picks the newest transaction by
createdAtwhen source timestamps collide, so near-simultaneous transactions no longer trip up sync ordering.
🐛 Bug Fixes
- Unlinking a transfer during transaction creation (before the transaction itself exists) no longer crashes the form.
- Locales load correctly on first paint after a deploy instead of falling back to English for a flash.
- The payee chunk loads when the payee dialog mounts outside the Payees route, so inline payee selectors work on the transactions list and bulk-edit screens.
- Vehicle client form no longer rejects valid input on validation.
- EnableBanking transient timeouts now retry, and Sentry no longer reports the same captured error twice.
- Investments paywall (HTTP 402) errors from upstream providers no longer create Sentry noise – they're expected upgrade prompts, not bugs.
- Assorted Sentry-reported edge cases around username generation collisions and payee extraction caps now log at the right severity instead of paging on noise.
📝 Code Changes
- feat: Add app version reload to catch new releases by @letehaha in #329
- feat(investments): fix ISIN search, dedup securities across providers (+ closed-holding flow) by @letehaha in #327
- feat(i18n): add Spanish (es) locale by @letehaha in #315
- feat(crons): speedup crypto price sync interval (default 15m) by @letehaha in #314
- feat(widgets): show % of avg income, settings popover by @letehaha in #313
- fix(transfers): prevent crash unlinking transfer in form creation mode by @letehaha in #330
- fix(i18n): load payee chunk when dialog mounts outside payees route by @letehaha in #328
- fix(enable-banking): shrink initial-sync lookback when bank caps it by @letehaha in #326
- fix(self-host): bundle of self-hosting setup fixes (CORS, logo.dev, crypto provider, AI models, env checks) by @letehaha in #325
- refactor(bank-providers): unify Balances table update + sync-status; close (accountId, date) race by @letehaha in #321
- fix: Sentry-reported issues by @letehaha in #316
Full Changelog: v0.18.0...v0.18.1