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)
Added
- Persist download checkpoints in the new download manager (#22678)
- Cookie support in the new downloader (#22429)
- Custom request header support in the new downloader (#22406)
- Bandwidth throttling for downloads (#22277)
- Resuming interrupted downloads (#22251)
- Pausing downloads with checkpointing (#22099)
- Cancellation support for downloads via
AbortController(#22084) - New downloader uses
If-Matchheader when a strong ETag is available (#22008) - Typed download errors in the new downloader (#22005)
- Pull-based download progress reporting (#22001)
Changed
- Added diagnostic logging in the FOMOD init path (#23330)
- Notifications with actions now persist until the user acts on or dismisses them, matching the documented INotification contract (both classic and modern UI) (#23226)
- Games remain manageable when extension dependencies are missing or fail to load (#23226)
- Modern UI notification popover now auto-opens for notifications dispatched during startup (#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)
- Added diagnostic logging in the External Changes path to help triage spurious ECD reports (#23208)
- nexus-api now refreshes the OAuth access token proactively when within 30s of expiry; concurrent refreshes coalesce into a single /oauth/token call, with the 401-driven fallback retained for clock skew and server-side revocation (#23178)
- Replaced the native crash-dump C++ addon with Electron's built-in crashReporter (Crashpad), so crash dumps now use Crashpad's directory layout instead of the old flat crash-{process}-{timestamp}.dmp naming (#23034)
- Upgraded Electron from 41.2.0 to 42.0.0 (#23025)
- Replaced the native exe-version addon with a pure-TypeScript PE-header parser (workspace package), removing a native dependency (#22914)
- Removed the native-errors C++ addon (#22907)
- Replaced the native diskusage addon with Node's fs.statfsSync (#22906)
- Replaced the native bsdiff-node addon with WASM bsdiff/bspatch running in a worker-thread pool, removing the last native C++ dependency from the collections extension (#22878)
- Ported the BSA archive reader (bsatk) from native C++ to pure TypeScript, merged BSA/BA2 support into a single gamebryo-archive-support extension, and added LZ4-frame decompression for Skyrim SE BSAs (#22872)
- Upgraded Electron from 39 to 41 and Node from 22 to 24 (#22869)
- Stopped using Electron's did-start-download event in the new downloader (#22860)
- New downloader now parses redownload and allowInstall args from nxm:// URLs (#22855)
- AlreadyDownloaded errors thrown by the new downloader now carry the offending downloadId (#22851)
- Ported the ESP/ESM plugin parser (esptk) from native C++ to pure TypeScript; plugin parsing is now async and runs in parallel via Promise.all (#22840)
- Removed the legacy downloader so the new download manager is the only path for starting downloads (#22821)
- Replaced the native ba2tk C++ addon with a pure-TypeScript BA2 archive parser supporting GNRL and DX10 archive types across v1 and v8 formats (#22700)
- Replaced the native vortexmt MD5 addon with Node's built-in crypto.createHash('md5') plus streaming file reads (#22697)
- Replaced the native gamebryo-savegame C++ 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)
- New download adapter dispatches redux actions (#22653)
- Download IPC adapter now tracks state, progress, pause/resume, and speed (#22651)
- New IPC download adapter (env-var-toggleable while it was being introduced; now permanent after the old downloader was removed) (#22615)
- IPC handlers added for download channels (#22614)
- New download manager tracks all downloads centrally (#22516)
- Download API exposed via the preload script (#22510)
- Moved download types into a shared workspace package (#22475)
- Added callback IPC channels used by the new downloader (#22469)
- New downloader detects HTML responses and shares its download error types across processes (#22404)
- Added timeout and retry resilience to the new downloader (#22330)
- Adapted Tools changes from v2.0 (#22293)
- New downloader can use range requests for single-chunk downloads when the chunker returns zero chunks (#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)
- Reworked the downloader around a new manager class, simplifying it to standalone functions (#22036)
- Reworked the Tools page (refactor with assorted fixes) (#22007)
- Product-version check for Baldur's Gate 3 (#21998)
Fixed
- Restored v1 behaviour for the nxm:// handler registration so cold-start downloads use the default user-data location (#23322)
- Witcher 3:
md5cache.jsonwas not bundled with the extension (#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)
- Modern UI: missing sidebar icons (Bethesda plugins, save games) and help menu icons (feedback, bug report) (#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) - 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)
- 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)
- "Game not discovered" dialog incorrectly shown on
-gamerestart/relaunch while async discovery was still in flight (#23210) - Tracked-mods fetch crashing when the Nexus client lacked OAuth configuration (#23173)
- Improved scrollbar visibility for the table component (#23125)
- "Tools" dashlet now shows in the classic UI only and is hidden in the modern UI (#23166)
- Removed spurious logs spam (#23130, #23132)
- Conflict Editor "Before All" / "After All" silently doing nothing when a filter was applied to the source mod name (#23136)
- Fixed inability to manage certain bundled game extensions (Blade and Sorcery, BattleTech, Daggerfall, DragonAge, NWN, Elder Scrolls Online and a few others) (#23131)
- Tailwind utility classes stripped from the compiled renderer CSS after the stylesheet output moved, leaving Spine and other UIv2 components unstyled (#23158)
- Suppress action on suppressible notifications shown with a cog/gear icon instead of a suppress icon (#23152)
- Toolbar dragging and toolbar popup issues (#22994)
- Remaining instances of
app.quitcausing application crashes (CLI-relaunch path and Vortex tray-icon close) (#22091) - Long profile names overflowing the header and profile cards (and now capped at 64 characters) (#22079)
- Elevation script closing prematurely during collection installation (timer extended from 5 seconds to 5 minutes) (#22029)
- Health check passing invalid
modIdto the Nexus API for external requirements (#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)