No description
  • Python 31.8%
  • Shell 29.3%
  • QML 27.5%
  • JavaScript 9.3%
  • HTML 1.6%
  • Other 0.5%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
leigh 52dba917fb Slideshow: specific Immich album, live photos and videos
Switch the slideshow from the favorites album to album
4fc2f364-a4b7-4006-b1c6-933d641e55fb, 10 s per photo, and enable live
photos and videos via Immich Kiosk URL params.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 20:23:28 +08:00
files Slideshow: specific Immich album, live photos and videos 2026-10-09 20:23:28 +08:00
.gitignore Initial dadKiosk setup: vanderPlan app window, kioskd screen manager, installer 2026-10-06 15:45:58 +08:00
install.sh Touch media controls: dock play/pause + now-playing panel with prev/next and volume 2026-10-09 16:34:36 +08:00
README.md Touch media controls: dock play/pause + now-playing panel with prev/next and volume 2026-10-09 16:34:36 +08:00
SETUP-LOG.md Slideshow: specific Immich album, live photos and videos 2026-10-09 20:23:28 +08:00

dadKiosk

Kitchen kiosk on an HP EliteOne 800 G2 23" Touch AiO (i5-6500, 8 GB, Intel HD 530, SiS touch, HP 2MP webcam) running KDE Neon 24.04 / Plasma 6.7 (Wayland).

  • vanderPlan (http://192.168.1.110:8091): main app, shown as a chromeless Firefox window
  • Home Assistant (http://192.168.1.121:8123): chromeless Firefox window, opened from the dock
  • Recipes (https://recipe.dadcloud.org, Mealie): chromeless Firefox window, opened from the dock
  • Signal Desktop: video calls; starts in the tray so calls ring
  • Spotify (Flatpak)
  • Immich photo slideshow as the screensaver (clock placeholder until Immich Kiosk is up)
  • Screen dims when nobody's around; the webcam wakes it when someone walks up
  • Touch media controls in the dock: big play/pause button, and the album-art button opens a panel with track info, large previous/play/next and a volume slider (works for Spotify, browser audio, …)
  • Power button turns the screen off (press again, or double-tap the screen, to turn it on); it never shuts down

Rebuild from scratch

  1. Install KDE Neon and create user leigh; connect to the network.
  2. Install the apps:
    • Signal: follow signal.org/download (apt repo + signal-desktop)
    • Spotify: flatpak install flathub com.spotify.Client
    • Firefox: Neon's deb (/usr/lib/firefox) is fine
  3. git clone <this repo> ~/kiosk-setup && cd ~/kiosk-setup && ./install.sh (asks for sudo for apt + autologin; run from inside the Plasma session)
  4. Do the Manual steps below, then reboot.

How it works

            touch / motion                   idle 5 min
 ┌──────────┐ ◄───────────── ┌───────────┐ ◄────────── ┌──────────┐
 │  ACTIVE  │                │ SLIDESHOW │             │  ACTIVE  │
 │vanderPlan│ ─── idle ────► │ (Immich)  │ ─ 30 min ─► │   DIM    │
 │Signal/Spt│                │  camera on│  or night   │ 10% / off│
 └──────────┘                └───────────┘             │ camera on│
                                   ▲ ─────── motion ── └──────────┘
Piece Repo file Installed to
Screen manager daemon files/kiosk/kioskd.py ~/.local/share/kiosk/kioskd.py (symlink)
Its settings files/config/kiosk.conf ~/.config/kiosk/kiosk.conf (symlink)
systemd user unit files/config/kioskd.service ~/.config/systemd/user/ (symlink)
vanderPlan launcher (URL lives here) files/bin/vanderplan ~/.local/bin/vanderplan (symlink)
vanderPlan menu/dock/autostart entry files/config/vanderplan.desktop.in ~/.local/share/applications/, ~/.config/autostart/ (generated)
Home Assistant launcher (URL lives here) files/bin/homeassistant ~/.local/bin/homeassistant (symlink)
Home Assistant menu/dock entry + icon files/config/homeassistant.desktop.in, files/icons/home-assistant.png ~/.local/share/applications/ (generated), ~/.local/share/kiosk/icons/ (symlink)
Power button → screen off/on files/bin/kiosk-power, files/config/kiosk-power.desktop.in, files/plasma/power-button.py ~/.local/bin/ (symlink), ~/.local/share/applications/ (generated), KWin global shortcut (applied)
Recipes (Mealie) launcher + dock entry + icon files/bin/recipes, files/config/recipes.desktop.in, files/icons/mealie.png same places as Home Assistant
Signal in tray at login files/config/signal-tray.desktop ~/.config/autostart/ (symlink)
Firefox kiosk prefs files/kiosk/ff-common.js + ff-*/user.js.local ~/.local/share/kiosk/ff-*/user.js (generated)
Hide Firefox toolbars files/kiosk/ff-vanderplan/chrome/userChrome.css chrome/ in the vanderPlan, Home Assistant and Recipes profiles (symlink)
Clock placeholder slideshow files/kiosk/placeholder.html ~/.local/share/kiosk/ (symlink)
Keep app windows full size after the on-screen keyboard files/plasma/kiosk-keepsize/ (KWin script) ~/.local/share/kwin/scripts/kiosk-keepsize (symlink), enabled in kwinrc
Window rules (maximized, no title bar) files/plasma/kwin-rules.sh ~/.config/kwinrulesrc (applied)
On-screen keyboard: narrow keys on a full-width bar files/keyboard/kiosk-keyboard-style + apt hook files/keyboard/99kiosk-keyboard-style /usr/local/sbin/, /etc/apt/apt.conf.d/; patches the dpkg-diverted Breeze style.qml (--system)
Dock size + pinned apps + media widget position files/plasma/panel.js Plasma panel config (applied)
Touch media controls (dock widget) files/plasma/kiosk-media/ (plasmoid org.dadkiosk.media) ~/.local/share/plasma/plasmoids/org.dadkiosk.media (symlink)
OpenCV files/requirements.txt ~/.local/share/kiosk/venv

Symlinked files can be edited in place and committed here. Generated/applied ones: edit the repo file and re-run ./install.sh --user.

kioskd runs as systemctl --user service kioskd:

  • Idle detection: swayidle (KWin ext-idle-notify). It respects idle inhibitors, so a Signal call or playing video won't start the slideshow.
  • Brightness: kscreen-doctor output.eDP-1.brightness.N, screen off: kscreen-doctor --dpms off.
  • Webcam: OpenCV frame differencing at 320×240, 3 fps, only while in SLIDESHOW/DIM, so Signal always gets the camera when someone is using the screen. The webcam LED is on while it's watching. Motion is ignored for settle seconds after brightness changes (auto-exposure swings look like motion).
  • PowerDevil dimming/sleep and the lock screen are disabled; kioskd owns the screen.

Day-to-day

systemctl --user restart kioskd          # after editing kiosk.conf
journalctl --user -u kioskd -f           # watch state changes
kill -USR1 $(systemctl --user show -p MainPID --value kioskd)   # slideshow now
kill -USR2 $(systemctl --user show -p MainPID --value kioskd)   # dim now
systemctl --user stop kioskd             # suspend kiosk behaviour for maintenance
~/.local/share/kiosk/venv/bin/python ~/.local/share/kiosk/kioskd.py --test-camera
                                         # live motion scores, for tuning [camera] threshold
                                         # (stop kioskd first; it may hold the camera)

Manual steps (not scriptable)

  • Signal: first run, link to the phone (Signal Desktop is a linked device).
  • KWallet blank password: Signal keeps its key in KWallet (safeStorageBackend: kwallet6). Autologin doesn't unlock the wallet, so Signal would hang on a password prompt at boot. KWalletManager → kdewallet → Change Password → leave blank. (Tradeoff: wallet contents readable to anyone at the machine.)
  • Home Assistant: open it from the dock, log in once and tick "Keep me logged in" (the session lives in the ff-homeassistant profile).
  • Recipes: open it from the dock and log in to Mealie once.
  • Spotify: log in.
  • Immich Kiosk (when https://immich.dadcloud.org is back): run damongolding/immich-kiosk in Docker next to Immich, then set [slideshow] url in files/config/kiosk.conf and systemctl --user restart kioskd.

Gotchas

  • Don't apt install python3-opencv on Neon: it pulls Ubuntu's Qt5, which conflicts with Neon's Qt5 (libqt5opengl5t64 : Depends: qtbase-abi-5-15-13). Use the venv.
  • Firefox --name X sets the Wayland app_id; that is how the dock and KWin rules tell the vanderPlan window apart from normal Firefox (StartupWMClass=vanderplan).
  • Pasting long sudo … | sudo tee one-liners into a terminal can wrap and split the command. Use ./install.sh --system instead.