Download

Get Moverlay.

One installer with the plugin, all 23 overlays, both dashboards and the default configuration. Free, no account.

Stable
Released
Platform
Windows · SimHub plugin installer
Download coming soon
Public downloads open when the plugin's repository goes public. The installer will be downloadable right here, with no change on your side.

What's new in the latest release

Requirements

What you need

System
Windows PC
Runtime
.NET Framework 4.8, SimHub's plugin runtime
Game
EA SPORTS F1 23, F1 24, F1 25 or the F1 25 2026 Season Pack, with UDP telemetry enabled in the game's settings. Other games
Permissions
Administrator access when SimHub is installed under Program Files
Install

Four steps

  1. Run the installer

    It finds SimHub on its own (use Browse… if it picks the wrong folder) and offers to close SimHub if it's running. Windows SmartScreen may warn because the installer isn't code-signed: choose More info → Run anyway.

  2. Enable Moverlay in SimHub

    Accept the new-plugin prompt, or enable it under Settings → Plugins and restart SimHub if asked.

  3. Add overlays to a layout

    In Dash Studio, add the Moverlay overlays you want to an overlay layout, or put the Race Control Dashboard on a spare screen.

  4. Configure and drive

    Open the Moverlay page in SimHub, adjust what you like, choose Save and apply, and start a session.

Updating? Run the newer installer the same way. It backs up your installation first and keeps your configuration, layouts, bindings and dashboard placement. Full install guide

Changelog

Earlier releases

3.0.2

Overlays

  • The Pit Strategy card's Compact layout fills its canvas and carries the evidence. Until 3.0.1 Compact was the dense 2.25 ladder at a fixed size, so on the 500 × 500 canvas a one-stop plan left the lower third of the card empty above two small footer lines. Compact is now the fuller view the layout is meant to be: the two footers become a row of gadget tiles — the fitted set's life and wear (MEDIUM LIFE · 11 LAPS · 10% WEAR), its degradation slope (DEG PER LAP · 0.12s), the pit-loss estimate with its source (22.5s · TRACK DEFAULT, amber under a caution) and the plan's confidence with what the plan costs (HIGH · COST 31.4s) — and the whole ladder is scaled so the stack the state shows fills the height, about 12 % larger on the common one-stop plan than before, with no empty band. A tile whose switch is off (ShowReasons, ShowPitLoss) gives its width to the rest; the life tile steps aside under NO STOP, where the LIFE strip already says it. Above 100 % text size the tiles go after the alternatives and the caption, before the strips. The Large layout is unchanged. The header tag (RACE, UNDER SAFETY CAR) now keeps a gutter's distance from the title instead of a fixed width.
  • Sizing policy written down. docs/DESIGN.md gains "Sizing within a card": the canvas never changes between layouts; Large spends it on size (only the critical rows, slack allowed) and Compact spends it on information and fills it (more gadgets, the ladder scaled to the space the state leaves, fillCap 1.4). Pit Strategy is the first card on the contract; the other Compact layouts keep the fixed 2.25 numbers until they are revisited.

3.0.1

Installer

The 3.0.0 rename missed four things SimHub itself keeps by the old MoverlayF1 names; an update to 3.0.1 migrates all four, once, and leaves anything it cannot read untouched:

  • Keybinds and StreamDeck buttons in PluginsData/PluginManagerSettings.json bound to a MoverlayF1Plugin.* action are rewritten to MoverlayPlugin.*.
  • Dash Studio's per-dashboard render mode, transparency and button bindings in PluginsData/Common/DashStudioSettings_2.json follow a renamed dashboard instead of resetting to defaults the next time Dash Studio opens it.
  • A device's screen assignment in PluginsData/Common/Devices/<device>/settings.json (the dashboard shown on a wheel or other display, its idle dashboard, a per-car override) is updated to a renamed dashboard; a numbered backup under _Backups/settings_b*.json is left alone.
  • A dashboard sitting under an old folder name a rename did not otherwise recognise - the 1.9.0 MoverlayF1 - Leaderboard Lastname folder is the known case - is now found by its fixed dashboard identity, and its folder, files, saved overlay layout references, Dash Studio entry and device screen assignments are all renamed together, preserving the saved layout position.

