Skip to main content

Patch Steam games to use the Goldberg emulator — replaces Steam API DLLs, writes DLC config, and restores originals on demand.

Project description

steamlayer

Patches Steam games to run through the Goldberg emulator.
Finds the AppID, grabs DLC info, swaps the DLLs, backs up the originals. One command.

Python Platform License


What it does

You point it at a game folder. It figures out the AppID (or you tell it), pulls DLC metadata from Steam, backs up the original steam_api.dll files, drops in Goldberg's replacements, and writes the config. If something breaks or you just want your files back, --restore undoes everything cleanly.

7-Zip, Goldberg, and Steamless are downloaded automatically on first run — you don't install them manually.

[!WARNING] steamlayer is under active development and not yet production-ready. Expect rough edges, and always keep --restore in mind.

Installation

pip install steamlayer

Or with pipx if you want it isolated:

pipx install steamlayer

Requirements:

  • Python 3.13+
  • Windows
  • 7-Zip somewhere on your system for the very first run (after that steamlayer manages its own copy).

Usage

steamlayer "C:\Games\Portal 2"

That's the common case. It'll do everything automatically. If AppID detection gets it wrong, pass it explicitly:

steamlayer "C:\Games\Portal 2" --appid 620

Not sure what it's going to do? Run with --dry-run first:

steamlayer "C:\Games\Portal 2" --dry-run

Game uses SteamStub DRM? Let steamlayer strip it automatically:

steamlayer "C:\Games\Portal 2" --unpack

Something broke, want your files back:

steamlayer "C:\Games\Portal 2" --restore

All options

Flag Description
-a, --appid <id> Skip auto-detection and use this AppID
-d, --dry-run Show what would happen, don't touch anything
-n, --no-network Use cached data only, no requests
-r, --restore Put the original DLLs back and clean up
-u, --unpack Auto-strip SteamStub DRM via Steamless before patching
-y, --yolo Accept lower-confidence AppID matches
-v / -vv More output (-v = info, -vv = debug)
--cache-dir <path> Override the cache location (default: ~/.steamlayer/.cache)
--no-defender-check Skip the Defender warning
--version Print the version and exit

How it works

AppID detection — checks for steam_appid.txt or .acf manifest files in the game folder first. If nothing's there, it searches a locally-cached community index, then falls back to the Steam store API. If two results look equally likely, it asks you to pick. Pass --yolo to lower the confidence threshold (useful for sequels or non-standard folder names).

DLC metadata — fetches the DLC list from the Steam API and resolves names using the same community index. Anything missing from the index gets looked up individually. Results are cached for a week so repeat runs are fast.

SteamStub detection — before patching, steamlayer scans every .exe in each DLL's directory for SteamStub DRM. It recognises v1.x (via SteamDRMP.dll import) and v3.x (via the 0xCAFEDEAD header magic in the .bind section). If wrapped executables are found and --unpack wasn't passed, it warns you. With --unpack, Steamless strips the DRM automatically and the original executable is vaulted alongside the DLLs.

Patching — finds every steam_api.dll and steam_api64.dll in the game tree, vaults the originals to <game>/__original_files__/, and copies in the right Goldberg DLL (x32 or x64). Config files go in a steam_settings/ folder next to each DLL, plus a steam_appid.txt at the game root.

Restore — moves the vaulted DLLs (and any vaulted executables) back, deletes the steam_settings/ directories, cleans up loose config files, and removes the vault once it's empty. Safe to re-run if it fails partway through.


Windows Defender

If real-time protection is on, add a folder exclusion before running:

Windows Security → Virus & threat protection → Manage settings → Exclusions → Add an exclusion → Folder

C:\Users\<you>\.steamlayer\vendors

Swapping Steam DLLs looks suspicious enough that Defender will sometimes quarantine Goldberg's or Steamless's files mid-download. The exclusion keeps that from happening. It only covers this one folder, nothing else on your system.


Troubleshooting

7-Zip bootstrap fails — steamlayer needs an existing 7z.exe to pull in its own copy. Make sure it's in PATH or installed at the default location (C:\Program Files\7-Zip\).

Wrong game detected — use --appid. You can find the right ID on SteamDB or in the store URL.

Defender quarantined something mid-install — add the exclusion above and re-run. steamlayer will re-download and retry cleanly.

SteamStub warning at runtime — the game executable is wrapped with SteamDRM. Re-run with --unpack to strip it automatically, or unpack manually with Steamless first.

Game broken after patching — run --restore. If that also fails partway through, run it again — it picks up where it left off.


Disclaimer

This tool is intended for use with software you legitimately own. Use responsibly.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

steamlayer-0.1.0.tar.gz (39.0 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

steamlayer-0.1.0-py3-none-any.whl (50.5 kB view details)

Uploaded Python 3

File details

Details for the file steamlayer-0.1.0.tar.gz.

File metadata

  • Download URL: steamlayer-0.1.0.tar.gz
  • Upload date:
  • Size: 39.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.11.6 {"installer":{"name":"uv","version":"0.11.6","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for steamlayer-0.1.0.tar.gz
Algorithm Hash digest
SHA256 4a3b9ab5ec89db8e625eef1c6779ac8909e3ad404d1584744558f9828513c849
MD5 c971ed0cecf0629610caf34ad23ff05a
BLAKE2b-256 ce39df13dea136e94a1a3837c8bf25061fb30c5371da9687b50a2abbbdd2471e

See more details on using hashes here.

File details

Details for the file steamlayer-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: steamlayer-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 50.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.11.6 {"installer":{"name":"uv","version":"0.11.6","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for steamlayer-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 1c086c16e20c7cf04cd699b4b46f920ac99d995a4e735fd6381c49c0458ad41c
MD5 ee7d36a42020db9d31f7fbcf8ec6baab
BLAKE2b-256 c4cd51572b7e4b2d2c39f9e77e2c48dc35445b946fe08fe058d8e8f6ac80c27c

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page