Skip to content

KyLaEga/Victoria3-DLC-Unlocker-macOS

Repository files navigation

Victoria 3 DLC Unlocker for macOS

Version 5.0.0 — modular engine, CreamAPI v5.3.0.0, complete DLC unlock, multiplayer supported

License: MIT Platform Game ShellCheck

🌍 Languages: English | Русский | Deutsch | Français | Español | 中文


⚠️ Disclaimer & legal warning

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.

📖 Description

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.

How it works

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).

Features

  • 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 status command to check what's installed
  • ✅ Integrity-checked, universal binary (Intel and Apple Silicon slices)

📋 Requirements

Supported platforms

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 ⚠️ May work; not officially supported by the game
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.

Prerequisites

  • 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) for codesign/xattr

🚀 Installation

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

Step by step

  1. 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.

  2. Clone or download this repository:

    git clone https://github.com/KyLaEga/Victoria3-DLC-Unlocker-macOS.git
    cd Victoria3-DLC-Unlocker-macOS
  3. 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 as libsteam_api_o.dylib, installs CreamAPI, builds the explicit DLC list from your game/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"
  4. 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 reads cream_api.ini only once at process start.

Verify it worked

Check the patch state without changing anything:

./bin/unlocker status vic3

You 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).


🛠️ Usage (unlocker CLI)

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

What install does under the hood

  1. Integrity gate — refuses to run unless the shipped libsteam_api.dylib matches the committed SHA256 (tamper/corruption guard).
  2. 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 under binaries/victoria3.app.
  3. Back up the original library as libsteam_api_o.dylib (never overwrites an existing good backup).
  4. Install CreamAPI — copies the proxy dylib over libsteam_api.dylib and re-checks the copy's hash before re-signing.
  5. Build cream_api.ini — scans game/dlc/*/*.dlc, collects each steam_id, de-duplicates, and writes an explicit [dlc] list with unlockall = false.
  6. 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.


🗑️ Uninstallation

./uninstall_dlc_unlocker.sh
# or: ./bin/unlocker uninstall vic3

This 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 status to confirm the current state.


❓ FAQ

DLCs show warning icons in the launcher

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.

Where do I get the DLC content files?

📖 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.

Why does status show fewer DLC than I expect?

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.

Steam "Verify Integrity of Game Files" reverted my patch

Expected — Steam replaced our library with the original. Run ./bin/unlocker status vic3 to confirm, then re-run the installer.

The game won't launch

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.

Is the bundled library safe?

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.)

Which DLCs are unlocked?

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.

Can I unlock another Paradox game?

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.


📜 Unlock strategy history

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.


🔐 Security & integrity

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.

🙏 Credits

📜 License

Licensed under the MIT License — see LICENSE.

⭐ Support

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.

About

DLC Unlocker for Victoria 3 on macOS

Topics

Resources

Contributing

Security policy

Stars

Watchers

Forks

Releases

Packages

Contributors

Languages