- Update nixpkgs channel from nixos-25.11 to nixos-26.05
- Bump actions/checkout from v6 to v7
- Bump cachix/cachix-action from v16 to v17
- Bump gepbird/nix-update-action from v2.1.1 to v3.1.0
- Remove schedule trigger from binary-cache workflow to avoid redundant builds (push to main already triggers the same cache)
A ~1s background watcher on DeviceRepo samples a cheap FIDO HID presence
fingerprint (vid:pid:serial, by enumeration only — it never opens the
device, so it can't contend with an in-flight read or write) and triggers
a refresh whenever the key is plugged, unplugged or swapped. Every screen
then reflects the current device without the manual Refresh button. The
watcher skips a tick while a refresh/write is in flight and stops cleanly
when the repo is dropped.
Several Configuration-screen fields were blank, wrong, or silently
overwrote a working device on save when talking to RS-Key firmware:
- CONFIG_READ over CTAPHID 0x41 answers with a CBOR `{1: blob}` map, but
the client fed the raw CBOR bytes downstream. The PHY read only worked
by accident for records under 24 bytes and broke once a product name
pushed it over; the LED read never worked. Decode the map and return
the inner record.
- Parse the LED status block at the correct stride ((len-1)/4) in one
shared helper, fixing the CCID path that read a 17-byte block as a
legacy 9-byte one (colour shown as the effect id).
- Read hardware LED (GPIO/brightness/driver) and touch-timeout as
optionals: an absent phy tag now means "firmware default" (blank
field) and is not written back, so a virgin phy is no longer clobbered
with GPIO=0 / driver=Pico / brightness=0 on the next Apply. A value is
written only when the user sets one.
- Hide the "Supported Curves" card for RS-Key: its firmware ignores the
phy ENABLED_CURVES tag (curve support is compile-time), so the toggles
were a no-op that also wrote a meaningless tag on save.
- Preserve each status' LED effect/speed on a colour write (read-modify-
write), reject over-long product names, read the enabled USB apps over
the 0xC2 vendor command, and fall back to the USB product string when
the phy record carries no product override.