Maintainer notes for cutting a new version of Trueforce For All.
Releases are built locally. The plugin csproj references SimHub's
redistributable DLLs by hint path under $(SimHubPath), so a CI runner
without SimHub installed can't compile it. There is no GitHub Actions
workflow for releases. The build, tag, and draft-release flow below is the
whole process.
The csproj <Version> is the single source of truth for the release. It
populates the assembly version, which is what the in-panel header readout,
the diagnostics block, the changelog dialog, and the auto-updater all read
at runtime. The installer build picks it up via the TRUEFORCEFORALL_VERSION
environment variable (step 6 below); set that to the same value.
If you edit EULA.txt or LICENSE, bump #define LegalRevision in
installer/TrueforceForAll.iss. The installer records the revision each user
agreed to and skips the license + EULA pages on a later update only while it
still matches; bumping forces those pages to be shown (and re-accepted) once
after the text changes.
For each release:
-
Bump
<Version>X.Y.Z</Version>insrc/TrueforceForAll.Plugin/TrueforceForAll.Plugin.csproj. This drives the assembly version, the in-panel header readout, the auto-updater's "current version," and the User-Agent it sends to GitHub. -
Update
README.mdif any user-visible feature changed (especially the supported-games or wheels tables, install steps, known limitations). -
Changelog / What's new:
- The GitHub release notes are the canonical "What's new" source. The
in-app What's-new modal fetches and renders the published release body
(RenderReleaseNotes), so notes can be fixed post-release without a plugin
update. A normal fix/hotfix release needs no
EffectChangelogentry. EffectChangelog.cshas two separate jobs:- Badge registry (
KnownEffectIds): when the release adds a new effect, append its ID here (append-only, matchTrueforcePlugin.SectionKindnames). This is what fires the per-section "NEW" badge on upgrade. Required for a new effect, irrelevant otherwise. - Offline changelog (
Versions): the structured fallback rendered when the GitHub notes can't be fetched. Optional. To populate it, just mirror the release's GitHub notes into aChangelogVersion(oneChangelogEntryper note); setEffectIdon any entry that is a new effect so it also fires the badge.
- Badge registry (
- A new effect's
Enableddefault is a case-by-case call. Default-off is the safe baseline (the NEW badge surfaces it without changing how the wheel feels on upgrade); an effect most users will clearly want can ship on instead (the rev limiter does). Either way, keep itsCarOverrideslot nullable (= use global) so existing presets and per-car overrides inherit the chosen default with no migration.
- The GitHub release notes are the canonical "What's new" source. The
in-app What's-new modal fetches and renders the published release body
(RenderReleaseNotes), so notes can be fixed post-release without a plugin
update. A normal fix/hotfix release needs no
-
Hardware-validate any new telemetry source or game-detection change on the rig before tagging.
-
Commit the version bump (plus any README / changelog changes) to
mainand push it. -
Build the installer locally.
TRUEFORCEFORALL_VERSIONmust be set to the release version before invokingiscc; the Inno Setup script reads it at compile time and falls back to0.1.0-dev(which ends up in Add/Remove Programs and the installer filename) when it's empty:dotnet build src\TrueforceForAll.Plugin\TrueforceForAll.Plugin.csproj -c Release dotnet publish src\TrueforceForAll.LoopbackHelper\TrueforceForAll.LoopbackHelper.csproj -c Release -r win-x64 # confirm installer\vendor\USBPcapSetup.exe is present $env:TRUEFORCEFORALL_VERSION = 'X.Y.Z' # same value as the csproj <Version> # ISCC location varies by install mode: system-wide installs sit under # "C:\Program Files (x86)\Inno Setup 6\ISCC.exe"; per-user installs (the # default if you opted into "Install for me only") sit under # "$env:LOCALAPPDATA\Programs\Inno Setup 6\ISCC.exe". & "$env:LOCALAPPDATA\Programs\Inno Setup 6\ISCC.exe" installer\TrueforceForAll.iss
The artifact lands at
installer\output\TrueforceForAll-Setup.exe. -
Create a draft GitHub release targeting the version-bump commit on
main, and upload the installer:gh release create vX.Y.Z installer\output\TrueforceForAll-Setup.exe ` --draft --target main --title "vX.Y.Z: <description>" --notes-file notes.md
Title and notes conventions (consistent since v0.1.19):
- Title:
vX.Y.Z: <description>. Description is sentence case (first word plus proper nouns / acronyms capitalized, the rest lowercase, e.g. "Diagnostics improvements", "Xbox G923 FFB resolver Hotfix"). Capitalize "Hotfix". Keep thevX.Y.Z:prefix even though GitHub also shows the tag. - Body: group notes under markdown section headers (
### Bug fixes,## Diagnostics, and so on), never a bare bullet list; the in-app modal renders###/##as gold section headers. Lead each bullet with a bold one-line summary, then the detail. - Don't use
--generate-notes; write the notes by hand to these conventions.
- Title:
-
On GitHub, open the draft, give the notes a final read, tick "Set as the latest release," and Publish. Until you publish, the auto-updater and the in-app What's-new won't see it (
/releases/latestand the modal both skip drafts). -
After publishing, reload the plugin in SimHub on a test machine to confirm the update banner appears and the installer downloads, and that any new-effect badges plus the "What's new" banner surface as expected.