Repository navigation
Roadmap: Nexus Collections install (one-click bundles) — Opción B (premium + free) #222
Description
Nexus Collections install — public roadmap
This is the meta-tracker for adding one-click Nexus Collections install to RipperMod Manager (Nexus edition). Asked for by CptAnonymou5 on Nexus, scoped after a full investigation of how Vortex does it and how MO2 deliberately does not.
Scope decision: Opción B — full support, premium and free-tier. Premium users get a direct download flow; free users get the same sequential nxm:// dialog Vortex uses (one Mod Manager Download click per mod, in order).
Compliance notes
Read-only metadata + per-file downloads through the same Nexus API path RipperMod uses today. No auto-update of the manager itself. Free-tier flow forces user-initiated browser clicks per mod, matching the Nexus distribution policy.
Phase 1 — Foundation (premium-friendly first, free-aware schema)
- PR A — Extend GraphQL
collectionRevisionquery to fetch full manifest (fileId,name,version,size,choices,phase,instructions). Addnxm://<game>/collections/<slug>/revisions/<rev>parsing to the frontend deep-link handler. Tests. - PR B — DB schema: new
installed_collectionstable (slug, revision_id, installed_revision_number, latest_revision_number, status, started_at, finished_at),installed_mods.installed_collection_idFK +collection_phase+is_optional,download_jobs.installed_collection_idfor batch tracking. Idempotent migration indatabase.py. - PR C — Collection install orchestrator service (
services/collection_install_service.py): resolve revision → manifest, plan ordered by phase, loop per phase, deploy once at phase end. REST endpoints (GET /api/v1/collections/{slug}/revision/{rev}for preview,POST /api/v1/games/{name}/collections/installto kickoff,GET /api/v1/collections/{id}/statusSSE). Premium path only in this PR. - PR D — Non-interactive FOMOD driver: helper that translates collection
choicesformat → existingdict[int, dict[int, list[int]]]schema. Addauto_deploy: bool = Trueflag toinstall_fomodto matchinstall_mod. Tests for plugin-name lookup + graceful failure when a recorded choice no longer matches the FOMOD. - PR E — Frontend:
CollectionPreviewDialog(preview manifest before install),CollectionInstallProgress(live SSE),CollectionFinishedDialog(summary). - PR F — Integration in Installed tab: collapsable groups per collection, uninstall-whole-collection action.
Phase 2 — Free-tier flow
- PR G —
FreeUserDownloadDialog: sequential per-mod dialog mirroring Vortex's design. Shows current mod / total, opens the mod page in browser, waits fornxm://...?key=&expires=callback, retries on premium-status flip. Skip / Cancel actions per mod. - PR H — Concurrency semaphore in
download_service.py(cap at e.g. 3 parallel downloads). Required for large collections — currently everycreate_and_start_downloadspawns a loose task with no cap. - PR I — Update detection: compare installed revision against
latestPublishedRevision.revisionNumber, surface an "Update available" pill on the collection group. Trigger re-install at new revision.
Out of scope (deliberate)
- No collection authoring/uploading — install-side only. Users wanting to publish a collection still use Vortex.
- No collection sharing between games — one collection lives in one game (matches Nexus's own data model).
- No partial-collection updates — Phase 2 update flow re-installs the whole collection at the new revision; per-mod diffing is too brittle.
Reference
- Vortex implementation:
extensions/collections/src/+src/renderer/src/extensions/nexus_integration/ - Manifest shape:
collection.jsonper Vortex types - MO2 deliberate refusal: PR #2383
Want to follow along?
Comment 👍 on this issue and you'll get pinged when each PR lands. ETA for first usable premium-only build: a few weeks once PR A starts.
Activity
feat(collections): widen revision manifest + parse nxm collection URLs (
feat(collections): InstalledCollection model + schema migration
feat(collections): InstalledCollection model + schema migration (#222 …
feat(collections): orchestrator service + REST endpoints (premium path)
feat(collections): orchestrator service + REST endpoints (#222 PR C, …
feat(collections): non-interactive FOMOD driver for Collections install
feat(collections): non-interactive FOMOD driver (#222 PR D) (#226)
feat(collections): frontend dialogs + hooks + SSE stream
feat(collections): frontend dialogs + hooks + SSE stream (#222 PR E) (#…
feat(collections): Installed-tab grouping + uninstall-whole-collection
feat(collections): Installed-tab grouping + uninstall (#222 PR F) (#228)
feat(collections): wire nxm://collections deep-links into install flow (
feat(collections): free-tier per-file nxm:// install flow (#222 PR G) (…
feat(collections): update detection + force-reinstall flow (#222 PR I) (
feat(collections): backport Nexus Collections install to Full edition (…
fix(collections): cherry-pick backport review fixes for edition parity (
Y4rd13 commentedon May 19, 2026
Roadmap status — shipped
Closing out as completed. All planned Phase 1 + Phase 2 (G + I) work landed on both editions; PR H stays postponed with rationale below.
Phase 1 — premium auto-install path
Landed on
nexus-compliantvia #223 → #229, onmainvia #232.nxm://collections/...deep linksInstalledCollectionmodel + schema migrationPhase 2 — free-tier + lifecycle
nxm://install: orchestrator emitsawaiting_nxm, awaits the user's "Mod Manager Download" click on Nexus, routes the key back via the existing/downloads/endpoint. Includes Skip + Cancel + startup recovery for staleawaiting_nxmrows.check_updates) + force-reinstall flow ("Update to rev N" badge + button)main(Full edition)nexus-compliantfor parityPR H — semaphore — postponed
download_servicecurrently creates anasyncio.Taskper CDN stream without a concurrency cap. The plan called for a_download_semaphore(default 3 concurrent), but verifying the orchestrator code showed it's already sequential —for entry in mods: await _wait_for_download(...)runs one download at a time. The free-tier flow added in PR G is also sequential by design (oneawaiting_nxmper mod). So a semaphore would have zero practical effect today.Worth doing only if/when we parallelize the orchestrator's download stage. Not tracking as a separate issue — the insertion point is documented in this thread and the change is ~10 lines whenever it's needed.
Follow-ups tracked
Aggregate-review on #232 surfaced two SUGGESTED-grade optimizations that didn't block shipping:
perf(collections): lighter check_updates query + tighter session windowperf(collections): virtualize preview dialog mod listParity confirmed
mainandnexus-compliantare byte-identical for the Collections code (collection_install_service.py,routers/collections.py,CollectionPreviewDialog.tsx, etc.). Future Collections work should be cherry-picked, never merged, per the dual-release strategy.Releases
v3.6.0(published)nexus-v2.11.1(draft — pending manual promotion to Nexus Mods per the gate in ci(nexus): require manual release promotion to upload to Nexus Mods #202)