What's Changed
This release tightens every step where data flows in and out of Wealthfolio: multi-exchange CSV imports keep their identity, quote sync explains itself when it can't price an asset, database backups get a managed list with streamed downloads, and self-hosters get a prebuilt Linux server with proper non-root container defaults.
⚠️ Breaking — self-hosters only
- Docker image now runs as UID/GID 1000 (#940, closes [#919]). Existing
deployments must
chowntheir data directory once before upgrading — see the self-host docs for the exact command. Fresh installs using the documented named-volume setup need no action. - Docker image moved to
wealthfolio/wealthfolio(#950). Theafadil/wealthfoliotag still publishes as a legacy mirror so existingcompose.ymlfiles keep working. - GitHub repo transferred to the
wealthfolioorg (#951). Old URLs redirect automatically.
CSV import — multi-exchange identity preserved
Major correctness pass on the import wizard, driven by #855.
- Exchange suffix identity preserved (#967, [#958]). German
.DElistings of US issuers now resolve to XETRA/EUR instead of snapping to NASDAQ/USD. ISIN-only rows resolve through existing assets or provider search rather than short-circuiting. Cross-listings (e.g.SHOPon TSX vs NYSE) produce two distinct review rows. - Region auto-classification now uses provider country data instead of guessing from the exchange MIC.
- TRANSFER_IN/OUT external flag preserved through CSV import (#952, fixes #927). The "External" checkbox on the Review grid no longer gets silently dropped on save.
- Padded broker fund names map correctly (#932, fixes #926). CSV cells with leading/trailing whitespace now resolve through saved symbol mappings.
- SPLIT rows require a positive ratio (#935). Blank or zero-amount split rows are blocked at validation time instead of silently failing to adjust holdings.
- HTML table preview now extracts headers from td-only tables.
- 35+ symbol multi-exchange E2E fixture added for regression coverage.
Quote sync & market data
- Quote sync position lifecycle fixed (#949). Asset-catalog active state is now decoupled from open/closed position state. Holdings-only assets are protected from orphan cleanup; targeted/inactive/closed/empty modes all filter correctly.
- "No quote" reasons are now visible (#936). The warning tooltip on asset tables explains why: manual pricing, inactive asset, expired option, matured bond, error cooldown, pending sync, or generic no-data.
- Bond provider routing fixed (#934). Bond ISIN now drives provider
selection; stale
data_source/error state is cleared when the market identity or provider profile changes. - Quote-unit currencies added (#973): GBp/GBX (LSE pence), ILA (TASE agorot), USX, ZAc, KWF. Resolved quote currency is now the source of truth for new market symbol selections.
- New provider capability panels for Börse Frankfurt, OpenFIGI (#942), and US Treasury Calc.
- Yahoo dividends endpoint isolated from the rest of the Yahoo path.
- Duplicate latest-quote snapshot IDs handled (#918 follow-up).
Asset-backed income activities
- DRIP, dividend-in-kind, and staking rewards are now first-class asset-backed income subtypes (#944). They expand into an income leg plus an acquisition leg, surface on activity grids, and round-trip through CSV import.
- Subtype clears and external subtype paths handled at persistence boundaries; AI tools and broker sync prep know about the new shapes.
- Stock splits now recalculate from the earliest matching activity rather than the latest snapshot.
Goals planning
Three issues closed by [#929]:
- Save-up date no longer drifts by one day in positive-offset timezones (#917).
- Save-up sliders unlocked (#921) — manual target amount, monthly contribution, and expected return can exceed the default slider range (still within backend limits).
- FIRE projection assumptions can go past the default UI range (#924), with warnings on high return/inflation values.
- Money inputs draft locally and commit on blur/Enter to stop preview flicker while typing.
Database backups
Major rework of the web/self-host backup flow (#975):
- New managed backup list with streamed downloads and one-click delete.
- Removed the unsafe arbitrary-path web backup endpoint.
- iOS gets a native file-picker export flow.
- Addon SDK
backupDatabase()returns filename-only metadata.
Wealthfolio Connect
- Per-request correlation IDs (#971). Every Connect, auth refresh,
subscription, and device-sync call now sends
x-wf-client-request-idand surfaces the serverx-request-idin failed-request logs — without logging sensitive payloads. Connect error fallback details preserved. - Subscription plan UI filtered to API-returned visible plans, so hidden Plus plans don't get re-added locally.
- Broker sync runs on mobile startup (#953) after the service context is ready.
- OCC option symbols normalized from broker activity sync (#948). Padded 21-char OCC tickers no longer create a duplicate asset against the compact form used by position sync. A migration cleans up safe duplicates in-place.
AI
- Anthropic top_k/top_p defaults removed (#945, fixes #933). Every Anthropic call was being rejected with "top_k must be unset when using Claude Models" — those keys are gone.
- Claude Opus refreshed to 4.7.
- Stale Anthropic tuning overrides sanitized.
- AI data sharing notice updated in the provider settings card.
Self-host
- Prebuilt Linux server tarball published with every release (#928, closes
#563). No more
~20 min on-device
cargo buildfor Proxmox / LXC installs. - New self-host docs for Proxmox (LXC, Docker-in-LXC, Docker-in-VM) and
Unraid, plus a Community Apps
template.xml. - Container runs as non-root (UID 1000, [#940] — see Breaking).
- Static OpenSSL link for server release builds.
WF_REQUEST_TIMEOUT_MSdefault raised to 5 min in the Unraid template.WF_CORS_ALLOW_ORIGINSdocumented in the prebuild README.
UI polish
- Savings input uses your currency instead of always
$(#910, fixes #909). Thanks @ChampionBuffalo1! - Dashboard chart views no longer show an extra scrollbar (#976, fixes #965).
- Dark-mode money input background fix.
- Mobile alert dialog layout improvements.
- Price sync toast / debounce tuned.
- XNEO display name updated to "Cboe Canada".
Security & maintenance
- Dependency lockfile security update (#959).
- Community addons index added to the README.
- Repository metadata filled in for
tauriCargo.toml and frontend package.json.
Testing
- Synthetic market-data fixtures for deterministic e2e quote/search/profile coverage (#970).
- Multi-exchange CSV import spec (#958).
- Symbol mapping spec now runs standalone on a fresh DB (#923).
- E2E coverage for stock-split holdings adjustment and asset-backed income subtypes.
Contributors
Thanks to everyone who shipped this release — @afadil, @ChampionBuffalo1, @triantos, @marcoscale98, and the wider community for issue reports and testing.
Full changelog: https://github.com/wealthfolio/wealthfolio/compare/v3.3.0...v3.4.0