modde
A cross-platform game mod manager written in Rust, running natively on Linux, macOS, and Windows. Provides mod management with virtual filesystem deployment, profile management, save versioning, and conflict detection.
Project site: https://modde.rs/ Documentation: https://modde.rs/docs/
Supported games
| Game | Current status |
|---|---|
| Skyrim SE/AE | Done: plugins, VFS, LOOT sorting, diagnostics, save tracking |
| Fallout 4 | Done: plugins, VFS, LOOT sorting, diagnostics, save tracking |
| Cyberpunk 2077 | Done: REDmod, CET, TweakXL, scripts, conflict detection |
| Fallout 76 | Partial: plugins, VFS, BA2 scanning; saves are effectively server-side |
| Starfield | Partial: plugins, VFS, diagnostics, save tracking |
| Fallout: New Vegas | Partial: Gamebryo plugins, VFS, scanning, save tracking |
| Oblivion | Partial: Gamebryo plugins, VFS, scanning, save tracking |
| Oblivion Remastered | Partial: hybrid UE5 pak + ESP plugins, VFS, save tracking |
| The Witcher 3 | Partial: mods/ deployment, .ws script-conflict scan, save tracking |
| Stellar Blade | Partial: UE4/UE5 deployment, scanning, conflicts, OptiScaler, save tracking |
| Subnautica 2 | Partial: UE4 pak deployment, scanning, conflicts, save tracking |
| Baldur's Gate 3 | Partial: pak deployment, modsettings.lsx load order, save tracking |
| Stardew Valley | Partial: SMAPI mod deployment, scanning, save tracking |
| Mount & Blade II: Bannerlord | Partial: Modules/ deployment, SubModule.xml dependency checks, save tracking |
Fifteen titles ship across the Creation Engine, Gamebryo, REDengine, Unreal 4/5,
Larian, SMAPI, and Bannerlord engines; additional titles can be added at runtime
as user-defined games. Games are
auto-detected via Steam (Proton) and Heroic (GOG, Epic, sideload) launchers.
The canonical status baseline for these claims lives in docs/capability-matrix.toml.
Features
- Virtual filesystem deployment: Symlink farm keeps the game directory clean and unmodified; atomic rollback to previous deployments
- Wabbajack on Linux: Native parsing of
.wabbajackmodlist archives without a Windows VM - Profile management: Create, fork, switch, and delete profiles; stackable experiments with rollback (like git branches); load order locking
- Save management: Git-backed save vaults with SHA-256 fingerprinting, compatibility warnings, and auto-capture for games with real save tracker support
- Conflict detection: Graph-based collision analysis with classification (dangerous vs cosmetic) and resolution suggestions
- Nexus-first installs: Nexus Mods API (REST + GraphQL browse/search),
nxm://, Browse Nexus, Wabbajack modlists, and Nexus Collections are the primary shipped install flows - Additional download backends: GitHub, Direct, Google Drive, MEGA, and MediaFire backends exist today mainly for Wabbajack/directive installs
- Installers: FOMOD is shipped end to end (interactive wizard plus declarative TOML/JSON/Nix configs); BAIN detection/execution exists but still requires the user-input selection flow
- Gaming tools & executables: MangoHud, vkBasalt, GameMode, ReShade, OptiScaler, and Proton are configured and patched from both the CLI and UI; named external executables (xEdit, BodySlide, Nemesis, …) run with overwrite capture via
modde exec/modde tool add-executable - Diagnostics: CLI and UI diagnostics use real plugin order plus resolved conflicts instead of placeholder inputs
- Reachable advanced views: Downloads, Data Files, Diagnostics, Tools, and Executables are connected in the UI; some remain
Partialrather than MO2-complete (see parity audit)
Architecture
| Crate | Purpose |
|---|---|
modde-core |
SQLite database, VFS/symlink farm, profiles & experiments, load-order resolver, collision detection, save vaults, installer pipeline, stock snapshots |
modde-games |
Game plugins for 15 titles across the Creation Engine, Gamebryo, REDengine, Unreal 4/5, Larian, SMAPI, and Bannerlord engines; the GamePlugin trait, launcher detection (Steam/Heroic), overlay tools, and user-defined games |
modde-sources |
Download backends (Nexus REST + GraphQL, Wabbajack, GitHub, Direct, Google Drive, MEGA, MediaFire), archive extraction (zip/7z/rar/BSA/BA2), FOMOD, and partial BAIN support |
modde-cli |
24+ top-level commands with 60+ subcommands covering detect, install, deploy, profiles, saves, tools, executables, and user-defined games |
modde-ui |
Iced GUI with Mod List, Browse Nexus, Collections, Wabbajack, Downloads, Data Files, Diagnostics, Tools, Executables, FOMOD wizard, and Settings views |
Usage
# Detect installed games
# Install a Wabbajack modlist
# Deploy mods and play
# Manage profiles
# Manage saves
# Analyze conflicts
# Check for updates
# Launch the GUI
Installation
Every release ships two binaries: the modde command-line tool and the
modde-ui desktop app. Install them through your platform's native package
manager, a direct download, Cargo, build from source, or — if you use Nix — a
flake with a declarative home-manager module. There is no single blessed
method; pick whatever fits how you already manage software. The canonical,
exhaustive list lives in the
installation guide.
Linux
# Arch (AUR) — modde-bin (prebuilt), modde (source), or modde-git (dev branch)
# Fedora / RHEL (COPR)
# Debian / Ubuntu (apt)
|
|
&&
# Flatpak (GUI)
# AppImage (self-contained) or tarball from the releases page
&&
macOS
The formula installs both modde and modde-ui on Apple Silicon and Intel
Macs. To install from a downloaded tarball instead, clear the macOS quarantine
attribute once after extracting, then run normally:
modde ships ad-hoc-signed macOS binaries (no Apple Developer ID, no
notarization). The xattr -dr step removes the "downloaded from the internet"
flag that triggers Gatekeeper; subsequent runs work without further
intervention. If you'd rather have notarized binaries (Apple Developer ID,
$99/yr), open an issue to fund or contribute it.
Windows
winget install Caniko.Modde # or: scoop install modde / choco install modde
Each Windows package installs modde.exe and modde-ui.exe on your PATH. To
install from the downloaded .zip instead, verify the Authenticode signature
before running:
Get-AuthenticodeSignature .\modde.exe
Get-AuthenticodeSignature .\modde-ui.exe
Both should report Status : Valid. On Linux you can verify the same files with
osslsigncode verify -in modde.exe.
Cargo
This builds the modde CLI from source (the GUI lives in a separate crate not
published to crates.io). It requires a Rust 2024 edition toolchain plus SQLite
and OpenSSL development headers — openssl-sys will not build without OpenSSL.
See the installation guide for the
per-distro package lists.
From source
# Binaries at target/release/modde and target/release/modde-ui
Use nix develop . -c cargo test --workspace for authoritative validation. A
plain cargo test --workspace outside the Nix shell is not a reliable signal
because openssl-sys will fail to locate OpenSSL on an unprepared host.
Nix
If you use Nix, modde is also a flake — a reproducible install that, through the home-manager module, additionally lets you declare your mod profiles as code. It's one option among many, not required and not "the" way in.
# Run directly
# Install to profile (both modde and modde-ui)
# Development shell
To wire the flake into your own config and declare profiles, add it as a flake input and import the home-manager module (see Home-Manager Module below):
# In your flake.nix inputs:
inputs.modde.url = "codeberg:caniko/rs-modde";
Privacy
Telemetry
modde has a remote-telemetry Cargo feature in modde-cli. It is opt-in (off by default in published builds) and currently a no-op stub - the feature compiles a detritus client, but no live endpoint is configured. Nothing is sent anywhere today.
When/if a telemetry backend is stood up, this README and the CHANGELOG will document:
- exactly what is collected,
- the opt-in flag,
- the endpoint URL,
- the data retention policy.
Until then: assume modde sends nothing. If you want to confirm, cargo tree -e features will show whether remote-telemetry is active in your build (it isn't, unless you explicitly enabled it).
Home-Manager Module
For Nix users, a home-manager module is included as the declarative option: configure your mod profiles as code and have them deploy on activation.
{
programs.modde = {
enable = true;
profiles = {
my-skyrim = {
game = "skyrim-se";
installMode = "auto";
gameDir = "/home/me/.local/share/Steam/steamapps/common/Skyrim Special Edition";
wabbajackList = {
url = "https://example.com/modlist.wabbajack";
hash = "sha256-...";
};
};
my-local-skyrim = {
game = "skyrim-se";
gameDir = "/home/me/.local/share/Steam/steamapps/common/Skyrim Special Edition";
wabbajackList = {
path = /nix/store/...-Legends-of-the-Frost.wabbajack;
};
};
my-cyberpunk = {
game = "cyberpunk2077";
nexusCollection = {
slug = "my-collection";
version = "1";
};
};
};
};
}
Set installMode = "await-game" while the game is not installed yet. modde
waits for Steam/Heroic-managed game installs and does not install the base game
itself.
Add the module to your home-manager imports from the flake:
# In your flake.nix inputs:
inputs.modde.url = "codeberg:caniko/rs-modde";
# In your home-manager config:
imports = [ inputs.modde.homeManagerModules.modde ];
Platform Support
modde runs natively on all three desktop platforms; every one is first-class.
| Platform | Architectures | Status |
|---|---|---|
| Linux | x86_64, aarch64 | Fully supported |
| macOS | x86_64, aarch64 | Fully supported |
| Windows | x86_64 | Fully supported |
CI
Forgejo Actions on Codeberg runs cargo fmt --check, cargo clippy,
coverage tests, Rust release builds, Nix package builds, and nix flake check
on every push and pull request. Pushes to trunk also build and deploy the
documentation site and presentation website to Codeberg Pages.
Tag releases are managed through cargo xtask release. Run
cargo xtask release X.Y.Z --dry-run to preview a workspace release, then
cargo xtask release X.Y.Z to publish all workspace crates to crates.io and
push the bare X.Y.Z tag. Release tags build and publish Linux, macOS, and
Windows CLI/GUI artifacts.
Website and docs
The presentation site (website/) is a Zola static
site; the documentation (docs/) is an mdBook.
The combined site output places the website at the root and the docs under /docs/.
For local editing:
&& &&
Contributing
See CONTRIBUTING.md for development setup and guidelines.
Security
See SECURITY.md for the security policy.
License
GPL-3.0-only