How to Install Mods on an Assetto Corsa Server
An Assetto Corsa server never hands mod cars or tracks to drivers. It keeps a thin slice of each mod and checks every driver’s copy against it. Here is exactly what goes on the server, what must match on every PC, and how to add mods, CSP weather and AI traffic without checksum kicks.
An Assetto Corsa server is not rendering cars, tracks, textures or sounds. It reads its config and compares checksums of the small files that hold car physics and track data.
CARS, TRACK, CONFIG_TRACK, MODEL and SKIN all point to folder names. A different capital letter or an old folder name is enough to break joins, especially on Linux.
When a mod updates, you must refresh the server’s data slice and every driver’s full install. Old server data with new client files produces checksum kicks.
Can’t compare checksum
usually means the server has a file the client does not. Checksum failed. Kicked from race
means the client has the file, but it is a different version.
How mods work on an Assetto Corsa server: the split
An Assetto Corsa server handles mods differently from a lot of other games. It does not send cars or tracks to drivers at join time. Instead, it keeps the small server-side files needed to identify the chosen content and to compare checksums, while each driver keeps the full install with models, textures and sounds. If you want the wider pattern behind that, our guide on how server mods and plugins work helps explain why Assetto Corsa feels unusual.
Here is the split for each part of a typical mod car or track: what the server holds, what drivers hold, and which files the server checks by default.
| Part of the mod | On the server | On every driver’s PC | Checksummed by default |
|---|---|---|---|
| Car data.acd | Yes | Yes | Yes |
| Old unpacked car data folder | Yes | Yes | No |
| Skin folders | Partly | Yes | No |
| Car and track .kn5 models, textures, sounds | No | Yes | No |
| Track data/surfaces.ini | Yes | Yes | Yes |
| models.ini or models_<layout>.ini | Yes | Yes | Yes |
| system/data/surfaces.ini | Yes | Yes | Yes |
The reason the server only needs data is simple: it is not drawing the car or track, so models and textures are wasted storage on the host. What it does care about is the set of files that define physical behaviour, surfaces and layout references, because those are the files used for checksum comparison. That is why uploading the whole mod works but is slow and fills storage for no real gain; a fully modded game install is many gigabytes.
Drivers still need the complete mod on their own PCs, with the same version and the same folder name the server expects. Official ks_ cars and Kunos tracks are already in every normal game install, but community content under a different folder name counts as missing. DLC ownership also still applies: if the chosen content depends on Kunos DLC, there is no server-side workaround for drivers who do not own it.
Before you start: know which server you are editing
There are three common setups:
- Kunos standard
acServer: ships with the game and readscfg/server_cfg.ini,cfg/entry_list.iniand thecontent/folder. - AssettoServer: reads the same INI files, then adds its own settings in
cfg/extra_cfg.ymlfor things like AI traffic and CSP weather. Some hosts treat it as a separate modded install type and switch you to file-based management. - ACSM: another community manager, mainly useful here because it exposes more checksum controls.
Whichever one you use, stop the server before editing INI files. The basics of server_cfg.ini, entry_list.ini, car whitelists, layouts and standard ports are covered in our guide to setting up an Assetto Corsa dedicated server.
Before you touch mods, take a copy of cfg/ and content/. If a track pack or preset import goes wrong, you want a clean revert rather than guessing which file changed. Our guide to game server backups covers a sensible routine.
Method 1: Content Manager Pack
This is the tidiest way to build the server-side slice of mod cars and tracks because Content Manager writes the same files the server already uses and only packs the content the server needs.
- Open the Server tab in Content Manager. If it is hidden, enable it in CM settings first.
- Create or open a preset, then choose the track and layout.
- In Entry list, add the cars you want and set capacity to match the number of entries.
- Check the layout’s pit limit shown under the capacity slider. Keep the entry list and
MAX_CLIENTSat or below that limit. - Save the preset, then click Pack. Choose Linux or Windows to match the server OS.
- On a rented server, leave Include executable and Pack into single exe-file unticked.
- Upload the ZIP and extract it at the server root so the packed
cfg/andcontent/merge into the existing folders.
The pack contains server_cfg.ini, entry_list.ini and the car/track data files needed for server checks. It does not upload the full visual side of the mod, which is exactly what you want.
Keep the car count within the pit limit under the capacity slider
Leave Include executable and Pack into single exe-file unticked
The common mistake is the subfolder trap. If extraction leaves you with something like my-pack/cfg/ and my-pack/content/ inside the server root, the game reads none of it and starts with the old setup. You should end up with the actual server folders updated in place, not with a new folder beside them.
Also watch for panel overwrites. Some hosts rewrite the server name, passwords, ports and lobby listing every time the server starts, so set those values in the host panel if that is how your service works. Treat the pack as content and race config, not as the final word on panel-managed settings.
The pit limit matters most on mod tracks, because their pit box counts vary a lot. If the entry list is longer than the layout supports, drivers’ games can crash when they join, or the server refuses to start. That is not a broken mod; it is the server trying to place more cars than the track has pit boxes.
Method 2: Upload the mod by hand
If you are not using Content Manager, you can still install mods manually. The important part is uploading the server-side files to the correct folders and then pointing server_cfg.ini and entry_list.ini at the exact folder names.
content/
cars/
<carfolder>/
data.acd
skins/
<skinfolder>/
tracks/
<trackfolder>/ (track with layouts)
models_<layout>.ini
<layout>/
data/
surfaces.ini
ai/
fast_lane.aip
<othertrack>/ (track without layouts)
models.ini
data/
surfaces.ini
ai/
fast_lane.aip
cfg/
server_cfg.ini
entry_list.ini CARS=<carfolder>;<anothercarfolder> TRACK=<trackfolder> CONFIG_TRACK=<layoutfolder> MAX_CLIENTS=<pit-box-limit-or-less>
[CAR_0] MODEL=<carfolder> SKIN=<skinfolder>
CARS is a semicolon-separated whitelist of car folder names. TRACK is the track folder, and CONFIG_TRACK is the layout subfolder when the track has layouts. In entry_list.ini, each slot needs its own [CAR_N] block with the matching MODEL and a skin folder name for SKIN.
Folder names must match what drivers have installed. A community car in content/cars/ex_gt3 on the server does not match a driver who has the same mod in content/cars/ex_gt3_v2. On Linux, the match must also be exact in capitalisation, which is one reason the differences in Linux vs Windows game servers matter more than they first appear.
Skins are the one softer edge here. The server needs the skin folder names because the entry list references them, but skins are cosmetic. If a driver does not have that exact skin, they usually see a default rather than being blocked from joining.
Checksums explained: what is checked, what is not, and why it matters
By default, the server checks the small files that affect how the session behaves, not the big files that draw the car or track. For cars, that means content/cars/<car>/data.acd. For tracks, it means system/data/surfaces.ini, the track’s surfaces.ini in either the base track or layout folder, and models.ini or models_<layout>.ini.
That default is sensible: these files are small, and they are the ones that matter most for fairness, because they hold the car’s physics data, the track’s surface definitions and which models make up the layout.
What is not checked by default
- Old unpacked car
datafolders: older mods may use these instead ofdata.acd, but they are not checksummed by default. - Car and track
.kn5files: these are optional checks in tools such as ACSM. - Skins: cosmetic only.
If you enable KN5 checks, every driver’s copy of those much larger model files has to match as well, and checking every car KN5 on a big car list can stop drivers joining at all. If you want extra protection on cars without the full cost of hashing every visual model, ACSM’s collider-only car KN5 mode is the sensible middle ground because it targets the collision side rather than every cosmetic asset. Checking all car KN5 files with many cars is the heavy option.
ACSM can also checksum arbitrary files in the Assetto Corsa root through Required Apps. That is useful for enforcing things like apps/python/sol_weather/sol_weather.py or dwrite.dll. If you leave the checksum blank, it only checks that the file exists. If you need an MD5 value for a manual check on Windows, CertUtil -hashfile yourFileName MD5 gives you one.
The two checksum errors mean different things
- “Can’t compare checksum”: the server has a file the client does not. Typical causes are a missing mod, wrong layout folder, or extra layout files on the server. This happens during loading and is not shown as a normal server-side kick.
- “Checksum failed. Kicked from race”: the client file exists but differs from the server’s version. The server log will show the file, for example a car
data.acd, then kick the player.
Read the server log before the join attempt. Assetto Corsa lists every file it asks the client to compare with lines such as Sending checksum request
and likely missing one of the following files
. That tells you what the server thinks is authoritative.
Do not “fix” join problems by deleting checksums unless you fully understand the trade-off. Removing checks means the server stops validating files that affect behaviour, which makes cheating easier. On AssettoServer, MissingCarChecksums: true by itself does not disable checksums; it only allows startup if some are missing. If a chosen car has no data.acd, AssettoServer can refuse to start with a missing car checksums error. If you deliberately remove all car checksum files, the log will show Initialized 0 car checksums
, but that is usually a last resort for oddball content, not a good default.
Getting mods to your drivers without manual guesswork
Since the Assetto Corsa server never sends content itself, you need a clean way to tell drivers what to install. At minimum, keep a content list with the exact car, track and version in use. Better still, expose download info in Content Manager so drivers can see what is missing before they join.
On AssettoServer, the full version of Content Manager can write a Share Mode Download URL in the preset’s Details tab and auto-fill Version Required. It creates cm_content/content.json, and you must enable EnableServerDetails: true in extra_cfg.yml. The important catch is that cm_content is not included by Pack, so copy that folder manually.
{"cars":{"car_name_here":{"url":"download url here","version":"version here"}},"track":{"url":"download url here","version":"version here"}} If you build content.json by hand, the version should match the version shown in the mod’s Author field in Content Manager’s content tab. If the mod has no version there, remove the version line instead of guessing one.
On the Kunos standard server, Content Manager download links need the community ac-server-wrapper running beside the server. It reads cm_wrapper_params.json from the preset folder and has its own port, separate from the normal Assetto Corsa ports. It also uses cm_content/content.json and can handle cars, skins, tracks and weather packages.
Use the links the mod authors provide unless you have explicit permission to re-upload their work. That keeps your server tidy as well: when the author updates the mod, you update one version reference instead of maintaining your own parallel download archive.
CSP, Sol and WeatherFX: the three edits that must agree
CSP-dependent servers fail in a more confusing way because the track path, the track files and the client CSP version all have to line up. This is the setup to double-check first.
content/tracks/csp/shuto_revival_project_beta/ TRACK=csp/2144/../shuto_revival_project_beta ; in the chosen layout's data/surfaces.ini [CSPFACE_0] ; cfg/extra_cfg.yml on AssettoServer EnableWeatherFx: true ; weather entry in server_cfg.ini [WEATHER_0] GRAPHICS=sol_03_scattered_clouds_type=17
For a minimum CSP version requirement, place the track under content/tracks/csp/<trackname> and point TRACK= to the CSP path form, such as csp/2144/../shuto_revival_project_beta. The version ID sets the minimum CSP build a driver needs: 2144, for example, means CSP 1.79 or newer. In the full version of Content Manager, the Require CSP to Join field writes this for you.
The easy mistake is editing too much in surfaces.ini. Rename only the first surface section from SURFACE_0 to CSPFACE_0. Changing any other surface section creates a checksum mismatch because the server is comparing that file by default.
CSP extra server rules live in cfg/csp_extra_options.ini. For example, ALLOW_WRONG_WAY = 1 belongs there. Some CSP features also rely on codes appended to SKIN= in the entry list: /ACA3 for teleport, /ABAH for colour change, and /ADAn for both.
On AssettoServer, EnableWeatherFx: true enables CSP weather, smooth transitions and rain support for compatible client versions. The weather line uses a WeatherFX type ID after _type=. Rain is not part of Sol or Pure by itself; it comes from paid preview versions of CSP.
AssettoServer also looks the track up in cfg/data_track_params.ini for its coordinates and time zone. A mod track that is not listed stops the server with a missing track params error. You can add a section for it yourself (the track folder name as the header, then LATITUDE, LONGITUDE and TIMEZONE) or set MissingTrackParams: true, but with WeatherFX on and no track params, time will not stay in sync between players and the server. ForceServerTrackParams makes drivers use the server’s values and needs CSP 0.1.79 or newer.
AI traffic on AssettoServer and updating mods without breaking joins
AI traffic tracks
AI traffic comes from AssettoServer, which is why some hosts sell it as a separate modded install. You need fast_lane.aip or fast_lane.ai in the track’s ai/ folder, either in the base track or the chosen layout. Content Manager Pack does not add this file, so upload it yourself if the traffic route is missing.
Then turn on EnableAi: true in extra_cfg.yml and set each traffic slot in entry_list.ini to AI=auto or AI=fixed. auto lets an AI car be replaced when a player takes the slot; fixed keeps it as AI.
AI traffic and big grids are what use the most CPU on an Assetto Corsa server, because every AI car is driven by the server itself. Memory is rarely the first limit: a 12-car race server idles under 0.1 GB, so a low RAM figure tells you nothing about whether the CPU can carry a traffic layout.
Updating a mod safely
- Stop the server.
- Update the mod in your own game files first, so your source files match what drivers are using.
- Re-pack with Content Manager or copy the new server-side files by hand.
- Upload the updated
data.acd, tracksurfaces.ini,modelsfiles, and any changed skin folders or AI files. - Update
content.jsondownload links and version info if you publish them. - Restart the server and tell drivers to update before they join.
The reason this order works is that the server’s checksum files must always represent the same release your drivers have installed. If the server still has an old data.acd while drivers have the new car, they will be kicked for checksum failure. If the mod author changed the folder name, the problem is even earlier: the server and driver now disagree on what the car or track is called.
For your own housekeeping, put the mod version in the ZIP or preset filename you upload. The server does not care about that name, but it stops you restoring the wrong pack later.
Troubleshooting: driver can’t join after adding a mod
Use the flow first, then match the exact symptom. The wording matters because each error points at a different stage in the join process.
| Symptom | Likely cause | First fix |
|---|---|---|
| Server stops at start and names a car or track folder | CARS, TRACK or CONFIG_TRACK points to a folder that does not exist | Check the folder name on disk and in the INI files, including layout name |
Missing car checksumson AssettoServer | A car on the list has no data.acd on the server: it was not uploaded, or it is an older mod with only an unpacked data folder | Upload the car’s data.acd from your own install; for a mod that has none, MissingCarChecksums: true lets the server start, and that car simply has no physics check |
Can’t compare checksumwhile loading | The server has a file the client lacks, such as the wrong layout data or extra files in the server track folder | Check the driver has the mod installed under the same folder name, then compare the server’s layout folders with theirs and remove stray layout files |
Checksum failed. Kicked from race | Client and server both have the file, but the versions differ | Re-upload the current server data files and make sure every driver updates to the same mod version |
| Works on a Windows test machine but fails on the Linux host | Case sensitivity: Ex_Hills and ex_hills are different on Linux | Make INI entries and folder names match exactly, including capitals |
| Clients crash on join with a big grid | The entry list is longer than the layout’s pit limit | Reduce MAX_CLIENTS and the number of [CAR_N] slots to the pit limit shown in Content Manager |
| CSP-required server rejects players | Wrong CSP path, wrong minimum version, or too many edits in surfaces.ini | Check the TRACK=csp/... line, the version ID, and that only SURFACE_0 became CSPFACE_0 |
| Download link is not offered in Content Manager | On AssettoServer, EnableServerDetails is off or cm_content was not copied; on Kunos server, wrapper is missing | Enable server details, upload cm_content/content.json, or run ac-server-wrapper with its own open port |
| Skins show as default | The client does not have that skin, or the skin folder name is wrong | Fix the SKIN= folder name if needed; otherwise treat it as cosmetic, not a join blocker |
| Time is out of sync with WeatherFX | Missing track params or incompatible CSP requirement for forced track params | Add the track to data_track_params.ini and check client CSP version if using forced server track params |
| AI traffic does not appear | fast_lane.aip/fast_lane.ai is missing, or EnableAi is off | Upload the AI spline to the correct ai/ folder and enable AI in extra_cfg.yml |
When the plan, not the mod, is the problem
| If you need… | What the server is short on | What to change |
|---|---|---|
| AI traffic on busy freeroam layouts | CPU headroom | Move to a plan with more CPU and an AssettoServer install type |
| A large rotation of mod cars and tracks | Storage space and direct file access | Choose a plan with enough storage and proper file or FTP access instead of a locked-down panel |
| CSP weather, download links and custom config files | Access to extra_cfg.yml, cm_content and related folders | Use a modded install type or a service that lets you manage files directly |
| Stable control over ports, passwords and lobby options | Panel settings overwriting packed config files | Set those values in the panel; read how game server control panels work before you pick a host that locks files you need |
| Advanced checksum policy | Standard tooling is too basic for your content mix | Use ACSM or another setup that exposes KN5 and required-file checksum controls |
If you are at the point where file access, install type or CPU behaviour is limiting what you can run, it is worth checking our Assetto Corsa server hosting comparison and filtering out services that only suit stock races.
Look for direct file access, support for AssettoServer or other modded install types, and enough CPU headroom for traffic or large grids. Those matter far more than a polished panel when you are managing checksums and custom content.
Compare the best Assetto Corsa server hostsAssetto Corsa server FAQ
Do I need to upload the whole mod to my Assetto Corsa server?
No. For normal server operation, the server only needs the small data slice used for config and checksum checks, such as car data.acd and track surfaces.ini/models files. Uploading the whole mod is usually just extra transfer time and storage use.
Why do drivers get “checksum failed” on my Assetto Corsa server?
That message means the driver has the same file path as the server, but the file contents are different. The usual causes are an old server data.acd, a client on a newer or edited mod version, or a changed track data file after a CSP tweak. Re-upload the current server data and make sure all drivers are on the same release.
Does the Assetto Corsa server send mod cars and tracks to players?
No. Assetto Corsa does not distribute cars and tracks from the server to joining drivers. Drivers must already have the full content installed locally, although Content Manager can show download information if you configure it.
Can I use mods without Content Manager?
Yes. Content Manager is convenient, especially for packing server data, but the server itself still reads the same server_cfg.ini, entry_list.ini and content/ folders. You can upload the required files by hand and edit the INI files directly.
Do skins have to match between the server and drivers?
Not in the same strict way as car and track data. The server needs valid skin folder names so the entry list can reference them, but skins are cosmetic and are not checked by default. If a driver lacks that skin, they normally see a default skin rather than being blocked from joining.
More Assetto Corsa server help
Set up the server itself, or compare hosts that give you the file access mods need.
Game updates, mod revisions and host panels change over time. If your host’s current panel workflow differs from the file-based steps here, follow the host’s live control panel for panel-managed settings and use these checks to keep the content in sync.