Strategy model

  • The Pit Strategy card no longer reads "0 STOPS" over a plan with a stop in it. Since 2.28.2 its headline printed the number of stops after the next one, so the common one-stop plan - a 13-lap Grand Prix on a medium with a mandatory stop to the soft at lap 5, in the maintainer's own race - read 0 STOPS · SOFT · L6-L13. The count is now the plan's stops, the next one included, and the plan is published as a race timeline the cards share: the stint on the car first, then every planned stint, and one entry per stop with its box lap, the window it may be taken in, the compound it fits and what it costs - the Pit Window's LAP 5-12 and the strategy card's stop are now one value, not two calculations. In the first seconds after lights out, before the game has sent the stint history, the card reads Waiting for tyre history instead of planning a race without the two-compound rule, and NO STOP cannot be called until the history is there. (/api/v1/pitstrategy-state gains CurrentLap, StopCount, PlannedStops[], Verdict, Alternatives[], FittedLifeLaps, DegradationSecondsPerLap and per-stint IsFitted / LifeLaps; the existing keys keep their meaning, the projection-key golden was extended deliberately, and the SimHub property surface is unchanged.)
  • A stop just made under the safety car no longer produces a second "BOX NOW". Right after a safety-car stop onto a fresh soft with two laps to go, the Safety Car Helper said STAY OUT · STOP DONE while the Pit Window and the Pit Strategy card still advised boxing again for another soft: a running safety car used to veto NO STOP outright and put a stop on the table by itself, so the cards published the stop-now plan - the cheapest set that reaches the flag - without asking whether the stop pays for itself or whether the helper had already recorded one. While a period runs the Safety Car Helper's verdict now decides whether a stop is on the table, and a caution no longer makes a stop free: it has to win back its own (reduced) pit loss. After the stop all three cards read the same thing: NO STOP, No stop planned, STAY OUT · STOP DONE. The review of this release closed two gaps in the same rule: NO STOP is now decided on the very totals the card's alternatives are priced on (staying out against the cheaper of the planned and the immediate plan, all three in seconds against the fitted set's pace to the horizon), so the card can no longer read 1 STOP beside a cheaper NO STOP alternative or the reverse; and the Safety Car Helper's green hold at a restart (the half second between the resume event and the status clearing) counts as the helper holding, so the stop-now plan no longer flashes there. And the verdict is the same whichever overlays are open: the totals it is decided on are computed for the Pit Window and the Safety Car Helper whether or not the Pit Strategy card or a dashboard's strategy gadget is drawing the timeline (opening the card used to be able to flip NO STOP).

The 3.0.0 notes left five judgement constants "for the maintainer's decision". Each was measured on the recordings on this PC (docs/TIMING-VALIDATION.md 3.0.1 has the numbers) and decided on that:

  • Tyre degradation is fitted per session, per compound, instead of one 2.2 s/lap full-life line for every compound and circuit. The main source is the game's own per-set lap delta over the sets of a compound at different wear (the set on the car is one of them), read back as seconds per wear point times the set's measured wear per lap; the session's clean laps (every car, regressed within each stint) and the old constant over the compound's usable life are weighed in beside it, by the laps of evidence each holds. With nothing measured a fresh set is priced exactly as 3.0.0 priced it; a worn fitted set is deliberately not - the old constant spread its 2.2 s over the laps LEFT, so a set with five laps to go degraded at 0.44 s a lap, and it now spreads over the compound's usable life (0.11) like every other set - and after a few laps on a set the slope follows the game's model. The set's wear per lap behind it is the Tyre Life card's measured rate first (right for a set fitted used, caution laps excluded), then the set's own wear over its age from the wear it had when it went on (a set fitted at 12 % no longer reads 11 points a lap), and under a safety car or VSC - where the game rescales its own deltas - the slopes fitted on the last green lap are held. Measured: at Baku a medium loses 0.03 s a lap of age where the constant said 0.09, at Madrid a soft 0.4-0.6 s where it said 0.22, at Texas a medium 0.16-0.19 against 0.17 - so the Baku sprint's predicted stop moves three laps later, Madrid's soft stints one to three laps earlier, Texas not at all. The Pit Strategy card, the Pit Window's predicted lap, NO STOP and the Safety Car Helper's net all price on the fitted slope (the per-compound rows - slope, source, laps of evidence - are kept on the engine's state for the tests and the replay harness, not on the JSON views, whose key sets are pinned).
  • Safety-car pit-loss factors: 0.60 under a full safety car (was 0.45), 0.85 under a VSC (was 0.65). 46 stops under a full safety car across three recordings lose a median 0.10 laps of progress against the cars that stayed out - 11.7 s at the field's pace, 0.62 of the green-flag loss - but the spread is the state of the train: 0.35 once it has formed (Baku, twenty stops on one lap), 0.7-1.2 in the deployment lap itself (Madrid, Baku online). Under a VSC (two stops) 0.85-1.2, which is also what the pace ratio predicts. The new numbers are the pooled medians; the period learning below tracks the difference during the period itself.
  • Rain forecast inside the race ends the dry plan there. When a forecast sample's own weather code (never the percentage, never an approximate forecast) puts rain inside the race and a wet set is in the allocation, the dry stints are planned only to the rain lap and every plan ends on the stop for intermediates at that lap - the strategy card's last row and last stop; a dry stop is planned inside those laps only when it pays for itself before the rain, and a set that reaches the rain lap needs no dry stop at all (the fitted set's reach is measured to the rain lap like every other horizon). The forecast's weather code is judged over the whole of the race that is left, not the next stint, so rain forecast beyond the game's own pit window is seen from lap one. No recording on this PC has rain inside a race (Madrid's samples all flipped after the flag), so this is fixture-tested.
  • Pit loss is learned under a safety car and VSC too. A rival's stop under a period is measured over lap progress, converted at the field's green lap (captured once, as the period begins, from the last green snapshot - a marshal zone the game keeps up through the period no longer blocks it, and a VSC that becomes a full safety car keeps it) and divided by the period's factor, then held to the same rules as a green stop; at Madrid 24 of 25 stops were under a caution and the estimate never left the table value. Run over that recording's whole field, nine of the eleven stops under the lap-4 safety car are learned; their green-equivalent (29.9 s against the 22 s table) is the deployment-lap effect the factor notes describe, and a green stop afterwards corrects the median.
  • Seconds per place stays 2.5 s (already a Safety Car Helper setting, 0.5-10 s). The measurable alternative - the field's spacing - is 0.3-0.5 s between consecutive cars on every recording, and pricing a place at the gap would turn a 10 s stint gain into twenty places regained; the constant is the cost of a pass, which no recording measures in a controlled way, so it stays a judgement the driver can set.

