2.1.0-beta.4
First public beta of the 2.1 release.
Known Issues
- Old extension version folders are not deleted on extension update, causing duplicate game listings and repeated update notifications ([#23295](#23295))
Added
- Persist download checkpoints in the new download manager ([#22678](#22678))
- Cookie support in the new downloader ([#22429](#22429))
- Custom request header support in the new downloader ([#22406](#22406))
- Bandwidth throttling for downloads ([#22277](#22277))
- Resuming interrupted downloads ([#22251](#22251))
- Pausing downloads with checkpointing ([#22099](#22099))
- Cancellation support for downloads via
AbortController([#22084](#22084)) - New downloader uses
If-Matchheader when a strong ETag is available ([#22008](#22008)) - Typed download errors in the new downloader ([#22005](#22005))
- Pull-based download progress reporting ([#22001](#22001))
Changed
- Added diagnostic logging in the FOMOD init path ([#23330](#23330))
- Notifications with actions now persist until the user acts on or dismisses them, matching the documented
INotificationcontract (both classic and modern UI) ([#23226](#23226)) - Games remain manageable when extension dependencies are missing or fail to load ([#23226](#23226))
- Modern UI notification popover now auto-opens for notifications dispatched during startup ([#23226](#23226))
- Extension install failures now surface the underlying 7z error text instead of the generic "needs to include index.js and info.json on top-level" message ([#23209](#23209))
- Added diagnostic logging in the External Changes path to help triage spurious ECD reports ([#23208](#23208))
- nexus-api now refreshes the OAuth access token proactively when within 30s of expiry; concurrent refreshes coalesce into a single
/oauth/tokencall, with the 401-driven fallback retained for clock skew and server-side revocation ([#23178](#23178)) - Replaced the native
crash-dumpC++ addon with Electron's built-incrashReporter(Crashpad), so crash dumps now use Crashpad's directory layout instead of the old flatcrash-{process}-{timestamp}.dmpnaming ([#23034](#23034)) - Upgraded Electron from 41.2.0 to 42.0.0 ([#23025](#23025))
- Replaced the native
exe-versionaddon with a pure-TypeScript PE-header parser (workspace package), removing a native dependency ([#22914](#22914)) - Removed the
native-errorsC++ addon ([#22907](#22907)) - Replaced the native
diskusageaddon with Node'sfs.statfsSync([#22906](#22906)) - Replaced the native
bsdiff-nodeaddon with WASM bsdiff/bspatch running in a worker-thread pool, removing the last native C++ dependency from the collections extension ([#22878](#22878)) - Ported the BSA archive reader (
bsatk) from native C++ to pure TypeScript, merged BSA/BA2 support into a singlegamebryo-archive-supportextension, and added LZ4-frame decompression for Skyrim SE BSAs ([#22872](#22872)) - Upgraded Electron from 39 to 41 and Node from 22 to 24 ([#22869](#22869))
- Stopped using Electron's
did-start-downloadevent in the new downloader ([#22860](#22860)) - New downloader now parses
redownloadandallowInstallargs fromnxm://URLs ([#22855](#22855)) AlreadyDownloadederrors thrown by the new downloader now carry the offendingdownloadId([#22851](#22851))- Ported the ESP/ESM plugin parser (
esptk) from native C++ to pure TypeScript; plugin parsing is now async and runs in parallel viaPromise.all([#22840](#22840)) - Removed the legacy downloader so the new download manager is the only path for starting downloads ([#22821](#22821))
- Replaced the native
ba2tkC++ addon with a pure-TypeScript BA2 archive parser supporting GNRL and DX10 archive types across v1 and v8 formats ([#22700](#22700)) - Replaced the native
vortexmtMD5 addon with Node's built-incrypto.createHash('md5')plus streaming file reads ([#22697](#22697)) - Replaced the native
gamebryo-savegameC++ parser with pure-TypeScript parsers for all six Gamebryo savegame formats (Oblivion, Skyrim, Skyrim SE, Fallout 3, Fallout NV, Fallout 4), removing the node-gyp/CMake/MSVC build toolchain requirement for the savegame extension ([#22688](#22688)) - New download adapter dispatches redux actions ([#22653](#22653))
- Download IPC adapter now tracks state, progress, pause/resume, and speed ([#22651](#22651))
- New IPC download adapter (env-var-toggleable while it was being introduced; now permanent after the old downloader was removed) ([#22615](#22615))
- IPC handlers added for download channels ([#22614](#22614))
- New download manager tracks all downloads centrally ([#22516](#22516))
- Download API exposed via the preload script ([#22510](#22510))
- Moved download types into a shared workspace package ([#22475](#22475))
- Added callback IPC channels used by the new downloader ([#22469](#22469))
- New downloader detects HTML responses and shares its download error types across processes ([#22404](#22404))
- Added timeout and retry resilience to the new downloader ([#22330](#22330))
- Adapted Tools changes from v2.0 ([#22293](#22293))
- New downloader can use range requests for single-chunk downloads when the chunker returns zero chunks ([#22292](#22292))
- DuckDB extensions are now bundled and loaded from a local cache, removing the runtime
FORCE INSTALL ... FROM 'https://...'so Vortex no longer touches the network for DuckDB extension loading at startup ([#22046](#22046)) - Reworked the downloader around a new manager class, simplifying it to standalone functions ([#22036](#22036))
- Reworked the Tools page (refactor with assorted fixes) ([#22007](#22007))
- Product-version check for Baldur's Gate 3 ([#21998](#21998))
Fixed
- Restored v1 behaviour for the nxm:// handler registration so cold-start downloads use the default user-data location ([#23322](#23322))
- Witcher 3:
md5cache.jsonwas not bundled with the extension ([#23306](#23306)) - Cancelling a collection install via the free-user download dialog now cleanly tears down the install pipeline, driver state, and notification, instead of leaving canceled sibling downloads as failures in the dialog ([#23304](#23304))
- Modern UI: missing sidebar icons (Bethesda plugins, save games) and help menu icons (feedback, bug report) ([#23263](#23263))
- Unauthenticated
401errors from the NXM download resolver now surface as a non-reportable "You are not logged in to Nexus Mods!" notification instead of aTypeErrorcrash on undefined OAuth config ([#23262](#23262)) - Missing or failed-to-load extension dependencies left games un-manageable; the install, profile-management, notifications, and modtype-enb paths were all hardened against this state ([#23226](#23226))
- Download failure when the target game's downloads folder did not yet exist, affecting mods that are compatible across multiple game domains (Skyrim/Enderal/Nehrim, site-domain mods); the folder is now created on demand when the download is queued ([#23213](#23213))
- "Game not discovered" dialog incorrectly shown on
-gamerestart/relaunch while async discovery was still in flight ([#23210](#23210)) - Tracked-mods fetch crashing when the Nexus client lacked OAuth configuration ([#23173](#23173))
- Improved scrollbar visibility for the table component ([#23125](#23125))
- "Tools" dashlet now shows in the classic UI only and is hidden in the modern UI ([#23166](#23166))
- Removed spurious logs spam ([#23130](#23130), [#23132](#23132))
- Conflict Editor "Before All" / "After All" silently doing nothing when a filter was applied to the source mod name ([#23136](#23136))
- Fixed inability to manage certain bundled game extensions (Blade and Sorcery, BattleTech, Daggerfall, DragonAge, NWN, Elder Scrolls Online and a few others) ([#23131](#23131))
- Tailwind utility classes stripped from the compiled renderer CSS after the stylesheet output moved, leaving Spine and other UIv2 components unstyled ([#23158](#23158))
- Suppress action on suppressible notifications shown with a cog/gear icon instead of a suppress icon ([#23152](#23152))
- Toolbar dragging and toolbar popup issues ([#22994](#22994))
- Remaining instances of
app.quitcausing application crashes (CLI-relaunch path and Vortex tray-icon close) ([#22091](#22091)) - Long profile names overflowing the header and profile cards (and now capped at 64 characters) ([#22079](#22079))
- Elevation script closing prematurely during collection installation (timer extended from 5 seconds to 5 minutes) ([#22029](#22029))
- Health check passing invalid
modIdto the Nexus API for external requirements ([#22019](#22019)) - "External changes" dialog still being raised after batch reinstalls or updates in some scenarios; new fix is timing-independent and avoids a race that could stall collection installation ([#22016](#22016))