The truck that cut you off has a name

A mod for Euro Truck Simulator 2 that turns the traffic into people.

Roadfolks reads the actual traffic around you and gives it drivers. 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 run against the real game yet. See Status before you expect it to work.

On the radio

What actually happens when somebody cuts in.

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 voice reads it, so the accent is real rather than spelled out.

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. Roadfolks 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.

When people do talk

Mostly not at 90 km/h. 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. Roadfolks reads the real traffic lights, including the seconds left on them, so nobody starts something the light will cut off, and each junction speaks once.

The same goes for a lay-by. Roadfolks reads the parked vehicles around you, so the lorry beside you at midnight is really there. Twenty seconds after you stop, somebody in it might say something. Get talked at the moment you pull up and you know it was scripted, so it waits.

Talk to a driver

Eight written characters, live, in your browser.

Pick a driver and say something. This is the dialogue part only: no game, no voice, no memory between visits. The replies come from a language model on Cloudflare Workers AI, built from the same character sheets the mod uses.

Runs containers between Koper and Munich. Twenty-two years on the road. Loathes the Karawanken queue and says so every time.

Checking whether the demo is on...

Try Slovenian or Croatian with Bojan or Marko. Limits: six messages a minute for you, and a fixed number a day for everybody together, so the free allowance lasts.

How it works

The simulation decides the facts. The 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

Up to 39 nearby vehicles, the parked lorries and the traffic lights, read from shared memory.

SCS telemetry

Your own position, the job, the cargo and the clock.

Tracker

Keeps one vehicle as one track, through the dropouts ETS2 produces.

Event detector

24 event types from geometry alone. No randomness, no model calls.

World engine

Who exists, what they remember, and whether anybody speaks at all.

Wingman AI

Microphone, speech recognition, voices and playback.

What the detector sees

  • CUT_IN They moved into your lane 12 m ahead and you lifted off.
  • TAILGATING Somebody has sat 14 m off your bumper for 40 seconds.
  • NEAR_MISS Bodywork clearance dropped under a metre at 90 km/h.
  • CONVOY_FOLLOW You have run together for six minutes.
  • TRAFFIC_JAM Five vehicles around you, nobody above 10 km/h.
  • BORDER_CROSSED SI to AT.

Who else is out there

  • The radio. 30 invented stations, each in the right language. Traffic bulletins are built only from incidents the simulation saw.
  • Police. Three speeding events in fifteen minutes earns a stop, and the officer says so.
  • Customs. Stop within 6 km of a border crossing and somebody wants your documents.
  • Hitchhikers. A real destination, and they get out when you reach it.
  • Your dispatcher. Knows the cargo, the deadline and the damage report before you say a word.

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.

Roughly one truck in six is written by hand: a route, a specific lorry, a reason to be on this road, and a story that moves one step each time you talk. The steps are stored in a database, not in the model's context, so a restart does not lose them and a chatty player cannot rush somebody through a whole story in one afternoon.

109
places on the map
66
written characters
273
story beats
239
conversation topics
105
easter eggs
361
tests, all offline

What it costs

About half a cent per hour of play, usually nothing.

Each line is a small request: under 2,500 tokens in and usually under 80 out. Speech recognition runs on your own PC through Wingman. The voices use Edge TTS, which is free.

Five providers are tried in order. A provider that hits its limit sits out for as long as it asks, or for a cooldown that doubles each time. A key that is refused sits out for six hours. The game keeps talking through whichever provider still answers.

Cloudflare Workers AI   primary
Groq                    low latency
Gemini Flash-Lite       free tier
OpenRouter /free        zero cost
OpenAI GPT-5 nano       paid fallback

If every provider fails, the driver says something short and fixed rather than nothing. Silence caused by a fault looks the same as silence by design, and nobody can debug that from inside the game.

Install

About fifteen minutes on a Windows game PC.

  1. Get the pieces

    Euro Truck Simulator 2, ETS2LA with its game plugin, the SCS telemetry plugin, Python 3.11 or later, and Wingman AI for voice. Put both plugin DLLs in bin\win_x64\plugins in the game folder.

  2. Install Roadfolks

    git clone https://github.com/DavidKolsek/roadfolks-ets2
    cd roadfolks-ets2
    py -m venv .venv
    .venv\Scripts\activate
    pip install -e .
  3. Add one API key

    setx CLOUDFLARE_ACCOUNT_ID "your-account-id"
    setx CLOUDFLARE_API_TOKEN "your-token"

    setx keeps the key after a restart. Open a new terminal after it. Other providers are in docs/PROVIDERS.md.

  4. Ask it what is missing

    roadfolks doctor

    One line per part, and one instruction for each part that is not ready. Start the game first, or the three game items fail.

  5. Start it

    roadfolks serve

    Then copy wingman-skill\roadfolks into the Wingman skills folder and turn the skill on.

No game handy? roadfolks demo runs a whole encounter with real dialogue and nothing else installed. The step-by-step first run on a game PC is in docs/GAME_PC.md.

Status

What works, and what has not met the real game yet.

PartState
Traffic tracking and event detectionDone, tested offline
Characters, nationality, personality, memoryDone
Silence budget and channel rulesDone
Language policy and accentsDone
Content: 66 characters, 273 beats, 239 topicsDone
Talk at red lights and in lay-bysDone
Radio, police, customs, hitchhikers, dispatcherDone
Provider fallback and quota handlingDone
Shared memory layoutTaken from ETS2LA source
Shared memory against a running gameNot yet run
Event thresholds on real trafficTuned on synthetic only
Heading calibrationNeeds one drive
Speech in and out through WingmanNot yet run

The shared memory layout is not a guess. It comes 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 roadfolks diagnose checks it against the real data using physics rather than field names.

The full to-do list is in the repository.