Fixes after review

An independent review of the strategy model, before this release shipped, caught two more user-visible gaps:

  • A set that already reaches a forecast rain lap no longer plans an unneeded dry stop. The plan's dry horizons were capped at the rain lap everywhere except the fitted set's own reach, so a set with life past the rain but not the flag was still planned a dry stop before the rain stop that ended the race anyway - two stops for a set that needed one.
  • NO STOP now reads the same whether or not the Pit Strategy card is open. The totals it and the card's alternatives are priced on used to exist only while the card or a dashboard's strategy gadget was drawing the full timeline, so opening the card could flip a Pit Window or Safety Car Helper verdict that had just read the opposite way.

Overlays

  • The Pit Strategy card is redesigned in the Pit Window card family, in both layouts. The 2.28.2 card - a stop count, a compound pill and bare lap ranges (0 STOPS · SOFT · L6-L13 in the maintainer's 13-lap race) - is now the Pit Window's sibling at the same 500 × 500 size: the same header band, one headline (1 STOP / 2 STOPS, or BOX NOW in amber, NO STOP in green, WAITING) with its reason under it (2-COMPOUND RULE, FASTEST TO THE FLAG, STOP DONE · RULE SATISFIED, FOR TYRE HISTORY ...), the next set's compound pill (the fitted set, TO THE FLAG, under NO STOP), rows with the coloured left rule and right-aligned values - BOX · WINDOW 5–12L5 (the Pit Window's own window, one value), PIT · REJOIN P2122.5s (amber under a caution), BOX 2 · HARDL38 for a second stop, TO GO / SOFT LIFE under NO STOP - and, as the last row, a stint bar: the race as laps 1..N, stints coloured by compound, the laps run dimmed, the current-lap needle, a pin at each box lap and the first stop's window underlined. Large adds the priced alternatives (BOX NOW +2.8s) when the height allows; Compact keeps the evidence footers (confidence and fitted degradation, pit loss and its source). NO STOP and the post-lights-out wait are drawn on the card (green headline; WAITING with the dash vocabulary) instead of a status chip. Both layouts hold the 28 / 18 px effective reading floor at the card's placement; the Compact floor baseline is re-pinned for this card alone. ?demo=1 is now the 13-lap race (&scene=scdone, twostops, boxnow, waiting for the others), ?selftest=1 runs the five scenes in both layouts, and tools\Selftest-Renderers.ps1 gained the page with two fixtures.
  • The Race Control Dashboard's brand badge is readable at its placement. The small F1/F1 25 mark the 3.0.0 rename added beside the header sat 2 px under the 18 px label floor; it now sits on it.

