← All work

Live product · Built by Bytesicht

SignageWall

A complete digital signage product: manage content in the browser, deliver it through the backend, and play it on connected screens.

Product design · Frontend & backend · Infrastructure

Visit SignageWall
SignageWall dashboard in a demo workspace: fleet health lists one offline screen, one unpaired screen and two online screens, with a live connectivity chart
Screen management · Demonstration workspaceView full size

Make a screen
part of a system.

Digital signage needs more than an image on a television. Someone has to prepare content, assign it, schedule it, and manage what happens when a display loses its connection.

The management application separates screens, media, and playlists so operators can reuse content across devices. They configure display apps, preview the result, and assign content to a screen without rebuilding each display from scratch.

Bytesicht designed and implemented the operator experience, backend platform, media delivery, and player as parts of one product.

SignageWall screen settings with a live preview of the assigned café menu board, plus volume, orientation, scale and slide-transition controls
Screen configuration · Demonstration workspaceView full size

How the system connects

Editing, delivery, playback.

  1. Management application

    React tools prepare media, playlists, schedules, and display-app configuration.

  2. API & content delivery

    NestJS manages records and device updates. MongoDB stores application state; R2 stores media.

  3. Screen player

    Preact renders assigned content, persists a local snapshot, and prefetches media.

Backend connectors bring external data into the display payload. Device communication carries updates; media is delivered from object storage. This is a component overview, not a deployment topology.

Engineering decisions

Reliability is part
of the product.

A preview uses the actual renderer.

The dashboard and player mount the same display-app bundle. Shared configuration schemas define the editing form and the data the app expects. A new display app extends that contract, rather than requiring two separate rendering implementations.

Offline behavior depends on the content.

The player restores a saved snapshot and cached media before reconnecting. Apps that need a live data source are handled separately. This gives cached content a recovery path without pretending every integration works offline.

A loaded page is not proof of playback.

The native player reports update health only when content plays or the backend confirms a legitimate idle state. The watchdog can distinguish a successful page load from a player that is actually ready to display content.

Provider credentials stay on the backend.

The Google Calendar connector normalizes events into a shared payload. OAuth connections remain behind the API; the screen receives display data rather than provider credentials. Integration changes stay separate from screen layout.

SignageWall player showing a café menu board with coffee items and prices
Player output · Example display contentView full size

Built with

React / NestJS / MongoDB / Cloudflare R2 / Preact / TypeScript / IndexedDB / Socket.IO

Current status

Live software, designed and built as a Bytesicht product. The system described here covers the management application, backend, and player.

Build with Bytesicht

A product is more than its interface.

From management tools to connected devices, we can take responsibility for the software between them.

Discuss your project