A working, confirmed recipe for running Assetto Corsa with Custom Shaders Patch (CSP) 0.2.x, Pure weather, ReShade, force-feedback wheels, and online multiplayer with WeatherFX on Linux via Steam Proton.
TL;DR — the one thing nobody tells you: use GE-Proton9-20 (Wine 9.0), not GE-Proton10 / Wine 10+. Wine 10 added a memory protection (W^X) that silently breaks CSP's patcher. Everything else here falls into place once the patcher actually runs.
CSP works by patching functions inside acs.exe at runtime. To do that it has to write into executable memory.
Wine 10.0+ added W^X memory protection (set_page_vprot_exec_write_protect) that blocks writing to pages marked executable. CSP's patcher hits this wall and silently fails — you get "Failed to initialize" every single launch, on every CSP version, no matter what else you change.
Wine 9.0 doesn't enforce it. On GE-Proton9-20, CSP patches all 2373 functions cleanly and reports "CSP Available." This is the root cause behind the vast majority of "CSP won't load on Linux" reports — it's the Proton version, not your config.
| OS | Ubuntu 24.04.4 LTS (Noble) |
| Kernel | 6.11.0-29-generic |
| CPU | Intel Core i7-6700K @ 4.0 GHz (2015) |
| RAM | 32 GB |
| GPU | NVIDIA GTX 1080 8 GB — driver 580.159.03 (2016) |
| Proton | GE-Proton9-20 (Wine 9.0 Staging) |
| AC / CSP / Pure | 1.16.4 / 0.2.12-preview1 (build 3467) / 2.57 |
Not a bleeding-edge machine — a 2015 CPU and 2016 GPU. If it runs here, it'll run on most modern Linux gaming setups.
Install it with ProtonUp-Qt (or drop it in ~/.steam/steam/compatibilitytools.d/).
In Steam → Assetto Corsa → Properties → Compatibility → Force GE-Proton9-20 — or set it via the launch script below.
⚠️ Do not use GE-Proton10 / any Wine 10 build. That's the W^X wall.
This bypasses Content Manager for launching, kills any stale wineserver, sets HideWineExports=Y (which makes Wine hide wine_get_version — so CSP's GetProcAddress returns NULL and CSP thinks it's on native Windows, keeping its Wine-specific code paths off), and launches AC. Edit the flagged lines for your hardware.
#!/bin/bash
export STEAM_COMPAT_CLIENT_INSTALL_PATH="$HOME/.steam/debian-installation"
export STEAM_COMPAT_DATA_PATH="$HOME/.steam/steam/steamapps/compatdata/244210"
export WINEPREFIX="$STEAM_COMPAT_DATA_PATH/pfx"
# NVIDIA Prime — laptop / hybrid (multi-GPU) only. DELETE on a single-GPU desktop.
export __NV_PRIME_RENDER_OFFLOAD=1
export __GLX_VENDOR_LIBRARY_NAME=nvidia
# dwrite=n,b is what LOADS CSP (native CSP dwrite.dll before Wine's builtin).
# msvcp120/msvcr120=n,b avoids crashes from Wine's MSVC runtime missing symbols.
export WINEDLLOVERRIDES="dwrite=n,b;msvcp120=n,b;msvcr120=n,b"
# Your wheel's VID/PID. Moza R5 shown — swap for yours, or remove if no wheel.
# Without this the wheel shows up as a generic gamepad and FFB won't initialize.
export SDL_JOYSTICK_WHEEL_DEVICES=0x346e/0x0004
GE="$HOME/.steam/steam/compatibilitytools.d/GE-Proton9-20"
AC="$HOME/.steam/steam/steamapps/common/assettocorsa"
# kill stale wineserver; HideWineExports=Y hides wine_get_version so CSP can't
# detect Wine and treats this as native Windows
"$GE/files/bin/wineserver" -k 2>/dev/null ; sleep 1
WINEFSYNC=1 "$GE/files/bin/wine64" reg add "HKCU\\Software\\Wine" \
/v HideWineExports /t REG_SZ /d "Y" /f 2>/dev/null
exec "$GE/proton" run "$AC/AssettoCorsa_original.exe"Save as launch-ac.sh, chmod +x launch-ac.sh, run it. (Also in this repo as launch-ac.sh.)
Install Content Manager first, then CSP 0.2.12-preview1 (from CM → Settings → Custom Shaders Patch), then Pure 2.57 last. Run CM in its own isolated prefix — see Content Manager (separate prefix). Sources are in Tools & sources below.
Run Content Manager in its own throwaway Wine prefix (e.g.
~/.wine-cm) for mod management only — don't use it to launch online sessions, and keep it out of the Proton prefix.
CSP's zip extraction resets these settings on every install/update, so re-run this script each time or you'll chase the same issues forever.
#!/bin/bash
# post-csp-install.sh
AC="$HOME/.steam/steam/steamapps/common/assettocorsa"
EXT="$AC/extension/config"
# WeatherFX ON — required for Pure, and many online servers require it
sed -i 's/^ENABLED=0/ENABLED=1/' "$EXT/weather_fx.ini"
# DXGI flip model OFF — DXVK's vtable differs from native DXGI; CSP's hook crashes with it on
sed -i '/^\[BASIC\]/,/^\[/ s/^ENABLED=1/ENABLED=0/' "$EXT/dxgi_tweaks.ini"
# Remove [NAMES_WINE] — stale Wine symbol overrides break CSP init
python3 - "$EXT/data_alt_mapping.ini" <<'PY'
import re, sys
p = sys.argv[1]
open(p, "w").write(re.sub(r"\n\[NAMES_WINE\].*", "", open(p).read(), flags=re.DOTALL))
PY
# Delete stale memory-layout cache — forces a clean rebuild
rm -f "$AC/cache/memory_layout.bin"
echo "post-CSP fixes applied."(Also in this repo as post-csp-install.sh.)
Still getting "Failed to patch" /
INIReader::cache … index=-1on Wine 9? That's a second, config-caused failure (separate from the Wine-10 W^X one). Fix it in CM → Settings → Custom Shaders Patch → General Patch Settings → Optimizations → uncheck "Cache AC memory layout" and "Cache AC data to speed up loading." CM silently re-enables both on every CSP update — re-check them each time. (rm memory_layout.binabove clears the stale cache; unchecking the boxes stops it coming back.)
In system/cfg/assetto_corsa.ini set THREADS=0, then make it read-only so Content Manager can't reset it:
chmod 444 ~/.steam/steam/steamapps/common/assettocorsa/system/cfg/assetto_corsa.ini
THREADS=1crashes the physics thread under Wine after ~67 seconds, every time.THREADS=0(physics on the main thread) fixes it.
Also set UPDATE_HZ=50 in cfg/network.ini for smoother online.
| Wheel (example) | Moza R5 — VID 0x346e / PID 0x0004 |
| SDL fix | SDL_JOYSTICK_WHEEL_DEVICES=0x346e/0x0004 in the launch script — without it the wheel registers as a generic gamepad and FFB won't initialize |
| Steering lock | LOCK=900 in controls.ini (R5 max is 1080°; 900° gives full authority in most cars) |
| FFB filter | FILTER_FF=0.15 (the default 0.99 kills all road/kerb detail) · FFB gain 1.0 |
Find your wheel's VID/PID with lsusb.
Once CSP loads, launch AC with the script and go Drive → Online → Direct Connect → your server's IP and game port (default 9600).
Don't use Content Manager's server browser on Linux — it crashes under Wine 9 (an IOCP socket bug). Direct Connect (or add-server-by-IP) avoids it.
Content Manager is only needed for mod management (installing CSP, Pure, cars, tracks). Run it in a separate Wine prefix (~/.wine-cm) so its .NET / Mono / Steam-bridge files never end up in the Proton prefix the game runs in — a polluted game prefix is a common, hard-to-debug cause of CSP/Proton issues.
First-time setup (once):
WINEPREFIX="$HOME/.wine-cm" winecfg # create the prefix
WINEPREFIX="$HOME/.wine-cm" winetricks -q dotnet48 corefonts # CM needs .NET 4.8Then launch CM with launch-content-manager.sh — it sets WINEPREFIX="$HOME/.wine-cm" and runs Content Manager Safe.exe (hardware acceleration off, which dodges Wine's renderer crashes).
The two prefixes share nothing except the read-only game folder (
…/common/assettocorsa/) — and that's correct: it's the actual game content (cars/tracks/CSP), not a Wine prefix. Don't launch online sessions from CM — uselaunch-ac.sh.
ReShade works — leave d3d11.dll in place. Old guides that say "remove ReShade before using CSP" are wrong. Those crashes came from CSP being in a failed / partial patcher state (Wine 10 W^X), not from ReShade itself. With CSP patched cleanly on Wine 9, the D3D11 hook chain is complete end-to-end and ReShade attaches on top of it with no conflict.
- CSP app shelf icons invisible when you press Home — the debug console shows instead. Cosmetic Wine IMGUI issue, doesn't affect gameplay or weather.
- Content Manager server browser crashes under Wine 9 (IOCP socket bug) — use Direct Connect.
- "Safe mode?" prompt on first load after a crash — cosmetic, CSP still loads fully.
- Tracks with animated video billboards crash on load (e.g. Shutoko Revival Project's ad screens). CSP plays those
.mp4clips through Windows Media Foundation, which crashes winegstreamer under Wine. Fix: rename or delete the ad-screen.mp4files in that track's folder (search the track dir for*.mp4). Same root cause as any in-game audio/video that uses CSP's media player — if a CSP app or track tries to play a video/audio file and the game hard-crashes on Linux, this is why. - Install AC on ext4/btrfs — NOT NTFS. Assetto Corsa on an NTFS partition (common if you keep games on a shared Windows drive) crashes on load. Move the install to a native Linux filesystem.
- Turn off CSP's "Car Instruments" and "Music" modules (CM → CSP → those modules → disable). Both use Windows Media Foundation → unstable under winegstreamer; disabling them removes a whole class of random crashes/freezes (same family as the video-billboard crash).
- Custom CSP sounds: use OGG Vorbis, not WAV/MP3. Any soundboard/mod audio played through CSP's media player freezes winegstreamer if it's WAV or MP3; OGG decodes natively. (Authoring a CSP app that plays sound? Gate it behind
ui.MediaPlayer.supportedAsync()so it no-ops on Linux instead of crashing.) - Remove
--disable-gpufrom your Steam launch options if it's there — a stray Chromium flag that breaks AC's rendering. - "Steam init failed" in Content Manager — launch CM elevated/as administrator in its prefix; it's a Steam-bridge admin-rights mismatch, not a missing dependency.
If you run an AssettoServer and want CSP clients to get WeatherFX/Pure online, set these in extra_cfg.yml:
EnableClientMessages: true
EnableWeatherFx: trueWithout EnableWeatherFx, a CSP+Pure client crashes on join with "server requires active WeatherFX." Note that enabling EnableClientMessages makes the server CSP-only (non-CSP clients get kicked).
Everything here is from its original home — nothing is rehosted:
| Tool | Where to get it |
|---|---|
| Assetto Corsa | Steam (app 244210) |
| Content Manager | acstuff.club (x4fab) |
| Custom Shaders Patch (CSP) | acstuff.club/patch (x4fab) — or from inside CM |
| Pure (weather/PP) | Overtake.gg — search "Pure" (Peter Boese); free + Patreon versions |
| ReShade | reshade.me |
| GE-Proton | github.com/GloriousEggroll/proton-ge-custom |
| ProtonUp-Qt (installs GE-Proton) | github.com/DavidoTek/ProtonUp-Qt |
| AssettoServer (for admins) | github.com/compujuckel/AssettoServer |
Found a fix for your distro / GPU / wheel? PRs welcome — that's the point of putting this on GitHub.
Thanks to x4fab (CSP, Content Manager), Peter Boese (Pure), GloriousEggroll (GE-Proton), and the AssettoServer + AC-on-Linux communities for the tools and the collective debugging that made this recipe possible.
MIT — copy, fork, adapt freely.