DEV Community

Dominic Hock
Dominic Hock

Posted on

Why Is Game Mod Management Still So Cumbersome in 2025?

A look at the problem, and an open-source solution: TotalControl

Hey everyone 👋
I’m Dominic, a passionate gamer and fan of open-source projects. Like many of you, I’ve spent countless hours modding games — and just as many hours fighting the tools we’re forced to use. From clunky Windows-only apps to platforms that ignore gamepads entirely, I kept wondering...

Why isn’t there a good, open-source, cross-platform mod manager in 2025?

So, I built one.
🚨 This post is an ad for my open-source application called TotalControl — but it’s also a breakdown of the modding ecosystem’s current pain points and how we can start fixing them.

💥 Why Is Mod Management Still So Painful?

If you’ve ever modded games like Skyrim or Stardew Valley, you know the routine:

  • Hunt down the mod files
  • Manually unpack or install them
  • Edit text configs
  • Hope it doesn’t crash
  • Repeat for updates

Even popular tools like Vortex or Mod Organizer have major flaws:
🔒 Windows-only, 💸 ads or subscriptions, 🧷 locked into an eco-system, 🧍‍♂️ no controller support.
That’s a huge problem in 2025, especially with Steam Deck and couch-gaming on the rise.

❓ Why Isn’t There a Cross-Platform, Multi-Game Mod Manager?

Here’s why this problem persists:

  • Most tools are Windows-first
    • They rely on .NET, WinForms, or native Windows APIs — making porting to Linux/macOS non-trivial.
  • Hard-coded support
    • Most managers are tailored to specific games (Skyrim, Fallout, Satisfactory), and adding others means trying to change their foundation.
  • Lack of modularity
    • Very few are designed to be plugin-first or sandboxed for safety.
  • Controller unawareness
    • Despite the popularity of Steam Deck and other handheld PCs, gamepad navigation is an afterthought (if considered at all).

🤷‍♂️ Why Is NexusMods Still the Only Multi-Game Mod Manager?

Vortex from NexusMods is technically a multi-game mod manager — but it’s built entirely around their own platform.
Let’s be honest: Vortex is not the answer for everyone.

  • ✅ It supports many games
  • ❌ It’s Windows-only, written in .NET
  • ❌ It’s user-extendable but honestly it’s a pain.
  • ❌ It’s heavily tied into the NexusMods website (which means mod downloads are platform-locked and account-gated)
  • ❌ It has no gamepad support
  • ❌ It's bloated with ads unless you pay

If you want to install mods outside of windows — or want something lighter, faster, and more transparent — you're on your own.

🎮 Introducing: TotalControl

TotalControl is (hopefully) my answer to all of this.

🛠️ A cross-platform, controller-first, plugin-based mod manager — 100% open source under the AGPL-v3 license.

You can think of it as the Visual Studio Code of mod managers: the core does nothing by default — everything is built with plugins.

🌟 Features at a Glance

  • ✅ Cross-platform — Windows, Linux, macOS
  • 🎮 Full controller support — navigate with a gamepad
  • 🧩 Modular & extensible — Lua plugins for game support
  • 🖼️ Modern UI — built with Vue.js + TypeScript
  • 🔐 Safe & sandboxed — plugins declare capabilities
  • 💻 No ads, no tracking, no subscriptions
  • 💬 Built in public — solo-developed, early alpha, contributions welcome!

⚙️ Why I Chose The Technologies Used

Business Logic:
I chose Go (Golang) for the core logic due to its:

  • Excellent cross-compilation support
  • Strong performance and concurrency model
  • Clean and readable structure for large applications

Frontend:
I’m using Vue.js with TypeScript, powered by the Wails framework.
Why Wails?

  • Native performance without Electron bloat
  • Small binary size
  • Seamless Go + JS interop

Plugin System: Lua
I picked Lua because it's:

  • Lightweight and embeddable
  • Already popular in game development (e.g., Factorio, WoW, Garry’s Mod)
  • Easy to learn and script with, even for non-devs
  • Doesn’t require compilation or external dependencies

