In unrelated news: I've been experimenting with GOG offline installers to see how "complete" they truly are (re: will I need to grab extra shit via
winetricks or
protontricks?). Long story short: Hitman: Codename 47's offline installer is rubbish. Fallout: New Vegas, Deus Ex: GOTY, The Witcher: Enhanced Edition - Director's Cut, and Hollow Knight all seemingly work flawlessly.
I've also elected to eschew stuff like Heroic, Lutris, Bottles, WineGUI, and other such front-ends for managing my prefixes wholesale. Instead, I'm going back to basics with
umu-launcher - itself a pure CLI tool that stuff like Heroic, Lutris, and Bottles paper over with their own abstractions. Honestly? Pretty illuminating to actually run an offline GOG installer in such a manner.
I'm sure other people already know how to do the shit I'm talking about, and probably in more efficient ways. This post ain't for those people; it's for turbospeds like me who find it really crap and sorta unrelaxed about how the solution to any mild-to-moderate problem is "download and install this GUI front-end that may or may not be orphaned or worse, vibe-coded." You'd be surprised how far you can get with just a text console, an editor, and a script. Don't be a retard and follow what I do verbatim, but if you can pick up the technique and successfully apply it, more power to ya.
Right out the gate, I could already tell how ugly running it straight out of the terminal will get. Using Hollow Knight as an example.
Code:
WINEPREFIX=/games/umu-cli/HK/Prefix GAMEID=umu-367520 STORE=gog PROTONPATH="/home/dfirst/.local/share/Steam/compatibilitytools.d/GE-Proton11-7" umu-run /games/umu-cli/HK/setup_hollow_knight_1.5.12620_64bit_89718.exe
It's a horrifically long and ugly string of text, but it makes sense and I only have to do it once per game.
* Declare my WINEPREFIX path.
* Declare the GAMEID. In this case,
umu-$STEAMID works quite well.
* Declare the game storefront this EXE came from
* Declare the path where pre-existing Proton versions are installed. I have GE-Proton11-7, you do you.
* Invoke
umu-run and then specify the path to the offline installer's EXE like so.
Hit enter, and if all goes well, you should be greeted by the GOG installer. Next, next, accept, and then hit "exit" instead of launching upon finishing the install. You
could keep treating this like an increasingly unwieldy one-shot command.
OR you could set up a simple bash script to launch it for you.
First and foremost: locate the correct EXE.
find is your friend. Something like
find "/games/umu-cli/HK/Prefix/drive_c/GOG Games/Hollow Knight" | grep exe usually returns an output similar to the below:
Code:
/games/umu-cli/HK/Prefix/drive_c/GOG Games/Hollow Knight/Hollow Knight.exe
/games/umu-cli/HK/Prefix/drive_c/GOG Games/Hollow Knight/UnityCrashHandler64.exe
/games/umu-cli/HK/Prefix/drive_c/GOG Games/Hollow Knight/unins000.exe
The first one is what we need to write the script. Spoiler alert: I was originally doing it as a bash script that passed the one-shot command until it occurred to me that I could make the script much more readable while still retaining the "double click the executable script and away you go" functionality. What I'm sharing below is what roughly 5 minutes of LLM whispering to Qwen3.5:9b with
--think=false passed in Ollama turned my original one-shot command script into.
Code:
#!/usr/bin/env bash
set -euo pipefail
PREFIX="/games/umu-cli/HK/Prefix"
GAME="/games/umu-cli/HK/Prefix/drive_c/GOG Games/Hollow Knight/Hollow Knight.exe"
PROTON="/home/dfirst/.local/share/Steam/compatibilitytools.d/GE-Proton11-7"
export WINEPREFIX="$PREFIX"
export GAMEID=umu-367520
export STORE=gog
export PROTONPATH="$PROTON"
#export MANGOHUD=1
#export PROTON_LOG=1
export DXVK_FRAME_RATE=60
export PROTON_NO_ESYNC=1
export PROTON_NO_FSYNC=1
exec umu-run "$GAME" "$@"
Beyond being more readable, it also does one thing exceptionally well: being easy to modify and troubleshoot on the fly. If my mangohud graph is basically flatter than Kansas and I'm pulling a steady 60fps, I'm golden. Comment that out. Preliminary testing shows that there ain't any egregious errors popping up in my Proton logs? Comment that line out!
The most important parts of this script are the first three lines that declare PREFIX, GAME, and PROTON paths and then the next four lines that export WINEPREFIX, GAMEID, STORE, and PROTONPATH, followed by the final line that properly invokes
umu-run, targets the GAME path, and then passes all the stuff you exported. So you can easily turn the above script into something more condensed like:
Code:
#!/usr/bin/env bash
set -euo pipefail
PREFIX="/games/umu-cli/HK/Prefix"
GAME="/games/umu-cli/HK/Prefix/drive_c/GOG Games/Hollow Knight/Hollow Knight.exe"
PROTON="/home/dfirst/.local/share/Steam/compatibilitytools.d/GE-Proton11-7"
export WINEPREFIX="$PREFIX"
export GAMEID=umu-367520
export STORE=gog
export PROTONPATH="$PROTON"
exec umu-run "$GAME" "$@"
Mind you: I've had success testing out Fallout: New Vegas, Deus Ex: GOTY, and Witcher 1's GOG offline installers this way before coming to Hollow Knight like this. I can also personally attest to Hollow Knight running flawlessly under
umu-launcher all the same as it would under Heroic or Steam. Successfully got up to Hornet Protector and beat her within the first hour of gameplay. Everything else before then like King's Pass, Dirtmouth, Forgotten Crossroads, False Knight, Gruz Mother, the Elder Baldur trap set by the Snail Shaman, and basically the entirety of Greenpath to that point? Child's play.
The Witcher: Enhanced Edition - Director's Cut? Same thing: the opening half hour or so where you're doing the invasion of Kaer Morhen tutorial, kill the frightener or fight Savolla, watch Leo get murdered, and then leave Kaer Morhen for Vizima. Ran perfectly, with the only jank emerging from how strangely W1's Aurora Engine gameplay and mechanics have aged with time. Fallout: New Vegas had the one-shot command script, then Deus Ex GOTY had the "condensed" script that Qwen3.5:9b --think=false turned it into, and finally W1 was where I figured out "oh shit, I can lock the framerate and disable ESYNC and FSYNC to let native Fedora NTSYNC be useful!" Come Hollow Knight? The entire process was basically perfected.
If you're intrigued and wanna see how far you get, by all means give it a fair shake. The hardest part for me was "Alright... just how
do I sequence this shit?" Overcoming that meant the rest came naturally.