Digital Signage

Screens get a small JSON, not a video; the design is drawn on the device.

A real-time system that sends lightweight JSON documents instead of videos to Android screens, which render them with templates.

Role
Backend, admin panel, Android
Year
2026
Status
Open source
Stack
NestJS · Next.js · Kotlin · Jetpack Compose · WebSocket · Docker
Links

Architecture

Architecture

Live demo · Prototype illustration, not a real screenshot
  1. 01

    Android screen

    Kotlin + Jetpack Compose. Templates live in the APK; a new template is one registry line and one Composable.

  2. 02

    Admin panel

    Next.js. Screens, devices, media, schedules and team; the preview is drawn with the same measures as the device.

  3. 03

    WebSocket

    A raw WebSocket that OkHttp can speak; changes travel as RFC 6902 deltas.

  4. 04

    NestJS + SQLite

    Multi-tenant organizations, roles, invitations, plan limits and the schedule engine.

Screens

01 / 03

Screens

Four screens on four templates: info, orders, queue number and media.

Real screenshots, matched to language and theme

How it works

The control plane is JSON

The server only tells a screen “render this template with this data”. Heavy media sits in a separate library; the device downloads it ahead of time, verifies it with SHA-256 and plays it from disk. Changes are designed to reach a device in under a second with almost no bandwidth.

Only the difference travels

When an order is added, only the changed fields travel, not the whole screen. If a device cannot apply a patch it asks for the full data itself. A change arriving from the panel over HTTP is handed to the device’s WebSocket through an in-process event bus.

When the network drops, the screen stays on

The last screen is stored on the device and shown when offline or at startup; media plays from the cache. The device reconnects with a growing delay, the app restarts itself after a crash and gives up after 3 crashes in 2 minutes so a broken build never loops forever.

Teams, integrations and setup

Organizations, owner/editor/viewer roles, email invitations, two-factor authentication, POS and queue-machine integration with screen-scoped API keys. Deployment is one command with Docker Compose and Caddy, with automatic HTTPS.