Performance

  • The strategy engine re-solves on events, not on every snapshot. The maintainer keeps the Race Control Dashboard with its strategy gadget open, so the 3.0.0 gate (which only skipped the plan when nothing drew it) never applied to them, and a set delta creeping by a few milliseconds ran the whole ranking, window and multi-stop search ten times a second - 0.76-0.86 ms a snapshot at 3.0.0, 0.85-1.44 ms with the fitted degradation of 3.0.1. The tyre engine now keys everything it computes on the inputs the answer depends on - the lap, the set on the car, the safety-car and red-flag state, the two-compound rule, the forecast samples, the pit loss (learned, penalty and wing), every set's wear to the whole per cent, life to the whole lap and delta to 0.1 s, every rival's compound, age, stops and clean lap, the fitted degradation - and re-solves only when one of them moves or on a 2 s heartbeat of session time; in between it publishes the previous state by reference, so the views' ETags hold and the dashboards redraw nothing. A stop, a lap, a caution or a rule change is inside the key and is reflected on its own snapshot. The two decisions made after the engine (a stop on the table now, which plan the card shows) clone the shared state only when they actually change. Measured on the 22-car fixture with the dashboard on and a delta creeping every snapshot: see docs/TIMING-VALIDATION.md 3.0.1 (the new "creeping" benchmark line is pinned at 0.30 ms; the idle read stays where it was).

Tyre Prep

  • The carcass windows were checked against the game, not adjusted. On five recordings a set driven hard settles at one carcass temperature per Pirelli compound whatever the circuit - C5 80 C, C4 85 C, C3 90 C - each inside the card's window, 5-10 C above its cold edge; qualifying flying laps that set a time started from 70-89 C on the C5 (never below the window; once exactly on its edge, which the card has always read as in the window), and at a safety-car restart a C4 at 67 C and a C5 at 69 C read COLD and were slow. The three slow flying laps that began with a warm carcass all had a cold surface, which the card prints beside the carcass but does not judge. The intermediate and wet windows stay as they were and unvalidated: no wet-track recording exists, and Madrid's intermediates on a drying track ran 83-100 C, hot by their window, as they should.

3.0.0

Renamed the product from MoverlayF1 to Moverlay: the plugin file, its settings page, every shipped overlay and dashboard, the installer, and every "Waiting for..." / "Connecting to..." string now use the new name throughout.

