pro_engineer — changelog

Pro Engineer/Changelog

Every release — what changed, and what was wrong before it

The whole history, out of the file the program ships with.

This page is the application's own CHANGELOG.md, rendered. Nothing on it is written twice: an entry is added when the release is made, and this is where it appears. Every version is its own address, so one fix can be linked to on its own.

Pro Engineer — the terminal

The terminal front end, and the core underneath both. Its source, its releases and its checksums are public.

v0.4.8

Added

Thanks

This release on GitHub →

v0.4.7

Nothing changed in the terminal or the core. The number moves because the two front ends are released together and carry the same version — a bug report that says "0.4.7" has to mean one build of everything, not a guess about which half. The work in this release is all in the window; see its changelog.

This release on GitHub →

v0.4.6

A patch for three faults a driver found and reported, two of them in what the engineer was telling people about their tyres.

Fixed

This release on GitHub →

v0.4.5

The release LAN was the point of. Two people, two machines, one network: one drives and the other watches — every screen, not a summary — and it works between the terminal and the window in any combination.

Numbered 0.4.5 rather than 0.4.3: the version this jumps over is the one where the two front ends spoke different protocols, and nothing was released from it.

The frame does not change. Every shm-bridge.exe and every installed panel from v0.4.0 onward keeps working, and nobody has to fetch a bridge.

Added

What arrives is the whole reading, so the watching machine finds the laps, builds the traces, draws the map's line and runs its own engineer. A spectator gets every tab, in their own units and their own language, rather than four sentences written on somebody else's machine.

Fixed

Changed

Known

This release on GitHub →

v0.4.2

A patch, and the frame does not change — every shm-bridge.exe and every installed panel from v0.4.0 onward keeps working, and nobody has to fetch a bridge.

Most of what is fixed here looked like something else while it was happening: laps that vanished, a reference lap that made no sense, advice about a race nobody was running. Three of the additions are measurements this core could have made all along and never did.

Fixed

Added

In the terminal

For anyone building on it

ac_core::laps::LapStore is where a saved lap lives — save, list, load, delete, and the migration. A front end that still writes saved_laps/ itself is writing somewhere its user cannot find.

This release on GitHub →

v0.4.1

Five fixes, all of them the program reporting something nobody measured. Four were found by driving Competizione for the first time; one of them has been wrong on Assetto Corsa since v0.4.0.

Fixed

Changed

Linux and Steam Deck

The Proton helper changed. After updating, press [B] on the launcher's overlay card to fetch the matching shm-bridge.exe — it is published with this release.

This release on GitHub →

v0.4.0

The point: a second simulator, and an engineer that knows what car it is looking at.

At a glance, everything since v0.3.6

Everything below is the detail.

🏎️ The engineer knows what car it is

The point: the Analysis tab drew what happened. It says where now, and how sure it is.

⚖️ Licence: MIT → AGPL v3

The project is licensed under the GNU AGPL v3 from this release onward. Nothing changes for anyone using the application: it is free, it stays free, there is no account and no paid tier. What changes is what may be done with the source.

LICENSING.md is the plain-language version — what needs asking, what does not, and what happens to a closed product found shipping this code without asking. CONTRIBUTING.md covers the sign-off patches now need, and why.

🏁 A second simulator: Assetto Corsa Competizione

Telemetry from ACC arrives. Its three shared-memory pages are read, turned into the same neutral reading Assetto Corsa produces, and every screen, the analyser and the engineer work on it unchanged — none of them knows which game it is looking at.

Which simulator is a choice now, on the launcherGAME: < … >, on every platform. It used to be detected, and detection is the wrong tool for this pair: the Linux bridge has to be running inside one game's Proton prefix before that game starts, so there is no process to detect yet, and both games publish under the same names. A wrong answer costs a bridge in the wrong prefix and an engineer running the other game's thresholds. The row also says what the chosen game can and cannot measure, so advice going quiet reads as a property of the game rather than as a broken feature. Choosing another game restarts the bridge in its prefix.

One thing is still owed, and it is named here rather than left to be found. The engineer's temperature thresholds were chosen against Assetto Corsa's cars and have not been read against a stint on a GT3 — the brake alert sits at 800 °C where ACC's carbon runs at 520, so it is likelier to stay quiet than to cry wolf, and the brake-wear thresholds are millimetres that want the same check. docs/plan-acc.md §10 is the list, and engineer_probe is how it gets done: every line of advice printed next to the numbers that produced it.

✨ Added

The two fuel rules deliberately have none, and that is a finding rather than an omission: "the fuel will not last" is arithmetic on what is in the tank, not a mechanism, and its check is the same number a lap later, already on the screen. A chain there would be three fields of ceremony making the advice look better researched than it is.

A third state is also deliberate. A rule that can explain itself but counts one whole-lap number rather than several agreeing observations carries a chain with empty evidence and keeps its hand-picked confidence — one counter is one observation however large it gets, and feeding it to the evidence model would dress a single number up as corroboration.

Two rules were sharpened on the way. Bottoming now knows which corners grounded rather than only that one did — the loop stopped at the first, which was enough to raise the alert and not enough to say anything about it — and the wear rule says laps left on the worst corner where it used to leave a percentage, because a percentage is not what a driver deciding whether to stop needs to hear.

🔌 For anyone building on it

🗑 Removed

🐞 Fixed

This release on GitHub →

v0.3.6

The point: the panel could tell you what was happening; it had nothing to say about the lap you had just finished. Now it does, with the last three laps to page through.

The frame changed, so Linux needs a matching shm-bridge.exe[B] on the launcher's overlay card fetches one. Everything else is optional and off until you turn it on.

⚠️ Breaking

✨ Added

Assigning a wheel button to the paging was in this release and has been taken out again: the binding was written into Assetto Corsa's own controls.ini correctly and the press never arrived back. It returns when it works, rather than shipping as a control that looks bound and does nothing.

🐞 Fixed

🧱 Under it

This release on GitHub →

v0.3.5

The point: the in-game overlay stopped being "the panel that sometimes works". It opens before the race and in the pits, keeps its settings when you close its window, and shows up to eight lines of advice instead of four. There is one overlay now rather than two. In the terminal, every key does what the screen says it does, and every one of them can be rebound.

Run in a real session on Linux (Proton) and on Windows 10.

⚠️ Breaking

✨ Added

🗑 Removed

🐞 Fixed

🧱 Under it

This release on GitHub →

v0.3.4

⚠️ The overlay in this release is a DEMO

A preview, not a finished feature. It is published so that it can be checked on real machines, which is the one thing that cannot be done while developing it.

  • It has never once been run on Windows. The tests pass by cross-compilation and clippy is clean against the Windows target, but not a line of it has executed there.
  • It has not been checked in game by the author of these changes. The panel is driven under LuaJIT and LÖVE and every ui.* call it makes is checked against the installed CSP — that is not the same as a session.
  • Some console captions and the Wear:, T:, B: prefixes are not translated yet.

The official release comes after real sessions on both systems. Report what breaks: the panel's status window now shows every version at once.

The point: before this release the overlay could not work for anyone on Linux. v0.3.3 was tagged eleven minutes before the commit that taught shm-bridge to map the overlay, so every published bridge created only AC's own pages. Confirmed by scanning the artifact.

⚠️ Breaking

🐞 Fixed

🚀 Added

This release on GitHub →

v0.3.2

A small follow-up to v0.3.1. Four pieces of functionality that were fully implemented but had no way to reach the user are now wired up, one wrong number in the analysis tab is corrected, and three things that ran far more often than they needed to no longer do.

🚀 New Features

🛡️ Fixed

⚡ Performance

🧹 Internal

185 tests, up from 171. The SVG renderer moved out of tui_tester into ui::screenshot so the binary and the application share one implementation; the README screenshots regenerate byte-identical from it.

This release on GitHub →

v0.3.1

A bug-fix release, and a large one. Three features that the interface has always advertised — the version carousel, saving your settings, and the Setup Cloud browser — did not work at all and now do. Four reachable crashes are gone. Assetto Corsa is finally found on Linux.

47 commits, 171 tests (up from 130), green on Linux and Windows.

⚠️ Read This First

🚀 New Features

🛡️ Crashes Fixed

🛡️ Things That Silently Did Nothing

🛡️ Wrong Numbers

🛡️ Keys, Text and Alerts

🛡️ Data, Shutdown and Security

⚡ Performance

🧹 Internal

This release on GitHub →

v0.3.0

🚀 New Features & Enhancements

🛡️ Bug Fixes & Stability

---

This release on GitHub →

v0.2.3

🚀 New Features & Enhancements

🛡️ Bug Fixes & Stability

---

Download the latest →

v0.2.2

🌟 Features

This release on GitHub →

RG Pro Engineer — the window

The graphical front end. Everything that decides anything is in the shared core, so a fix in the list above reaches this too; what is listed here is the window's own.

v0.4.9 this build

Braking, and the half of the engineer that was missing: it now follows up on what it told you. Plus a library of laps other people drove, so nobody's first evening at a circuit is a blank screen.

Added

Fixed

Download the latest →

v0.4.8

Modules: the parts of the window you choose to have, a little language to write your own with, and the program's own screens written in it — so a tab is something you edit rather than something you replace.

Added

Words. A line in quotes is a sentence, {…} in it is a formula, and {fuel:1} is that formula to one decimal place. Put when after the closing quote and it appears only while that is true, which is how a warning is written. A hole with no answer draws a dash, never a nought.

Things it does. print, warn, alert and title are actions: a formula can say something as well as work something out, and a row that fired warn or alert draws itself in that colour — one thought written once. Only the arm of an if that is taken runs, so if a then print "yes" else print "no" says one of them.

Things it keeps. state best = 0 declares a slot and remember best = max(best, speed) writes to it, once a frame, in the order written. A peak, a counter, how long something has been true: the things an expression alone cannot do. Slots are not saved — a slot is what is happening in this session, and restoring yesterday's peak would be a number nobody measured.

Things it draws. paint NAME 220 is a panel you draw on, and on it dot, line, box, ring, arc and text — every number a formula. The space is 0 to 1 across and down, a radius is a fraction of the shorter side so a ring is round on any shape, and angles are degrees with 0 straight up going clockwise, the way a dial is read. A rev counter with a needle, a red zone and the number in the middle is nine lines. Any mark takes the same when a sentence does, so a warning light is one more.

And two marks that are about the whole lap rather than this instant: path x, y draws a map of the track you are on, fitted to the canvas so the numbers need no scaling, and here x, y puts a point on that map — where the car is. Two lines for a track map you drew yourself.

Another lap. best(f) is what f was at this place on the track on your quickest complete lap of the session, and last(f) the same on the one you just finished — so the thing every telemetry program is for is one line:

let delta = speed - best(speed)

They are a table by distance rather than a number, which is what makes that mean "slower than your best lap here" rather than "than its average". The table is worked out once when the lap changes, so asking it costs one lookup per sample. Inside best(…) everything is about that lap, so best(highest(speed)) is the highest it went round the quickest one. Until there is such a lap they give nothing at all: a delta of zero in your first minute would read as "exactly on your best", which is the one thing it must not say. The best lap is chosen the way the analysis screens choose it — quickest, complete and valid — from one place, because two would drift.

Trigonometry, and ten other functions: sin, cos, tan, asin, acos, atan, atan2, log, log10, exp and lerp. Every angle is in degrees, in and out, because every angle this program shows is — atan2(lat_g, lon_g) is which way the car is being pushed, 0 straight ahead.

A module you wrote. module "Fuel Warden" and about "…" give a document a name and a line about what it is for; it appears on MODULES beside the ones that shipped, saying which tabs it adds and whether every line reads.

And a chapter of the handbook about all of it, in the program: GUIDE → Writing your own screen, which appears while the studio is on and is not there when it is off, because "off costs nothing" has to mean the documentation too. It is this window's own chapter rather than the shared core's, on the same argument the streaming ones are: the terminal has no studio.

``` let g = hypot(lat_g, lon_g)

panel HOW HARD IT IS WORKING Combined g (g) = g Grip used (%) 0..100 = clamp(g / 1.6 * 100, 0, 100) ~ Speed (km/h) = speed ```

A range makes it a bar, a ~ makes it a line over the lap, and anything else is a number — so there are no shape keywords to remember. instead of DASHBOARD puts your screen where the program's own tab was, and that is the one thing in the format that takes something away: it is a separate word from screen, the editor shows a table of everything the document is taking and a GIVE THEM ALL BACK that keeps your work, and the tab itself says every time it is opened that it is not the program's screen. panel NAME starts a box, screen NAME starts another tab, columns 2 puts two side by side, and let grip = … names a piece of maths the rows below can use. Nothing has to line up.

It is drawn by the same widgets every other screen uses, at the same cost, and it follows the car — including a car arriving over the network. The document and what it draws are side by side, updating from the car as you type, so writing a screen and looking at it is one loop rather than two tabs. KEEP IT saves and BACK returns to the last version you kept; six worked documents are one press away under START FROM. A line that does not read costs its own row and names its line number, because a screen that went blank on a typo is a screen nobody would dare change.

It ships that way for the tabs this format can say — DASHBOARD, STRATEGY and both halves of TELEMETRY — and each of them states, in the red panel before anything happens, what does not come with it: the engineer's findings and the damage on DASHBOARD, the four-corner tables on TELEMETRY, the stops themselves on STRATEGY. For the tabs built out of the corner table, the engineer's chains or the setup files there is nothing to hand over, and the panel says that too rather than pretending an empty page is an edit.

The altitude was there the whole time — it comes off the game's own files with the rest of the circuit, and the core's own note beside it said no map used it. This is the map that does: turn it, tip it, zoom it, drag it with the pointer, and colour your lap on it by speed, throttle, brake, gear or height, with the corners carrying the names the track gives them and the car on it where you are. The elevation is at its own size: a circuit as it is, with the slopes the track really has, rather than a hill drawn taller than it is to make a point. And a free camera — a switch, then W, A, S, D to fly, Q and E for up and down, the pointer to look — so it can be walked the way a scene is walked rather than only turned on a turntable. The old turntable is still there and is still what it opens with.

And it answers rather than only showing. The lap is drawn where the car actually was, from the car's own position rather than down the middle of the road — running wide at an exit, clipping an apex and a different line into a corner are the three things a map of a lap is for, and all three used to come out as the same stripe down the centre. The car is drawn as the car, its own outline read from its own model, at its own size, pointing along the road: on a whole lap it is a speck inside the marker, and the moment you zoom into a corner it is what says how much of the road you were using. And pointing at the lap says what was happening there — speed, gear, the pedal, where round the lap, and how far off your best you were at that exact place.

It is not the scenery. The trees, the buildings and the grandstands are meshes inside the game's own model files; reading and drawing those would be a different program, and one that could not run beside the game it was decoding. What is here is every part of the circuit the game will tell us about.

And a great deal on it: the road at its own width, which comes out of the track's files — eleven metres at Spa and half that through the Bus Stop — with its two kerbs, the pit lane, the start line, the sector lines, the corner names, the surface lit by which way it faces, its own shadow on the ground beneath it, and the climb as a profile under the map with the car's place marked on it.

It costs more than the other screens and says so where you can see it. PLAIN is the road and your lap and nothing else, for a machine the game is already using all of; FULL adds the shadow, the kerbs, the pit lane and the start line; EVERYTHING adds the names, the sectors and the profile. The projection is worked out once per camera move rather than once per frame, and a frame hands egui two meshes and a handful of lines.

It adds no tab. RECORDS already lists every session you have driven, so this is what that list becomes: each evening carries how much its best lap moved from the one before it in the same car — the number a work log exists to produce — a line you write about what you changed, typed straight into the row so it can be done between stints, and under it the run of evenings in the car you are in, as a line. Off, the table is exactly the five columns it has always been.

It is deliberately not a setup diff. The core can compare two setups, but nothing on disk records which setup was on the car during a past session, and inventing that link would be a guess dressed as a measurement.

What Motion deliberately does not do is roll a number to its new value. An eased number is a number nobody measured, shown as though somebody had, and that is the one thing this program refuses everywhere else.

Faster

Fixed

Thanks

Download the latest →

v0.4.7

The patch that makes it pleasant to use: a lap you can play back, a session that survives the window closing, and the screens tidied up.

Added

Fixed

Download the latest →

v0.4.6

Three faults reported by one driver, and the name back.

Fixed

Download the latest →

v0.4.5

Watching somebody else drive, and the car drawn the way the driver sits in it.

Added

Fixed

Download the latest →

v0.4.2

Download the latest →

v0.4.1

Download the latest →

v0.4.0

The first release of the window: ten screens over the same core the terminal reads, with the analysis a character grid cannot have — hover a trace and read the value under the cursor, lay two laps over each other, pull one corner out and zoom into it.

Download the latest →