A desktop mod manager that keeps your game folder clean.
Store every mod in one pool, then apply, disable, update or remove it with a click — without ever digging through the game directory by hand.
Mod managers usually fail in the same place: once files are copied into the game folder, nobody knows what came from where. ZMods records every file it writes, so removing a mod removes exactly those files and nothing else.
- One pool per game. Mods live in ZMods' own storage. The game folder only ever holds what you have actually applied.
- Apply, disable, remove — reversibly. Disabling parks a mod without deleting it. Removing from the game leaves it in the pool for later.
- Update with a diff. Point ZMods at a new version and it shows you exactly which files are added, changed and removed before you commit.
- Honest state. Every launch re-checks the disk. If files vanished, the mod
is flagged
brokeninstead of silently lying to you. - Folder mods and file mods. Per game, or per mod for games that use both.
- Search, filter and tag your pool; sort by name, status, version or date.
- Yours to look at. Dark and light themes, any accent colour, six bundled fonts. No telemetry, no account, no network calls.
Grab the file for your system from the latest release.
Windows
Download ZMods_0.1.0_x64-setup.exe and run it. (An .msi is also provided
if you prefer it for deployment.)
Windows 11 and up-to-date Windows 10 already have everything needed. On older Windows 10 the installer will offer to fetch WebView2 — let it.
"Windows protected your PC"
The builds are not code-signed (certificates cost money), so SmartScreen warns about them. Click More info → Run anyway. If that makes you uneasy, build it yourself — see Building from source.
macOS
Download the .dmg for your Mac and drag ZMods to Applications:
| Mac | File |
|---|---|
| Apple Silicon (M1–M4) | ZMods_0.1.0_aarch64.dmg |
| Intel | ZMods_0.1.0_x64.dmg |
"ZMods is damaged and can't be opened"
It isn't — macOS says this about any app that isn't notarised. Clear the quarantine flag once, then open it normally:
xattr -dr com.apple.quarantine /Applications/ZMods.app
Linux
AppImage — works on any distro
chmod +x ZMods_0.1.0_amd64.AppImage
./ZMods_0.1.0_amd64.AppImageSelf-contained, nothing to install. Needs FUSE 2 (libfuse2 on Debian/Ubuntu,
fuse2 on Arch) — most systems already have it.
Debian, Ubuntu, Mint — needs Ubuntu 22.04+ or Debian 12+ for WebKitGTK 4.1
sudo apt install ./ZMods_0.1.0_amd64.debFedora, RHEL, openSUSE
sudo dnf install ./ZMods-0.1.0-1.x86_64.rpmArch, Manjaro, EndeavourOS
From the AUR, with any helper:
yay -S zmods-bin # prebuilt, installs in seconds
yay -S zmods # builds from source, ~3 minOr build the package yourself and let pacman track it:
git clone https://github.com/abodesalm/zmods.git
cd zmods/packaging && makepkg -siEither way, sudo pacman -Rns zmods uninstalls cleanly. See
packaging/README.md for details.
1. Add a game. Click + Add Game and fill in two paths:
- Game folder — where the game is installed.
- Mods folder — where applied mods should be copied. For Skyrim that is
.../Skyrim Special Edition/Data; for most games it is amods/directory.
Then pick whether this game's mods are folders, single files, or both. Cover art, an icon and a hero banner are optional but make the library much nicer to look at.
2. Add mods to the pool. On the game page, + Add Mod copies files into ZMods' storage. The game folder is not touched yet.
3. Apply what you want. Use the ⋯ menu on any row:
| Action | What happens |
|---|---|
| Apply | Copies the mod from the pool into the game's mods folder |
| Remove from game | Deletes exactly the files it copied; the mod stays in the pool |
| Disable | Pulls it from the game and parks it in the pool's disabled/ folder |
| Enable | Puts it back and re-applies it |
| Update | Pick a new version, review the diff, then commit |
| Remove from pool | Deletes it everywhere |
Choose Update, point at the new download, and ZMods compares it against what is in the pool — file by file, by content, not just by name. Nothing is written until you press Apply update. If the mod was applied, it is re-deployed to the game folder automatically.
Theme, accent colour, font and pool location all live in Settings and save the moment you change them.
| Path | |
|---|---|
| Linux | ~/.local/share/zmods/ |
| macOS | ~/Library/Application Support/zmods/ |
| Windows | %APPDATA%\zmods\ |
db.json holds your library — games, mods, tags, notes, settings. It is plain
JSON, so it is easy to back up or inspect. Mod files sit in pool/, which you
can relocate to another drive from Settings → Pool path (ZMods moves the
existing files for you).
Uninstalling ZMods never deletes this folder. Remove it by hand if you want a clean slate.
"Mods folder not found" — the game moved, or an external drive is not mounted. Fix the path with ⋯ → Edit game; ZMods will carry applied mods across to the new location.
A mod shows as broken — its files are missing from the pool (deleted, or
the pool moved without them). Use ⋯ → Update and point at the files again to
repair it.
Nothing happens when I apply a mod — check the toast in the bottom-right corner. Errors stay on screen until dismissed and carry the exact reason.
Linux: it runs from the terminal but my app launcher says "executable not
found" — your desktop session's PATH does not include ~/.local/bin, because
graphical sessions do not read ~/.bashrc or ~/.zshrc. The installer writes an
absolute path so this should not happen; if you launch it some other way, add:
mkdir -p ~/.config/environment.d
echo 'PATH=$HOME/.local/bin:$PATH' > ~/.config/environment.d/10-local-bin.confthen log out and back in.
You need Rust and Node 20+, plus:
- Windows — MSVC Build Tools with the "Desktop development with C++" workload
- macOS —
xcode-select --install - Linux — WebKitGTK 4.1 and friends:
webkit2gtk-4.1 gtk3 librsvg base-devel(Arch) orlibwebkit2gtk-4.1-dev libgtk-3-dev librsvg2-dev patchelf(Debian/Ubuntu)
npm install
npm run app # dev build with hot reload
npm run app:build # release build (use app:build:linux on Linux)Bundles land in src-tauri/target/release/bundle/.
On Linux use
app:build:linux. It setsNO_STRIP=1, without which the AppImage step fails — linuxdeploy bundles an old binutils whosestripcannot parse the.relr.dynsections modern toolchains emit.
Tauri cannot cross-compile — each platform's installer needs that platform's
native tooling. To build for all three from one machine, push a tag and let CI do
it; .github/workflows/release.yml builds Linux, Windows and both macOS
architectures, then attaches everything to a draft release:
git tag v0.1.0 && git push --tagsIssues and pull requests are welcome. See docs/ARCHITECTURE.md for how the codebase is laid out and which invariants matter.