Breaking

  • The configuration file changes shape (revision 5): the 2.x Overlays section becomes Profiles.eaf1 and General, Analysis and SoundCommands move to the root, with every value kept. This happens once, on the first start of 3.0.0, and the previous file is copied to config.json.pre-3.0.bak next to it first; a 2.x build reading the new file would see an empty configuration and save its defaults over it, which is what the backup is for. Nothing to do unless you edit config.json by hand or want to go back. A downgrade to 2.x re-mints the installation id (the identity the backend knows you by changes) and rewrites the file in the 2.x shape; 3.0.0 recognises such a file whatever revision it carries, keeps every value it holds and takes another backup (config.json.pre-3.0.2.bak, ...) before reshaping it again. A file the plugin cannot read at all is kept as config.json.invalid.bak before the defaults replace it, and a backup copy that fails is logged as a warning rather than treated as an unreadable file.
  • Every Dash Studio property changes prefix from MoverlayF1Plugin.* to MoverlayPlugin.*. A dashboard shipped with the plugin is migrated automatically (see below), but a formula you built yourself in Dash Studio that references a MoverlayF1Plugin.* property must be edited by hand to the new name.
  • The plugin DLL is renamed from MoverlayF1.dll to Moverlay.dll. Setup (or tools\Install.ps1) removes the old DLL when it installs the new one and carries your plugin activation over (see below), so SimHub should not ask you to enable the renamed plugin again; if it does, enable it once, the same way as after any plugin rename.
  • SimHub's plugin activation entry is migrated: both installers rename the F1Overlays.MoverlayF1Plugin entry of SimHub's PluginsData\PluginsActivation.json to Moverlay.MoverlayPlugin, keeping its enabled and menu fields (or add it enabled when neither exists); a missing or unreadable file is skipped and SimHub then asks once.
  • Shipped dashboards are renamed from MoverlayF1 - <Name> to Moverlay - <Name>. An existing installed dashboard is renamed in place (its dashboard and screen IDs, and any custom renderer URL, survive the rename) rather than duplicated, and a saved overlay window layout that referenced the old dashboard file by name is rewritten to the new one automatically.
  • Stored data moves from PluginsData\MoverlayF1 to PluginsData\Moverlay the first time the renamed plugin starts (configuration, recorded laps, pit stops, start history, learned pit lanes, dial positions and exports). The move happens once, automatically, and only when the new folder does not already exist.

Multi-game

