A Bash script to automatically download, verify, and install the latest GE-Proton (GloriousEggroll's excellent Proton fork) for Steam on Linux desktops / laptops. Keeps your gaming compatibility tools up-to-date with minimal hassle.
- Standalone: Runs anywhere to update GE-Proton.
- Hook-Friendly: Perfect as a post-update script for apt-up or pac-up. Fully dry-run aware via
IS_DRY_RUN. - Efficient: Nothing happens unless it needs to.
- No Restart Required: After initial setup, GE-Proton updates are picked up by Steam automatically — no restart needed.
- Fetches the latest GE-Proton from GitHub.
- Architecture-aware: auto-detects the host CPU (
x86_64oraarch64) and downloads the matching GE-Proton build. Since GE-Proton11-1, upstream ships both, and the script selects the correct asset for your machine. - Verifies checksums for security and consistency.
- Installs to a static
GE-Proton-Latestdirectory in~/.steam/steam/compatibilitytools.d(or a custom path), with a customizedcompatibilitytool.vdfso Steam recognizes it as "Proton GE Latest". - Automatically rotates the previous version to
GE-Proton-Previous("Proton GE Previous") as a fallback in case of critical bugs. - After initial setup, no Steam restart is required for updates — the static internal name means Steam uses the new build immediately.
- Tracks installed versions via a state file (
.ge-proton-version) to avoid redundant downloads. - Cleans up legacy versioned directories (e.g.
GE-Proton10-27) from older script versions. - Handles user ownership (no root-owned files in your home dir).
- Skips root installs as accidental unless explicitly allowed (
--force-root). - Dry-run aware: checks
IS_DRY_RUNwhen run as a hook and reports what would happen without downloading or installing anything. - Debug mode for troubleshooting (
--debug).
Instead of extracting each GE-Proton release to its own versioned directory (e.g. GE-Proton10-30), this script uses static directory names with rewritten compatibilitytool.vdf files:
| Directory | Internal Name | Display Name (in Steam) |
|---|---|---|
GE-Proton-Latest/ |
GE-Proton-Latest |
Proton GE Latest |
GE-Proton-Previous/ |
GE-Proton-Previous |
Proton GE Previous |
Since Steam's CompatToolMapping in config.vdf references tools by their internal name, keeping the internal name static means you only need to select Proton GE Latest once. After that, every update transparently replaces the contents of that directory and Steam uses the new build at the next game launch.
The actual GE-Proton version installed under each slot is tracked internally via a .ge-proton-version state file and reported in the script's output.
Bash,curl,tar,sha512sum(standard on most distros).Steaminstalled natively (.deb, package manager, etc.).- A supported CPU architecture: x86_64 (amd64) or aarch64 (arm64). The script auto-detects yours and fetches the matching build. You can force a specific build with
GE_PROTON_ARCH(see Usage) — handy under a translation layer (FEX-Emu, box64, qemu-user) or to stage a build for another machine. An unrecognized CPU falls back to x86_64 with a warning rather than failing.
Flatpak Steam users: This script is not compatible with Flatpak Steam. Upstream GE-Proton tarballs include pressure-vessel, which cannot nest inside Flatpak's sandbox. Install GE-Proton via Flatpak instead:
flatpak install com.valvesoftware.Steam.CompatibilityTool.Proton-GE
Here it's found a new version, rotated the previous Latest to Previous, downloaded and checksummed the new release, extracted it, and rewrote the VDF files:
Checking for GE-Proton updates...
Using overridden Steam directory: /home/chris/.steam/steam/compatibilitytools.d
Latest version: GE-Proton10-30
Rotating GE-Proton-Latest (GE-Proton10-29) → GE-Proton-Previous...
Previous version: GE-Proton10-29
Downloading GE-Proton10-30.tar.gz...
/tmp/ge-proton-update.BJfprL/GE-Proton10-30.tar.gz 100% 478.83M 90.1MB/s in 5.2s
Verifying checksum...
Checksum verification passed
Extracting GE-Proton10-30 to /home/chris/.steam/steam/compatibilitytools.d/GE-Proton-Latest as user chris...
GE-Proton10-30 installed as 'Proton GE Latest'!
==> Updated in-place. No Steam restart required.
Done!
curl -sL https://raw.githubusercontent.com/cwadge/ge-proton-updater/main/ge-proton-updater -o /usr/local/bin/ge-proton-updater
chmod +x /usr/local/bin/ge-proton-updater
ge-proton-updater- Copy to the
apt-uppost-hook directory:
sudo curl -sL https://raw.githubusercontent.com/cwadge/ge-proton-updater/main/ge-proton-updater -o /etc/apt-up.d/post.d/50-ge-proton
sudo chmod +x /etc/apt-up.d/post.d/50-ge-protonOr for pac-up:
sudo curl -sL https://raw.githubusercontent.com/cwadge/ge-proton-updater/main/ge-proton-updater -o /etc/pac-up.d/post.d/50-ge-proton
sudo chmod +x /etc/pac-up.d/post.d/50-ge-proton- (Optional) Set a custom target in
/etc/apt-up.confor/etc/pac-up.conf:
EXPORT_VARS="GE_PROTON_TARGET=/home/youruser/.steam/steam/compatibilitytools.d"- Run
sudo apt-uporsudo pac-up.
When installed as an apt-up or pac-up hook, the script automatically respects dry-run mode. Both parent scripts export IS_DRY_RUN=true before running any hooks when --dry-run is active. The updater checks this variable and, if set, queries the GitHub API for the latest version and reports what it would do — without downloading, extracting, or modifying anything:
[DRY-RUN] Would update GE-Proton: GE-Proton10-29 → GE-Proton10-30
or, if already up to date:
GE-Proton10-30 is already up to date.
No special configuration is needed — dry-run awareness is built in.
-
Standalone:
ge-proton-updater(updates for the current user). -
Root with Custom Target:
GE_PROTON_TARGET=/path/to/dir sudo ge-proton-updater. -
Force Root Install:
ge-proton-updater --force-root(if you're running Steam as root for some wild and unforeseen reason). -
Force Architecture:
GE_PROTON_ARCH=aarch64 ge-proton-updater(orx86_64) — overrides CPU auto-detection and fetches that build regardless of the host. Useful when running x86_64 GE-Proton under a translation layer on ARM (or vice versa), or to stage a build for a different machine. Acceptsx86_64/amd64andaarch64/arm64; an unrecognized value is treated as an error. -
Dry-Run:
ge-proton-updater --dry-run— checks for a newer version and reports what would happen without downloading or modifying anything. -
Debug Mode: Something going wrong? Run
ge-proton-updater --debugfor full verbiage.
After the first GE-Proton install, Steam needs to be told to use it:
-
Restart Steam.
-
Go to
Steam>Settings>Compatibility. -
Set "Default compatibility tool:" to
Proton GE Latest.
That's it — you only need to do this once. Future updates will be picked up automatically without restarting Steam.
If a new build causes issues, you can switch to Proton GE Previous as a fallback until the next release.
If you were previously using versioned directory names (e.g. GE-Proton10-27, GE-Proton10-28), the script will:
- Install the latest version to
GE-Proton-Latest/with the new static naming. - Automatically clean up any legacy versioned directories.
After migrating, you'll need to restart Steam once and select Proton GE Latest as your compatibility tool. From that point forward, updates are seamless.
For systems with multiple Steam users, adapt the script as follows:
- Set
GE_PROTON_TARGETupstream for the gamer's Steam path, e.g. edit/etc/apt-up.confor/etc/pac-up.conf:
EXPORT_VARS="IGNORE_CC_MISMATCH=1 GE_PROTON_TARGET=/home/gamer/.steam/steam/compatibilitytools.d"- Run
sudo apt-uporsudo pac-up.
Run the script once per user with GE_PROTON_TARGET as a CLI variable:
GE_PROTON_TARGET=/home/gamer1/.steam/steam/compatibilitytools.d ge-proton-updater
GE_PROTON_TARGET=/home/gamer2/.steam/steam/compatibilitytools.d ge-proton-updater
...Use multiple copies of the script with hard-coded targets:
- Copy and edit the script for each user:
sudo cp ge-proton-updater /etc/apt-up.d/post.d/ge-proton-updater-gamer1
sudo chmod +x /etc/apt-up.d/post.d/ge-proton-updater-gamer1
# Edit ge-proton-updater-gamer1, uncomment and set: GE_PROTON_TARGET="/home/gamer1/.steam/steam/compatibilitytools.d"
sudo cp ge-proton-updater /etc/apt-up.d/post.d/ge-proton-updater-gamer2
sudo chmod +x /etc/apt-up.d/post.d/ge-proton-updater-gamer2
# Edit ge-proton-updater-gamer2, uncomment and set: GE_PROTON_TARGET="/home/gamer2/.steam/steam/compatibilitytools.d"
...-
Run parent script, e.g.
sudo apt-uporsudo pac-up. Each hook updates its respective user's GE-Proton individually.- Be sure you don't set
GE_PROTON_TARGETinapt-up.conf/pac-up.confin this case, as it'd override the script-specific targets.
- Be sure you don't set
MIT License (LICENSE) - feel free to use, modify, and share!
A script for keeping GE-Proton up to date by Chris Wadge