Changelog
The release history. Download any tagged version as a .streamDeckPlugin from the GitHub releases page. Generated from the repo’s CHANGELOG.md; do not edit this page by hand.
One entry per version. A tagged version is built and staged as a draft GitHub release by the workflow; I publish the draft by hand. The Elgato Marketplace listing is a separate track.
1.7.0.0 - 2026-10-11
Redesigned settings panels, per-reading dial colors and reliability fixes in one release.
- The settings panels for Sensor Reading keys, Sensor Dials, HWiNFO Control keys and detail tiles share one essentials-first layout. On Sensor Reading keys and Sensor Dials a header with the exact face the plugin last drew and its live state stays pinned while you scroll the app’s own 410 px panel, and a theme strip under it opens on a first visit (one line naming what is drawn and where it comes from, such as “Default (shared: Void)” with Change beside it, then every theme as a chip drawn in its own colors with its name on it). The strip folds like a section; folded, its line keeps the checked theme as a small chip in that theme’s colors, beside where it comes from. When a key’s or dial’s own theme differs from the shared one, Make shared takes Change’s place: it makes that theme the shared theme and sets the key or dial back to Default. The chips keep the themes’ defined order in the Stream Deck app, which delivered them alphabetized. Then come Reading, Display, Alerts, Press (Controls on a dial) and Advanced, whose Shared defaults, Connection, Support and Configuration documents fold on their own. Reading and Display start open, a section you open or fold stays that way on the next key’s panel while the app runs (the two chevron buttons at the top right of the header, or Alt-click on a title, open or fold them all; never stored in a key’s settings), and every folded section’s title line says what it holds in the runtime’s own terms: inherited choices are marked “shared”, thresholds read as at or beyond (≥, ≤) with their unit and a dial’s unit scope, and a dial’s gesture line follows the resolved preset, so a tap made dead by touch zones is not listed. Open, a section drops that line and keeps its longer explanations behind a How … works link. A default key’s panel measures more than a quarter shorter than the first 1.7 draft’s, which never shipped (1,042 to 753 CSS px on the simulated test host). Fields and buttons share one height (28 px), every theme chip carries its name, and small marks (checkboxes, group radios, text actions) take at least a 24 px target.
- The panel tells its states apart: connecting, plugin not answering, no reading selected, HWiNFO unavailable (the saved reading is kept and never called missing), no new Shared Memory data (with how long, for example “Not updating for 42 s”), an unknown Gadget data age (named as unknown, never as stopped), the source being reopened after a layout change or restart (“Reopening source”, never “Live”), saved reading not found, and no search matches. The header’s state uses the words on the face. Where there is a local fix, it sits right under the header: Check again (which says when the answer came back if nothing changed), HWiNFO setup steps, Pick another reading, or, when Data source is set to one provider only, a way to that setting. A healthy Gadget source says so in one line; the rest sits under Advanced, Connection.
- Opening a panel writes nothing, and an edit changes only the field it touched. Rotation groups, detail tiles, per-reading names, quad cell colors and list entries keep fields and entries this version does not know instead of being normalized away, and a stored choice this version does not know shows as kept rather than silently replaced. Replacing the shared settings document, removing a rotation group that holds readings and a merge that drops group names or folds two or more groups of readings into one each ask for a second, separate press: a quick double click only arms them, and so does a mouse button already held down when Enter arms them.
- The reading picker is built once per sensor list and filtered in place, and stays responsive on a 5,000-reading tree (PERF.md). It follows the combobox pattern: arrow keys browse, Enter picks, Tab or a click elsewhere closes without changing anything. Rotation membership and custom detail lists are checklists instead (one Tab stop; arrow keys move inside), so ticking a reading never changes the reading on the dial. On a dial the rotation sits right under the reading on the dial: the search that ticks readings first, then the rotation as one list (one Tab stop; arrow keys select) with the reading on the dial marked, so you can watch it move as you turn, and one toolbar under it, Earlier, Later, Rename and Remove, for the selected reading. At a group’s edge Earlier and Later move the reading into the neighboring group. A reading HWiNFO no longer lists shows a “missing” pill, two readings with the same name carry the word that tells their sensors apart (for example #0 and #1), and the lines under the lists follow the dial’s control map (what a turn or a pressed turn does, and when the reading on the dial is outside the set). The dial’s face sits beside its name in the header instead of above it, and the header leads with the name the dial shows.
- The Stream Deck app keeps the Escape key and most of its own clicks from reaching a panel, so the open list also closes on a second click in the box and when the panel loses focus. Moving the pointer out of the panel never closes it. A click that opens it selects the whole name, so typing replaces it. Text typed just before selecting another key is saved as the pointer leaves, instead of being lost with the panel.
- Faces as the device draws them: the app’s SVG engine dropped the gap before a unit (“59.7°C”). Dual keys and dials now draw a space (“59.7 °C”), unless it would shrink a value, and three-row keys keep their units tight so the labels keep the room. On a dual key with a pinned second row, a row’s MIN, MAX or AVG sits after its own label when the label still draws whole at its usual size, so that value keeps its size as a press cycles the stats; otherwise it follows the value as in 1.6.0 and the label stays whole. When both rows show the same stat, one badge sits in the divider, as in 1.6.0.
- Every control has a programmatic name and a visible focus ring, text contrast and small targets were raised, and the panels reflow at 320 px wide without horizontal scrolling.
- Labels follow the new vocabulary; the renames change no stored settings. “Deck default” is now Default; the deck theme, deck text and type accents are Theme, Text color and Accent colors under Advanced, Shared defaults (marked “All keys and dials”); Poll every is Read every; Label mode is Title when the dial moves on; Reset reach is A stats reset clears; Press does is A press; Detail contains is Details list; Tile shows is Readings per tile; and “Repeat Back under this key’s own cell” is “Also go back from this key’s own position”. The Text color help says it colors the numbers and labels while graphs, bars and stat badges take the accent color, and the Accent colors help says which colors reach the numbers (issue #31).
- Malformed Gadget raw numbers remain unavailable instead of displaying a numeric prefix or adding it to freshness, history and session statistics. Healthy neighboring readings keep serving. Detail faces also refresh when a legacy Gadget alias becomes ambiguous or recovers.
- A raw value that overflows to infinity is unavailable everywhere it is compared, not only where it is drawn: it no longer paints a key critical, colors a dial row with the alert color, or holds an alert-aware auto cycle on the reading, while the face shows no value. A data reading that only overflows once converted to bytes shows the same unavailable mark in its own unit instead of “Infinity”. A dial’s session AVG stays a number when readings are large enough to overflow their running total.
- A key, dial or HWiNFO Control key held down while its settings change does nothing when released: the press ends, and the next press uses the new settings. Before, a held press could run the command the new settings named, such as resetting every dial. The press also stays over when the Stream Deck app repeats the key-down or replays the key’s appearance while it is held. A key set to open details on a hold opens them when held past half a second, even if a busy or waking PC delivers the release before the hold is noticed.
- Auto cycle keeps its interval when the Windows clock is corrected, and so do the detail view’s Back (a second press right after the first is still one hop) and the settings panel’s second-press confirmations. A hand-edited interval that is not a number or text (true, a list) reads as off instead of cycling. A threshold typed while HWiNFO is away applies to the reading it was typed for, even if the dial moves before data returns.
- A newly accepted source keeps its own sample age. Switching from recent Gadget values to an old Shared Memory sample no longer makes that sample appear live.
- Shared Memory readings with a duplicated stable identity or a missing sensor owner are withheld instead of receiving keys based on list order. Healthy readings keep serving, and a unique identity recovers on its own with a fresh history segment. Saved selections are never rewritten; old duplicate-suffixed or ownerless keys need reselection after repair.
- Invalid theme names fall back safely. The settings panel refreshes its picker after source recovery or a provider change, preserves drafts in the Configuration documents, fills them from the settings it already holds (a slow reply to a fresh read could put an older document back into the panel), and retains unknown fields in them. A reading name holding a malformed character no longer empties the picker. A detail tile setting this version cannot read stays as stored when the tile is edited, and a hand-edited command or shared theme that is not text no longer stops a panel summary from drawing.
- Copy support report copies only the report it asked for, once: a late, repeated or unrequested answer, or an earlier copy that failed late, no longer replaces the clipboard.
- Shared settings changed just as the plugin starts are kept: the plugin no longer applies or writes back an older copy that reached it first.
- Group jumps skip a confirmed alias of the current reading so the next distinct reading in the target group remains reachable.
- The plugin log quotes names that come from HWiNFO or the Stream Deck app, so a name with a line break in it stays on its own log line.
- Two-row and three-row dials can color each reading’s number separately. Display adds Reading colors with Signal, Pairs and Uniform presets, individual color wells, and Auto resets. Colors follow each reading through rotation, reordering, groups and confirmed cross-source links, including with Type accents off. An optional Color numbers by sensor type setting uses automatic category colors. Valid Custom Text and alerts retain priority. Both color options are opt-in; existing settings do not enable them automatically.
- Two ticked Gadget readings that share a source name and label are both withheld while both are ticked, instead of being numbered in encounter order. HWiNFO reports some readings twice under one name (a GPU fan once in RPM and once in percent, for example), and a shift-click range ticks both. In HWiNFO, untick or relabel the one your key should not show, and the other comes back on its own after two polls. Nothing is written to disk and nothing is remembered after a plugin restart. HWiNFO rewrites its Gadget rows one at a time after a tick or untick, so a name seen on two rows for the first time skips that one poll like any torn read, and a poll that then shows it on one row is skipped as well, because that can be the moment the other row is being rewritten; only a name still on two rows at the next poll is withheld, and the plugin log names the slots once. A name that comes back alone under a different unit than it last showed is taken as such a first sighting too, because a twin that sorts ahead of the one on the key lands in its slot first; a unit that HWiNFO itself changes therefore costs two skipped polls before the new unit shows. Sparse slots and names containing spaces keep working.
- Most Gadget selections saved by 1.6.0 keep working after the upgrade. HWiNFO’s standard source names (“CPU [#0]:
") carry a colon, and 1.7 stores readings with a colon or tilde in the name under a new key format, so the provider republishes the 1.6 spelling as a checked alias when exactly one current reading renders to it and no live reading owns that spelling. Keys, dense layouts, dials, rotation sets, groups, custom detail lists, and per-reading names and colors saved under the old spelling resolve through it. An old spelling that now matches two readings does not resolve while it is ambiguous. Selections whose label reads exactly "Reading 0" through "Reading 1023", whose source name or reading label contains any literal tilde ("~"), or whose old key carried the "~n" duplicate suffix get no alias and need one reselection. This includes unique names such as "Hot~Spot" and "CPU~Package". If both readings of a same-name pair were ticked, 1.6.0 showed both (the second as a "~1" copy). 1.7 withholds both while both are ticked. A key that 1.6.0 saved on the plain name was on the first of the two, so untick or relabel the second; a key saved on the copy needs one reselection. - Advanced users can explicitly link a Shared Memory key and its Gadget counterpart in the Shared settings document (Advanced > Configuration documents). Links apply to keys, dense layouts, dials and custom detail lists in either provider direction. Nothing is inferred from similar names or values. Conflicting links and changed native units or types are refused. The type is checked on the Shared Memory side, where it is HWiNFO’s own, so a percent reading that HWiNFO types as Other links in both directions, and a Yes/No reading carries the unit
Yes/Noon both sources. A pairing edit takes effect at once on every key, dial and tile; re-applying or reordering the same pairs changes nothing. A rotation set or group that holds both endpoints of one pair steps through it as one reading, and a custom detail list shows one cell per measurement. If a custom list already contains both keys, the duplicate cell’s label and color are hidden with it, preserving later tiles’ styling. Unlinking restores the saved layout unless an explicit detail-list or tile edit saves the shown layout. Per-reading names and colors follow a confirmed alias, and the settings panel shows a linked saved key as present, with its label, tick and color. - The settings panel’s sensor list shows every reading. It used to stop after 150 rows, so on a system with many CPU readings a later source such as the GPU only appeared when searched for, and a reading ticked or selected there could not be seen or unticked in the list.
- A stale sensor snapshot keeps the picker’s missing-reading cue, matching the panel header; an unavailable source still leaves the picker neutral. Bar and Ring help now distinguishes Shared Memory session min/max from Gadget’s moving window of 36 samples, which restarts after a gap.
- Gadget starts with unknown freshness until a value change is observed. Unchanged registry values show Age unknown instead of claiming HWiNFO stalled. A Yes/No reading’s raw flip counts as value evidence, and its unit no longer changes with the word, so a dial threshold set while it reads No fires when it reads Yes. A Yes/No reading now reads as the word HWiNFO itself shows, Yes or No, on keys, dials and tiles, instead of the 0.00 it had carried since 1.6.0; thresholds still compare the 0 or 1 underneath. Its Bar or Ring runs empty to full on either source. Gadget historical fields are unavailable, with an N/A badge and an empty value for MIN/MAX/AVG on keys and detail tiles. The Gadget baseline survives a page change, a drill-down and Back, so the page you land on shows values instead of starting again at Age unknown, and a steady Gadget source is no longer reopened every few seconds while it rests there.
- Opening a source is never evidence of freshness. After a source switch, a page change or a reopen, the held values keep their real age and source, and the stale screen names the source the values came from. A Shared Memory timestamp is aged by the clock HWiNFO wrote it from, so a HWiNFO that stopped polling, before or while the keys were off screen, no longer shows as live for 15 seconds after a page change, a Source change or a plugin start. This also applies when a poll is delayed: a newer timestamp on an unchanged value cannot make an already-old sample fresh again.
- Sparklines capture subsecond value changes and end their segment on a skipped read, missing reading, unit change, provider transition or stale window. Dial session statistics count observed changes and producer stamps once; missing readings, stale or unavailable data, unit or provider changes and explicit resets start a new session, and the first live frame after a stale or unavailable tick shows “stats reset: data gap” once. A pairing edit ends a session or sparkline segment only where the saved key now stands for a different measurement; adding or removing an alias for the same measurement resets nothing. Averages are sample-weighted. Retained single-view sessions also reset when a reading disappears or changes source, unit, type or measurement while another reading is selected. Ordinary rotation preserves the session without counting unseen values.
- Shared Memory’s cached reader checks the owning sensor ID and instance before updating a value, including descriptor-only topology changes.
- Gadget rereads each row before accepting a scan and retries a scan whose fields changed between the two reads. A row whose formatted value contradicts its raw value skips one scan like any interleave; when it contradicts itself on consecutive scans it is withheld on its own: the other rows keep working, the plugin log names the reading and its slot once, and the settings panel says so. This catches detectable partial writes; the registry still cannot prove an atomic producer update. Reopening the registry and metadata changes do not establish freshness.
- Correction to the 1.6.0.0 entry: the Gadget scan does not cost the same whatever the number of ticked readings; its 2.7 ms was measured with 13 readings ticked, and the cost grows with the selection, to about 150 ms per poll with all 554 readings on my bench ticked (measured in PERF.md, 2026-09-20), so tick the readings you put on the deck. 1.7 also rereads each row to catch rows HWiNFO is renumbering, which roughly doubles the registry reads per ticked reading compared with 1.6.0 (counted: 1,024 plus 7 per reading, against 1,024 plus 3).
- In Auto mode with Shared Memory not running, a Gadget key that opened but whose scan was refused shows Source busy (the registry changed during the scan) or Source error (a registry value that cannot be read as text) instead of Start HWiNFO. A Shared Memory mapping that exists but is switched off is still reported as Shared Memory is off.
- Source statistic capabilities are explicit. Dial sessions show a brief reset reason when their measurement, native unit, type or source changes, and once after a data gap.
- Built-in value, unit and numeric statistic colors keep at least 4.5:1 authored contrast in normal, dim, dense and dial alert views, and Dim keeps labels at least as readable as units. Individually chosen reading, quad cell and detail tile colors render exactly in Theme mode and are only dimmed in Dim mode; a valid Custom Text color stays exact and replaces them while it is set. Moving readings in a custom detail list keeps automatic colors adjusted for the theme instead of turning them into chosen colors.
- Keys, dials and detail tiles keep the Tahoma Bold they have always drawn on the device, now named outright and measured. Earlier versions named a font list, which the Stream Deck app’s SVG renderer reads as one unknown name, so it drew Tahoma while every layout was measured for the narrower Segoe UI: on hardware a three-row label could run into its value and a long status line off the key. Every fit now measures the ink Tahoma Bold actually draws, from the font’s own metrics, against the key’s visible area and the dial’s edge. Where 1.6.0 drew a title, label, value or stats line whole and clear of its neighbors, 1.7 keeps its size and letters, except where 1.6.0’s ink already sat within a pixel or two of the edge or of its neighbor. Text that ran into a value or off the key now shortens or steps down a size instead. Accented Latin, Greek and Cyrillic letters are measured too. Two trades remain on three-row keys: a value too wide for 18 px draws at 16 px so its label keeps its letters, and a label stays within 2 px of its row’s other labels.
- Faces no longer ask for letter spacing, which the Stream Deck app never draws, so the settings panel preview and the docs images now match the keys and dials.
- New Text font setting under Advanced, Shared defaults: Tahoma (the default) or Segoe UI, the font of Windows and the settings panel, lighter and narrower, so long labels fit more often. It applies to every Sensor Reading key, Sensor Dial and detail tile (the HWiNFO Control key keeps its fixed Tahoma icon); an install without the setting keeps Tahoma.
- A two-reading key keeps its value whole when a reading’s unit is long: the unit is shortened instead of pushing the number’s first digits off the key, and units that fit are unchanged.
- A dial row in critical is a brighter red than in 1.6.0: on the dark themes it reads at 4.5:1 or better, where 1.6.0’s red read below 4:1, and it stays apart from the temperature color. A row in warning keeps 1.6.0’s amber on the dark themes. On Paper both are darkened until they read at 4.5:1.
- A three-row Overview dial no longer cuts Mbps, Gbps, MB/s or MT/s at the screen edge: the value and unit columns slide left together when the widest unit needs the room, and faces whose units already fit are unchanged.
- The HWiNFO Control key’s success tick no longer sticks to the key when the key leaves the screen inside the tick’s moment (a Multi Action that also switches the page does that): the icon is restored on the way out and again when the key returns.
- The Configuration documents keep a Gadget key whole, including trailing whitespace in its label; only leading whitespace is dropped.
- The settings panel keeps unapplied edits to the Configuration documents when Advanced is closed and reopened, closes the sensor picker when keyboard focus leaves it, and no longer marks saved selections as missing while the source is unavailable.
- Invalid control characters in labels are replaced instead of breaking the key or dial image.
- Release builds validate exact tag and package versions, and a dated CHANGELOG entry for the tag, before installing dependencies, and only the separate release-staging job receives write permission, and the CI workflow runs under a read-only token; the release stages a draft rather than publishing one. The external soak monitor now distinguishes plugin and host resources, process restarts and failed observations.
- One command,
npm run release:validate, runs the whole software qualification from a clean clone in a fixed order (static checks, native build, bundle, unit and native suites, pack, archive contract, ABI check and recovery suite on the extracted bytes, validators) and writes a record of the bytes each stage exercised. CI packs the plugin on every push, holds the archive to the shipping contract, and runs the ABI check and the recovery suite on the extracted bytes. release-native-manifest.jsonrecords the Windows SDK version the addon was built against, the release run refuses a compiler version that is not a version, and it compares the builthwsm.nodewith the previous release’s manifest and annotates the run when the bytes moved without a native source change. The packaging gate refuses a vendoredhwsm.nodethat was built from other native sources than the tree it sits in, and the manifest step refuses a binary that lacks any of the hardening flags the build asks for. Packing now runs the Elgato CLI over a staged copy of the plugin directory, so the tracked manifest is left untouched, and the packed archive itself is held to a checked-in list of its members: a missing or extra member, a member whose bytes differ from the built files, a log, symbol or test-only addon, an unsafe path, a duplicate or case-colliding name, a damaged entry, or a manifest that disagrees with the checkout fails the pack and removes the archive.- The bundle ships
@elgato/streamdeck2.1.2 with@elgato/utils0.6.0, and the release and CI workflows run on the Node 24 generation of their pinned actions. Native C behavior and the API are unchanged; the build now enforces warning level 4 and treats warnings as errors after node-gyp defaults are applied, which changes the recorded build source ID.
1.6.92.0 - 2026-09-09
- GitHub preview for issue #31, based only on released 1.6.0. Not a Marketplace release. Adds Color numbers by sensor type and independent Reading colors under Appearance for two-row and three-row dials. Signal, Pairs and Uniform presets share the four-reading key’s palette; individual color wells follow reading identity through rotation and groups.
- Chosen colors work with Type accents off, keeping existing graph colors. Valid Custom Text and alerts retain priority; Dim uses the existing blend. Existing settings, single dials and every key layout keep their behavior.
- Multi-row gallery examples use the runtime composer with achievable settings. Colored examples remain preview-only until a corrected Marketplace build ships. Native bytes are reused from v1.6.0.
- This preview upgrades 1.6.0 and 1.6.90. Planned stable 1.7.0 supersedes it; 1.6.1 does not. See the preview’s install and return-to-stable notes.
1.6.0.0 - 2026-09-04
- A detail tile can carry one to four readings. The new Tile shows setting packs two, three or four readings onto each tile of the drill-down view, using the same stacked, row and quad faces regular keys have: a dense tile shows one shared stat badge, a press cycles everything on it together, and paging counts readings rather than tiles, so a Stream Deck + XL page can list up to 128 readings at once. One reading per tile stays the default and keeps the page exactly as it was.
- The second Back under your finger is now on by default: press a key to open its details and the same cell becomes a Back tile, so the finger that pressed in presses right back out. The movable top-left Back stays as well. Untick “Repeat Back under this key’s own cell” to keep only the top-left Back; a choice you already made either way is preserved. (1.5.0 shipped this off by default.)
- A custom sensor list can group and dress its tiles one by one. Each tile in the list grows a size cycler and per-cell labels (click a name to rename it), and a four-reading tile adds per-cell colors with a switch to bare color-coded values, the same knobs a regular key of that size has. Chips drag between tiles with the landing point painted at the cell edge nearest the pointer, whole tiles drag (and arrow-key) as one unit, and a reading’s label and color travel with it wherever it moves. Removing a reading shrinks the tile that held it instead of pulling the next reading up into a layout you were looking at.
- The settings panel’s Advanced fold gains a Config section: this key’s (or dial’s) settings and the deck-wide settings as one JSON document you can copy, keep and apply, for backing up a hand-built layout or cloning it onto another key or machine. Reading keys in the document carry their friendly sensor names so the list reads and reorders by hand; Apply strips the names, replaces the whole document in one write, and reloads the panel. Copy always hands out the settings of the moment you press it, and says so honestly if the clipboard refuses.
- The detail filter got faster and more talkative: the pattern matcher now runs in linear time (an adversarial pattern could previously stall a match for minutes, re-run every poll), and the panel shows a live match count under the filter field before you ever press the key.
- Hardening across the faces: hostile text degrades instead of breaking a render (a lone UTF-16 surrogate no longer aborts the face, an absurdly long pasted label no longer stalls a tick, a hand-edited decimals value falls back to auto), an invalid per-key theme now follows the deck default instead of the built-in one, faces repaint when their data changes rather than on every clock tick, and the HWiNFO Control success badge can no longer hold a closing plugin process open for its last 700 ms.
- The Gadget registry no longer ends at the first gap in HWiNFO’s numbering. HWiNFO gives every reading you tick “Report value in Gadget” a numbered slot and keeps that number reserved while the reading is unticked, writing nothing into it, so a list of 39 ticked readings can carry a dozen holes. The reader treated the first missing slot as the end of the list: on the reported setup 25 readings were published and 4 showed up, and a hole at slot 0 read as an empty Gadget key. The scan now walks the whole bounded range (1,024 slots, about 2.7 ms per poll on my bench whatever the number of ticked readings; measured in PERF.md), so every published reading reaches keys, dials and the Sensor details view, and a missing slot is never mistaken for a fault. (Reported in issue #21.)
- The Gadget setup guidance names where the tick actually lives: the sensor window’s Configure Sensors dialog, HWiNFO Gadget tab, then the Enable reporting to Gadget switch and Report value in Gadget on each reading, not a right-click menu. The status screens, the settings panel’s first-run tip and the docs all say so now.
1.5.90.0 - 2026-08-11
Preview build for the issue #5 follow-up, cut from the detail-density branch for tester validation ahead of the next release. Not a general release.
- “Tile shows” on a detail opener packs 1 to 4 readings onto each tile of the detail view, using the same stacked, row and quad faces regular keys have. Pressing a dense tile cycles the stat for all of its readings together, and a quad’s micro labels drop the leading tokens all four cells share.
- A Custom sensor list can group its tiles one by one: per-tile size, per-cell labels and quad identity colors, edited in the key’s sensor list with drag, an armed plus marker, and inline pick results.
- The detail filter matches in linear time and now survives sensor names that carry their own literal wildcard characters; hostile text in labels (an unpaired surrogate, a very long paste) degrades to a safe face instead of freezing a tile or stalling a poll tick.
- Carries the sparkline fix that also ships in 1.5.1: changing the Poll interval no longer stops sparklines from collecting, so this preview is a superset of the current stable release.
1.5.1.0 - 2026-08-11
- Sparklines no longer disappear for good after a Poll interval change. The poller reset its sample rings by dropping them entirely, and those rings are what mark a reading as collected, so a key that was showing a sparkline stopped collecting one the moment the interval changed and never resumed until the key was reloaded. Bar and Ring keys lost the same evidence for their session bounds, and a two-row dial lost its row lines. The rings now empty in place: a cadence change still discards samples from the old rhythm, but the readings stay subscribed. Starting the plugin with a saved non-default interval hit the same path once per launch, so a custom interval could cost the first sparkline of every session.
1.5.0.0 - 2026-08-02
- The plugin could quit on its own about half a minute after every start, leaving every key frozen on its last reading until the Stream Deck app was closed and reopened. A safety check that exists to clean up after an app crash decided the app was gone whenever it could not inspect it, which on some machines is always, so it shut the plugin down 30 seconds into every session. That check now treats “cannot inspect” as what it is, never arms at all on a machine that cannot answer the question, waits for two sightings in a row, and asks the app directly before quitting: if the app answers, the check stands down for the rest of the session. It also logs why, so the next report needs no guesswork. The behaviour it protects against is unchanged: when the app really is gone, the plugin still exits instead of polling for nobody. This was wrong from 1.1.1.0 onwards. (Reported by @zekkragnos in issue #17, who sent the log that proved it.)
- “Copy support report” now says “Plugin not responding” if nothing answers within three seconds, instead of sitting there disabled. The report is built by the plugin, so a plugin that is not running could never answer, and the one button meant to diagnose that looked simply broken.
- A key or dial no longer keeps a stale picture after the Stream Deck app reconnects or the machine wakes. Both skip redrawing when the new face is identical to the last one they sent, and they were carrying that memory across a replayed appearance, which is exactly when the app’s own image cache can be cold. A key showing a status screen, or a reading that sits on the same number, could stay on the old picture indefinitely. The detail view already did this correctly; now the key and dial do too, with the end-to-end suite parking both on a sensor HWiNFO does not publish, so the face cannot change by itself and the repaint is the only thing that can produce a frame.
- Two support paths that were dead ends: the sentence explaining WHY the native bridge was rejected went to a console nobody can read, so it now travels with the error into the log, and “Access denied” no longer insists the cause is always elevation. HWiNFO running as a different Windows user produces the identical error, and no amount of un-elevating fixes that one.
- An empty
HWINFO_SM2_NAME,HWINFO_SM2_MUTEX_NAMEorHWINFO_VSB_KEYenvironment variable is now treated as “not set” rather than as an empty name, which the native layer rejected and which left the keys stuck on “HWiNFO error” until the variable was deleted. - A plugin whose connection to the Stream Deck app died while keys were on screen used to keep running: it went on reading HWiNFO and drawing frames into a closed pipe, forever, with nothing in the log. The app is now the only thing keeping the plugin alive, so a dead connection ends it and the app can start a fresh one. A new test covers exactly that case; the existing ones only ever closed the connection after the keys had already gone.
- “Not updating” could fail to appear on a machine whose clock stepped backwards, which happens on VM resume, on the first time sync after a boot with a flat CMOS battery, and on Windows and Linux dual boots that disagree about UTC. Elapsed time was measured against the wall clock, so a correction of an hour meant an hour in which frozen readings could not be reported as frozen. It is measured with a clock that only ever moves forwards now.
- A sensor key can act like a folder. The Sensor Reading key’s Press setting can open a detail view: the deck switches to a bundled one-page profile listing a whole group of readings, Previous and Next page through a long group, a title tile (every deck but the Mini) shows the group and the visible range, and pressing a listed reading cycles its current, min, max and avg for that visit. Back returns to the profile and page you came from. One profile is installed per deck type, and what it shows is decided at press time by the key you pressed, so one key opens a CPU breakdown and the next a GPU one. (Requested by @FattSlice in issue #5 and shaped by three rounds of his testing.)
- Each key picks its own grouping. Detail contains offers every reading of the key’s sensor source (the default), a custom list you order by hand, or a glob filter matched against source name and label taken together:
*4090*gathers everything that card publishes,*gpu*fan*just its fans. The panel shows a live match count under the field before you ever press, and a filtered page re-resolves every poll, so readings that appear or vanish in HWiNFO follow along. - The way out is an ordinary Sensor Reading key. The view’s Back tile is a real key: give it a sensor, any of the four layouts, a theme, custom text, thresholds and the Show stat, and because the page is an editable profile you can move it where you want it. Only its press is reserved for returning. Left unconfigured it shows the sensor you drilled down from.
- A second Back under your finger, when a key asks for it. Tick “Repeat Back under this key’s own cell” on an opener and, inside the view, a reading cell at the pressed key’s position doubles as a second Back: tap in, tap out without moving your hand, with the listed readings flowing around it. Off by default: the issue #5 testers found one movable Back better than two fixed ones.
- Three press behaviors, default unchanged: cycle stats exactly as before, open details on press, or tap to cycle with a half-second hold opening details. A key that never touches the Press section behaves byte for byte as it did in 1.4.
- Detail pages ship for the Mini (3x2), every 15-key (5x3), the Neo (4x2), Stream Deck + (4x2 keys), XL (8x4) and + XL (9x4 keys), plus the Virtual Stream Deck, which borrows whichever bundled layout fits its grid. Decks that cannot host a page (Mobile, Studio, Galleon, pedals, G-keys, virtual decks under 3x2) refuse the press with the alert cue; everything else about the key keeps working normally. The profiles are generated deterministically from one layout table and carry no user or sensor data.
- Opening a view starts from black instead of flashing a stale page. The Stream Deck app repaints a profile from each key’s last cached image, so the plugin paints pure black on the way out and the live faces paint over black on the way in.
- Hardening from an adversarial review of the navigation: entry cannot dispatch twice on a double press, a profile install accepted after the prompt expires bounces back out instead of stranding a dead view, unplugging a deck mid-view cleans up its session, an orphaned sensor no longer groups every other orphan with it, and hostile filter patterns (regex metacharacters, emoji, 500-character strings) compile safely under a 128-character cap. Repaints coalesce into one pass and unchanged polls skip rendering entirely; that skip is gated on a provider value revision rather than HWiNFO’s one-second poll stamp, so an HWiNFO polling period set under a second keeps moving the detail tiles (found by an automated review of the merged branch). The same review caught the picker’s “+ all” button binding to its source by display name: two identically named sources resolved to the first; the button now binds by position. The detail view rides the existing single shared poller; the dense + XL page at the 250 ms poll option is measured in PERF.md.
- The detail profile is named “HWiNFO Details”. The Stream Deck app never updates a profile that is already installed, so the first drill-down after upgrading asks once per deck to install it. If you tested a preview, remove its detail profiles first, or this one installs alongside them as “HWiNFO Details copy”.
- Flipping HWiNFO’s own unit setting (Fahrenheit, and any other unit it rewrites in place) now updates the keys and dials on the next poll. The snapshot parser’s fast path re-checked only reading identities and values, never units, so a mid-session flip left the old unit on screen and, with the plugin’s “Show temperatures in °F” also on, converted an already-converted value: 80 °C became 348.8 °F. The parser now treats a unit rewrite like an identity change and rebuilds. The conversion and alert-threshold functions gained their first direct tests, and the resilience e2e now flips units mid-run against the built plugin.
- Opening HWiNFO’s shared memory no longer blocks. The native open path waited up to 500 ms, twice, on HWiNFO’s consistency mutex while keys and dials went unserviced; it now fails fast like the read path always has and simply retries on the next poll (native addon 1.1.0).
- A busy HWiNFO no longer shows “Start HWiNFO”. Open-time contention used to be folded into the not-running screen, telling you to start software that was running in front of you. It now has its own transient state: the keys say “HWiNFO busy, retrying” and values hold in the meantime. In auto mode a busy open retries shared memory on the next poll instead of silently switching to the Gadget source and back.
- The pack-version floor is scoped to the release line being packed: tags reachable from the commit, not every tag in the repository. Without this, tagging v2.0.0 in the future would have silently made every 1.x maintenance pack impossible. Covered by a new test suite that builds throwaway repositories and proves the floor cases, the release-workflow tag exclusion and the fallbacks for repositories git cannot answer.
- An honesty pass over every published claim. Sparkline docs no longer promise that history survives any absence (polling stops when no Sensor Reading key or Sensor Dial is visible; the docs now say exactly what survives and what pauses). The credited original plugin is no longer called archived (it changed maintainers and is active again). PERF.md’s competitor comparison entries from 2026-07-04 were removed rather than kept: they named rival builds without versions and their harness was never committed, so they could not be verified by anyone, including me.
- Trust a stranger can check: every GitHub Action is pinned to a commit SHA (including the third-party release publisher, which runs with write permissions), the Elgato CLI install in the release job is pinned to an exact version (bumped by hand on purpose; Dependabot keeps the action pins and the npm tree current), SECURITY.md documents a private disclosure route, and the README, FAQ, install guide and release notes now say plainly that
bin/hwsm.nodeis unsigned and show the one-line PowerShell command to verify it against each release’s published SHA-256.
1.4.93.0 - 2026-07-31
- The second Back is now opt-in (@FattSlice’s follow-up on the preview 3 behavior). By default the tile at the pressed key’s position is an ordinary listed reading again and the movable top-left Back is the one way out; tick “Repeat Back under this key’s own cell” in the key’s Press section to bring the tap-in, tap-out tile back, with the listed readings flowing around it. Left off, a page runs its full reading stride.
- Fixes from two review passes over the merged drill-down: detail tiles keep moving when HWiNFO polls faster than once a second, the picker’s “+ all” binds its source by position instead of display name, a NaN value can no longer freeze the render gate, provider swaps can no longer collide revision lines, a busy probe reopen no longer fakes fresh data or doubles sparkline samples, leaving a view under a frozen tick no longer strands a black surface, and a failed install retry no longer eats the prompt’s expiry tombstone.
- The settings panel and the docs now show the second Back: the Press section screenshot with the checkbox ticked, and a detail page rendered with both Back tiles.
1.4.92.0 - 2026-07-30
- A drill-down key can now shape its own page, so the one shared detail profile behaves like a folder per key (issue #5, shaped by @FattSlice’s testing). Detail contains picks the list: every reading of the key’s sensor source (the default), a custom list you build by hand, or a new glob filter matched against source name and label taken together.
*4090*gathers everything the card publishes,*gpu*fan*just its fans; the panel shows a live match count under the field before you ever press, and a filtered page re-resolves every poll so readings that appear or vanish in HWiNFO follow along. - The key you pressed is Back under your finger. Inside the view, the tile sitting in the pressed key’s position shows the return face and returns on press, alongside the fixed top-left Back; listed readings flow around it.
- Opening a view starts from a black beat instead of a stale flash. The Stream Deck app repaints a profile from each key’s last cached image, so the plugin now paints pure black on the way out and the live faces paint over black on the way in.
- A Virtual Stream Deck sized 9x4 or larger now borrows the + XL page: 32 reading tiles per page instead of the XL page’s 28. Its dial bank is empty on a virtual deck, and the app installs it cleanly on a deck without encoders.
- Hardening from an adversarial review pass: entry cannot dispatch twice on a double press, a profile install accepted after the prompt expires bounces back out instead of stranding a dead view, unplugging a deck mid-view cleans up its session, and hostile filter patterns (regex metacharacters, emoji, 500-character strings) compile safely under a 128-character cap. Repaints coalesce into one pass and unchanged polls skip rendering entirely.
- The updated page ships as profile revision “HWiNFO Details”; the numbered names end with this cut. The first drill-down after upgrading asks once per deck to install it. Copies from earlier previews stay in your profile list until you remove them, and if a preview 1 copy still holds the name, the app installs the new one as “HWiNFO Details copy”.
1.4.91.0 - 2026-07-29
- The detail view’s Back tile is now a normal Sensor Reading key you can configure: pick its sensor, use the single, dual, triple or quad layout, themes, custom text, thresholds and the Show stat, exactly like any other key. Pressing it is still fixed to returning to the profile you came from, and a small return hook stays visible on every layout so the way out is never ambiguous. Left unconfigured, the tile keeps showing the sensor you drilled down from. (Requested by @FattSlice in issue #5.)
- The bundled detail profiles are editable now instead of read-only, so you can add your own keys to the detail page and configure the Back tile in place. Stream Deck never updates a profile that is already installed, so this ships as a second profile revision named “HWiNFO Details 2”: the first drill-down after upgrading asks once to install it, and a copy installed from the previous preview stays untouched in your profile list (remove it there if you no longer want it).
- Ordinary keys are unaffected: a key without the internal Back marker behaves exactly as before, settings are never rewritten, and the marker survives every panel edit.
1.4.90.0 - 2026-07-29
- A sensor key can act like a folder. The Sensor Reading key’s new Press setting can open a drill-down detail view: the deck switches to a bundled one-page profile listing every reading of that sensor’s HWiNFO source (or a custom ordered list you build in the panel), with the pressed key staying live as the Back tile, top left, where the native folder back key sits. Previous and Next page through long sources, a title tile shows the source and visible range, and pressing a listed reading cycles its current / min / max / avg for that visit. Back returns to the profile you came from. (Requested by @FattSlice in issue #5.)
- Three press behaviors, default unchanged: cycle stats exactly as before, open details on press, or tap-to-cycle with a half-second hold opening details. Keys that never touch the Press section behave byte-for-byte as they did in 1.4.
- Six read-only detail profiles ship, one per deck type: Mini (3x2), 15-key (5x3), Neo (4x2), + (4x2 keys), XL (8x4) and + XL (9x4 keys). The Virtual Stream Deck borrows whichever keypad layout fits its user-sized grid (a 10x10 virtual deck runs the XL layout, a 3x2 one the Mini layout). The Stream Deck app asks to install the matching profile the first time details open on a deck; unsupported decks (Mobile, Studio, Galleon, pedals, G-keys, virtual decks under 3x2) refuse the press honestly with the alert cue and keep the ordinary key behavior. The profiles are generated deterministically from one layout table and carry no user or sensor data.
- The detail view rides the existing single shared poller and dedupes identical frames; the dense + XL page (32 live tiles) at the 250 ms poll option is measured in PERF.md. HWiNFO stopping mid-view degrades the tiles to the ordinary status screens with Back still working, and recovery is automatic; a plugin restart inside the view renders honest “No detail selected” tiles instead of stale data.
1.4.0.0 - 2026-07-25
- Three readings on one key. The key Layout setting gains “Three readings, rows”: three full-width rows, each with its own sensor, label, value and inline unit, split by thin rules. Every row shows the same stat and the key press cycles all three together; thresholds follow the first sensor and recolor the whole key on alert. The third slot is the quad layout’s third sensor, so moving a key between the three-reading and quad layouts keeps what you picked. (Requested by @FattSlice in issue #3.)
- Key labels size themselves to fit. A label now steps down through a ladder of sizes until it fits the row instead of being cut at one fixed size, measured against per-glyph Segoe UI Semibold advances rather than a character count. Names like “Total CPU Usage”, “CPU CCD1/CCD2 (Tdie)” and “Current DL rate” render whole again. Across my own profiles no label came out smaller than it did in 1.3.0.
- The MIN/MAX/AVG stat badge moved from the key corner into a gap under the title, the same idiom the two-reading layout already used in its divider. A badged label no longer gives up width to a corner clip, so “Core2 (CCD1)” with an AVG badge renders whole at 20px where it used to cut at 16px.
- The unit on a single-reading key sits on baseline 114 at 18px. A sparkline riding its session maximum used to draw over the unit’s descenders; the spark strip is now inset so its worst-case ink stops at the band edge, and the unit clears it. (Measured, see PERF.md.)
- Sparkline history lives for as long as the plugin runs. The poller keeps a ring for every reading a key or dial row has asked for and feeds it on every fresh snapshot, on screen or not, while a Sensor Reading key or Sensor Dial stays visible somewhere, so paging back to a key returns its line instead of one that rebuilds from scratch. With none visible, polling stops and collection pauses until a key returns. Changing the poll interval still clears the history, because the ring is spaced by sample, not by clock, and a plugin restart still starts the lines fresh on purpose.
- An HWiNFO layout change no longer flashes an error screen. Starting a game that adds GPU readings changes the shared-memory layout; the poller now reopens the data source at the new size and re-reads it within the same tick, so live values never leave the keys. If that reopen does not land at once, the last values stay on screen for up to 15 seconds before any status screen appears. Access denied, disabled and damaged-install still surface immediately.
- I replaced the koffi FFI dependency with hwsm, my own Node-API addon built from
native/hwsmin this repo and covered by the same MIT license. The download drops from 583,133 B to 215,672 B. Nothing about reading sensors changes for you, with one exception worth knowing: hwsm reads HWiNFO’s shared memory only while holding HWiNFO’s consistency mutex, and there is no unguarded read path. Earlier versions read without the mutex when it was missing, so on a host that publishes the mapping without a mutex this version reports HWiNFO as not running and, in auto mode, falls back to Gadget reporting.
1.3.90.0 - 2026-07-23
- Preview build for the issue #3 testers, published as the GitHub pre-release
pre-1.4-issue3-2only; nothing was submitted to the Marketplace. It carries the 1.4 branch as of this date: adaptive label sizes, the three-reading key layout, the stat badge under the title, the balanced unit corridor, the hwsm native bridge, reopen-in-place on HWiNFO layout changes, and sparkline history that lives for the plugin lifetime (collected while a Sensor Reading key or Sensor Dial is visible). - Preview builds now version in the 1.3.9x band. The first preview reported 1.3.0.0, and Stream Deck keeps the installed copy when a plugin file’s version is not higher than what is installed, so installing that preview over 1.3.0 changed nothing (caught by @FattSlice in issue #3).
npm run packnow refuses any package whose manifest version does not clear the newest released tag.
1.3.0.0 - 2026-07-16
- A Display select for keys: None, Sparkline (recent history), Bar, or Ring. Bar draws a rounded track along the bottom of the key showing where the value sits in its range (0 to 100 for percentages, otherwise the values seen this session); Ring is an automotive-style arc opening downward, sweeping from bottom-left over the crown to bottom-right, so a high-is-bad redline lands at the lower right. With Warn at or Critical at set, both gauges mark the threshold zones in muted amber and red, blended toward the face background so the live fill always reads over them, toward the alarmed end (the low side when Direction alerts below). Existing keys are untouched: the new Display setting wins over the legacy sparkline checkbox when both exist, and a key that never touched the select renders exactly as before.
- The dial’s range bar marks the same warn/critical zones on its track. An automatic session range widens just enough to keep the zones visible; a manual Bar min/max is never widened, and zones outside it are clipped.
- Deck-wide Data units: byte and rate readings re-tier as decimal (KB, MB, GB, rates in Mbps) or binary (KiB, MiB, GiB, rates in MiB/s). Thresholds keep comparing in the reading’s native display unit, so flipping the preference never re-arms an alert.
- The Text setting: Theme, Dim, or Custom text per key, per dial, or once for the whole deck (the Deck text row under Advanced). Custom paints the main value your exact color, with a “Dim labels, units and stats” checkbox for the secondary text; warn and critical colors always win, and status screens keep their fixed safety colors. (Requested in issue #2.)
- Sectioned settings panels. Both property inspectors group their rows under flat headers (Sensor, Format, Appearance, Layout and Alerts on keys; Sensor, Rotation, View, Format, Appearance, Bar range and Alerts on dials) with a left rule marking the blocks a select reveals. The dial’s “Rotation” row is renamed “Bump guard”, the deck-wide Text row “Deck text”, and the Bar min/max fields hide on the overview views, where the bar does not draw. Every control keeps its place in the panel and its stored setting.
1.2.0.0 - 2026-07-13
- Two readings on one key. A new Layout setting on the Sensor Reading action stacks a second readout under the first: two rows, each with its own label, value and inline unit, split by a thin divider. The second reading has its own sensor picker and label (so one key can pair CPU with GPU, both RAM sticks, or the same sensor’s minimum and maximum). By default the second row follows the first’s stat, the key press cycles both rows together, and a non-current stat shows as one MIN/MAX/AVG badge centered in the divider gap; “Second shows” can instead pin the second row to a fixed stat. When the rows show different stats, each non-current row carries its own badge inline after its unit, the dial’s idiom, so labels never lose width to a corner badge. Decimals and the °F toggle apply to both rows; warn/critical thresholds and the type accent follow the first reading, and an alert recolors the whole key exactly like the single layout. The sparkline stays a single-layout feature: the second row takes its space. Existing keys are untouched; the single layout remains the default and renders exactly as before. (Requested in issue #1.)
- Four readings on one key: the quad grid. A third Layout option splits the key into a 2x2 grid, one reading per cell, behind a hairline cross. The first two cells reuse the single and dual fields, so switching from the stacked layout keeps both sensors; cells three and four get their own pickers, and a quad with only two or three sensors picked leaves the spare cells empty. By default each value is drawn in its cell’s color, so you can tell the four readings apart at a glance: a preset select offers four hues, row pairs, or uniform blue, and four color wells set any cell individually. A “Cell labels” toggle switches to a short uppercase label above a plain value instead. Values compact to at most four characters per cell (48700 shows as 49k) and the font steps down rather than overflow a cell. Every cell shows the same stat, the key press cycles them together, and a non-current stat badges once at the cross center. Decimals and the °F toggle apply to all cells; warn/critical thresholds and the type accent follow the first sensor, and an alert recolors the whole key over the cell colors, so warn and crit stay unmistakable. A cell whose sensor drops out of HWiNFO’s output shows a placeholder while the rest keep updating, and junk in any slot costs only that cell. The sparkline stays a single-layout feature.
- Overview views for the dial touchscreen. “Overview (three rows)” lists up to three readings of whatever rotation already moves through (the rotation set, the active rotation group, or the picked sensor’s readings), each with its label and live value. “Overview (two rows, big values + trend)” trades one row for size: two tall rows with 26 px values, a full label line each, and the space beside the value put to work: a long label word-wraps onto it, a short one frees it for a live sparkline of that reading’s recent values (the keys’ own recent-history line, fed for the visible rows; the reading on the dial is marked with a full-width highlight band and an accent bar). The three-row face is the wide tile: the reading on the dial is a small accent thumb riding a left rail that spans the rows, which also shows where the window sits in the full list; rotating moves the thumb and scrolls the window. One context line (top by default, or below the rows via the new Context line setting) carries the shared name and the session low/high: the numbers always render in full, right-anchored, and only the name shortens, so a long name can never eat a stat. Values share one right-anchored column at a fixed edge, sized by a ladder so the widest visible value fits, with units in a fixed column beside it; row labels draw as small uppercase text that fills the room up to its own row’s value and shortens only when a name truly runs out of space, and thin separator lines between rows can be turned off with the new Separators setting. The pinned and cycle-paused tags and the stat badge share the context line’s name region; a transient hint (a group-jump name, a reset confirmation) briefly takes the whole line, then the name and numbers return. Alerts recolor a row’s value text only. Rows stay readable the same three ways in both views: leading words the visible rows share are lifted into the context line (“GPU Temperature / GPU Hot Spot” reads as “Temperature / Hot Spot” beside a “GPU” context; a Row labels setting restores full names), values line up in one column, and any reading can be renamed by clicking its chip’s name in the rotation set (the name also titles the dial when that reading is selected). Auto cycle, alert interrupts (an alerting row can pull the window to itself), pin, pause, touch taps, group jumps and the HWiNFO Control key all drive the overview unchanged. The single view remains the default and is pixel-identical to 1.1.11.
- All of 1.2.0’s additions are append-only settings: profiles written by 1.2.0 degrade cleanly on older plugin versions (the extra fields are ignored and the dial or key runs its single face), and malformed values resolve to the nearest working layout, down to the single face.
1.1.11.0 - 2026-07-12
- Named rotation groups for the dial, optional and off until you build them. “Split into groups” under the rotation set turns the set into group 1 and adds a collector group; tick readings into it, name the groups, and the dial gets two speeds: plain rotate stays inside the active group, while a gesture set to “Switch sensor or group” (Elite’s press+rotate) jumps between groups and shows the landing group’s name on the dial for a moment. The HWiNFO Control key’s “Next/Previous sensor or group” commands honor the groups on every preset. The auto cycle steps inside the active group, and with “On alert” ticked it still watches every group: a critical reading anywhere in the set interrupts across group boundaries. Legacy keeps rotating through everything as one flat list, exactly as before, and a Custom map with no group-switching gesture does the same, so no group can ever become unreachable. Dials without groups behave exactly as they did, and older plugin versions read the groups as one flat rotation set, so downgrading loses nothing.
- The rotation set in the dial’s settings panel now shows where the dial is: the chip of the reading on screen is highlighted in blue and follows rotation, group jumps and the auto cycle while the panel is open.
- Switching the Controls preset from Elite to Custom now copies Elite’s gesture map into every select you have not set yourself, so “Elite minus the one gesture you want different” is a single change instead of rebuilding the whole map from the Legacy defaults. Gestures you already assigned are never touched.
- The Custom preset’s command lists are aligned across gestures: Press+rotate gained “Cycle stat mode”, and Short push, Long push and Long touch now offer the same full command set (reset session stats, pause/resume auto cycle, pin/unpin, cycle stat mode, back to current value) instead of each listing a different subset.
- Fixed: dial status faces (“Start HWiNFO, not detected”, “Access denied” and the rest) and the “rotate to pick” face drew their message at the numeric value size and ran off the right edge of the touchscreen slot. Longer value text now steps down to a size that fits.
1.1.10.0 - 2026-07-11
- New dial rotation controls. A rotation set: tick readings in the dial’s sensor picker and rotation moves through just those, in your order, even across different sensors. An “Ignore turns” switch: the dial ignores rotation entirely, so a bump can never move you off your reading. An auto cycle: the dial steps through the rotation set (or the picked sensor’s readings) on a timer, from every 5 seconds to every 5 minutes, and it works with turns ignored for a hands-off tour.
- Rotating a dial whose saved sensor has temporarily vanished (HWiNFO restart, device dropout) no longer jumps to an unrelated reading and overwrites the selection. The dial shows “Sensor missing / waiting” and ignores turns until the sensor returns.
- Dial session stats are now kept per reading, keyed by HWiNFO’s stable sensor identity: rotate away and back and that reading’s own session min/max/average is still there, and no reading can ever show another one’s numbers. Stats for rotation-set members keep accumulating while they are off screen (whenever a Sensor Reading key or Sensor Dial is visible, which is what keeps the poller running), and the whole set survives reconnects, wake replays, page switches and profile changes (up to 30 minutes off screen).
- Fixed stale dial titles when rotating through readings: a custom label written for one reading stayed on as the touchscreen title after rotating to another, so the name no longer matched the value. Rotating now clears the custom label and the title follows the reading (a new “Label mode” setting keeps it instead, as a fixed title for the slot).
- New control presets for the dial. “Legacy” (the default, and what every existing dial keeps) is the exact previous behavior. “Elite” adds press+rotate to jump between sensors, a short press that pauses the auto cycle, and a long press (half a second) that resets session stats. “Custom” assigns each gesture individually, including optional two- or three-zone touch (left/right switch readings, center taps). Pressed rotation never triggers the plain-rotation action, and a press that saw rotation executes nothing on release. The Stream Deck app’s own gesture hints follow the selected preset.
- New “HWiNFO Control” key action: drive Sensor Dials from any key, pedal, G-key or Multi Action step, on any connected device. Commands: previous/ next reading or sensor, stat mode, pause/resume auto cycle, pin/unpin, reset session stats. Targeting is explicit (a per-dial “Link ID”, or all dials), and the key ticks or alerts by whether any dial took the command.
- Thresholds and manual bar ranges are now unit-scoped: they only apply to readings in the unit they were typed against, so a warn level meant for a temperature can no longer fire on a fan RPM after rotating to it. Scoping starts with the first threshold you edit after updating; thresholds saved by earlier versions keep their old reach until then.
- Alert-aware auto cycle, opt-in via the “On alert” setting: ticked, the cycle holds instead of rotating away while the shown reading is critical and its next step goes to a critical member of the set instead of the next one in order. Unticked (the default), alerts do not steer the cycle.
- New pause and pin states (from Elite/Custom gestures or the Control key): pause stops the auto cycle timer, pin locks the selection against turns, taps and the cycle. Both survive page switches (up to 30 minutes off screen), both show on the dial’s bottom line, and the display mode a dial was left in also survives page navigation now.
- A device capability registry derives each deck’s grid, encoder count and touch geometry from the Stream Deck registration (Stream Deck + XL: six 200x100 touch segments) and degrades safely for unknown and untested devices: they fall back to a keys-only profile and input is never gated. Hardware the plugin has not been proven on is not listed as supported.
- New redacted local diagnostics: a “Copy support report” button in every settings panel (devices by model and hashed ID, data-source state, action states; no sensor values, no names, no upload), and an opt-in event recorder (
HWINFO_TRACE_EVENTS=1) whose traces replay through the test suite’s gesture machine. See the new “Hardware compatibility” docs page. - Verified on the Stream Deck + XL (9x4 keys, six dials): a full 36-key, 6-dial layout ran live on real hardware with every theme, sparklines, alert states, and touchscreen dials rendering correctly at 0.1 % CPU. The e2e suite now registers a Stream Deck + XL mock device and drives the dial on its sixth encoder, so this coverage holds without the hardware.
- The plugin log now names each connected deck (model and key grid), so support logs say exactly what hardware was involved.
- New
HWINFO_LOG_LEVELenvironment override (trace/debug/info/warn/error) for support diagnostics; the default staysinfo. Atdebug, each key and dial logs where it appeared (device and position).traceneeds a debug launch of the plugin; on a normal Stream Deck launch it falls back todebugand the log says so. - The Marketplace listing, README, FAQ, installation guide, Sensor Dial page and troubleshooting page now name the Stream Deck + XL alongside the Stream Deck + when they describe dial support.
1.1.9.0 - 2026-07-05
- Fixed the key sparkline clipping the bottom edge. The strip sat too low, so at a session low the line and its end dot were scissored by the key edge with no margin beneath. Moved the strip up (now y 120-134) so the line and the r=5 dot always clear the edge. Regenerated the marketing and docs images to match.
1.1.8.0 - 2026-07-05
- Meets the current Marketplace intake requirements (surfaced in the live Maker Console): manifest
SDKVersion3 and minimum Stream Deck app 6.9. The plugin now requires Stream Deck software 6.9 or later. - Upgraded the runtime SDK from
@elgato/streamdeck1.4.1 to 2.1.0, which SDKVersion 3 requires. Migrated the property-inspector messaging off the removedstreamDeck.ui.currentontostreamDeck.ui, and moved theJsonValue/log-level imports to their new homes. Same behavior: all unit, e2e (harness, resilience, gadget, dead-fallback, load), and live-load checks pass, and the poller/render/status paths are unchanged. - The plugin URL and the docs links now point at the documentation site (docs.slawrensen.com/hwinfo-streamdeck) instead of the raw GitHub repo.
1.1.7.0 - 2026-07-05
- Copy pass over everything a user reads, ahead of the Marketplace submission: manifest description, settings-panel text, status-screen and probe wording, README and docs. Plain punctuation throughout. No functional changes.
- New icons across the board: the app, category, and action icons now show what the plugin actually renders (a key face with a value and sparkline; a knob for the dial action) instead of a radial gauge it never draws.
- Repo: added
npm run release:validate(lint, typecheck, tests, plus a copy/manifest/asset/version validator).
1.1.6.0 - 2026-07-05
- Sparklines now persist across page changes. The recent-history graph used to reset to empty every time a key reappeared (switching pages, waking the machine, the app reconnecting) and had to rebuild from scratch. History now lives with the poller and survives those, so switching away and back keeps the graph drawn. It also survives a °C/°F toggle now (same data, just relabelled), and a frozen HWiNFO no longer flattens the line; it holds its last real shape. (A graph on a page you haven’t viewed in a while still rebuilds, and fills at HWiNFO’s own update rate.)
- Redesigned the status screens (Start HWiNFO, Shared Memory off, Not updating, etc.) to be calmer and OLED-friendly: a true-black background instead of dark grey, two lines of soft-white text instead of three lines of hard white. Same guidance, much less glare.
1.1.5.0 - 2026-07-05
- Theme gallery: the “Deck default” chip is now structurally distinct from the preset it resolves to. It keeps its truthful resolved-palette face but wears a dashed accent border and a small link/follow badge, so it can never be mistaken for the Void (or any) preset chip at a glance, even when the deck theme it follows happens to render an identical palette. (v1.1.3/v1.1.4 tried text-only cues that still failed the eye.)
- Fixed a data-source fallback bug: when free HWiNFO disables shared memory after 12 hours it leaves the named mapping behind with a “DEAD” marker. The reader now validates that marker at open time, so “auto” mode correctly falls back to the Gadget registry instead of getting stuck on the “Shared Memory off” screen, and a shared-memory upgrade probe no longer closes a working gadget provider for the dead mapping. (New
e2e:dead-fallbackregression.) - Fixed the sensor picker silently replacing your saved sensor: pressing Enter with the picker open but no search text typed used to select the first sensor in the list. It now leaves the current selection untouched.
- The dial’s “HWiNFO stalled” touchscreen text now says “check Gadget” when the dial is reading from the Gadget registry, matching the key screen and PI hint instead of always pointing at Shared Memory.
1.1.4.0 - 2026-07-04
- Theme gallery: the “Deck default” chip face now reads “auto” (in the resolved theme’s colors) instead of a sample value, so it no longer looks like a duplicate of the theme it currently resolves to.
1.1.3.0 - 2026-07-04
- Fixed the theme gallery layout: the longer “Deck default” label introduced in 1.1.2.0 blew its grid column wide (CSS grid min-width:auto). Chips are equal-width again; the resolved deck theme now appears in the help line under the gallery (“currently Void”) and in the chip tooltip.
1.1.2.0 - 2026-07-04
- Theme system truthfulness: the settings panel’s “Deck default” chip now shows the plugin’s actual resolved deck theme (labelled with its name, e.g. “Deck default · Void”) instead of guessing from raw global settings, and updates live when the deck-wide theme changes. Added help text making the precedence rule explicit: a per-key theme always wins; the Advanced “Deck theme” only affects keys set to Deck default.
- Fixed: an empty or invalid stored deck theme could permanently block the legacy-migration default while silently failing to apply; the migration can no longer overwrite a theme the user picked concurrently.
- The effective deck theme is now logged at startup and on every change.
1.1.1.0 - 2026-07-04
- Hardening: the plugin now watches its parent process and exits if the Stream Deck app dies without cleaning up (hard-crash scenario found during competitive benchmarking; previously the poller could keep the process alive with nobody to render for; normal operation already relied on the app’s job object). No functional changes.
1.1.0.0 - 2026-07-04 (first tagged build)
The baseline feature set. Tag: v1.1.0.
Features
- Live HWiNFO sensor readings on Stream Deck keys: value, unit, custom label, sparkline history, stat modes (current/min/max/avg; a key press cycles).
- Stream Deck + dial/touchscreen action: live value with session min/max and a range bar; rotate to switch readings, push to reset session stats, touch to cycle stat modes.
- Seven display themes (per key or deck-wide) with sensor-type accent colors and aviation-style alerting: amber/black at warn, red/white at critical. Alert colors are global and never themed.
- Searchable sensor picker in the settings panel with live values for all ~500+ readings, grouped by source.
- Dual data source with auto-fallback: HWiNFO Shared Memory (full stats) preferred, Gadget registry (free version, no 12-hour limit) as fallback, automatic upgrade back to shared memory when it returns.
- Resilient status screens for every failure mode: HWiNFO not running, Shared Memory disabled or expired, privilege mismatch (with the concrete fix), Gadget reporting enabled but no sensors ticked, stale data.
- First-run setup guide inside the settings panel.
Performance (measured, see PERF.md)
- Incremental shared-memory decoder: ~6 µs and near-zero allocation per poll tick for ~516 readings (up to 62× faster than the naive decode).
- ~0.07 % average CPU with a 12-key live page at a 1-second poll.
- Memory-stable under a 35-minute soak (RSS slope negative); the plugin process exits cleanly when Stream Deck stops and idles when no keys are visible.
Notes
- Requires HWiNFO (free or Pro) with Shared Memory Support or Gadget reporting enabled. Windows x64 only (Windows-on-ARM shows a clear unsupported-platform screen).
- This is an independent project, not affiliated with or endorsed by REALiX/HWiNFO. No ads, no telemetry.