Internal groundwork (docs/MULTI-GAME.md phases 0-3): the telemetry engine now reads the game through an adapter seam - a host frame filled once per SimHub callback, an adapter registry, and the session-identity, player-selection and 60 Hz sampling decisions behind it. Every measured F1 rule (the Baku reload id keep, the frozen-stream deferral, rewinds, spectator and one-shot handling, the player-change reset) is unchanged and pinned.

  • The plugin now knows which game SimHub is feeding it and what that game can tell it. Twenty-one new Dash Studio properties describe this: Source.GameKey, Source.GameLabel, Source.ProtocolKey, Source.ProtocolVersion and Source.AdapterVersion, and one Support.<Capability> string per capability (Roster, LapTiming, WorldPose, Weather, Forecast, Tyres, Damage, PitService, Cautions, StartLights, RaceControlEvents, TimeTrialReferences, EnergySystems, Fuel, CarTelemetry, Spotter) reading Supported, Restricted (the game gives the value for your car only, or only in some sessions) or Unsupported. Under the EA F1 games every row reads Supported except Spotter, and Restricted appears where it always did in practice (the other cars' tyres and telemetry in an online session with restricted telemetry). The same two blocks ride on the local server's state and settings payloads.
  • Almost nothing changes for F1 25 (2026 season pack included), F1 24 and F1 23 in any mode: every overlay, dashboard, setting, property and route works as in 2.28.2, and the shipped previews render pixel-identical apart from pages whose demo animates on the clock and the two deliberate exceptions in the Overlays section below (the Race Control Dashboard header and the Steering Wheel idle page each gain a small "F1"/"F1 25" brand badge that was not there before).
  • A game the plugin does not support yet still gets nothing visible. With another SimHub game running (iRacing, ACC, ...) the overlays that need what that game cannot provide stay hidden - Shown reads false, a Toggle changes nothing visible and a Peek is refused with a log line - instead of drawing a card full of zeros and dashes, and the common overlays (Track Map, Track Position Circle, Driver Ahead and Behind, Driver Relative, Leaderboard, Inputs, Proximity Radar, Delta vs PB, Lap Chart, HUD, Steering Wheel, Race Control Dashboard) know how to drop the controls the game has no data for (ERS column, gauge and trace, tyre glyphs, DRS pill, pit-window and strategy gadgets, the flag banner, the rejoin marker, wheel pages and tiles). Today no second game adapter ships, so what you get with another game is Waiting for <game> telemetry and a source-probe dump under PluginsData\Moverlay\diagnostics (written on its own for a game without an adapter, at most five per SimHub session, or on demand through the new ProbeSource action; widened to SessionData four levels deep, every raw Telemetry variable and the full driver lists) that the next phase reads its facts from. The whole non-F1 path is exercised by a test-only iRacing stand-in, not by a live game.
  • Settings profiles per game. The configuration file now keeps one settings profile per game family (Profiles.eaf1 for the EA F1 games) with the General, Sound Commands and Analysis sections shared. The settings page gains a Settings profile card on the General page's Plugin row that lists the profiles the plugin knows and opens on the active one; with the EA F1 games alone nothing changes and the card stays hidden. A tab the selected profile cannot show is collapsed, a row that reads an F1-only value is disabled with "(not available for )", and the Steering Wheel's Pages card names the pages the profile drops.
  • The Proximity Radar gained a track-distance mode for a game with no world positions (cars on a strip by distance along the lap, the side rails lit from the sim's own spotter) and the Track Map reads its outline from that game's SimHub track recording (PluginsData\<game>\MapRecords); both are fixture-tested only, the F1 radar and map are unchanged.

Performance

Since 2.28.2 the Pit Strategy planner's whole-race search ran from scratch on every snapshot, for everyone, whether or not anything drew its result: one 22-car snapshot took 0.72 ms and allocated 1.5 MB instead of the 0.20 ms / 0.13 MB of 2.28.1. The search is now run only while something shows the plan (the Pit Strategy overlay, the Steering Wheel's Systems page or a Race Control Dashboard Strategy gadget; the PitStrategy.* Dash Studio properties read Disabled in the meantime, as DeltaPb.* do while that overlay is hidden), its memo is shared by the tyre ranking, the immediate choice and the plan and kept from one snapshot to the next while the allocation, pit loss and rules are unchanged, and an unchanged plan is republished as the same object. Measured on the same fixture: 0.21 ms and 0.13 MB per snapshot with the plan on or off, 0.46 ms and no extra allocation on a snapshot whose inputs moved. Every published ranking, immediate call and plan is unchanged, and the benchmark now asserts the budget. Across the whole multi-game pass Telemetry.Read finishes at 0.21-0.22 ms and about 130.6 KB per 22-car snapshot, inside budget and with every 60 Hz sampler byte count unchanged from 2.28.2.

Strategy model

Strategy model repairs (the pit-stop / tyre-strategy review of 2026-09-20; the fixture and replay evidence is in docs/TIMING-VALIDATION.md 3.0.0). What the advice got wrong, and what it says now:

  • The dry two-compound rule was claimed in every race session, sprint races included, where the game has no such rule: a sprint run on one compound read STOP NEEDED · 2-COMPOUND RULE on the Safety Car Helper, the Pit Window could never say NO STOP and the plan was forced onto a second compound. It is a Grand Prix rule now and is never claimed in the sprint race of a sprint weekend.
  • The engine's own pit window subtracted the fitted set's age twice: the game's per-set delta already prices the worn set on the car, so the ideal lap was pulled earlier by a number of laps that grew with the stint (five to six laps mid-stint). The window is now the lap on which the fitted stint plus the cheapest complete plan from that lap costs least - the same search the Pit Strategy card plans with - and its reason names what decided it (a further stop, the new set's life, the fitted set's cliff, or the balance).
  • The Pit Strategy card ignored the Pit Window's decisions: it kept showing "1 STOP - MEDIUM L20-L51" beside a pill reading NO STOP, or a planned soft beside BOX NOW - FIT HARD under a safety car. It now reads No stop planned while the pill says NO STOP, publishes the plan from a stop at the end of this lap while a stop is on the table (a caution, the window open, a set with nothing left) so its first stint is the compound the pill and the Safety Car Helper name, and the helper's compound is that same immediate answer instead of a separate rank walk.
  • A plan that spent two sets of one compound priced the second as a copy of the first: the Baku allocation's used soft (1.09 s/lap, 17 laps to the cliff) was charged as the fresh set's 1.25 s and 19 laps, so stint ranges ran too long and costs too low. Every physical set is priced on its own and every stint names the set it spends.
  • A set of the fitted compound with the rule open was priced as its own pace plus one pit loss, with no stint of the other compound in the sum; it now carries the stint that discharges the rule.
  • The Safety Car Helper's net gain was the new set's offset against the stop alone: the wear swing between the set on the car and the new one over the stint is now in the gain, and a plan that needs a further stop pays that stop at the green-flag pit loss - the 2 STOPS NEEDED tail used to be free.
  • A measured tyre life scaled the mean corner's rate as if a set could be worn to 100 % (a set at 47 % read 0.74 of a fresh life instead of 0.33); it now runs from the set's wear to the cliff at the worst corner's rate, which is the number that decides NO STOP when no set packet is available.
  • A plan's first stop was always priced at the green-flag loss, so a stop under a safety car or a wing repair read 10-12 s too dear on the card; it now costs what that stop pays (the SC/VSC-reduced estimate with the pending stop/go and the repair inside it for a stop now, the green loss plus the same for the planned lap).
  • Deliberately unchanged, for the maintainer's decision: the 2.2 s/lap full-life pace loss, the SC/VSC pit-loss factors and the seconds-per-place price are judgement constants (the replays show a track-dependent curve, not a line), rain inside the plan's horizon does not shorten a dry plan, and pit loss is still not learned from stops made under a safety car.

Overlays

  • Per-game brand mark, deliberate and visible under EA F1 too, not only under another game. The Race Control Dashboard header and the Steering Wheel idle page each gain a small badge that was not there before - the game's own label (e.g. F1 25) next to the track name on the dashboard, and prefixed to the idle page's remembered last-session line - built from the same Source the plugin's other pages already read. The three analysis pages and the leaderboard header show the same badge beside the MOVERLAY wordmark (the F1 mark under an EA F1 game, as before, or the connected game's own label under any other recognised source). This also fixes a phase-3 bug on the leaderboard: a real EA adapter label such as "F1 25" was compared against the literal string F1, took the unbranded text path and silently lost the header's RACE session word - a real F1 25 game read the same as an unbranded source. Every "Waiting for MoverlayF1" / "Connecting to MoverlayF1" string across every renderer, dashboard and analysis page now reads Moverlay.

