Hide mouse cursor if unclutter is available
July 7, 2026 · View on GitHub
Raspberry Pi Kiosk Mode (Chromium)
This guide launches Chromium in kiosk mode to display KIP at: http://<sk_server_IP>:3000/@mxtommy/kip/#/page/0
It supports Raspberry Pi OS Bullseye (X11/LXDE) and Bookworm (Wayland).
What is “kiosk mode”?
Kiosk mode runs a single application full-screen and suppresses most desktop UI. In this guide, Chromium loads KIP and stays on screen like a dedicated instrument display.
- What it does:
- Launches Chromium full-screen without toolbars (“chrome”).
- Autostarts after login; optional auto-restart via systemd.
- Disables screen blanking; can hide the mouse cursor.
- What it does not do:
- It is not a full OS lockdown or content filter.
- Exit/maintenance:
- Desktop autostart: press Alt+F4 to close, or switch to a TTY (Ctrl+Alt+F2) and run: pkill chromium-browser || pkill chromium.
- systemd user service: systemctl --user stop kiosk.service (disable with systemctl --user disable kiosk.service).
1) Prerequisites
-
Raspberry Pi OS with Desktop, user:
pi(or adjust paths). -
Chromium installed:
sudo apt update sudo apt install -y chromium-browser || sudo apt install -y chromium -
Optional (hide mouse cursor):
sudo apt install -y unclutter -
Enable Desktop autologin:
sudo raspi-configSystem Options → Boot / Auto Login → Desktop Autologin
-
Disable screen blanking
- Wayland (Bookworm): raspi-config → Display Options → Screen Blanking → No
- X11 (Bullseye): we also disable via
xsetin the script below.
2) Create the kiosk launcher script
sudo nano /home/pi/kiosk.sh
Paste:
#!/usr/bin/env bash
set -euo pipefail
# URL for KIP (adjust as needed)
URL="${URL:-http://<sk_server_IP>:3000/@mxtommy/kip/#/page/0}"
# Pick Chromium binary
BROWSER="$(command -v chromium-browser || true)"
if [[ -z "${BROWSER}" ]]; then
BROWSER="$(command -v chromium || true)"
fi
if [[ -z "${BROWSER}" ]]; then
echo "Chromium not installed. Try: sudo apt update && sudo apt install -y chromium-browser || sudo apt install -y chromium"
exit 1
fi
# Hide mouse cursor if unclutter is available
if command -v unclutter >/dev/null 2>&1; then
unclutter -idle 0 -root &
fi
# Disable screen blanking on X11 (LXDE). On Wayland, use raspi-config instead.
if [[ "${XDG_SESSION_TYPE:-}" == "x11" ]]; then
xset s off -dpms
xset s noblank
fi
# Optional: wait for network/host (best-effort, up to ~2 minutes)
host="$(echo "$URL" | sed -E 's#^[a-z]+://([^:/]+).*$#\1#')"
if command -v ping >/dev/null 2>&1; then
for i in {1..60}; do
ping -c1 -W1 "$host" >/dev/null 2>&1 && break || sleep 2
done
fi
exec "$BROWSER" \
--kiosk \
--start-fullscreen \
--no-first-run \
--noerrdialogs \
--disable-session-crashed-bubble \
--disable-translate \
--disable-features=TranslateUI \
--enable-features=OverlayScrollbar \
--autoplay-policy=no-user-gesture-required \
--check-for-update-interval=31536000 \
--overscroll-history-navigation=0 \
--app="$URL"
PRO TIP : Browsers have native edge swipe gestures (swipes that starts from the very edges of the browser window). It triggers back and forth browser history page navigation. KIP posseses defensive code replacing the history page navigation with a KIP sidebar open/close operation. It's not 100% perfect all the time. The --overscroll-history-navigation=0 launch parameter disables the browser native gestures completly.
Optionally, you can also add the following exec "BROWSER" \ flags:
Tell Chromium to keep all threads actives.
--disable-background-timer-throttling \
--disable-renderer-backgrounding \
--disable-backgrounding-occluded-windows
Reduce memory consumption (Pi Zero)
--disable-gpu \
--single-process \
--js-flags="--max-old-space-size=512"
Save, then:
sudo chmod +x /home/pi/kiosk.sh
Tip: You can override the URL without editing the script using:
URL="http://signalk.local:3000/@mxtommy/kip/#/page/0" /home/pi/kiosk.sh
3A) Autostart via Desktop (.desktop) – simplest
Create an autostart entry:
mkdir -p ~/.config/autostart
nano ~/.config/autostart/kiosk.desktop
Paste:
[Desktop Entry]
Type=Application
Name=KIP Kiosk
Exec=/home/pi/kiosk.sh
Terminal=false
X-GNOME-Autostart-enabled=true
This launches after the desktop session starts.
3B) Autostart via systemd (user) – robust, auto‑restart
Recommended if you want Chromium to restart on crash.
mkdir -p ~/.config/systemd/user
nano ~/.config/systemd/user/kiosk.service
Paste:
[Unit]
Description=KIP Chromium Kiosk
After=graphical-session.target network-online.target
Wants=network-online.target
[Service]
Type=simple
Environment=URL=http://<sk_server_IP>:3000/@mxtommy/kip/#/page/0
ExecStart=/home/pi/kiosk.sh
Restart=on-failure
RestartSec=5
[Install]
WantedBy=graphical-session.target
Enable:
systemctl --user daemon-reload
systemctl --user enable --now kiosk.service
Logs (for debugging):
journalctl --user -u kiosk.service -f
Note: This runs after user login to the desktop. Ensure Desktop Autologin is enabled (Step 1).
4) Reboot and verify
sudo reboot
Chromium should open full-screen at: http://<sk_server_IP>:3000/@mxtommy/kip/#/page/0
Troubleshooting
- Blank screen on Bookworm: confirm Screen Blanking is disabled in raspi-config (Wayland ignores xset).
- Chromium not found: install package
chromium-browserorchromium(varies by OS version). - Wrong URL: KIP is served under /@mxtommy/kip/. Ensure the full path is used.
- Certificates: prefer HTTP or trusted TLS. Avoid
--ignore-certificate-errorsin kiosk. - systemd service not starting: check `journalctl --user -u kiosk.service -f