Mods Manager

Created at: September 13, 2026, last updated at: September 13, 2026

Mods is an interactive CLI for installing, enabling, and disabling Unreal Engine mod triplets across supported games.

It began as Forever Winter Mods, where game discovery, paths, and mod operations all belonged to one game-specific utility. Mods retains that behavior and moves the game-specific decisions behind adapters. Archive inspection, transactional installation, triplet state changes, and the terminal interface are now shared by every supported game.

The current release supports The Forever Winter and Grounded 2. The project is published as @sabinmarcu/mods.

How it works

Run mods without a command to open an interactive game picker. It lists the supported games and reports whether each one is ready, needs its mods directory initialized, or was not detected. After selecting a ready installation, the CLI displays its complete mod triplets.

Each entry can be enabled or disabled as one operation, so its required .pak, .ucas, and .utoc files remain in the same state. Use mods install <archive> with a selected game to inspect a .zip, .7z, or .7zip archive. A single new triplet installs immediately. Archives with multiple triplets or an existing mod open a selector first.

The CLI does not extract an archive with unexpected payloads and does not delete installed mods. Documentation files are permitted, but other file types cause it to stop and leave the archive for manual review. The tool manages complete triplets and refuses to guess how an unfamiliar archive or unrelated file should be handled.

What changed from Forever Winter Mods

The original CLI searched for one game and accepted a direct mods-directory override. Mods introduces an explicit game layer:

  • A game picker provides the default interactive entry point.
  • Stable game IDs support scripts and direct selection through --game.
  • mods games reports every registered game and its detected installations.
  • --game-root accepts an installation root; the selected adapter resolves the final mods directory.
  • mods init creates a missing canonical ~mods directory when its parent exists.
  • Shell completion is generated from the same Commander command graph used for parsing.

These additions change how a target directory is selected, not how mod files are interpreted. The complete-triplet contract and archive safety rules remain shared.

Game adapters

Each adapter owns four facts: a stable ID, a display name, game-root discovery, and the mapping from a game root to its canonical mods directory. The core owns Steam library discovery, installation-state inspection, archive handling, mod operations, and the Ink interface.

Adapters are registered at build time. The CLI does not load arbitrary adapter packages, so adding another game requires a source change and a new release.

Supported games

GameIDMods directory relative to game root
The Forever WinterforeverwinterWindows/ForeverWinter/Content/Paks/~mods
Grounded 2grounded2Augusta/Content/Paks/~mods

Both adapters allow the final ~mods directory to be created when its parent game directory exists.

Terminology

Mod triplet

A set of three files with the same basename: .pak, .ucas, and .utoc. For example, Example_P.pak, Example_P.ucas, and Example_P.utoc make one triplet. The CLI only lists, toggles, or installs a mod when all three matching files are present.

Enabled and disabled

An enabled triplet keeps its normal filenames. A disabled triplet appends .disabled after each extension, such as Example_P.pak.disabled. The payload stays in the same directory; only the names change.

Game root

The installation directory for a supported game. --game-root accepts this directory rather than a Paks or ~mods directory. The selected adapter derives the canonical mods path beneath it.

Archive

A .zip, .7z, or .7zip file containing one or more mod triplets. Archive folders are allowed, but each mod is identified by its own complete, same-named triplet.

Steam discovery and installation state

The CLI searches Steam libraries on Windows and Linux, including configured secondary libraries. Each adapter supplies the directory names that identify its game. Every detected installation is then classified as ready, needs-initialization, or invalid.

A ready installation already has its canonical mods directory. An installation needs initialization when the directory is absent but its parent exists. An invalid installation records why the expected location cannot be used. If discovery cannot find a usable installation during an interactive session, the CLI prompts for a game root.

This is a game-root workflow rather than an arbitrary mods-directory override. Supplying --game-root bypasses automatic discovery, but the adapter still derives and validates the final directory.

Built and maintained by Sabin Marcu

(2025 -2026)

Table of contents

Experiments