The blue truck that just cut you off has a name.
Roadfolk reads the actual traffic around you in Euro Truck Simulator 2 and turns it into people. The lorry that overtook you on the left is a Croatian driver called Marko with patchy English and a short temper. He might call you on the CB about it. He might not.
In development. The traffic reader has not been run against the real game yet. See Status before you expect it to work.
What actually happens
Ej, pazi malo! Vidiš da sam tu?
Sorry mate, didn't see you.
Is okay. You go Koper too? Big queue today.
Marko answered in Croatian first because his English is poor and the simulation knows it. When you answered in English he switched, and his reply is short and missing an article, because that is what a 0.42 English speaker sounds like. A Croatian text-to-speech voice reads it, so the accent is real rather than spelled out phonetically.
Four hundred kilometres later a Croatian truck passes you near Graz. There is a chance it is Marko again. If it is, he remembers the overtake, and he is one step further along his story than last time.
Most of the time, nothing happens
A mod where every incident triggers AI chatter becomes unbearable within ten minutes. Roadfolk enforces silence: a global cooldown, a per-driver cooldown, a personality roll, and a hard ceiling of six unprompted lines per ten minutes. The default preset averages under 15 lines an hour on a busy motorway, and a test fails the build if that number creeps up.
How it works
The simulation decides the facts. The language model only writes the words.
Ask a model to "invent an interesting trucker" and you get a different disposable person every time. Hand it a driver who exists, an overtake that happened, and a grudge from last Tuesday, and you get somebody the player recognises.
ETS2LA plugin
Reads up to 40 nearby vehicles from the game's internal structures: position, speed, bounding box, trailers.
Tracker
Keeps one vehicle as one track across frames, including the dropouts ETS2 produces when it re-sorts its traffic array.
Event detector
24 event types from geometry alone. No randomness, no model calls, fully tested offline.
World engine
Decides who exists, what they are like, what they remember, and whether anybody speaks at all.
Wingman AI
Microphone, speech recognition, model routing, text to speech, playback. Roadfolk does not reimplement any of it.
What the detector sees
-
CUT_INThey moved into your lane 12 m ahead and you lifted off. -
TAILGATINGSomebody has sat 14 m off your bumper for 40 seconds. -
NEAR_MISSBodywork clearance dropped under a metre at 90 km/h. -
CONVOY_FOLLOWYou have run together for six minutes. -
TRAFFIC_JAMFive vehicles around you, nobody above 10 km/h. -
BORDER_CROSSEDSI to AT.
Who else is out there
- The radio. 30 invented stations, one to three per country, each in the right language. Cross a border and the new station identifies itself. Traffic bulletins are built only from incidents the simulation actually observed.
- Police. Three speeding events in fifteen minutes earns a stop, and the officer says so. Routine checks only happen while you are already parked.
- Customs. Stop within 6 km of a border crossing and somebody wants your documents. Once per crossing.
- Hitchhikers. A student, a stranded driver, a backpacker a long way from home. They have a real destination and get out when you reach it.
- Your dispatcher. Knows the cargo, the deadline and the damage report before you mention any of them.
Who you meet
Most drivers are generated from where you are. In rural Slovenia you mostly meet Slovenians, then Austrians and Croatians, then the Polish and Lithuanian plates that run half the continent. A passenger car 400 km from its home country is rare, and the model is told so.
Roughly one truck in six is written by hand: a route, a specific lorry, a reason to be on this road, and an arc that advances one step every time you talk. Gerhard from Villach takes four conversations to mention the transformer he moved over the Brenner with a police escort. Barry from Swansea finishes a story two meetings after he starts it.
Beats are stored in SQLite, not in the model's context. Continuity survives a restart, and a chatty player cannot rush somebody through their whole story in one afternoon.
When people talk
Not at 90 km/h, mostly. The best conversation in the game happens at a red light: you are stopped, you have nothing to do, and the light ends the conversation for you. Roadfolk reads the actual traffic lights, including how many seconds are left on them, so nobody starts something the light will cut off, and each junction speaks once.
The same goes for a lay-by. Roadfolk reads the parked vehicles around you, so the lorry beside you at midnight is really there and really is a lorry. Twenty seconds after you stop, somebody in it might say something. Pull up and get talked at instantly and you know it was scripted, so it waits.
- 109
- places on the map
- 66
- written characters
- 273
- story beats
- 239
- conversation topics
- 105
- easter eggs
- 357
- tests, all offline
What it costs to run
Each line of dialogue is a small request: under 2,500 input tokens and usually under 80 output tokens. On Cloudflare Workers AI that is roughly half a cent per hour of play, and the free daily allowance covers normal single-player use.
Speech recognition runs locally through Wingman's FasterWhisper. Speech synthesis uses Edge TTS, which is free. A run of five providers means a rate limit mid-overtake falls through to the next one instead of going quiet.
Cloudflare GLM-4.7-Flash primary
Groq GPT-OSS-20B low latency
Gemini Flash-Lite free tier
OpenRouter /free zero cost
GPT-5 nano paid fallback If every provider fails, a character says something short and canned rather than nothing. Silence caused by a bug looks the same as silence by design, and that is impossible to debug from inside the game.
Install
-
Install the pieces
Euro Truck Simulator 2, the ETS2LA game-side plugin, and Wingman AI.
-
Install the world engine
git clone https://github.com/DavidKolsek/roadfolk cd roadfolk pip install -e . -
Check it without the game
roadfolk probe --scenario cut_in --tableDrives a scripted overtake and cut-in through the real pipeline. If this prints events, the engine works.
-
Point it at the game
roadfolk diagnose # find the right memory layout roadfolk probe --table # watch real traffic roadfolk serve # start the service -
Add the Wingman skill
Copy
wingman-skill/roadfolk/into Wingman'sskills/folder and enable it. -
Add one API key
set CLOUDFLARE_ACCOUNT_ID=... set CLOUDFLARE_API_TOKEN=... roadfolk selftestThe self test checks that a Croatian driver with weak English really produces broken English, and that a Slovenian driver answers in Slovenian.
Status
| Part | State |
|---|---|
| Traffic tracking and event detection | Done, tested offline |
| Characters, nationality, personality, memory | Done |
| Silence budget and channel rules | Done |
| Language policy and accents | Done |
| Content: 109 places, 66 characters, 273 beats, 239 topics | Done |
| Talk at red lights and in lay-bys | Done |
| Radio, police, customs, hitchhikers, dispatcher | Done |
| Shared memory layout | Transcribed from ETS2LA source |
| Shared memory against a running game | Not yet run |
| Event thresholds on real traffic | Tuned on synthetic only |
| Live model, speech in and out | Needs an API key |
| Extended plugin: model, colour, plate | Planned |
The shared-memory layout is not guessed. It is transcribed from ETS2LA's
own reader: three bare arrays of fixed records, with no header and no
player position in any of them. It has still never touched a running
game, so it sits behind one data-driven module, and
roadfolk diagnose scores it against the real buffer using
physics rather than field names. Correcting it is a config change rather
than a rewrite.