Pro Engineer/Assetto Corsa
Everything it reads from AC, and everything it says back.
Assetto Corsa publishes its telemetry in shared memory for exactly this purpose. Pro Engineer reads those pages sixty times a second, works out what the tyres, brakes, fuel and driving are actually doing, and answers in sentences — on a second screen and inside the car, through Custom Shaders Patch.
Works with the base game and with Content Manager. Custom Shaders Patch is needed only for the in-game panel — everything else runs without it.
Four shared-memory pages, and nothing else. It does not inject code, hook the renderer or modify a single game file — it opens what Assetto Corsa already publishes and reads it.
| Physics, at the game's own rate | Tyre pressures, inner/middle/outer temperatures, brake temperatures, wear, suspension travel, both pedals, steering, gear, RPM, speed, both G axes, slip, fuel and the wheel's force feedback level. |
| Graphics and session | Lap and sector times, position on track, the session type, the number of laps or the time left, and the flags. |
| Static | Car and track names, maximum RPM and fuel, and the tyre compound — enough to know what it is looking at before a wheel has turned. |
| Read until two reads agree | A page caught mid-write is inconsistent, and one bad frame in a thousand is a spike in a graph and a wrong verdict in an engineer. Each page is re-read until two consecutive reads match, and a frame that never settles is discarded rather than drawn. |
Nothing measured is nothing said. Some cars and some mods do not publish tyre wear at all, and four zeros are not four destroyed tyres. Every average that was never taken is treated as absent — the verdict is withheld rather than invented, which is a distinction this project has had to learn the hard way.
Sentences, not thresholds. Grouped, so four cold tyres is one line rather than four; ranked, so the line you read at 200 km/h is the one that matters; and each carries how sure it is.
Several observations agreeing closely — four corners saying the same thing, not one odd frame.
Enough to raise. Not enough to bet a setup change on.
It is watching and has not decided. Being told that is worth more than a confident guess.
Nine tabs, every keyboard shortcut rebindable, and every on-screen hint printed from the binding — so it cannot tell you the wrong key. About 0.1 % of one CPU core, and no GPU cost at all: it is a terminal program.


Five windows as a Custom Shaders Patch Lua app — the main panel, the engineer, telemetry, status and the lap debrief — opened and closed independently, every block switchable, and readable at 4K because text is drawn at any size rather than at the five fixed tiers the platform offers.
Every time the application starts, and it rewrites itself whenever it differs from the running build. There is no step to forget and no version to match by hand.
Lua runs on Assetto Corsa's render thread, where a millisecond is a sixth of the frame budget at 165 Hz. Everything is worked out on the desktop side and copied in; the panel formats text when a frame arrives, never while drawing.
In the garage, in the pits, before the green — and it tells “waiting for the car” apart from “waiting for the application”, which are two different problems.
One screen that names which of the application, the bridge and the panel does not fit. It is the question this project is asked most, and guessing at it costs an evening.
Corners are found in the trace — a stretch where lateral load stays up long enough to be a corner rather than a kink — so it needs no track data and works on mods and on tracks nobody has written a table for.

It will not invent a comparison. Corners are matched by distance rather than by position in the list, because two laps can detect a different number of them and comparing T5 to T5 compares two different corners. A corner the reference lap does not have is drawn as no comparison rather than as a delta of zero.
Download, unzip, run. It finds Assetto Corsa, writes the in-game panel into
assettocorsa\apps\lua\, and creates the shared memory the panel
reads. Nothing has to start in a particular order.
# unzip anywhere, then
ac_pro_engineer.exe
The desktop side is a native Linux binary and needs nothing else. The in-game panel additionally needs a small bridge running inside the game's Proton prefix, because only a Windows process in there can give the shared memory the name the game is allowed to open.
./ac_pro_engineer
# for the in-game panel, leave this running too
protontricks-launch --appid 244210 shm-bridge.exe
CSP needs libraries Proton ships only as stubs. If Content Manager opens on a
black screen, or the game crashes the moment a Lua script runs, that is what the
proton-setup.sh in the release archive installs. The full sequence is
on the download page.
CSP's app sidebar → enable the panel, listed there as Pro Engineer. It is already in place; the application put it there when it started.
The complete list, folded by area — tyres, the engineer, the debrief, corner analysis, ghosts and traces, driving style, fuel, force feedback, setups and the built-in setup guide.
All 218 featuresThe shared-memory read, the one computed frame every front end sees, the Proton bridge, and why the panel is forbidden from calculating anything.
Under the bonnetFrames, Steam Deck, whether it touches the game, whether a friend can watch, and what the licence allows.
Nine answers