4c474c0916c75b1ff4345be2fae480817d4268fb
SeniorNet Kiosk — v0.01
A fully locked-down, zero-maintenance browser kiosk for senior users running on Ubuntu 24.04 LTS Server.
Overview
The kiosk presents a single Chrome browser window with a custom floating toolbar. Seniors see only large, friendly navigation buttons and bookmarks — no browser UI, no address bar, no settings. Everything is managed remotely over SSH or Cockpit.
Architecture
┌─────────────────────────────────────────────────────┐
│ SeniorNet Toolbar (PyQt5 overlay — always on top) │
│ [ < Back ] [ Forward > ] [ HOME ] [ Bookmarks ] │
├─────────────────────────────────────────────────────┤
│ Bookmarks Bar (scrollable, nested folder menus) │
├─────────────────────────────────────────────────────┤
│ │
│ Google Chrome (--app mode) │
│ No browser UI — content only │
│ │
└─────────────────────────────────────────────────────┘
- OS: Debian Trixie
- Display: X11 + LightDM (auto-login) + Openbox WM
- Browser: Google Chrome in
--appmode (no tabs/address bar) - Toolbar: PyQt5 frameless overlay, always-on-top, 142px tall
- Browser control: Chrome DevTools Protocol (CDP) over WebSocket on port 9222
- Remote management: SSH + Cockpit (port 9091)
- Remote access: Headscale (self-hosted Tailscale)
Files
| File | Purpose |
|---|---|
browser.py |
Main application — PyQt5 overlay + CDP Chrome controller |
bookmarks.json |
Nested bookmarks (folders + links) shown in the bookmarks bar |
/home/jgitta/kiosk-home/index.html |
Home screen with large buttons and live clock |
System Configuration Files
| Path | Purpose |
|---|---|
/etc/lightdm/lightdm.conf.d/50-kiosk.conf |
Auto-login as jgitta into Openbox session |
~/.config/openbox/autostart |
Launches browser.py at session start, auto-restarts on crash |
/etc/X11/xorg.conf.d/50-kiosk-hardening.conf |
Blocks TTY switching and Ctrl+Alt+Backspace |
/etc/apt/apt.conf.d/20auto-upgrades |
Automatic unattended security updates |
Chrome Launch Flags
Chrome is launched with these key flags:
--app=<HOME_URL> # No browser UI, content only
--window-position=0,142 # Below the 142px overlay
--window-size=1920,938 # Full width, remaining height
--remote-debugging-port=9222 # CDP for toolbar control
--disable-gpu # Required on server hardware (no GPU drivers)
--disable-dev-shm-usage # Prevents shared memory crash
--test-type # Suppresses unsupported-flag warning banner
--disable-features=OptimizationHints,... # Prevents ML model cache corruption
--disable-component-update # No background component downloads
--user-data-dir=~/.config/google-chrome-kiosk # Dedicated kiosk profile
Hardening
- TTY switching blocked:
/etc/X11/xorg.conf.d/50-kiosk-hardening.confsetsDontVTSwitch - X kill blocked:
DontZapprevents Ctrl+Alt+Backspace - tty2–tty6 disabled:
systemctl disable getty@tty2..6 - Keyboard shortcuts blocked: Overlay intercepts Alt+F4, Ctrl+W, Ctrl+T, Ctrl+N, F11, Escape
- Auto-restart: Openbox autostart restarts browser.py within 5 seconds if it crashes
- Profile cleanup: GPU/ML caches wiped on every Chrome launch to prevent corruption
Bookmarks
Bookmarks are stored in bookmarks.json as nested JSON. Top-level items appear as buttons in the bookmarks bar. Items with a children array become folder dropdown menus.
[
{"name": "Gmail", "url": "https://mail.google.com"},
{"name": "News", "children": [
{"name": "BBC News", "url": "https://www.bbc.com/news"}
]}
]
Edit bookmarks live through the Bookmarks button in the toolbar, or edit bookmarks.json directly via SSH.
Home Screen Buttons
Defined in /home/jgitta/kiosk-home/index.html:
- Email (Gmail)
- Internet (Google)
- Weather (AccuWeather)
- News
- Facebook Messenger
- YouTube
Remote Management
- SSH:
ssh jgitta@192.168.88.44(local) orssh jgitta@kiosk-remote(via Tailscale) - Cockpit:
https://192.168.88.44:9091
Installation Summary
- Install Ubuntu 24.04 LTS Server (minimal)
- Install packages:
python3-pyqt5 google-chrome-stable unclutter xorg openbox lightdm fonts-noto-color-emoji websocket-client - Configure LightDM for auto-login
- Copy
kiosk-browser/andkiosk-home/to/home/jgitta/ - Place system config files (see table above)
- Reboot
Version History
| Version | Date | Notes |
|---|---|---|
| 0.01 | 2026-05-21 | Initial release — working kiosk with toolbar, bookmarks, hardening |
Description
Languages
Python
49.8%
HTML
28.1%
Shell
20.5%
PHP
1.6%