A stability release. No new surface area, just making the app fast, light and correct on large portfolios with long histories.
First launch will take longer than usual. A one-time migration rebuilds derived data and rewrites the database file to reclaim disk space. Let it finish before closing the app.
Performance & stability
- Valuation no longer spikes memory. Long histories were expanded into dense daily clones before valuation, which could push the app out of memory. Valuation now walks a sparse keyframe timeline, batches quotes, and bounds concurrent recalculation. (#1412)
- Performance statistics no longer time out. Transfer economics come straight from the asset instead of being rebuilt through daily snapshots, and identical cold calculations are coalesced. (#1347, [#1398])
- Databases shrink roughly 8×. Snapshots were re-serializing the full
lotsarray already stored in thelotstable, about 89% of file size on large instances. AVACUUMreturns the space to the filesystem. One real 356 MiB database came out at 79 MiB. Thanks @atsoc0ocsav. (#1218, [#1387]) - SQLite tuning: larger cache and mmap,
temp_store = MEMORY, a composite index onactivities(account_id, activity_date), andANALYZEafter migrations. Thanks @atsoc0ocsav. (#1218) - Imports are validated before they are applied, unsupported dates are rejected, and one skipped account no longer blocks the rest. (#1412)
Fixes
- Holdings-mode deposits counted as gains. Snapshot-tracked accounts record no activities, so a 300K deposit showed as a +300K period gain. External flows are now inferred by pricing both snapshots at the transition day's quotes, so only user-made changes remain. Net contribution, device sync and add-on semantics are unchanged. (#1418)
- Dashboards failed on quote gaps. Days where no position had a usable quote were dropped, and scoped aggregation then rejected the history as an interior gap. Those days now emit a row marked unpriced. Thanks @Jonjon-prog. (#1022)
- Rebalance targets sized against a stale total on taxonomies without a cash category: the top-up bought more of already-overweight sleeves and the After column summed above 100%. Thanks @FlyingDuck. (#1248, [#1249])
- CSV imports stored a blank currency on asset-backed rows when the file had no currency column, breaking FX conversion later. The account currency is now backfilled, and a Health Center check deep-links already-affected activities. (#1388, [#1410])
POST /api/v1/activities/bulkvalidated every row against the first row's account, rejecting valid rows and silently accepting forbidden ones depending on row order. Thanks @kryofin. (#1356, [#1357])- Cash dividend and interest edits failed on quantity/price fields that are hidden in cash mode, on desktop and mobile. (#1413)
- Holdings-mode account pages now open on Snapshots instead of Activities, and snapshot history no longer shows Cash as 0. (#1413)
- Whole-period TWR was nulled by dormant days with a sub-unit denominator. Those days now pause compounding; genuinely fatal reasons still null it. Thanks @atsoc0ocsav. (#1218)
- Custom provider prices in BRL (
R$ 1.234,56) now parse. Thanks @bergomel. (#1381, [#1390]) - Logs no longer contain quantities or stored amounts.
Improvements
- Average cost line on the holding chart, folded into the existing buy/sell marker toggle and persisted across reloads. Hidden for closed positions. Thanks @Baykenn. (#1370)
Add-ons
- Navigation stays above add-on views. Opening an add-on on iOS or in floating/mobile layouts hid the nav bar behind the iframe, which also swallowed pointer input. (#1273, [#1313], [#1315])
- Add-on content clears the bottom navigation, so controls at the bottom of a page are reachable. No changes needed in installed add-ons or the SDK. (#1383)
Security
- 26 of 28 open Dependabot advisories cleared via direct upgrades, with three
pnpm.overridesremoved rather than added. Notable:hono4.13.1,undici7.29.0,ip-address10.4.0,react-router7.18.2,diesel2.3.12. (#1416)
Full Changelog: https://github.com/wealthfolio/wealthfolio/compare/v3.6.2...v3.6.3