Skip to content

v1.35.0: GPL-3.0-or-later, framework-dependent build, provenance docs - #95

Merged
wygodad merged 7 commits into
mainfrom
test/fdd-signed
Aug 17, 2026
Merged

v1.35.0: GPL-3.0-or-later, framework-dependent build, provenance docs#95
wygodad merged 7 commits into
mainfrom
test/fdd-signed

Conversation

@wygodad

@wygodad wygodad commented Aug 17, 2026

Copy link
Copy Markdown
Owner

Working branch for v1.35.0. Draft on purpose - not ready to merge, opened so CI runs against the changes.

What is in here

Licensing. The code moves from MIT to GPL-3.0-or-later. MIT let anyone close the source and sell it; GPL keeps the freedoms attached to whatever gets redistributed. Releases through v1.34.x stay MIT for material the project had the right to license that way.

Name and artwork are outside the code license (TRADEMARK.md, LICENSE-ASSETS.md). Forks are welcome; shipping a modified build wearing this project's identity is not.

Provenance (THIRD-PARTY-NOTICES.md). Where the hardware knowledge came from, per structure, naming the specific upstream file and its SPDX header rather than the repository, and separating what was generated from upstream maps from what was researched with them as a reference. Origin and later hardware validation are recorded as different things, because verifying a mapping does not change where it first came from.

Distribution changes from self-contained to framework-dependent. The download goes from ~160 MB to ~2.5 MB and the .NET 8 Desktop Runtime becomes a requirement. The release asset is renamed to GhostDeck-win-x64.exe, which is what stops the in-app updater in v1.34.0 from swapping a self-contained install for a build that needs a runtime the user may not have.

Banners are raster now. The generator used to export every glyph as Bezier paths, so the committed SVGs were vector outlines of Segoe UI and Consolas. They are drawn to a bitmap instead, at twice the previous resolution.

Two fixes found while auditing. msiec-sync no longer treats charge addresses 0xD7 and 0xEF as interchangeable - the waiver never fired and could only have masked a G1 entry silently inheriting the G2 default. The supported-models doc now says fan and temperature registers were the part cross-checked against MControlCenter, which is what actually happened.

Verified, not just reasoned about

The migration path. A build from the v1.34.0 tag, differing only in the three API URLs, was pointed at a release carrying only the new asset name. It detected the update, offered Install, and on click fell back to the release page: no .update.exe, no .bak, no updater script in %TEMP%, and the running exe byte-identical afterwards. This is the failure that would have hurt - an update swapping a working install for an exe that cannot start - so it was tested against the code users actually have rather than read.

The signed artefact. A dry-run of the release workflow produced GhostDeck-win-x64.exe, 2.4 MB, version 1.35.0.0, Authenticode Valid, signed by WYGODA DAWID FENIX INSPIRE, and it runs. Worth recording: the unsigned framework-dependent single-file is deleted on sight by Defender as Behavior:Win32/Execution.A!ml, and once took GhostDeck's own scheduled task with it. The signed one is not touched. Local builds of this shape are not a valid test.

The release notes. The workflow extracts them from CHANGELOG.md with a regex, and that is the one release step dry-run skips, so it was checked against the final text.

Checks

Build 0 warnings, 699 translation keys x 15 languages, model database consistent and signature valid, README counters, supported-models doc regenerated from the code. CI green on every push to this branch.

Not in this release

The announcements.json entry is gated to maxVersion: 1.34.0, so only the people who have to act see it. Winget is untouched because the package was never published: the manifests exist locally at 1.28.0 and no submission was ever made.

The generator exported every glyph through FormattedText.BuildGeometry, so the
committed banners were vector outlines of Segoe UI and Consolas. Windows font
terms allow graphic images of text but not converting the fonts themselves, so
the banners are now drawn with DrawingContext.DrawText and saved as PNG through
RenderTargetBitmap. Nothing but pixels leaves the machine.

Rendered at 2560x600 from the same 1280x300 layout, so they are sharper on HiDPI
screens than the SVGs were. Layout, colours and copy are unchanged, except that
the profiles banner no longer states a model count: a number baked into an image
is not covered by the CI counter guard and would drift on every new model.
MIT let anyone take GhostDeck, close the source and sell it. GPL keeps the
freedoms attached: forking and selling stay allowed, but a distributed
modification has to carry the same rights and ship its source. Releases through
v1.34.x stay MIT for the material the project could license that way.

The name and the visual assets are deliberately outside the code license, in
TRADEMARK.md and LICENSE-ASSETS.md: forks are welcome, wearing this project's
face while claiming to be official is not. THIRD-PARTY-NOTICES.md records where
the hardware knowledge came from, naming the upstream file and its SPDX header
rather than the repository, and separating what was generated from upstream maps
from what was researched with them as a reference. Origin and later hardware
validation are tracked as different things, because verifying a mapping does not
change where it first came from.

licenses/ carries the terms of what the executable actually bundles, which is
System.Management and the .NET apphost, both MIT.

Also: msiec-sync no longer treats charge addresses 0xD7 and 0xEF as
interchangeable. Upstream uses 0xEF on G1 and 0xD7 on G2, and all 35 G1 entries
set it explicitly, so the waiver never fired - it could only ever have masked a
G1 entry losing its address and silently inheriting the G2 default. The
supported-models doc now says fan and temperature registers were the part
cross-checked against MControlCenter, which is what actually happened.
Matches the rename in the release workflow. The comment above the constant
explains why the name differs from the executable, so it does not get "fixed"
back later: an installed v1.34.x looks for an asset called exactly
GhostDeck.exe, and not finding one is what stops it from replacing a
self-contained copy with a build that needs a runtime the machine may not have.

Verified end to end against the v1.34.0 code rather than by reading it: a build
from that tag, differing only in the API URLs, was pointed at a release carrying
only the new asset name. It detected the update, offered Install, and on click
fell back to the release page - no .update.exe, no .bak, the running exe
byte-identical afterwards.
Targeted at maxVersion 1.34.0, so only the people who have to act see it and
anyone already on 1.35.0 does not.

The wording follows the behaviour the migration test actually produced rather
than a guess: clicking Install in v1.34.x reports a failed download and opens
the releases page, because the asset it looks for no longer exists. Left
unexplained that reads as a bug, so the notice says it in advance, states that
the installed copy is untouched, and points at the file to download. All 15
languages.
The release page is where someone lands after the updater opens it, so the
upgrade note goes at the top of the section rather than buried in a bullet.

The licensing entry claimed the MIT grant "still applies to" the older releases.
Narrowed to material the project had the right to license that way, matching the
wording already used in README - the point of documenting provenance is not to
then make broad claims about third-party rights.
Dated 2026-08-17. [Unreleased] stays as an empty heading so the next change has
somewhere to go.

The release workflow extracts its notes with a regex over this file, and that is
the one release step the signed dry-run does not exercise, so it was checked
against the final text: the match starts at the 1.35.0 heading, stops before
1.34.0, and picks up neither the empty Unreleased section nor the previous
release.
@wygodad
wygodad marked this pull request as ready for review August 17, 2026 11:49
@wygodad
wygodad merged commit 5043c0e into main Aug 17, 2026
5 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant