Skip to content

Roadmap: Nexus Collections install (one-click bundles) — Opción B (premium + free) #222

Closed

Description

@Y4rd13

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 collectionRevision query to fetch full manifest (fileId, name, version, size, choices, phase, instructions). Add nxm://<game>/collections/<slug>/revisions/<rev> parsing to the frontend deep-link handler. Tests.
  • PR B — DB schema: new installed_collections table (slug, revision_id, installed_revision_number, latest_revision_number, status, started_at, finished_at), installed_mods.installed_collection_id FK + collection_phase + is_optional, download_jobs.installed_collection_id for batch tracking. Idempotent migration in database.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/install to kickoff, GET /api/v1/collections/{id}/status SSE). Premium path only in this PR.
  • PR D — Non-interactive FOMOD driver: helper that translates collection choices format → existing dict[int, dict[int, list[int]]] schema. Add auto_deploy: bool = True flag to install_fomod to match install_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 for nxm://...?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 every create_and_start_download spawns 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.json per 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

  1. Y4rd13 commented on May 19, 2026

    @Y4rd13
    OwnerAuthor

    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-compliant via #223 → #229, on main via #232.

    Source PR What it added
    #223 (PR A) Widen Nexus revision GraphQL manifest + parse nxm://collections/... deep links
    #224 (PR B) InstalledCollection model + schema migration
    #225 (PR C) Orchestrator service + REST endpoints (premium path)
    #226 (PR D) Non-interactive FOMOD driver (resolve pre-recorded author choices)
    #227 (PR E) Frontend preview/progress dialogs + SSE stream + hooks
    #228 (PR F) Installed-tab grouping + cascade uninstall
    #229 NXM deep-link → install-flow store handoff

    Phase 2 — free-tier + lifecycle

    Source PR What it added
    #230 (PR G) Free-tier per-file nxm:// install: orchestrator emits awaiting_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 stale awaiting_nxm rows.
    #231 (PR I) Update detection (check_updates) + force-reinstall flow ("Update to rev N" badge + button)
    #232 Batch backport of all 9 commits to main (Full edition)
    #233 Cherry-pick the aggregate-review fixes back to nexus-compliant for parity

    PR H — semaphore — postponed

    download_service currently creates an asyncio.Task per 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 (one awaiting_nxm per 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:

    Parity confirmed

    main and nexus-compliant are 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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions