Initial release v0.01 — SeniorNet kiosk browser
- PyQt5 floating toolbar (Back, Forward, HOME, Bookmarks) over Google Chrome - Scrollable bookmarks bar with nested folder dropdown menus - Chrome DevTools Protocol (CDP) for navigation control - Home screen with large senior-friendly buttons (Gmail, Google, Weather, News, Facebook, Messenger, YouTube) - Automatic GPU/ML cache cleanup on every Chrome launch - Kiosk hardening: TTY switching blocked, keyboard shortcuts intercepted, auto-restart on crash - System config files and install script included
This commit is contained in:
@@ -0,0 +1,121 @@
|
||||
# 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**: Ubuntu 24.04 LTS Server (minimal, headless)
|
||||
- **Display**: X11 + LightDM (auto-login) + Openbox WM
|
||||
- **Browser**: Google Chrome in `--app` mode (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.conf` sets `DontVTSwitch`
|
||||
- **X kill blocked**: `DontZap` prevents 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.
|
||||
|
||||
```json
|
||||
[
|
||||
{"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
|
||||
- Facebook Messenger
|
||||
- YouTube
|
||||
|
||||
## Remote Management
|
||||
|
||||
- **SSH**: `ssh jgitta@192.168.88.44` (local) or `ssh jgitta@kiosk-remote` (via Tailscale)
|
||||
- **Cockpit**: `https://192.168.88.44:9091`
|
||||
|
||||
## Installation Summary
|
||||
|
||||
1. Install Ubuntu 24.04 LTS Server (minimal)
|
||||
2. Install packages: `python3-pyqt5 google-chrome-stable unclutter xorg openbox lightdm fonts-noto-color-emoji websocket-client`
|
||||
3. Configure LightDM for auto-login
|
||||
4. Copy `kiosk-browser/` and `kiosk-home/` to `/home/jgitta/`
|
||||
5. Place system config files (see table above)
|
||||
6. Reboot
|
||||
|
||||
## Version History
|
||||
|
||||
| Version | Date | Notes |
|
||||
|---------|------|-------|
|
||||
| 0.01 | 2026-05-21 | Initial release — working kiosk with toolbar, bookmarks, hardening |
|
||||
Reference in New Issue
Block a user