@@ -138,7 +138,7 @@ Optional `notify-send` popups for lock/unlock, idle lock, bridge offline, blocke
138138- ` libhidapi-libusb0 `
139139- ` python3-venv ` , ` python3-pip `
140140- OpenPnP with a configured machine (actuator names ` VAC1 ` / ` VAC2 ` expected for vacuum keys)
141- - Desktop: ` libnotify-bin ` (` notify-send ` ) for notifications — optional
141+ - Desktop: ` libnotify-bin ` (` notify-send ` ) for notifications (installed as a package dependency)
142142
143143---
144144
@@ -366,7 +366,7 @@ See [HID-NOTES.md](HID-NOTES.md) for protocol details.
366366| ` OpenPnP bridge not running ` | Restart OpenPnP; confirm ` Startup.py ` symlink |
367367| First button press missed | Ensure only one HID client is running; use current controller (HID read/write decoupling fix) |
368368| Permission denied on ` /dev/hidraw* ` | Run ` sudo udevadm control --reload-rules && sudo udevadm trigger ` ; replug |
369- | Notifications silent | Install ` libnotify-bin ` ; check ` notifications_enabled ` |
369+ | Notifications silent | Check ` notifications_enabled ` ; verify ` notify-send ` is available |
370370| Bridge changes ignored | ** Restart OpenPnP** (not just the controller) |
371371| Controller changes ignored | ` systemctl --user restart streamdeck ` or ` ./run ` |
372372
@@ -404,6 +404,51 @@ streamdeck/
404404
405405---
406406
407+ ## Releases
408+
409+ The ` .deb ` is built and uploaded ** only when a GitHub Release is published** — not on every push.
410+
411+ ### Publish a new version
412+
413+ 1 . Update ` VERSION ` default in ` build-deb.sh ` if needed (the release workflow passes the tag).
414+ 2 . Commit and push to ` main ` .
415+ 3 . Create a tag matching the version, e.g. ` v0.1.0 ` .
416+ 4 . On GitHub: ** Releases → Draft a new release** → choose the tag → ** Publish release** .
417+ 5 . The [ Release workflow] ( .github/workflows/release.yml ) builds ` streamdeck-openpnp_<version>_all.deb ` and attaches it to that release.
418+
419+ Install from a release asset:
420+
421+ ``` bash
422+ curl -LO https://github.com/tlf30/lumenpnp-streamdeck/releases/download/v0.1.0/streamdeck-openpnp_0.1.0_all.deb
423+ sudo apt install ./streamdeck-openpnp_0.1.0_all.deb
424+ streamdeck-setup-user
425+ systemctl --user enable --now streamdeck
426+ ```
427+
428+ ### CI vs release workflows
429+
430+ | Workflow | Trigger | Publishes ` .deb ` ? |
431+ | ----------| ---------| -------------------|
432+ | [ CI] ( .github/workflows/ci.yml ) | Push / PR to ` main ` | No — build verification only |
433+ | [ Release] ( .github/workflows/release.yml ) | Release ** published** | Yes — attached to the release |
434+
435+ ### GitHub Actions hardening
436+
437+ These workflows follow supply-chain best practices:
438+
439+ - ** Pinned actions** to full commit SHAs (not floating ` @v4 ` tags).
440+ - ** Least-privilege ` permissions ` ** — ` contents: read ` for CI; ` contents: write ` only on release upload.
441+ - ** No release on PRs or tags alone** — only ` release: published ` .
442+ - ** Repository guard** — release job runs only on ` tlf30/lumenpnp-streamdeck ` .
443+ - ** Dependabot** weekly PRs for action updates (` .github/dependabot.yml ` ).
444+
445+ Recommended repository settings (GitHub → Settings → Actions):
446+
447+ - ** Fork pull request workflows:** Do not run (prevents untrusted workflow code from accessing secrets).
448+ - ** Workflow permissions:** Read repository contents and packages permissions (workflows elevate only where needed).
449+
450+ ---
451+
407452## License
408453
409454[ MIT License] ( LICENSE ) — Copyright (c) 2026 LumenPNP.
0 commit comments