Repository navigation
What's new in 1.42.0 - the full write-up, with screenshots
[1.42.0] - 2026-10-24
Added
- Keyboard backlight on the Bravo 15 C7V / Katana A15 AI B8VG (
158NIMS1, model database 20261031,
#276, thanks @PedroElBigo) - the backlight level (off / low / mid / high) now works on this board. Its
4-zone RGB keyboard keeps the brightness in the same controller register as a single-colour one;
GhostDeck sets only the brightness, never the colours. - Crosshair presets in the tray menu - once you have saved a preset, the tray's Crosshair
entry becomes a submenu like Scenes: the on/off switch on top, then one entry per preset
with a dot on the active one; picking a preset loads it and shows the crosshair. Settings →
System → Tray menu gets two more switches, for the gaming overlay entries and for the
crosshair entry, next to the existing ones. - Copies of the settings in the app folder, with Restore and Delete - GhostDeck keeps copies
ofsettings.jsonin its own folder: one at start whenever a preference changed since the last
copy, one before every import, one when you click Save a copy now (Settings → System →
Backup), and one of a file it could not read. The Backup card lists them with the date and the
reason; Restore puts the chosen copy back, checked like an import, with the current settings
copied first; Delete removes one. You choose how many stay (50, 75, 100, 125 or 150); when
there are more, the oldest are deleted and the new ones saved. - The complete change history, on Status - every entry is written to
history-<year>.login
the app folder, which the app never trims (the first start also writes the entries the app
still remembers from before the file existed), and Status → Change log shows all of it: a range
(today, 7 days, 30 days, all), the count and a search field that filters as you type above the
table, a click on a column header to sort, rows in two tints that light up under the mouse, the
time in full. The newest 200 rows draw first and the next 200 come in on their own as you
scroll. Copy shown copies what is on screen, Open history file opens the year's file,
Clear the history copies everything to the app's backups folder first and then empties the
list and the files. The separate "Full log" window is gone; the tray's Change log entry
opens this sub-tab.
Security
- The command-line channel has limits - a program that connects to the running app's
command pipe and then says nothing, never ends its line, floods it or stops reading the answer
no longer holds the channel for every later command: the app reads with a deadline and a
length cap and drops such a client. A command the app did not answer in time is reported as
failed instead of being run a second time outside the app. - Release workflow actions pinned to commits - every GitHub action in the build, release
and sync workflows is referenced by its commit, not by a tag that could be re-pointed. - The unsigned model-database override stays in the program's folder - the developer hook
MSIPS_MODELS_JSONis taken only from the application's own folder in a release build (the
folder itself, a plain file: no sub-folder, no link); a path anywhere else is ignored and logged. - The in-app updater verifies the downloaded release - before anything is swapped, the
downloaded file has to carry a valid Authenticode signature from the GhostDeck release identity
(the signer's Trusted Signing certificate profile and publisher name, which survive the
certificate's regular rotation), and the version written into that signed file has to be the
one the release announced and newer than the running program, so a genuine older build cannot
be served as an update. A file that fails is deleted and the Updates tab says so instead of
installing it or sending you to download it again. The verified file stays locked for as long
as the app runs. - The update script no longer lives in the shared temp folder - it is written next to the
program, where it has the same protection the program itself has, and its text contains no
paths: they travel in the environment of the script's process. When it cannot be written
there, the update is called off and the app keeps running.
Fixed
- Command line reports the real result -
--profile,--cycle,--fanboost,--curve,
--kbd,--webcam,--fnswap,--charge,--panicand--sceneanswered "done" with exit
code 0 even when the write had failed and the app had shown the error on screen. They now
return exit code 1 with the reason. A scene, and the panic reset, run each of their steps on
their own, apply what they can and report the steps that failed, on screen, in the change log
and on the command line. Refusals that used to pass as success count as failures: Fan Boost on
the backup WMI path, a charge limit saved but not written while automatic writes are paused, a
turbo mode a scene could not set, a fan mode that could not be put back after Fan Boost.
--profileaccepts only the four profile names (a number such as 999 is refused up front).
The same holds with no app running:--fanboost offwhose fan mode could not be put back,
--profilewhose assigned fan curve could not be written and a--panicwith a failed step
say so and return exit code 1 instead of "done"; a travel mode caught up on the command line
whose previous limit could not be written says so instead of staying silent.
A command whose connection to the app broke before the answer is reported as uncertain, never
run a second time outside the app. - Importing a settings backup is all or nothing - a file that passed the first check but was
missing a part (for example"Hotkeys": null) used to change the language and clear the
shortcuts before it failed, and the next save kept that half-imported state. The file is now
checked and rehearsed on a copy first; one that fails leaves every setting as it was. A picture
carried by the backup is checked with the same limits as a picture chosen by hand, before
anything changes; a backup with a bad picture is refused as a whole. After an import or a
restore every page of the window is built again, so the imported scenes, presets and the rest
show up at once instead of after a restart. - A settings file the app cannot read is kept, not replaced - when
settings.jsoncould not
be read, the app used to start with default settings without a word and the next save
overwrote the file. It now keeps the unreadable file as a copy in the backups folder, writes
the reason toerrors.logand starts with defaults; the last good copy is one Restore away. - Settings that were never loaded are never saved - a settings object that did not go
through the app's own initialisation (one a tool or a test built a page on) is refused by the
save, with a line in the error log, so it can never replace your file with defaults. - Settings are saved through a temporary file - a crash or a full disk during a save can no
longer leave a truncatedsettings.jsonthat the next start would read as "no settings"; the
previous file is kept assettings.json.bak. - Updates tab at very large scales - the "Downloading… X%" label stays inside the page and
"Last checked" moves under the progress bar; when the two buttons cannot share a row they sit
one under the other. The label and the bar keep one place while the percentage counts up, the
bar is repainted at most a dozen times a second, and the signature check that follows the
download has its own line ("Checking the signature…") instead of a pause with no explanation. - Backup and diagnostics results as GhostDeck cards - "settings imported", "not a valid
settings file", "operation failed" and "saved to" on the Settings tab are GhostDeck cards now,
like every other message of the app, instead of Windows message boxes. - In-app updates in folders with national letters - the swap script was written as UTF-8 while
the console reads it in the system's OEM code page, so a path such asC:\Users\Łukasz\...was
invisible to it: the app closed with "Restarting", Windows reported that it could not find the
file, and the installed version stayed as it was. Paths now reach the
script through its environment, which also keeps a%or!in a folder name literal. - A failed swap puts the previous version back - each step of the update script is checked;
when the new program cannot be put in place or cannot be started, the old one is restored and
started, and the Updates tab reports which step failed. When even that restore fails, the old
program is left as.bak, nothing is started, and the tab says it had to be put back by hand.
Before, a failed second step left no program under the original name (only the.bak). - Updates tab: a long status stays readable - a refusal or a report about the previous update
is a sentence; it now wraps beside the buttons, or under them on a narrow window or a large
display scale, and the release history moves down to make room instead of covering it. The two
buttons grow with the display scale and with their text, so "Check now" at 200 % is whole. - Power test: restore after a partly written profile - a profile recipe is written byte by
byte, and a write that failed on its second byte had already changed the first. The run now
treats a started write as written, puts the starting profile back in that case too, and
reports a failed restore in the report and on the page instead of hiding it. - Text cut off at high display scaling (#172, thanks @UzaydaGezen) - at
about 200 % the shortcut fields, the Fan curve buttons, mode label and chart axes, the RAM, VRAM
and disk rows, the Gaming tiles and charts, the Fn left/right switch, the Settings tab strip and
several drop-down lists were too small for their text. Boxes, rows and buttons now grow with the
text, lists are as wide as their longest value, long labels wrap instead of ending in "...", and
the change log sizes its columns to what they hold. The crosshair sliders show their whole value
and form one column of equal tracks, with the "?" beside the "Size" label instead of in front of
the slider. The boxes under the Status gauges grow with the display scale, so every box shows
its text in the same size, and the gauges above them grow by half of the scale's growth; the
history charts keep the value and time labels apart, fan curve point labels stay inside the
chart, and the overlay settings fit every metric name. The
"Show overlay" switch, the crosshair hotkey's "(disabled)", the switches on the Settings tiles and
the travel mode "?" line up with what sits next to them, and help dots, colour swatches, slider
handles and list arrows grow with the scale. The icon buttons in the window header (Models,
updates, report, theme) and the scene cards' actions show whole icons; the scene actions sit on
the name line and every card's settings start right under its name. The Deck view draws bigger
dials with the scale labels below the centre, clear of the curve, and the live reading beside
the dial. The "Report my model" wizard, the live EC view and the help bubbles scale with the
display too. - Older laptops without an entry recognised in every scenario (#268, #257) - on
laptops whose firmware does not answer MSI's usual interface, GhostDeck recognises a known layout
of the data blocks by a few values. One of them follows the MSI Center scenario, so a laptop
started in Balanced or Extreme showed temperatures only, without fan readings and without the
offer to send a report. The check no longer uses that value. - On/off switches at high scaling - the switches on Settings, Scenarios and the overlay
settings grow by a quarter of the display scale's growth (57 x 31 px at 140 %, 65 x 35 px at
200 %), so they no longer look tiny next to their labels; at 100 % they are unchanged. - Turkish card headings (#172) - headings written in capitals kept the
dotless "ı" lower-case ("PİL SAĞLıĞı"); they now follow the rules of the selected language
("PİL SAĞLIĞI"). - No long dashes in the interface - every em dash in the app's texts, in all 15 languages,
became a short dash or a comma. - On-screen notifications at 125-150 % display scaling - a short title such as "SSD running
hot" no longer breaks onto two lines, "75°C" is never split after the degree sign, and the title
and the message start in the same column. The toast's margins and width now grow with the display
scale like its text; long messages still wrap, at spaces only.
Changed
- Model database 20261101: MSI Katana 17 B12VEK added to the B12UCXK / B12VGK entry (
17L5EMS2, the same MS-17L5 board) (#277, thanks @bel5656). - Model database 20261030: MSI Bravo 15 C7V / Katana A15 AI B8VG (
158NIMS1) promoted to Tested - snapshot and fan curve confirmed again and a clean power test (Extreme +8 %; Silent keeps the speed on clearly slower fans, the same in an earlier owner's runs, recorded as a trait of the board) (#274, #275, #276, thanks @PedroElBigo; earlier reports by @dmas-dll and @Lofre). An eighth owner confirms the Vector 16 HX AI / Raider 16 HX AI (#272, thanks @nicosergia08-cyber) and a second owner the Vector A16 HX A8WIG fan curve (#273, thanks @harunomar54). - Model database 20261029: MSI Katana 17 HX B14WFK added to the B14WGK entry (
17L7EMS1, the same MS-17L7 board) (#269, thanks @brnxt0); MSI Thin 15 B12UCX / B12VE (16R8IMS2) - a third owner's clean power test confirms stable switching (#271, thanks @skinthread). - Model database 20261028: MSI Katana 17 HX B14WGK (
17L7EMS1) - fan curve verified (#266, thanks @kaszaslevi04). - Model database 20261027: MSI Vector GP68 HX 13V (
15M1IMS1) promoted to Tested - scenario capture 1:1 with a real Silent, the fan curve confirmed again and a clean power test (Silent 81 % of Balanced's work, Extreme +7 %) (#262, #263, #264, thanks @mara-zhu).
Full Changelog: v1.41.0...v1.42.0