Tooling/tests

  • Five checked-in contract goldens (docs/DEVELOPMENT.md) pin the property surface, the full HTTP route table, every settings leaf key, representative projection keys and packaged dashboard/screen identities, so an accidental public change to any of them fails a test by name; phase 3 extends each with its Source/Support/profile additions. tools\Selftest-Renderers.ps1 runs every renderer's ?selftest=1 cases headlessly against canned Support fixtures and fails on any FAIL line; tests\Floor-Check.ps1 gained twelve iracing-* rows (the common slice against the iRacing fixtures, held to the same readability floors as the F1 rows, left out of the Compact baseline). tools\Capture-Previews.ps1 -Fixture iracing and tools\State-Proxy.ps1 -settings=<name> serve and capture the common renderer slice against canned non-F1 states for review, never shipped or embedded. The full suite passes 5,736 SDK/plugin assertions, tests\Installer.Tests.ps1 64 checks and tests\Setup.Tests.ps1 70 checks, all green.

Docs

  • Four new documents: docs/CANONICAL-UNITS.md (the units and signs every adapter must agree on), docs/FEATURE-INVENTORY.md (phase 0's classification of every snapshot field, reader, route, setting and renderer as common, adapter-assisted or F1-specific), docs/IRACING-SDK.md (direct iRacing SDK research: transport, variables and licence terms) and docs/IRACING-SLICE.md (the capabilities measured from the maintainer's own SimHub iRacing replays, which the test-only stub adapter declares). docs/MULTI-GAME.md phases 0-3 are marked done against their exit criteria and deviation lists; the recommended first implementation ticket (section 11) is marked shipped.