Skip to content

Releases: gyng/widgetsack

v0.0.52

Choose a tag to compare

@gyng gyng released this 13 Jul 21:50
05b8e98

What's Changed

  • fix(reliability): review round 2 — boot-path logging, latch leaks, layout backup by @gyng in #56
  • test(coverage): restore to ~99.6/99.0/99.9/99.9 + gate coverage in CI by @gyng in #57
  • fix: harden plugins, themes, sensors, and bridge boundaries (0.0.52) by @gyng in #58

Full Changelog: v0.0.51...v0.0.52

v0.0.51

Choose a tag to compare

@gyng gyng released this 09 Jul 20:24
32cd668

Fixes

  • The album cover now leaves with the track instead of lingering and expanding on pause. Players that tear down / recreate their SMTC media session on pause (so the prior track can't be carried forward) left the now-playing widget with no title but a cover held up by the crossfade's no-art grace — which then expanded to fill the box for a moment before disappearing. The cover is now dropped the instant the session has no current track; a paused player that still has a track keeps its cover up, and the no-art grace still bridges art that lags its metadata on track changes.
  • NowPlaying.tsx is a text file again. The track-identity key embedded literal NUL bytes as separators, which made git treat the file as binary (breaking diffs and merges); they're now proper `\0` escapes — same string at runtime.

Verified: `cargo test` / `clippy` / `fmt`, `tsc` (TS7), oxfmt+oxlint (0 warnings), 2769 unit tests (including a new regression test for the cover fix), build.

v0.0.50

Choose a tag to compare

@gyng gyng released this 09 Jul 20:00
7ce96f0

Fixes

  • The app no longer silently exits when its last window closes. widgetsack is a tray app, but a layout whose widgets all live on one secondary monitor runs on a single overlay window (an empty primary reclaims its renderer) — so any transient failure to spawn that overlay (monitor not yet enumerated at logon, the display DDC-switched to another input, a WebView2 hiccup) ended the process with no trace: the "didn't start at login" mystery. The exit is now prevented and a hidden primary respawns on a gentle 30-second retry until a monitor returns. Quit from the tray still quits.
  • Overlays come back instantly when a monitor returns. A native display-change watcher re-runs overlay reconcile the moment the display topology changes while no window is alive — no waiting out the retry timer after flipping a monitor input back.
  • A transient layout-read failure no longer closes every overlay. "Couldn't read widgets.json" was treated as "the layout is empty" and tore down working overlays; the reconcile pass is now skipped instead. Reconcile is also single-flight, so concurrent passes can't race to create the same overlay window.
  • Overlay failures now land in the log file. Frontend lifecycle errors (reconcile / spawn / self-fit) used to vanish with the webview console; they now persist to the rotating log (target `client`) so postmortems don't take hours.
  • Media-session (GSMTC) failure no longer prevents startup. The app starts with the now-playing pipeline disabled instead of crashing on a startup assert.

Maintenance

  • TypeScript 7 (native compiler) — full type-check drops from ~8.0s to ~1.7s with zero code changes.
  • oxlint + oxfmt replace ESLint + Prettier (typescript-eslint does not support TS7). Same style rules, same zero-warnings gate. Note: most react-hooks v7 (React Compiler) rules aren't implemented in oxlint yet, so their enforcement is paused — the 0.0.49 code fixes remain in place.
  • Rust dependencies refreshed within semver (`cargo update`, 24 crates).

Verified: `cargo test` (200) / `clippy` / `fmt`, `tsc`, oxlint+oxfmt (0 warnings), 2768 unit tests, build, `check:docs`, 34 Playwright e2e — plus live runtime verification of zero-window survival and monitor-return recovery.

v0.0.49

Choose a tag to compare

@gyng gyng released this 03 Jul 02:25
dd6b0b9

Fixes

  • Autostart at login now actually works. The Windows Run entry was written with a stray trailing space (unquoted), which Windows' logon launcher silently refused to execute — so "Start at login" never started the app even when the toggle, the saved preference, and Task Manager all showed it enabled. It now writes a correct, quoted command.

Maintenance

  • Full dependency upgrade. Rust deps refreshed (cargo update); client toolchain moved to ESLint 9 (flat config), Vite 8, Vitest 4, TypeScript 6, Prettier 3, happy-dom 20. 0 npm vulnerabilities (was 7).
  • Codebase brought into compliance with the stricter react-hooks v7 (React Compiler) rules — 115 sites, all behavior-preserving.

Verified: cargo test/clippy, tsc, ESLint (0), Prettier, 2762 unit tests, build, check:docs, 34 Playwright e2e.

v0.0.48

Choose a tag to compare

@gyng gyng released this 19 Jun 04:22
7b83329

widgetsack 0.0.48

Features

  • Monitor Switch widget + DDC/CI input-source switching
  • Home Assistant control widgets — cover, fan, lock, scene, switch, binary sensor, input, media player (+ album art, history backfill)
  • Overlay auto-refit on display changes
  • --multi dev instance — run alongside the installed release with isolated config
  • Studio polish: add-widget preview popovers, palette filter/reorg, View Transitions

Fixes

  • Merge-drop crash — dragging a widget onto another to group them no longer stack-overflows the studio (wrapLeafWith/rebuild unbounded recursion)

Internal

  • Comprehensive test suite — ~2,760 tests (from ~1,390), ~99% line coverage with a principled coverage gate

🤖 Generated with Claude Code

v0.0.47

Choose a tag to compare

@gyng gyng released this 15 Jun 00:03
af8a06a

Fixes

Hug widgets no longer overflow their container's cross axis (#49). The 0.0.46 hug fix floored a content-basis widget on both axes, so a widget in a column got min-width: max-content and overflowed its container horizontally (the Network widget bulging past its column in studio). Hug now floors only the main axis — the cross axis stays bounded by the container — while still growing to fit content along the hug direction. Verified live on the overlay + studio.


The Windows installer (widgetsack_0.0.47_x64-setup.exe) and its SLSA build provenance are attached by CI once the build completes. Verify a download with:

gh attest verify widgetsack_0.0.47_x64-setup.exe --repo gyng/widgetsack

v0.0.46

Choose a tag to compare

@gyng gyng released this 14 Jun 23:26
946f628

Hugged widgets no longer clip on the overlay

  • Fixed: a widget or grouped widget set to hug kept its size in the studio but reverted (and clipped) on the actual overlay. The layout loader was silently dropping the hug setting when reading the saved layout. Hug now survives the round-trip, so hugged widgets (e.g. the Network monitor) fit their content everywhere — no need to re-hug; your saved layout fixes itself on load.

🤖 Generated with Claude Code

v0.0.45

Choose a tag to compare

@gyng gyng released this 14 Jun 22:49
f4fd99a

Hugged grouped widgets fit their full content

  • Fixed: a hugged grouped widget (e.g. the Network monitor) no longer clips its bottom row — it now sizes to its full content instead of landing a row short. If your network widget was still clipped after v0.0.44, set its size to "hug — fit content" (or re-hug) and it should fit.

🤖 Generated with Claude Code

v0.0.44

Choose a tag to compare

@gyng gyng released this 14 Jun 21:51
e092246

Hug sizing now works for grouped widgets

  • Fixed: widgets made from a template (like the Network monitor) are groups, and setting them to hug still clipped. Hug now fits a group's content. The group size option is relabelled "hug — fit content" and actually applies it.
    • If your existing Network widget still clips, set its size to "hug — fit content" (it may currently be on fill).
  • CI: upgraded actions/checkout and actions/setup-node to v6 (Node 24).

🤖 Generated with Claude Code

v0.0.43

Choose a tag to compare

@gyng gyng released this 14 Jun 21:23
87067e8

Widget "hug" sizing no longer clips

  • Fixed: widgets set to hug (fit-content) no longer clip their content. Fill meters (gauge, sparkline, CPU, GPU panel) now grow to fit instead of being pinned to a fixed box — fixes the GPU panel and network widgets being cut off at hug size.
  • Fixed: the GPU VRAM readout no longer ellipsizes — it shares one unit (e.g. 5.6 / 11.2 GiB) so it fits the stat cell.
  • Fixed: the Network template's default size now fits its histograms + rate row.

🤖 Generated with Claude Code