- Implemented a new API endpoint for retrieving and managing user favorites in /api/users. - Added functionality for admins to edit the shared "main" user's favorites. - Created a one-shot DB smoke test script for verifying multi-user kiosk migrations. - Introduced a RoomClock class for synchronizing server time across clients using WebSocket.
Online Radio Explorer
Touchscreen kiosk + admin for exploring and playing internet radio in the office.
Quick start
cp .env.example .env
npm install
npm run dev
- Kiosk: http://localhost:5173/
- Admin: http://localhost:5173/admin/
- API: http://localhost:4173/api
First boot creates the SQLite DB at DB_PATH, runs the seed, and provisions the
bootstrap admin from ADMIN_BOOTSTRAP_USER / ADMIN_BOOTSTRAP_PASSWORD.
Production
npm run build
npm start
The built kiosk is served from /, admin from /admin/, API from /api.
Electron (desktop / Pi)
The Master view also runs as a standalone Electron app. The Express + WebSocket server boots inside the Electron main process; controllers/panels on other devices on the LAN connect to it normally.
npm install # postinstall rebuilds better-sqlite3 for Electron's ABI
npm run electron # builds web assets and launches Electron
Packaging (Windows installer + Linux AppImage for Pi targets):
npm run dist:win # NSIS installer
npm run dist:linux # AppImage for x64 / arm64 / armv7l
In packaged builds, the DB and image cache live under app.getPath('userData')
(%APPDATA%/Online Radio Explorer on Windows, ~/.config/Online Radio Explorer
on Linux). In npm run electron dev mode the existing repo data/ directory
is reused.
Layout
server/— Express, SQLite, WebSocket hub, source adapters, stream resolver.web/— Vanilla JS kiosk (web/) and admin (web/admin/) bundled by Vite.data/seed/stations.json— curated starter pack.deploy/— systemd unit + Pi setup notes.