Skip to content

v0.1.3

Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 27 Jul 06:15

Changelog

All notable changes to this project will be documented in this file.

[Unreleased]

[0.1.3] - 2026-07-27

Added

  • Gallery announce media: animated layout GIFs (neon-dash-v2 lead, neon-dash, arc-gauge, cyber-grid) and a live cava stream GIF under docs/assets/gallery/. Offline multi-frame helper: cargo run --release --example render_gallery_frames.

Fixed

  • Xvfb stream sessions start with -nocursor so cooler frames / GUI stream preview / cava captures no longer include a pointer sprite.
  • Tray no longer double-registers on desktops that run both systemd user units and XDG autostart (installer prefers one path; binary takes a single-instance flock on $XDG_RUNTIME_DIR/thermalwriter/tray.lock).

[0.1.2] - 2026-07-27

Added

  • thermalwriter-tray: lightweight StatusNotifierItem controller (ksni) for opening the Config GUI, switching layouts, starting stream presets, reloading config, and stopping the daemon. Separate process from both the headless daemon and the Tauri GUI; idle path is D-Bus event-driven with no polling timers. Optional install via packaging/install.sh (INSTALL_TRAY=0 to skip) plus systemd/thermalwriter-tray.service and XDG autostart.
    • Pixmap-only tray icon (empty IconName) so Quickshell/Noctalia does not show a missing-icon tile.
    • Text-only context menu (no unresolved freedesktop icon-name entries); active layout marked with .
    • Detached GUI launch (hyprctl / systemd-run) with focus/move onto the current Hyprland workspace; live compositor instance resolved via lock + .socket.sock.
  • Release tarball now ships bin/thermalwriter-tray, packaging/thermalwriter-tray.desktop, and systemd/thermalwriter-tray.service alongside the daemon.
  • Clean-machine release QA harness under scripts/release-qa/ (L0 artifact checks, multi-distro L1 install matrix, optional L2 host cable smoke).

Fixed

  • Release tarball stages docs/comparison-methodology.md (README relative link was broken in the published v0.1.1 archive).
  • Cooler unplug/replug auto-detect no longer waits on Enter prompts during host cable smoke.

[0.1.1] - 2026-07-25

Performance

  • Tick loop skips render/encode/USB send when the active layout's resolved inputs are unchanged (FrameSource::content_fingerprint). Streaming (Xvfb) sources still render every tick.
  • NVIDIA GPU sensors prefer in-process NVML (dedicated worker, hard 500ms recv timeout so a wedged driver cannot pin the tick loop) over forking nvidia-smi every poll; smi remains a fallback with the same budget + kill, and both paths back off when unusable. NVML device_by_index failures demote to smi (not silent empty). (#80, #91)
  • Hybrid AMD+NVIDIA machines register Nvidia before AmdGpu so the discrete GPU owns gpu_* / vram_* keys.
  • SensorHub collision warnings log once per key for the life of the hub (no per-poll journal spam).
  • hwmon skips high-latency JEDEC spd5118 DIMM sensors (~8 ms/poll on typical boards) that no stock layout displays.
  • Adaptive hwmon pruning: after a short discovery window, chips that cannot serve the active layout's needed metrics are skipped (EMA cost > 500µs or simply unneeded).
  • Sensor polling is limited to keys the active layout can display (frontmatter + template token scan against the catalog), with provider short-circuit once those keys are collected.
  • Default sensors.poll_interval_ms lowered from 1000 to 2000 (still one sensor refresh per display frame at the default 2 FPS).
  • list_sensors reports per-key poll cost (cost_us); GUI sensor pickers show live-measured cost so setup can avoid expensive keys.
  • Steady-state daemon footprint on the comparison machine: 0.41% of one core and ~81 MB PSS at default 2 FPS (stock neon-dash, NVML, dirty-frame skip, 2000 ms poll). Earlier post-v0.1.0 remasure was 0.87% / ~72 MB PSS before the 2000 ms poll + layout-needed prune path.

Fixed

  • Clippy -D warnings clean again on CI (type_complexity on the shared sensor catalog, duplicated too_many_arguments allow, plus a couple of follow-on lints).

[0.1.0] - 2026-07-24

Added

  • Initial daemon implementation for controlling Thermalright LCD coolers.
  • Multi-transport device support: raw bulk, SCSI, HID Type 2/3, and LY bulk protocols across nine USB IDs, with automatic discovery and config-overridable VID:PID selection. 87ad:70db (Peerless Vision / GrandVision 360 AIO) is verified on physical hardware; the remaining IDs are implemented against protocol fixtures — testers wanted.
  • Responsive layout rendering at negotiated native resolutions (240x240 through ultrawide), with {# canvas: responsive #} opt-in reflow and uniform containment for fixed-canvas layouts.
  • Support for rendering layout templates using SVG and Tera engine, including built-in layouts.
  • Integrated sensor providers for system temperature, load, power, and memory metrics, with slow/wedged hwmon chip quarantine.
  • D-Bus control command-line interface (CLI) to interface with the running daemon.
  • RAPL udev configuration rule generator to safely allow reading processor power metrics without root.
  • Optional Tauri-based graphical user interface (GUI) for visual configuration and streaming, including overlay color suggestions derived from the selected background image.
  • Support for setting background images on the cooler LCD.
  • Xvfb streaming presets to pipe arbitrary window regions (e.g. conky, cava, btop, nvtop, custom terminal emulators) straight to the cooler.
  • Whole-daemon profiling harness with committed performance baselines (scripts/profile.sh, docs/profiling-baselines.md).

Changed

  • Release tarball installer now uses the bundled daemon binary when present, while source checkouts still build with Cargo.
  • RAPL access now uses a dedicated thermalreader group with 0440 permissions instead of world-readable counters.
  • Xvfb streaming now uses generated Xauthority credentials and private runtime preview frames.

Fixed

  • Stream restarts preserve the original layout tick rate when returning from Xvfb mode.
  • Layout switches now wait for renderer startup confirmation before updating D-Bus state.
  • SVG text variables are XML-escaped before rendering, so labels containing characters like & do not break previews or daemon rendering.