Free, open-source game launcher toolkit for Apple Silicon Macs. Set up Battle.net, Steam, Epic and GOG with separate Wine environments, Mac launch shortcuts and documented compatibility.
11
stars
35
commits
Shell
primary language
Sep 10, 2026
updated
Wine → Whisky → Kegworks… and now a Korean round: Soju 🍶
The launchers actually log in. Battle.net, Steam and the Epic Games Launcher on Apple Silicon — no black login window, no "Signing in…" that never ends, no CrossOver license. A fully free, open-source Wine stack.
If you got here from a Whisky/Kegworks thread titled "Battle.net crashes on login", "Steam won't open" or "launcher shows a blank window": those are the exact walls this repo documents and fixes (CEF renderer int3 on PAGE_WRITECOPY, CEF GPU process dying on init, Steam's webhelper) — see docs/DIAGNOSIS.md.
Built from CodeWeavers' published GPL sources (Wine 11.0, CrossOver 26.3 source drop), compiled and assembled by scripts in this repo. No paid software required.
Status (2026-08): Working end-to-end — Battle.net login, Agent, and D2R in-game rendering (D3DMetal); Epic Games Launcher login (tray icon in the menu bar); Steam client login + D3D11 games. Verified on an M4 Pro running macOS 26.5.
Community Wine builds (Whisky, Kegworks-era engines) stopped working with modern Battle.net and D2R. The commercial option works, but the underlying Wine engine is GPL — so we built it ourselves and documented every wall we hit. Three of those walls had never been publicly solved:
ROSETTA_ADVERTISE_AVX=1 — D2R's loader requires AVX instructions. Without this env var, the game freezes forever at ~86 MB RSS with 0% CPU, before any graphics init. This is why D2R "hangs at launch" on non-CrossOver Wine builds.
D3DMetal symlink layout — Apple's Game Porting Toolkit libraries must live in lib/external/ with lib/wine/x86_64-unix/{d3d10,d3d11,d3d12,dxgi}.so as symlinks into it. Copying the files instead breaks @loader_path resolution and D3DMetal dies in an assertion loop.
Battle.net Agent caller-signature fix — the Agent verifies the signature of the connecting client using a relative filename resolved against its CWD (a versioned subfolder). Seeding a copy of the signed Battle.net.exe into each Battle.net.NNNNN subfolder makes verification pass (fixes error BLZBNTBNA00000005).
Plus one trap: never put Apple platform binaries (nohup, arch, …) in the launch chain — macOS strips DYLD_* variables when exec'ing them.
Guides: D2R on Apple Silicon · Windows Steam client · Whisky alternatives
curl -fsSL https://raw.githubusercontent.com/BCD1210/soju/main/install.sh | bash
Or via Homebrew:
brew install BCD1210/soju/soju
soju install # then: soju battlenet / soju d2r / soju epic / soju steam
Downloads the prebuilt engine (~350 MB), walks you through Apple's free GPTK download (the one file Apple forbids redistributing), auto-installs Battle.net with Blizzard's official installer, and drops a Battle.net.app in ~/Applications. Log in and play.
The only thing you download outside this repo's scripts is Apple's free Game Porting Toolkit (one file, needs a free Apple ID) — Apple forbids redistributing it.
# 1. Get the scripts
git clone https://github.com/BCD1210/soju.git && cd soju
# 2. Fetch runtime components (x86_64 dylibs + wine-mono, all from free GPL releases)
scripts/get-components.sh
# 3. Build the engine from GPL sources (30-60 min)
scripts/build-engine.sh
# 4. Install Apple GPTK payload (download the GPTK dmg from
# https://developer.apple.com/games/game-porting-toolkit/ , mount it, then:)
scripts/get-gptk.sh
# (if you happen to have CrossOver installed, the script auto-extracts from it instead)
# 5. Create a bottle + install Battle.net (official Blizzard installer, fully automatic)
scripts/create-bottle.sh
# 6. Play
scripts/play.sh battlenet # launcher -> log in -> install & play your game
scripts/play.sh d2r # direct game launch (offline)
scripts/play.sh kill # stop everything
Already have a CrossOver bottle with games installed? scripts/setup-bottle.sh clones it (28 GB game re-download avoided).
Same engine, own bottle, no extra tricks: Epic's CEF keeps its GPU process alive on this build, so the launcher runs with its stock command line. Verified 2026-08-29: unattended install from the official MSI (~30 s), launcher UI, login.
scripts/create-epic-bottle.sh # official Epic MSI, unattended
scripts/play.sh epic # log in -> install & play
scripts/play.sh epic-kill # stop the Epic bottle (closing the window keeps the launcher running; right-click the Epic icon in the macOS menu bar to reopen or Exit — same as the Windows tray; a plain left click does nothing, as Epic only reacts to the menu)
Games have not been broadly tested yet; anything that needs kernel anti-cheat (EAC/BattlEye) will not run under Wine.
D2R shipped on Steam in Feb 2026 as the Infernal Edition. Steam support uses a different free engine: the modern Steam client's CEF UI does not render on CrossOver-source builds (black window — cross-process swapchain + CEF sandbox issues), but it works on Homebrew's wine-stable 11 with a tiny steamwebhelper wrapper that forces --disable-gpu --single-process. That fix comes from notpop/steam-on-m1-wine (MIT — wrapper source vendored in third_party/). Steam gets its own bottle so the two stacks never interfere:
scripts/create-steam-bottle.sh # installs wine-stable + wrapper + official Valve installer
scripts/play.sh steam # log in -> install & play
scripts/play.sh steam-kill # stop the Steam bottle (closing the window keeps Steam running; click the Dock icon to bring it back, Steam > Exit quits)
Verified on M4 Pro / macOS 26.5: login, library, and an actual D3D11 (Unity) game rendering in-game via a DXMT fork — see docs/STEAM-GAMES.md for the full wiring (scripts/setup-steam-games.sh). Notes: switch your macOS input source to English (ABC) when typing in Steam (IME composition shows as ? otherwise).
Prerequisites: Apple Silicon Mac, Rosetta 2, Xcode Command Line Tools, Homebrew, your own Battle.net account/games, and a free Apple ID for the GPTK download. Nothing from Apple, Blizzard, or CodeWeavers is redistributed by this repo.
libd3dshared.dylib (inside GPTK) is not just graphics: D2R's loader requires its non-native code region registration to get through Rosetta 2 — without it the game freezes at launch even with AVX advertised. Graphics itself can run on pure open-source vkd3d/MoltenVK if D3DMetal is absent.
get-components.sh then re-run build-engine.sh.ROSETTA_ADVERTISE_AVX=1 or libd3dshared not reaching the game. Launch via play.sh only, and check step 4.nohup/arch/another Apple-signed binary, which strips DYLD_* vars. Launch via play.sh.play.sh seeds the signed exe automatically; make sure you launch through it.Every bottle start also spawns idle Windows service processes (services.exe, winedevice.exe, plugplay.exe, rpcss.exe, explorer.exe /desktop, ~100 MB per set). If a bottle's wineserver is killed abruptly (a crash, an aborted run), those services never notice and linger. scripts/soju-sweep.sh removes them, and play.sh kill / epic-kill / steam-kill and the reaper call it automatically — but only when no wineserver is running at all, so a live game or launcher is never touched.
scripts/build-engine.sh — full engine build recipe (freetype cross-build, gnutls wiring, GPTK layout, entitlements)scripts/setup-bottle.sh / scripts/play.sh — bottle creation and the verified launch environmentdocs/DIAGNOSIS.md — deep-dive on the CEF renderer crash and the Agent signature failuredocs/D2R-GAME-LAUNCH.md — the D2R loader investigation, dead ends includedresearch/ — raw log evidence for the findingsmedia.codeweavers.com/pub/crossover/source/35 commits
Shell
100.0%
Free, open-source game launcher toolkit for Apple Silicon Macs. Set up Battle.net, Steam, Epic and GOG with separate Wine environments, Mac launch shortcuts and documented compatibility.
11
stars
35
commits
Shell
primary language
Sep 10, 2026
updated
Wine → Whisky → Kegworks… and now a Korean round: Soju 🍶
The launchers actually log in. Battle.net, Steam and the Epic Games Launcher on Apple Silicon — no black login window, no "Signing in…" that never ends, no CrossOver license. A fully free, open-source Wine stack.
If you got here from a Whisky/Kegworks thread titled "Battle.net crashes on login", "Steam won't open" or "launcher shows a blank window": those are the exact walls this repo documents and fixes (CEF renderer int3 on PAGE_WRITECOPY, CEF GPU process dying on init, Steam's webhelper) — see docs/DIAGNOSIS.md.
Built from CodeWeavers' published GPL sources (Wine 11.0, CrossOver 26.3 source drop), compiled and assembled by scripts in this repo. No paid software required.
Status (2026-08): Working end-to-end — Battle.net login, Agent, and D2R in-game rendering (D3DMetal); Epic Games Launcher login (tray icon in the menu bar); Steam client login + D3D11 games. Verified on an M4 Pro running macOS 26.5.
Community Wine builds (Whisky, Kegworks-era engines) stopped working with modern Battle.net and D2R. The commercial option works, but the underlying Wine engine is GPL — so we built it ourselves and documented every wall we hit. Three of those walls had never been publicly solved:
ROSETTA_ADVERTISE_AVX=1 — D2R's loader requires AVX instructions. Without this env var, the game freezes forever at ~86 MB RSS with 0% CPU, before any graphics init. This is why D2R "hangs at launch" on non-CrossOver Wine builds.
D3DMetal symlink layout — Apple's Game Porting Toolkit libraries must live in lib/external/ with lib/wine/x86_64-unix/{d3d10,d3d11,d3d12,dxgi}.so as symlinks into it. Copying the files instead breaks @loader_path resolution and D3DMetal dies in an assertion loop.
Battle.net Agent caller-signature fix — the Agent verifies the signature of the connecting client using a relative filename resolved against its CWD (a versioned subfolder). Seeding a copy of the signed Battle.net.exe into each Battle.net.NNNNN subfolder makes verification pass (fixes error BLZBNTBNA00000005).
Plus one trap: never put Apple platform binaries (nohup, arch, …) in the launch chain — macOS strips DYLD_* variables when exec'ing them.
Guides: D2R on Apple Silicon · Windows Steam client · Whisky alternatives
curl -fsSL https://raw.githubusercontent.com/BCD1210/soju/main/install.sh | bash
Or via Homebrew:
brew install BCD1210/soju/soju
soju install # then: soju battlenet / soju d2r / soju epic / soju steam
Downloads the prebuilt engine (~350 MB), walks you through Apple's free GPTK download (the one file Apple forbids redistributing), auto-installs Battle.net with Blizzard's official installer, and drops a Battle.net.app in ~/Applications. Log in and play.
The only thing you download outside this repo's scripts is Apple's free Game Porting Toolkit (one file, needs a free Apple ID) — Apple forbids redistributing it.
# 1. Get the scripts
git clone https://github.com/BCD1210/soju.git && cd soju
# 2. Fetch runtime components (x86_64 dylibs + wine-mono, all from free GPL releases)
scripts/get-components.sh
# 3. Build the engine from GPL sources (30-60 min)
scripts/build-engine.sh
# 4. Install Apple GPTK payload (download the GPTK dmg from
# https://developer.apple.com/games/game-porting-toolkit/ , mount it, then:)
scripts/get-gptk.sh
# (if you happen to have CrossOver installed, the script auto-extracts from it instead)
# 5. Create a bottle + install Battle.net (official Blizzard installer, fully automatic)
scripts/create-bottle.sh
# 6. Play
scripts/play.sh battlenet # launcher -> log in -> install & play your game
scripts/play.sh d2r # direct game launch (offline)
scripts/play.sh kill # stop everything
Already have a CrossOver bottle with games installed? scripts/setup-bottle.sh clones it (28 GB game re-download avoided).
Same engine, own bottle, no extra tricks: Epic's CEF keeps its GPU process alive on this build, so the launcher runs with its stock command line. Verified 2026-08-29: unattended install from the official MSI (~30 s), launcher UI, login.
scripts/create-epic-bottle.sh # official Epic MSI, unattended
scripts/play.sh epic # log in -> install & play
scripts/play.sh epic-kill # stop the Epic bottle (closing the window keeps the launcher running; right-click the Epic icon in the macOS menu bar to reopen or Exit — same as the Windows tray; a plain left click does nothing, as Epic only reacts to the menu)
Games have not been broadly tested yet; anything that needs kernel anti-cheat (EAC/BattlEye) will not run under Wine.
D2R shipped on Steam in Feb 2026 as the Infernal Edition. Steam support uses a different free engine: the modern Steam client's CEF UI does not render on CrossOver-source builds (black window — cross-process swapchain + CEF sandbox issues), but it works on Homebrew's wine-stable 11 with a tiny steamwebhelper wrapper that forces --disable-gpu --single-process. That fix comes from notpop/steam-on-m1-wine (MIT — wrapper source vendored in third_party/). Steam gets its own bottle so the two stacks never interfere:
scripts/create-steam-bottle.sh # installs wine-stable + wrapper + official Valve installer
scripts/play.sh steam # log in -> install & play
scripts/play.sh steam-kill # stop the Steam bottle (closing the window keeps Steam running; click the Dock icon to bring it back, Steam > Exit quits)
Verified on M4 Pro / macOS 26.5: login, library, and an actual D3D11 (Unity) game rendering in-game via a DXMT fork — see docs/STEAM-GAMES.md for the full wiring (scripts/setup-steam-games.sh). Notes: switch your macOS input source to English (ABC) when typing in Steam (IME composition shows as ? otherwise).
Prerequisites: Apple Silicon Mac, Rosetta 2, Xcode Command Line Tools, Homebrew, your own Battle.net account/games, and a free Apple ID for the GPTK download. Nothing from Apple, Blizzard, or CodeWeavers is redistributed by this repo.
libd3dshared.dylib (inside GPTK) is not just graphics: D2R's loader requires its non-native code region registration to get through Rosetta 2 — without it the game freezes at launch even with AVX advertised. Graphics itself can run on pure open-source vkd3d/MoltenVK if D3DMetal is absent.
get-components.sh then re-run build-engine.sh.ROSETTA_ADVERTISE_AVX=1 or libd3dshared not reaching the game. Launch via play.sh only, and check step 4.nohup/arch/another Apple-signed binary, which strips DYLD_* vars. Launch via play.sh.play.sh seeds the signed exe automatically; make sure you launch through it.Every bottle start also spawns idle Windows service processes (services.exe, winedevice.exe, plugplay.exe, rpcss.exe, explorer.exe /desktop, ~100 MB per set). If a bottle's wineserver is killed abruptly (a crash, an aborted run), those services never notice and linger. scripts/soju-sweep.sh removes them, and play.sh kill / epic-kill / steam-kill and the reaper call it automatically — but only when no wineserver is running at all, so a live game or launcher is never touched.
scripts/build-engine.sh — full engine build recipe (freetype cross-build, gnutls wiring, GPTK layout, entitlements)scripts/setup-bottle.sh / scripts/play.sh — bottle creation and the verified launch environmentdocs/DIAGNOSIS.md — deep-dive on the CEF renderer crash and the Agent signature failuredocs/D2R-GAME-LAUNCH.md — the D2R loader investigation, dead ends includedresearch/ — raw log evidence for the findingsmedia.codeweavers.com/pub/crossover/source/35 commits
Shell
100.0%