A correctness release: improved portfolio returns and tax/split/dividend accounting, plus fixes for issues after the major add-on platform overhaul.
Fixes
- Holding returns now exclude FX. Cross-currency transferred securities could report inflated returns (e.g. +120%) by folding exchange-rate movement into security performance. Return % is now computed in holding currency. (#1277)
- Dividend-adjusted history fixed for MarketData.app — its adjusted closes were double-counting separately booked dividend cash activities, overstating returns. Run a full market-data backfill to correct stored history. (#1284)
- Split-adjusted valuations now shared across accounts — a split entered in any account corrects historical valuation for every account that held the asset, including ones that sold before the split. (#1286)
- Tax now deducts from cash balance for all cash activity types (Credit, Deposit, Withdrawal, cash transfers), fixing dashboard/account balances that were off by the tax amount. (#1268)
- Contribution limits handle units-based transfers — a
TRANSFER_INwith quantity/price but no stored amount no longer breaks the deposits calculation. (#1250) - Health Center sell-proceeds check now matches the holdings calculator, removing false positives on taxed sells. Some dismissed "missing lot disposal" warnings resurface once after upgrade (intended). (#1289)
- Health price-sync retries behave consistently across desktop and web; empty history is treated as a neutral no-data skip instead of accumulating errors. (#740)
- FEE/TAX activity value no longer displays 0 for tax-only activities — the frontend now mirrors the backend charge precedence. (#1290)
- Price precision cleaned up — regular prices drop floating-point tails (
268.3999939→268.40) while sub-cent prices and average costs keep up to 8 decimals; custom-provider Unicode keys parse correctly; Quotes tab renamed Price History. (#1287) - Non-ASCII symbol search no longer panics on Nordic/Arabic/CJK/emoji input. (#1234)
- Market-data API key input stays bound while typing/pasting a first-time key. (#1253)
- "Where it went" dashboard widget now shows a distinct Saving row. Thanks @Jonjon-prog. (#1279)
- AI provider permissions can be reset again — re-enabling deselected permissions is no longer silently ignored. (#1300)
- Onboarding Connect links open reliably in the desktop app; self-hosters can opt into the MCP endpoint with
WF_MCP_ENABLED=true. (#1300)
Add-ons
- Platform overhaul completing the 3.6 sandbox model (#1260): durable per-addon SQLite storage (replacing the broken
localStoragepattern, device-synced), manifest-first lazy lifecycle (contributes.routes/links, nav built without executing addon code), host-owned render root, baseline capabilities dropped from the consent prompt, self-hosted auth-gate parity, and legible sandbox error toasts. - Basic auth for brokered network requests (
auth: { type: 'basic' }) — enables APIs like SimpleFin Bridge. (#1274) - Safe module-import rewriting via
es-module-lexer, fixing host calls likeactivities.import(...)being mangled. (#1275) - Device-identity refactor — the persistent install ID is dropped from public settings and the addon SDK; addons using
Settings.instanceIdmust stop relying on it. (#1270)
Internationalization
- Activity type/subtype names now localized in badges, tables, filters, import, and the AI tool. Thanks @FlyingDuck. (#1243)
- Interval selector labels (
1D/1W/…/ALL) now localized. Thanks @FlyingDuck. (#1242) - Non-Latin category creation fixed (e.g.
贵金属,عقارات) — no longer silently fails. Thanks @FlyingDuck. (#1247) - Spain (
es) spending categorization preset added alongside US/CA/GB. Thanks @blastik.
Full Changelog: v3.6.1...v3.6.2