A CreamAPI clone for Linux.
Since 20PercentRendered has archived the repo, I have decided to fork and support it as far as I can.
Русская версия: README.ru.md
This fork (gongarn/creamlinux) adds the following on top of anticitizn/creamlinux:
- Modern Steam SDK support - SteamApps v009, SteamUser v022/v023, SteamClient v021-v023 (upstream only hooked v008/v021/v017-019, so recent titles like CK3 showed no DLCs); the Steam headers were updated to SDK 1.65 with separate vtable-correct wrappers per interface version
- Flat API hooks (
SteamAPI_ISteamApps_*,SteamAPI_ISteamUser_*) - fixes Unity/Steamworks.NET titles (e.g. Dead Cells) that call the flat API directly; also fixes a 32-bit stack bug in the old BGetDLCDataByIndex hook unlockall = true- unlock every DLC the game knows about without any ID list; the[dlc]section becomes optionaltools/update-dlc.py- auto-fetch DLC lists from the Steam Store API (no more hunting for DLC ids by hand)tools/setup.py- one-click installer: auto-detects native vs Proton games, installs creamlinux or SmokeAPI (hook/koaloader/proxy modes),--scan/--install/--uninstall,--dry-run- Web UI (
tools/gui.py) - local web app: games table, install/uninstall, ini editor, DLC updater with live log - Reliability fixes - cream.sh works from any working directory (#62),
MangoHud support (#51), preloads only the matching bitness (clean logs, #71),
CREAM_CONFIG_PATHaccepts a file or a directory - CI & quality - modern workflows (auto weekly sync of
cream_api.ini, automated releases), unit tests wired into ctest, code split into modules (src/), removed dead code
- Unlocks DLCs listed in
cream_api.inifor native Linux Steam games (no Proton/Wine support) - Supports modern Steam SDK interfaces: ISteamApps v008/v009, SteamUser v020-v023, SteamClient v017-v023
- Hooks the flat API (
SteamAPI_ISteamApps_*,SteamAPI_ISteamUser_*) used by Unity/Steamworks.NET titles cream_api.iniis auto-synced from upstream every week via CI
Creamlinux should work on most Steam games. It does not work with Proton or Wine - use SmokeAPI or other alternatives made specifically for Windows instead. The following games have been tested and definitely confirmed to work:
- Stellaris
- Hearts Of Iron IV
- Europa Universalis IV
- Crusader Kings II
- Crusader Kings III
- Victoria 3
- PAYDAY 2
The following games have been tested and do not currently work with creamlinux, feel free to try some of the alternatives listed at the bottom of this readme:
- Cities Skylines 2
- European Truck Simulator / American Truck Simulator
The easiest way of installing is using Tickbase's Application: https://github.com/Novattz/creamlinux-installer It automatically downloads and sets up creamlinux for Steam games that you choose, as well as fetching all DLC IDs for it. Keep in mind that you will still need the actual, up-to-date DLC files in the game. The install script and creamlinux do not automatically download any game content. You will have to run it again if new DLCs are released for a game.
Alternatively, use the bundled setup helper (Python 3, no dependencies):
python3 tools/setup.py --scan # list installed Steam games + unlocker status
python3 tools/setup.py --install 394360 # install unlocker for an installed game
python3 tools/setup.py --dir /path/to/game
It auto-detects the game type:
- native Linux game -> installs creamlinux (files are taken from your local build or the latest release) and prints the launch options
- Windows game in Proton -> installs SmokeAPI
(the Windows-side DLC unlocker) into the game folder plus the shared
cream_api.ini; no launch options needed --scanfinds every installed Steam game (any library folder), shows native/Proton type and whether an unlocker is already installed--smokeapi-mode hook|koaloader|proxypicks the Proton install method:hook(default, the DLL itself acts as proxy),koaloader(injector proxy that survives game updates) orproxy(replaces steam_api dll, most reliable but needs reinstall after updates)- add
--update-dlc <appid>to fetch a fresh DLC list first,--dry-runto preview
If the script does not work for you, you can install creamlinux manually. Beware that you will have to manually update cream_api.ini to contain the DLC IDs for the games that you choose.
- You will need the actual, up-to-date DLC files in the game. Creamlinux does not auto-download anything
- Download the latest release of Creamlinux
- Unzip it and copy the files to the game's directory
- Set the game's steam launch params to
sh ./cream.sh %command% - Launch the game and have fun!
The list of "supported" DLCs is stored in cream_api.ini. If you want to test creamlinux on a new game or a new DLC has just come out, you can add more entries here manually.
Set unlockall = true in the [config] section of cream_api.ini and every DLC
the game knows about is treated as installed - the [dlc] list is not needed
(though it is still useful when you want to control exactly which DLCs show up).
Set logging = false in [config] to silence creamlinux log output (it logs
to stderr by default).
Instead of hunting for DLC ids by hand, use the bundled helper:
python3 tools/update-dlc.py 394360 --output package/cream_api.ini
It queries the Steam Store API for the game's DLC list, fetches the names and
merges them into the [dlc] section - existing entries and comments are kept.
Use --dry-run to preview the diff first, --refresh-names to update names
of already-known ids, and pass several appids to process multiple games.
If that doesn't work, please check the Troubleshooting section below.
For a graphical interface, run:
python3 tools/gui.py
It starts a local web app at http://127.0.0.1:8765 and opens your browser
(no domain, no internet needed - everything runs on your machine). The UI
shows every installed Steam game with its type and unlocker status and lets
you install/remove unlockers, switch SmokeAPI modes, edit cream_api.ini
(unlockall, logging, DLC list) and refresh DLC lists from the Steam Store
with a live log.
- Ensure you have all build dependencies installed:
- On Ubuntu:
build-essentialgcc-multilibg++-multilibcmakegit - On Arch:
base-develmultilib-develcmakegit
- Clone the project:
git clone https://github.com/gongarn/creamlinux
- Build the project:
sh ./build.sh
- Copy
outputfolder contents to the game folder - Set the game's steam launch params to
sh ./cream.sh %command%
Alternatively, if you have Docker installed, you can just run docker compose up
This is normal. The DLCs should still work.
Use the mangohud launch prefix: sh ./cream.sh mangohud %command%. The script detects it and sets
MANGOHUD=1 / MANGOHUD_DLSYM=1 so both preloads coexist (previously they clashed: only one
of the two would take effect).
Steam may launch the game from a different working directory, so relative paths fail.
cream.sh now switches to its own directory automatically; make sure the script and the
.so files are in the game's root directory (not a subfolder).
- Have you made sure to download the latest version of the DLC files? Sometimes unrelated patches or updates to the game will modify some DLC files, and creamlinux is currently somewhat sensitive to outdated files.
- Do you have Steam installed from a flatpak? Creamlinux doesn't play nicely with it, please try a native version if possible
- Games on a recent Steamworks SDK (e.g. Crusader Kings III, recent Paradox titles) need the modern interface support (SteamApps v009, SteamUser v023, SteamClient v023) included in this fork. If your game still shows no DLCs, make sure you are not running an old release.
- Unity/Steamworks.NET titles (e.g. Dead Cells) call the flat API - supported since this fork.
Are you sure that the creamlinux files are at the game's root directory and not in a subfolder?
Try setting the executable flag of the cream.sh script (it should be set already, but just in case):
chmod +x cream.sh
Creamlinux is specifically made for native Linux games. If you are using a compatibility layer, use alternatives made specifically for Windows (e.g. SmokeAPI, regular CreamAPI or whatever). AutoCreamAPI has worked well for some people, keep in mind that you need to install .NetCore3 on your Wine/Proton instance first.
Please collect a log using the instructions below as well as an overview of the game's directory using ls -lh; ls -lh */, then post an issue describing your situation here.
If using a KDE environment, set your game launch options to this:
konsole --hold -e sh ./cream.sh %command%
Or if you are using Gnome environment, you can set your launch options to this:
gnome-terminal -- sh -c "./cream.sh %command%; exec bash"
If using neither, install konsole and follow the KDE step.
Then launch the game (skip any launchers like the Paradox launcher if possible, they interfere with the logging). Wait for the game to load, close it, then copy and paste the contents of the terminal.
If you want to load cream_api.ini from a specific path, specify the path with CREAM_CONFIG_PATH in the launch options. Both a path to the ini file and a directory containing cream_api.ini are accepted, e.g.:
CREAM_CONFIG_PATH=/home/user/creamlinux-config sh ./cream.sh %command%
If creamlinux doesn't work for your game, there are a couple of known alternatives for Linux. I provide no guarantees for their legitimacy and functionality, but some people seem to be happy with them.
- StellarKey
- CreamAPI (Windows, MacOS, Linux)
- AutoCreamAPI for Proton (.NetCore3 required)
The many contributors who submitted bugfixes, tested games and updated the list of DLC IDs :)
Novattz for creamlinux-installer
Rosentti for originally creating and maintaining this project
Valve for steamworks
goddeysfreya for hookey

