Local-network HTML digital signage. Control a fleet of TVs from a single admin UI.
Controller (Node.js) ←→ Players (Electron / Pi / Android)
↕ ↕
Admin Web UI Fullscreen WebView
↕
Cast Devices (Chromecast / Cast-enabled TVs)
npm installnpm run dev:controller
# → http://localhost:3000npm run dev:player
# Electron app opens, discovers the controller via mDNS, registers itselfOpen http://localhost:3000, go to Assign, pick a screen and sign → Push.
FTSign discovers Cast-enabled devices (Chromecasts, Android TVs, smart TVs) on your LAN automatically.
- The controller discovers Cast devices via mDNS (
_googlecast._tcp) - You can cast signs to any discovered device from the Cast tab in the admin UI
- Signs are loaded as URLs (controller serves the HTML)
The Default Media Receiver has limited HTML support. For full arbitrary HTML:
- Register a developer account at https://cast.google.com/publish ($5 one-time)
- Register a Custom Receiver pointing to:
http://<your-controller-ip>:3000/cast-receiver.html - Note your App ID and set it:
export FTSIGN_CAST_APP_ID=<your-app-id>
Apple TV doesn't support Cast. Options:
- AirPlay mirroring from a Mac/iOS device (not push-based)
- Build a tvOS app (future roadmap)
| Platform | How to run |
|---|---|
| Any Mac/PC | npm run dev:player |
| Raspberry Pi | Install Electron, same command |
| Android TV | Coming soon (WebView + WS client) |
| Chromecast | Built-in via Cast tab |
| Variable | Default | Description |
|---|---|---|
FTSIGN_PORT |
3000 |
Controller HTTP/WS port |
FTSIGN_DB |
ftsign.db |
SQLite database path |
FTSIGN_CAST_APP_ID |
CC1AD845 |
Cast receiver App ID |
FTSIGN_CONTROLLER |
ws://localhost:3000/ws |
Player fallback (if mDNS fails) |
All messages are JSON with envelope:
{ "type": "...", "device_id": "...", "timestamp": "...", "payload": {} }Message types: REGISTER, REGISTER_OK, LOAD_SIGN, ACK, ERROR, HEARTBEAT, PING, PONG
- Playlists + scheduling
- Asset upload (images/fonts)
- Android TV player app
- Role-based auth (RBAC)
- Bundle packaging + offline cache
- Emergency broadcast
- tvOS / AirPlay integration
- Multi-controller scaling (Redis pubsub)