Vanilla acServer does not know what a championship is. It runs the sessions you configure, loops them if you ask, and writes one JSON results file per session - standings, points and who is booked into which car are somebody else's problem. That somebody is usually Assetto Corsa Server Manager (ACSM), a free web front end that builds server_cfg.ini and entry_list.ini for each event, launches acServer itself, collects the results and turns them into a points table with classes, teams, sign-ups and penalties. If you would rather not run another program, the same league can be run from the two config files and a spreadsheet, and this guide covers both: the Server Manager way, and the settings underneath it that you need to understand either way.
If you have not set up the base server yet, start with the Assetto Corsa server guide, which goes through server_cfg.ini, sessions, ports and mod content key by key. This post assumes that works and moves on to running the same field of drivers week after week.
What vanilla acServer gives a league, and what it does not#
Everything a league needs from the game itself is already there; it is just not joined up.
- Results. At the end of every session
acServerwrites a JSON file into itsresultsfolder, named with the date, time and session type - something like2026_10_7_20_45_RACE.json. It holds every car, every lap, best laps, total times and the contact events the server saw. - Fixed slots.
entry_list.iniwith aGUIDper entry andLOCKED_ENTRY_LIST=1gives each driver their own car, skin and grid slot. - Balance tools.
BALLASTandRESTRICTORper entry, withMAX_BALLAST_KGinserver_cfg.inias the ceiling. - Race formats. Practice, qualifying and race sessions in sequence, plus a reversed-grid second race and a mandatory pit window, all set in the config.
What it does not have is memory. Nothing carries over from one race night to the next: no points, no success ballast, no record that a driver was penalised last week. Every championship tool, ACSM included, is a layer that reads the results files, keeps state between events and writes new config files before the next one. Knowing that makes troubleshooting much easier, because almost every league problem is one of those three steps going wrong.
Assetto Corsa Server Manager in brief#
ACSM is a single Go binary with a browser interface, originally built by Emperor Servers and published as open source on GitHub. The original repository is now archived and read-only, so you are running finished software rather than something that will change under you. That is mostly a comfort for a game that has not moved in years, but it does mean bugs will not be fixed upstream and forks are where any new work happens.
The pieces you configure live in config.yml next to the binary:
steam: install_path: assetto executable_path: acServerhttp: hostname: 0.0.0.0:8772 session_key: generate-a-long-random-string server_manager_base_URL: https://league.example.comstore: type: boltdb path: server_manager.dbaccounts: admin_password_override:server: audit_logging: true performance_mode: false persist_mid_session_results: false| Setting | What it does |
|---|---|
http.hostname | Address and port of the web interface. 8772 is the shipped default |
http.session_key | Encrypts login sessions. Set your own random value |
server_manager_base_URL | Used for links in championship messages and sign-ups |
store.type | boltdb keeps everything in one file; json writes one file per event |
store.path | Where that data lives. This is the file to back up |
admin_password_override | Emergency reset of the admin password |
audit_logging | Records which user started, stopped or deleted what |
performance_mode | Turns live timing off to save CPU |
The first login is the user admin with the password servermanager, and you are made to change it immediately. If you lose it later, put a temporary value in admin_password_override, restart, log in with it and set a new one. Create separate accounts for each steward rather than sharing the admin login; the audit log is only useful if names in it mean something.
Where it runs matters. ACSM launches and stops acServer itself, so it wants to be the thing in charge of the process. That fits a machine you control - your own box or a dedicated server - where you open 9600 TCP and UDP, 8081 TCP and the web port. On a game panel the panel is the process manager, so the practical pattern there is the file-based workflow described below: the panel runs acServer, and you replace the two config files between events.
Building a championship: classes, points and events#
A championship in ACSM is a list of classes, a list of entrants and a list of events. Each event is a track, a layout, a session sequence and a start time; when you start an event, ACSM writes the config for that event, launches the server and attaches the results to the championship when the sessions finish.
Classes
A class is a set of cars plus its own points table. Single-make series need one class. A multi-class endurance grid - GT3 and GT4 sharing the track - needs one class per category, each scored separately, which is the only fair way to score a field where the slower class can never win overall.
Points
The default table is the Formula 1 one, and every field is editable per class:
| Field | Default | What it awards |
|---|---|---|
| Places | 25, 18, 15, 12, 10, 8, 6, 4, 2, 1 | Points by finishing position in class |
| Best lap | 0 | Bonus for the fastest lap of the race |
| Pole position | 0 | Bonus for topping qualifying |
| Collision with driver | 0 | Points deducted per car-to-car contact |
| Collision with environment | 0 | Points deducted per wall contact |
| Cut track | 0 | Points deducted per counted cut |
| Second race multiplier | 1 | Scales points for a reversed-grid second race |
The collision and cut deductions are tempting and usually a mistake. The server counts every touch, including the one where somebody else punted you, so automatic deductions punish victims as readily as culprits. Leave them at zero and handle incidents with stewarding. A small best-lap bonus is fine; a large one rewards drivers who pit for fresh tyres in the last two laps instead of racing.
Ties are broken by countback - the driver with more wins ranks higher, then more second places, and so on - which is the convention most leagues use anyway. Publish it in your rules so nobody is surprised in the last round.
Events
Add events in calendar order and give each one the full session sequence: practice, qualifying, race, and a second race if you run them. You can copy an event and change only the track, which keeps session lengths and assists consistent across a season. Change one thing at a time between seasons, not between rounds.
Entry lists for a league#
The entry list is where a league either feels organised or does not. You have three ways to fill it.
A fixed list. You add every driver yourself with their SteamID64 as the GUID, their car, skin and team. With a locked entry list, nobody else can take their slot and they always spawn in the same car. This is the most work and the least trouble.
Open entrants. The championship accepts whoever joins and adds them to the entrant list automatically. With the persist option on, the car and skin a driver first joins with become theirs for the season. This suits a public "Thursday night" series with a changing field; it does not suit a league with a waiting list.
A sign-up form. ACSM can publish a registration page where drivers enter their name, Steam GUID, team and preferred car and skin, optionally with custom questions and reCAPTCHA protection configured in the championships section of config.yml. Requests can be accepted automatically or approved by hand. Approved drivers land in the entrant list with their GUID filled in, which removes the most error-prone step - copying seventeen-digit numbers out of Discord messages.
Whichever you use, the rules from the base server still apply underneath:
- The number of entries, and
MAX_CLIENTS, must not exceed the track's pit boxes. A 32-car grid does not fit on a 24-box track, and the failure looks like a broken session rather than a clear error. - Every
MODELmust be in the event's car list and everySKINmust exist in that car'sskinsfolder on the server, or the server falls back or refuses the entry. - Drivers need the same version of every mod car and track. Publish the content list with download links before round one - Assetto Corsa content, Content Manager and mod tracks covers packaging it so people actually install it.
Ballast and restrictor
Two ways to use them. Fixed balance is a per-entry value set for the season - a rookie class or a handicapped veteran. Success ballast changes per round: the championship leader carries 30 kg, second 20 kg, and so on. Vanilla acServer has no idea who is leading, so success ballast means editing the entry list before each round, which ACSM's per-event entrant editing makes quick. Keep MAX_BALLAST_KG above the largest value you will use, or the server clamps it silently.
Restrictor is a percentage power cut and feels different from ballast: ballast hurts braking and cornering, restrictor hurts straights. For balancing different cars, use restrictor; for slowing a driver who is simply faster, ballast is less punishing on tracks with long straights.
Race formats: reversed grids, pit windows and race weekends#
Most league formats are a handful of keys in server_cfg.ini, which ACSM exposes as form fields:
[SERVER]LOCKED_ENTRY_LIST=1PICKUP_MODE_ENABLED=0MAX_BALLAST_KG=100REVERSED_GRID_RACE_POSITIONS=8RACE_PIT_WINDOW_START=10RACE_PIT_WINDOW_END=20RACE_EXTRA_LAP=0QUALIFY_MAX_WAIT_PERC=120[RACE]NAME=RaceLAPS=25WAIT_TIME=90IS_OPEN=0| Key | What it does |
|---|---|
REVERSED_GRID_RACE_POSITIONS | 0 no second race; N runs a second race with the top N reversed; -1 reverses the whole field |
RACE_PIT_WINDOW_START / _END | The lap (or minute, in a timed race) range in which the mandatory stop must be made |
RACE_EXTRA_LAP | 1 adds a lap after the timer runs out in a timed race |
QUALIFY_MAX_WAIT_PERC | How long the server waits for drivers on a lap when qualifying ends, as a percentage of the best lap |
IS_OPEN | 0 closes the race to late joiners; 1 lets them in; 2 lets them in until 20 seconds before the start |
The reversed grid is the classic two-race format: a sprint from qualifying order, then a second race with the top eight reversed. Pair it with a Second race multiplier below 1 - 0.5 is common - so the lottery race does not decide the title.
A pit window turns a sprint into a strategy race and is the closest vanilla gets to a mandatory stop. A driver who does not stop inside the window is penalised at the end. Explain it in the pre-race briefing; somebody always forgets.
ACSM also has race weekends: a chain of sessions that can be run at different times - qualifying on Wednesday, races on Thursday - where each session's grid is built from the results of an earlier one, with filters such as reversing or splitting the field. It is the feature to reach for when your grid is bigger than the pit boxes and you need a qualifying split into two races, or when people cannot commit to one long evening.
Running race night#
A routine that keeps the evening calm:
- Before the night. Confirm the content list is final, the entry list matches the approved drivers and the event's track layout is right. Start the event an hour early with practice open so problems surface before the grid forms.
- Thirty minutes before. Post the server name, password and a reminder of the content versions. Most failed joins are checksum errors from somebody's out-of-date mod.
- During qualifying. Watch live timing for drivers who have not set a time. Somebody missing at this point is usually stuck on a join error, not late.
- During the race. One steward watches, nobody else touches the controls. Admin chat commands -
/adminwith the admin password, then/kick,/next_session,/restart_session- are for emergencies, not for adjusting results. - After the race. Let the results file write. Do not stop the server the instant the leader crosses the line: the results are written when the session ends, after
RACE_OVER_TIME.
That last point catches organisers constantly. A server stopped mid-session writes nothing for that session. ACSM's experimental persist_mid_session_results option tries to protect against this by forcing a session change before stopping, but the safer habit is to let sessions end on their own.
Results, penalties and appeals#
The results JSON is the source of truth. ACSM imports it into the championship automatically when the event ends, and you can also import a results file manually - which is how you recover a race that was run outside the championship by mistake, or on a different server.
Penalties are applied in the results view as time added or positions dropped, and points are recalculated from that. Set the stewarding process before the season starts:
- A deadline for protests, such as 24 hours after the race, with a replay timestamp required.
- A small panel, not one person, and not anyone involved in the incident.
- A fixed penalty scale - five seconds for a minor avoidable contact, a drive-through equivalent for a serious one - so decisions are consistent rather than personal.
Keep a copy of every raw results file even after penalties are applied. If a decision is overturned, you want the original to recalculate from rather than a chain of edits. Server rules, moderation and staff covers the human side of this in more depth, and game server events and tournaments has the wider playbook for running organised nights.
The file-based alternative
Without ACSM, a league is three folders and a routine. Keep one pair of server_cfg.ini and entry_list.ini per round, named for the round, and copy the right pair into cfg/ before the night. After the race, take the JSON from results, enter the finishing order into a spreadsheet with your points table and countback rule, apply penalties there, and update the next round's entry list with any success ballast. It is more manual and entirely workable for a twelve-car league, and it has one real advantage: every round's config and every result is a plain file you can read in ten years.
This is also how a league runs on a panel-managed server. On RE:NODE you edit both files in the browser editor or upload a round's pair over SFTP, download the results folder from the file manager, and restart the server from the console. A Schedules entry can restart the server into the next session sequence at a fixed time, and backups can be taken on demand right before race night. If you do want ACSM's web interface, that is a job for a machine you run the processes on yourself.
Backups and keeping a season safe#
What is irreplaceable in a league is small, and that is exactly why people forget to copy it:
server_manager.db(or the JSON store folder) - every championship, entrant, event and result in ACSM.config.yml, including the session key; losing it logs everybody out but loses no data.- The
resultsfolder fromacServer, which is your fallback if the database is ever damaged. - Your content list with exact versions and links.
Back these up after every round, not weekly. A season is one file that changes once a week, which makes it the easiest thing in the world to protect and the most painful to rebuild from memory. Backups that actually restore explains why one test restore before the season starts is worth more than any number of untested copies.
Troubleshooting#
The event started but the championship shows no results. The session was stopped before it ended, so no results file was written. Check the results folder; if a file exists, import it manually.
A driver is in the championship twice. They joined once with a different Steam account, or open entrants added them before you did. Merge by keeping one GUID and deleting the duplicate before the next round, because points do not follow a name.
Drivers are kicked as soon as they join. Locked entry list with a GUID that does not match, a skin that does not exist, or a checksum error. The server log names which.
The grid is shorter than the entry list. MAX_CLIENTS or the track's pit boxes are lower than your entrant count. Use a race weekend with split qualifying.
The second race never starts. REVERSED_GRID_RACE_POSITIONS is 0, or the race has no laps left to run after RACE_OVER_TIME. Check the value in the generated server_cfg.ini, not in the form.
The web interface is unreachable. The web port is not open, or hostname is bound to localhost. Game server ports explained covers testing one port at a time; reading the console is about finding the line in the log that says which address it bound to.
FAQ#
Is Assetto Corsa Server Manager still maintained?
The original open-source repository is archived and read-only. The software still works, because Assetto Corsa's server has not changed in years, but fixes and new features only appear in community forks.
Can I run a championship without Server Manager?
Yes. Keep a pair of config files per round, read the JSON results files after each race and score them in a spreadsheet. It is slower per round and much simpler to host, which suits small leagues on a panel-managed server.
How do I stop strangers taking league slots?
Put each driver's SteamID64 in the GUID field of their entry and set LOCKED_ENTRY_LIST=1. Add a join password as well, so the server does not fill with people who are then kicked.
What is the second race multiplier for?
It scales points for a reversed-grid second race. A value of 0.5 gives half points, which keeps the reversed race meaningful without letting a lucky result outweigh a full feature race.
Should I deduct points automatically for collisions?
Usually not. The server counts every contact regardless of fault, so automatic deductions punish the driver who was hit as well as the one who hit them. Stewarding with replays is fairer.
Where are race results stored?
In the results folder of the server, one JSON file per session. Server Manager imports them into its own database, but the raw files are worth keeping as a backup and an audit trail.




Comments
Completely anonymous: no account, no email, no cookie. We store the name you type, the text and the time - nothing else. Links are limited and markup is not rendered.