The Windows Steam client on Apple Silicon
Yes, the actual Windows Steam client (not just macOS Steam) runs on M-series Macs for free, including D3D11 games rendering in-game. Verified on an M4 Pro / macOS 26 with the August 2026 Steam client.
The quick version
brew install BCD1210/soju/soju
soju steam-install # wine-stable + wrapper + Steam
soju steam # log in and play
soju steam-games # optional: wire DXMT so D3D11 games render
Why Steam black-screens on most Wine setups
The modern Steam client is basically a Chromium (CEF) app. Two separate things break it on macOS Wine:
- The CEF GPU process crash-loops under Wine's sandbox (0xC0000005), leaving a black window.
- Cross-process presentation isn't supported by the Metal translation layers (DXMT #141), so even when the client runs, its composer can't show helper-rendered frames.
The fix (from notpop's
steam-on-m1-wine, MIT) is a tiny wrapper around steamwebhelper.exe
that forces --disable-gpu --single-process, plus launching Steam with
-no-cef-sandbox -cef-single-process. Soju builds and redeploys the
wrapper automatically. Steam updates keep restoring the original, so this must
happen on every launch.
Making games actually render (DXMT)
The Steam client and games have opposite needs in the same Wine prefix:
the client needs vanilla wined3d (it restart-loops on DXMT), while D3D11 games
need DXMT (D3D11→Metal). Soju's
steam-games step wires both:
- DXMT installed as 64-bit Wine builtins (as natives they can't attach their Metal unixlib)
- A
winemetal.dllplaceholder insystem32(without it, by-name lookup fails withc0000135. Unity's "Failed to initialize graphics") - Marker-stripped vanilla d3d DLLs served to the Steam client per-app via the registry (a 1-byte patch defeats Wine's fake-DLL redirect)
- A rebuilt
winemac.soexporting macdrv symbols so DXMT can present, plus aWINE_NO_DOCK_ICONpatch for a single Dock icon
The full story (ten hard-won facts, each one a wall we hit) is in docs/STEAM-GAMES.md.
Practical notes
| Issue | Fix |
|---|---|
| Black window on launch | A crashed session leaves a SingletonLock; soju steam cleans it automatically. If launching manually, delete it from htmlcache. |
| Steam shows a "not responding" dialog while updating | Normal on first run. Let it finish. |
| Typed text appears as ?? | Switch macOS input to English (ABC). |
| Game forces fullscreen | Steam tags games with a fullscreen AppCompat flag; soju steam-games scrubs it. Unity titles also accept -screen-fullscreen 0. |