Each plugin lives in a sandbox and explicitly declares what it can access — like mod directories or web APIs — making the system safe by design.

🔌 Example: The Factorio Testing Plugin

Here’s an example game plugin. This one could add support for Factorio — managing installed mods, downloading new ones, and even reading mod-list.json.
plugin.json

{
  "id": "com.github.subtixx.factorio",
  "name": "Factorio",
  "description": "Enables managing Factorio mods and saves.",
  "entry": "plugin.lua",
  "capabilities": {
    "filesystem": {
      "path_whitelist": ["$HOME/.factorio/*"]
    },
    "network": {
      "url_whitelist": [
        "https://mods.factorio.com/*",
        "https://api.mod.io/*"
      ]
    }
  },
  "functionality": [
    "mod_management",
    "save_game_management"
  ]
}
Enter fullscreen mode Exit fullscreen mode

plugin.lua (snippet)

function readModListFile(plugin)
    local mod_list_file = io.getFileContent(plugin:GetGameModDirectory() .. "mod-list.json")
    if mod_list_file == nil or mod_list_file == "" then return {} end
    local mod_list = json.decode(mod_list_file)
    local mod_ids = {}
    for _, mod in ipairs(mod_list.mods or {}) do
        mod_ids[mod.name] = mod.enabled or false
    end
    return mod_ids
end

function loadModsFromApi()
    local response = http.get("https://mods.factorio.com/api/mods")
    if response and response.status_code == 200 then
        local data = json.decode(response.body)
        cache.set("factorio_mods", data)
        return data
    end
    return {}
end

return {
    mods = loadModsFromApi(),
    GetInstalledMods = function(self)
        local mod_list = readModListFile(self)
        local mod_files = io.getFilesInDirectory(self:GetGameModDirectory(), { "*.zip" })
        local mods = {}
        for _, file in ipairs(mod_files) do
            local info = json.decode(io.readFileFromZip(file, ".*?/info\\.json"))
            mods[#mods + 1] = {
                id = info.name,
                name = info.title or info.name,
                version = info.version,
                description = info.description or "",
                author = info.author or "Unknown",
                file_path = file,
                enabled = mod_list[info.name] or false,
                game_id = "factorio"
            }
        end
        return mods
    end,
    GetGameModDirectory = function()
        if os.is_windows then
            return io.pathJoin(os.getenv("APPDATA"), "Factorio", "mods")
        elseif os.is_linux then
            return io.pathJoin(os.getenv("HOME"), ".factorio", "mods")
        elseif os.is_macos then
            return io.pathJoin(os.getenv("HOME"), "Library", "Application Support", "factorio", "mods")
        end
    end
}
Enter fullscreen mode Exit fullscreen mode

🧪 Current Status: Alpha Phase

As of writing, TotalControl is still early-stage — here’s what works:

  • ✅ Plugin system
  • ✅ Mock frontend
  • ✅ plugin to test scripting functionality
  • 🚫 No real UI ↔ backend integration yet
  • 🚫 No mod install/update workflows yet
  • 🚫 No plugin sandbox
  • 🚫 No capability system

But it’s a solid foundation. And yes — I’m doing this solo, just a gamer and developer with a dream and a keyboard.

🙋‍♂️ A Personal Note

I’ll be honest — putting this out there makes me nervous as hell. I often look at my own code and ideas and think they’re garbage, or that no one will care. Imposter syndrome is real, and it’s loud. But despite that, I care deeply about making good tools and sharing them, even if they’re not perfect. TotalControl is my way of trying anyway — and if you find it useful, that already means the world to me.

👐 Want to Help?

Check out the repo:
👉 github.com/subtixx/total-control

  • 💬 File issues, request features
  • 🧩 Write plugins for your favorite games
  • 🧪 Test it on your setup
  • ⭐ Star the repo to support it!

This isn’t just about one project — it’s about modernizing how we mod games. Together, we can make it platform-agnostic, user-friendly, and open.

Thanks for reading — and happy modding! 🎮
— Dominic

Top comments (0)