1.1.0 ​

Swofty Launcher for F1 25 1.1.0 is a performance release.

Play is much faster when nothing changed since the last launch. The launcher reuses the profile's last build while its addons, mods, settings, the game files it reads and the launcher itself are unchanged. It keeps the SHA-256 of each game file it checks in $DATA/state/hashes.json and hashes a file again only after it changes, keeps compressed resources in $DATA/cache/zstd until they go unused for 30 days, and asks the offline play extension about a game build once.

The game starts faster. swofty_core checks each game function at its address on the Steam build before it scans the code for it, keeps the addresses it did scan for in swofty/cache/scan-cache.tsv in the game folder, and scans with a faster search. loader.log is written from a background thread.

Menus and Team HQ run smoother. swofty_core no longer inspects every node as a menu builds and matches addon screens once per menu file. The copy of the game's own log takes only warnings and errors from the UI and flow channels, and repeated successful storage calls stop being logged after the first three. The SDK and the R&D: Tyres & Thermal Management addon check game memory once per region instead of once per page.

The launcher uses less CPU while it's open: it redraws when something it shows changes, and every 30 seconds otherwise.

When Steam is closed, Play and swofty run start it and wait for it to sign in before launching the game. The status line reads Starting Steam…, then Waiting for Steam to sign in…. To turn this off, clear Start Steam automatically in the menu next to Play, or run swofty run --no-start-steam for one launch. swofty steam shows whether Steam is running and signed in, and swofty steam --start starts it. See Steam.

The R&D: Tyres & Thermal Management addon 0.10.1 checks game memory through the SDK's region cache. The Career Mode Editor 0.2.1 renders its sections only while its page is open in the launcher, one section per frame, and writes its snapshot off the game's thread. Both still run on earlier launchers: R&D Tyres on 1.0.9 or later, the Career Mode Editor on 1.0.10 or later.

These switches help with troubleshooting. Set them under "env" in "launch" in $DATA/config.json; see Diagnostic switches.

VariableEffect
SWOFTY_UI_DIAG=1Logs each node of an addon screen as it builds, as earlier releases did
SWOFTY_LOG_SYNC=1Writes each loader.log line as it's logged
SWOFTY_STORAGE_LOG=allLogs every storage call
SWOFTY_RESOLVE=scanScans for every game function and leaves the scan cache off
SWOFTY_PERF=1Logs [perf] timing lines for screen opens, career flows, the game log and Career Editor sections

For addon authors:

  • swofty::mem caches each thread's VirtualQuery answer for regions of 1 MiB or more, beside its per-page cache. It's header-only: rebuild your plugin to pick it up, and it still runs on earlier launchers.
  • The game log's default channels take UI, flow and ERP loader messages at warn. verbose in channels adds their info messages back, so "default,verbose" matches earlier releases. See Logging.
  • Per-node screen build diagnostics are off by default. Turn them on with SWOFTY_UI_DIAG=1 or "diagnostics": true in the "ui" block of swofty/settings.json.
  • Each binding in bindings.json carries match, the RVA where its pattern matches on the analysed build. api->scan goes through the scan cache: a pattern found exactly once before is checked at its cached address first.
  • The storage API logs the first three successful calls of each kind from each addon, then only failures. SWOFTY_STORAGE_LOG=all logs every call.

Download it from Releases or with the installer. The launcher offers each new release itself.

Publishing