Version 5.0.0 — modular engine, CreamAPI v5.3.0.0, complete DLC unlock, multiplayer supported
🌍 Languages: English | Русский | Deutsch | Français | Español | 中文
For educational purposes only. Use at your own risk.
- You must own a legitimate copy of Victoria 3 on Steam. This tool does not download any DLC — it only flips ownership state for DLC content that is already present in your game files.
- Using a DLC unlocker violates the Steam Subscriber Agreement and Paradox's EULA. In principle this can lead to a VAC / account ban or suspension. Victoria 3 has no VAC-secured servers, so the practical risk is low, but it is not zero — you accept it yourself.
- The authors are not responsible for any consequences. If you enjoy the game, please buy the DLC and support Paradox Interactive.
A DLC unlocker for Victoria 3 on macOS. It uses CreamAPI v5.3.0.0 to unlock DLC ownership for a game you legitimately own on Steam.
The tool installs CreamAPI's libsteam_api.dylib (a drop-in proxy in front of
the real Steam library) into the game's
binaries/victoria3.app/Contents/Frameworks/, backs up the original as
libsteam_api_o.dylib, and writes a cream_api.ini. At launch the game asks
Steam which DLC you own; CreamAPI answers "yes" for each unlocked DLC while
still proxying everything else to the real Steam, so multiplayer keeps
working.
At install time the unlocker enumerates the game's own game/dlc/*.dlc
metadata and writes an explicit [dlc] list (unlockall = false). Building
the list from the content you already have is complete and works offline
after the first launch, and never depends on Steam's runtime DLC list. The
list is rebuilt on every install, so adding new DLC content and re-running the
installer keeps it current. If no DLC metadata is found, it falls back to
unlockall = true (Steam resolves the list online).
- ✅ Multiplayer supported (CreamAPI proxies to the real Steam)
- ✅ Complete DLC unlock — explicit list built from your own
game/dlc/content (offline-safe), rebuilt on every install - ✅ Automatic detection of the Victoria 3 install (internal disk and external drives)
- ✅ Safe backup of the original library; clean, reversible uninstall
- ✅ Non-mutating
statuscommand to check what's installed - ✅ Integrity-checked, universal binary (Intel and Apple Silicon slices)
Victoria 3 itself only ships a Metal-capable macOS build. The unlocker runs wherever the game runs:
| Platform | Status |
|---|---|
| Apple Silicon (M1–M4), macOS 11+ | ✅ Supported (game runs native arm64) |
| Intel Mac with a discrete AMD GPU | |
| Intel Mac with Intel integrated GPU | ❌ Not supported by Victoria 3 (Paradox requirement) |
The shipped libsteam_api.dylib is a universal (fat) binary containing both
x86_64 and arm64 slices, so the unlocker itself never forces Rosetta 2. The
platform limitation above is Victoria 3's, not the unlocker's.
- A Mac that meets Victoria 3's macOS requirements (Apple Silicon recommended)
- Victoria 3, legitimately purchased on Steam
- The DLC content files (must already be present — this tool does not download them)
- Xcode Command Line Tools recommended (
xcode-select --install) forcodesign/xattr
TL;DR — three commands, then launch the game:
git clone https://github.com/KyLaEga/Victoria3-DLC-Unlocker-macOS.git
cd Victoria3-DLC-Unlocker-macOS
./install_dlc_unlocker.sh-
Make sure the DLC content is in place first. Your game's
game/dlc/folder must already contain the DLC packs (this tool unlocks ownership, it does not download content). See Where do I get the DLC content files? below if it's empty. -
Clone or download this repository:
git clone https://github.com/KyLaEga/Victoria3-DLC-Unlocker-macOS.git cd Victoria3-DLC-Unlocker-macOS -
Run the installer:
./install_dlc_unlocker.sh
This is a thin wrapper around
./bin/unlocker install vic3. The tool verifies the shipped library, auto-detects your Victoria 3 install (internal disk and external drives), backs up the original aslibsteam_api_o.dylib, installs CreamAPI, builds the explicit DLC list from yourgame/dlc/content, and ad-hoc re-signs the result for macOS Gatekeeper.If your game lives somewhere unusual, point the tool at it directly:
./bin/unlocker install vic3 --path "/Volumes/My Drive/SteamLibrary/steamapps/common/Victoria 3" -
Launch Victoria 3 through Steam. With the explicit
[dlc]list this works offline too. Important: if the game or the Paradox launcher was already open, fully quit it (⌘Q) and relaunch — CreamAPI readscream_api.inionly once at process start.
Check the patch state without changing anything:
./bin/unlocker status vic3You want to see:
[+] Patch state: INSTALLED (CreamAPI active)
[+] Original backup: PRESENT (...libsteam_api_o.dylib)
[+] cream_api.ini: PRESENT
[*] unlockall = false; explicit [dlc] list (N DLC)
Then open the DLC tab in the Paradox launcher — every DLC whose content is present should now be owned (no "Buy" buttons, no warning icons).
The single entrypoint is bin/unlocker; the two *_dlc_unlocker.sh scripts are
thin convenience wrappers for the default game.
./bin/unlocker install [vic3] # back up original + apply CreamAPI patch
./bin/unlocker uninstall [vic3] # restore the original library
./bin/unlocker status [vic3] # non-mutating: show patch / backup / integrity
./bin/unlocker --help
./bin/unlocker --version
Options (after the command):
--yes Non-interactive; assume "yes" to confirmations.
--path DIR Use this game directory instead of auto-detecting.
Check state without changing anything:
./bin/unlocker status vic3- Integrity gate — refuses to run unless the shipped
libsteam_api.dylibmatches the committed SHA256 (tamper/corruption guard). - Locate the game — expands the search paths from
games/vic3.conf(handles spaces and external/Volumes/*drives); or uses--path. Victoria 3 keeps its macOS binary underbinaries/victoria3.app. - Back up the original library as
libsteam_api_o.dylib(never overwrites an existing good backup). - Install CreamAPI — copies the proxy dylib over
libsteam_api.dyliband re-checks the copy's hash before re-signing. - Build
cream_api.ini— scansgame/dlc/*/*.dlc, collects eachsteam_id, de-duplicates, and writes an explicit[dlc]list withunlockall = false. - macOS hardening — strips the quarantine attribute (
xattr) and ad-hoc re-signs the dylib (codesign -s -) so Gatekeeper loads it inside the game.
uninstall reverses steps 3–4 (restore the backup, delete cream_api.ini,
re-sign). status reports all of the above and changes nothing.
./uninstall_dlc_unlocker.sh
# or: ./bin/unlocker uninstall vic3This restores libsteam_api.dylib from the backup, removes cream_api.ini,
re-signs the original, and cleans up any legacy artifacts.
Running Steam's "Verify Integrity of Game Files" silently restores the original library and removes the patch — that is expected. Re-run the installer to re-apply, or
statusto confirm the current state.
The DLC content files are missing. The unlocker only changes ownership
state — the actual content must be present in the game's game/dlc/ folder.
📖 Full step-by-step guide (transferring
game/dlc/, joining split archives, troubleshooting): docs/DLC-CONTENT.md.
This tool does not distribute or download DLC — you bring your own. Paradox
DLC content is cross-platform, so the usual route is to copy the game/dlc/
folder from a machine where you already have it (e.g. a Windows or Linux
install you own) into your Mac install at:
.../steamapps/common/Victoria 3/game/dlc/
Each DLC lives in its own subfolder containing a .dlc metadata file and the
content archive. After copying, run the installer (or re-run it) so the [dlc]
list is rebuilt from the new content.
Got the content as a multi-part archive (*.zip.001, *.zip.002, …)?
Those parts are one archive split into chunks — not separate zips. Join and
extract them on macOS like this (you don't extract each part separately):
# 7-Zip handles the LZMA compression Paradox packs often use, and reads all
# parts automatically when you point it at the first one:
brew install sevenzip
7zz x "DLC-….zip.001" -o"/path/to/Victoria 3" # writes the game/dlc/ tree
# Alternatively, concatenate the parts back into one file first (order matters):
cat DLC-….zip.00{1,2,3,4} > DLC-….zip
7zz x DLC-….zip -o"/path/to/Victoria 3"Point -o at the game folder (the parent of game/) — the archive already
contains the right subpath, so extracting there merges it into place.
That's correct, nothing is missing. Paradox often bundles several content packs
(an expansion + its content/music pack) under a single Steam purchase
(appid). The unlocker grants ownership per Steam appid, so the number it
reports is the count of distinct appids — the launcher then shows every pack
those appids unlock. status reports the number of appids in your current
config.
Expected — Steam replaced our library with the original. Run
./bin/unlocker status vic3 to confirm, then re-run the installer.
macOS Gatekeeper may be blocking the modified library. The installer already strips the quarantine attribute and ad-hoc re-signs the dylib, but if you copied files manually:
xattr -dr com.apple.quarantine "/path/to/Victoria 3/binaries/victoria3.app"
codesign --force -s - "/path/to/Victoria 3/binaries/victoria3.app/Contents/Frameworks/libsteam_api.dylib"Install the Command Line Tools first if codesign/xattr are missing:
xcode-select --install. Still stuck? Run the uninstaller and try again.
The shipped libsteam_api.dylib is byte-identical to the official CreamAPI
nonlog macOS build and scores 0/64 on VirusTotal. You can re-verify the
checksum yourself — see docs/SECURITY.md and
vendor/creamapi/VERSION.txt. (Note: the binary
embeds an upstream build path in its install name; that is harmless and is what
the tool actually uses to detect an installed patch.)
Every DLC whose content is present in your game/dlc/ folder. The installer
reads each .dlc file, collects its Steam appid, and writes the full set into
cream_api.ini's [dlc] section — expansions, immersion packs, content packs
and music alike (Voice of the People, Sphere of Influence, Colossus of the
South, Pivot of Empire, Charters of Commerce, National Awakening, Iberian
Twilight, The Great Wave, …). Added new DLC content? Re-run the installer and
the list is rebuilt. status vic3 prints how many appids the current config
covers.
The engine is game-agnostic. Adding e.g. CK3 or EU4 needs only a new
games/<game>.conf (appid + bundle name + search paths) — no code change. Only
Victoria 3 ships today; see docs/CONTRIBUTING.md.
The macOS unlocker has used three different unlock strategies. If you ran an older version (this project began life as an EU4 unlocker), this is what changed and why:
| Versions | Strategy | Multiplayer | Notes |
|---|---|---|---|
| 1.x – 2.x | Goldberg Steam Emulator | ❌ | Fully emulates Steam offline and replaces libsteam_api.dylib; used a steam_settings/ folder and steam_appid.txt. Single-player only — you couldn't invite friends or join sessions. |
| 3.0 | CreamAPI + unlockall = true |
✅ | Switched to a CreamAPI proxy that forwards to the real Steam, so multiplayer works again. DLC came from Steam's runtime list. |
| 4.0+ | CreamAPI + explicit [dlc] list |
✅ | The installer builds the full list from your own dlc/ content, so it's complete and works offline. |
| 5.0 | Retargeted to Victoria 3 | ✅ | Same engine and strategy, now pointed at Victoria 3 (binaries/victoria3.app, game/dlc/, appid 529340). |
uninstall still removes the old Goldberg artifacts (steam_settings/,
steam_appid.txt, *.backup) if you're upgrading from a 1.x–2.x install.
The installer refuses to run if the shipped dylib's SHA256 does not match
vendor/creamapi/VERSION.txt (tamper/corruption guard), and CI re-verifies it
on every push. See docs/SECURITY.md.
- CreamAPI — the DLC unlocker library
Licensed under the MIT License — see LICENSE.
If this helped you: ⭐ star the repo, 🐛 report issues, 💡 suggest improvements. And if you enjoy Victoria 3 and its DLC, please buy them to support Paradox Interactive.