Roadfolk

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

Marko hr-HR, CB

Ej, pazi malo! Vidiš da sam tu?

You push to talk

Sorry mate, didn't see you.

Marko

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

Who else is out there

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

  1. Install the pieces

    Euro Truck Simulator 2, the ETS2LA game-side plugin, and Wingman AI.

  2. Install the world engine

    git clone https://github.com/DavidKolsek/roadfolk
    cd roadfolk
    pip install -e .
  3. Check it without the game

    roadfolk probe --scenario cut_in --table

    Drives a scripted overtake and cut-in through the real pipeline. If this prints events, the engine works.

  4. Point it at the game

    roadfolk diagnose          # find the right memory layout
    roadfolk probe --table     # watch real traffic
    roadfolk serve             # start the service
  5. Add the Wingman skill

    Copy wingman-skill/roadfolk/ into Wingman's skills/ folder and enable it.

  6. Add one API key

    set CLOUDFLARE_ACCOUNT_ID=...
    set CLOUDFLARE_API_TOKEN=...
    roadfolk selftest

    The self test checks that a Croatian driver with weak English really produces broken English, and that a Slovenian driver answers in Slovenian.

Status

PartState
Traffic tracking and event detectionDone, tested offline
Characters, nationality, personality, memoryDone
Silence budget and channel rulesDone
Language policy and accentsDone
Content: 109 places, 66 characters, 273 beats, 239 topicsDone
Talk at red lights and in lay-bysDone
Radio, police, customs, hitchhikers, dispatcherDone
Shared memory layoutTranscribed from ETS2LA source
Shared memory against a running gameNot yet run
Event thresholds on real trafficTuned on synthetic only
Live model, speech in and outNeeds an API key
Extended plugin: model, colour, platePlanned

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.

The full to-do list is in the repository.