No description
- Python 31.8%
- Shell 29.3%
- QML 27.5%
- JavaScript 9.3%
- HTML 1.6%
- Other 0.5%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
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> |
||
| files | ||
| .gitignore | ||
| install.sh | ||
| README.md | ||
| SETUP-LOG.md | ||
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
- Install KDE Neon and create user
leigh; connect to the network. - 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
- Signal: follow signal.org/download (apt repo +
git clone <this repo> ~/kiosk-setup && cd ~/kiosk-setup && ./install.sh(asks for sudo for apt + autologin; run from inside the Plasma session)- 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
settleseconds 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-homeassistantprofile). - 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-kioskin Docker next to Immich, then set[slideshow] urlinfiles/config/kiosk.confandsystemctl --user restart kioskd.
Gotchas
- Don't
apt install python3-opencvon Neon: it pulls Ubuntu's Qt5, which conflicts with Neon's Qt5 (libqt5opengl5t64 : Depends: qtbase-abi-5-15-13). Use the venv. - Firefox
--name Xsets 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 teeone-liners into a terminal can wrap and split the command. Use./install.sh --systeminstead.