Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 9 additions & 9 deletions .github/release-notes/v0.5.0.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

**Released:** 2026-09-08

This release lands two large hardware efforts: full **Lian Li TL LCD and L-Wireless** support (wired panels, RF controller, wireless LCD receivers) and a productized **OpenRGB fallback** that Hypercolor can install, partition, launch, and supervise on your behalf. Alongside them, a new `rig-setup` agent skill turns a physical PC build into a working spatial layout, and the Studio canvas gets a hard look at frame-budget behavior on dense scenes.
This release lands two large hardware efforts: full **Lian Li TL LCD and L-Wireless** support (wired panels, RF controller, wireless LCD receivers) and a productized **OpenRGB fallback** with installation guidance, detector partitioning, and managed server startup. Alongside them, a new `rig-setup` agent skill turns a physical PC build into a working spatial layout, and the Studio canvas gets a hard look at frame-budget behavior on dense scenes.

## 🌟 Highlights

Expand All @@ -16,7 +16,7 @@ New crate `hypercolor-openrgb-host` detects the installed OpenRGB binary (native
Hypercolor now tracks what it *cannot* drive. `GET /devices/unclaimed` lists USB hardware no enabled native driver claims, `GET /devices/coverage` joins native, bridge, and unclaimed views per physical device, and `GET /system/openrgb` reports installation, endpoint probes, permission checks, and coverage in one payload. The UI surfaces this through `unclaimed_hardware.rs` and `bridge_status.rs`, including prefilled device-support issue links.

### 🤖 The `rig-setup` agent skill
A user-facing skill that onboards a physical build end to end: inventory, coverage, interview, generate, dial in. `skills/rig-setup/scripts/gen_layout.py` turns a case spec (mm geometry, mount positions) plus a rig spec into attachment profiles, a spatial layout, and a named scene, working offline against a saved template catalog when the daemon has no coverage route. `coverage.py` decides native vs bridge vs unsupported (falling back to `lsusb`, `system_profiler`, or `pnputil`), and `request_support.py` files a deduplicated GitHub issue for unclaimed hardware. Skills now ship in the release tarball under `share/hypercolor/skills`.
A user-facing skill that onboards a physical build end to end: inventory, coverage, interview, generate, dial in. `skills/rig-setup/scripts/gen_layout.py` turns a case spec (mm geometry, mount positions) plus a rig spec into attachment profiles, a spatial layout, and a named scene, supporting offline generation from a saved template catalog. `coverage.py` decides native vs bridge vs unsupported (falling back to `lsusb`, `system_profiler`, or `pnputil`), and `request_support.py` checks for existing requests and prints a prefilled issue URL; passing `--file` submits the request through an authenticated `gh` session. Skills now ship in the release tarball under `share/hypercolor/skills`.

### ⚡ Studio canvas under a frame budget
`layout_canvas.rs` drops overlapping per-output backdrop filters, memoizes render metadata via `Memo::new`, samples pointer geometry once per animation frame (flushing final movement on release), and keeps `<For>` outputs keyed across edits. Measured on an 80-output scene during development, median frame intervals fell from **66.7 ms to 16.7 ms** and median hover work from **5 ms to 0.7 ms**. `e2e/tests/studio-performance.spec.mjs` pins the resulting *behavior*: drag and undo state, output stacking during hover, absence of per-output backdrop filters, inspector freshness, and no redundant scene fetch.
Expand All @@ -39,8 +39,8 @@ A user-facing skill that onboards a physical build end to end: inventory, covera
- **CLI**: `hypercolor openrgb status | hints | partition | start | stop | resize <device> <zone> <size>`. The managed server binds loopback only, runs headless, and logs to `<data>/logs/openrgb.log`.
- **Detector partition** (`data/openrgb/detectors.toml`): per-family prefix matching for `razer`, `lianli`, `corsair`, `dygma`, `nollie`, and `asus`/ENE. Families with an active native driver are disabled in OpenRGB's config; user toggles outside the managed keys are preserved, and re-enabling requires an explicit list.
- **Permission checks** (Linux): `udev_rules`, `i2c_dev_module`, `i2c_nodes_writable`, `hidraw_nodes_writable`, each carrying a concrete remedy command.
- **Driver hardening**: writers paced to `target_fps` from a detector-class table, one shared SDK link per endpoint with a reconnecting task, `RESIZEZONE` gated behind a clean close, brightness verified on output activation, frame-shape mismatches guarded, and serial plus location published in discovery metadata.
- **Live reconciliation**: flipping `drivers.<id>.enabled` registers or unregisters the output backend without a restart, and `openrgb diagnose` joins the safe diagnostic checks.
- **Driver hardening**: writers paced to `target_fps` from a detector-class table, one shared SDK link per endpoint with a reconnecting task, zone resizing requires explicit opt-in and a resizable zone, brightness verified on output activation, frame-shape mismatches guarded, and serial plus location published in discovery metadata.
- **Live reconciliation**: flipping `drivers.<id>.enabled` registers or unregisters the output backend without a restart, and `hypercolor diagnose --check openrgb` checks bridge connectivity and reports output-disabled routes.
- **Zone sizes**: `PATCH /config/keys/drivers.openrgb.zone_sizes` merges an object patch against current settings, keyed by driver-minted controller fingerprint then zone name, and applies on connect.

## 🔭 Events and API
Expand Down Expand Up @@ -82,14 +82,14 @@ A large grouped Rust bump (77 crates) plus the workspace follow-through on every
- **System-packaged user service identity changed.** `packaging/systemd/user/hypercolor.service.system` now sets `HYPERCOLOR_SERVICE_IDENTITY=user_service:systemd:hypercolor.service` (was `system_service:...`). Distro packagers must ship the updated unit, or protected control operations will attest with the wrong identity.
- **New udev rules are required for Lian Li TL LCD and wireless receivers.** `udev/99-hypercolor.rules` adds product-scoped rules for `04fc:7393`, `1cbe:0006`, and `1cbe:0005`. Without reinstalling and reloading the rules, those panels will not be reachable.
- **Release archive layout changed.** Tarballs now include `share/hypercolor/skills`, and the manifest reports `user_skill_files` alongside `skill_files`. Packaging scripts that enumerate archive roots need updating; `scripts/verify-release-artifact.sh` enforces the new contract.
- **`hypercolor-control` moved** from `.agents/skills/` to `skills/hypercolor-control/`. Anything referencing the old path should follow the move.
- **`DisplaySummary` gained a `rotation` field** and face requests now carry the display rotation field. The field is serde-defaulted, so old clients keep decoding, but clients that round-trip face requests must preserve it or they will silently reset a screen's mounting.
- **User-facing skills now live under `skills/`.** The old `.agents/skills/hypercolor-control` path remains available through a compatibility symlink.
- **Display mounting rotation is now a device setting.** `DisplaySummary.rotation` reports the mounting orientation. Update it through `PUT /api/v1/devices/{id}` using `display_rotation`; face-assignment requests do not carry this setting.

## Upgrade Notes

1. Reinstall and reload udev rules on Linux: `sudo cp udev/99-hypercolor.rules /etc/udev/rules.d/ && sudo udevadm control --reload-rules && sudo udevadm trigger`.
1. Reload the updated Linux udev rules. From an extracted release archive, run `sudo cp lib/udev/rules.d/99-hypercolor.rules /etc/udev/rules.d/ && sudo udevadm control --reload-rules && sudo udevadm trigger`. In a source checkout, the rules file is `udev/99-hypercolor.rules`.
2. Distro packagers: pick up the updated `hypercolor.service.system` and the `share/hypercolor/skills` archive root.
3. Regenerate any OpenAPI-derived clients. The Python client in `python/src/hypercolor/_generated/` is already regenerated for coverage, unclaimed devices, OpenRGB status, display rotation, and `forget_device`.
4. If you previously killed OpenRGB before launching Hypercolor, stop doing that. Run `hypercolor openrgb status` to see what is detected, `hypercolor openrgb hints` for install commands, then `hypercolor openrgb start` to adopt or launch a managed loopback server. Native drivers still take precedence per device.
5. Run `hypercolor devices coverage` after upgrading to see which hardware is native, bridged, or unclaimed, and `hypercolor devices unclaimed` to generate support requests for the rest.
4. For hardware without a native driver, run `hypercolor openrgb status` and `hypercolor openrgb hints`. After installing OpenRGB, enable the bridge with `hypercolor config set drivers.openrgb.enabled true`, select managed ownership with `hypercolor config set drivers.openrgb.ownership.mode open_rgb_owned`, then run `hypercolor openrgb partition` and `hypercolor openrgb start`. Native drivers retain ownership of supported devices.
5. Run `hypercolor devices coverage` to inspect native and bridged ownership, and `hypercolor devices unclaimed` to list unmatched USB hardware. Use the rig-setup skill's `request_support.py` helper to prepare support requests.
6. Lian Li LCD owners: set the panel's mounting rotation in device detail or Studio so faces, media, and effects turn with the screen.