LZStealth 2ea8d389fa
Publish Docker Image / build-and-push (push) Successful in 58s
This PR breaks the large web and player bootstrap files into smaller modules with clearer ownership.
Web changes:

Split shared helpers, bootstrap logic, route groups, and upload-sync behavior out of web.js.
Kept web.js focused on wiring and server startup.
Fixed screen playlist reassignment so changing a screen’s playlist now triggers a refresh.
Fixed single-slide playlist refresh behavior so updates do not get stuck behind the current slide.
Player changes:

Split websocket/runtime handling into runtime.js.
Split playlist assembly and revision hashing into playlist.js.
Split onboarding and player HTTP routes into dedicated modules.
Split render utilities and template loading into render-helpers.js.
Kept player.js mostly as startup/orchestration.
Validation:

Rebuilt both services with Docker Compose.
Smoke-checked web and player routes after the refactor.
Verified get_errors was clean on the touched modules.
2026-07-20 23:58:27 +01:00
2026-07-14 12:50:52 +01:00
2026-07-14 20:52:39 +01:00

Pulse Signage

Pulse Signage is a digital signage system that lets you manage screens, playlists, slides, templates, and uploaded media from one admin interface.

It runs as two connected services:

  • the web admin app for managing content and screens
  • the player app that shows the current signage on each screen and listens for live updates

What You Can Do

  • Sign in to the admin dashboard
  • Create and organize playlists and slides
  • Design reusable templates and canvas sizes
  • Register screens and assign playlists to them
  • Upload images and other media for use in slides and templates
  • View live screen connections and send player commands

Documentation

Player-facing API details live in docs/api.md. It covers the player HTTP endpoints for screen playback, playlist data, connections, and commands.

Player websocket behavior lives in docs/websocket.md. It covers the player control socket, snapshot stream, and the command/message shapes the player accepts.

What You Need

  • Docker and Docker Compose
  • A MySQL database

First-Time Setup

When the app starts for the first time, it creates the database tables it needs and adds a default admin account if no users exist yet.

  • Username: admin
  • Password: admin

You can change the initial admin credentials with these optional environment variables:

  • DEFAULT_ADMIN_USERNAME
  • DEFAULT_ADMIN_NAME
  • DEFAULT_ADMIN_PASSWORD

Configuration

The app reads its settings from environment variables.

Database Connection

  • DB_HOST - MySQL host, default 127.0.0.1
  • DB_PORT - MySQL port, default 3306
  • DB_NAME - database name, default signage
  • DB_USER - database user, default signage_user
  • DB_PASSWORD - database password, default signage_password

Web Admin App

  • WEB_PORT - admin app port, default 3000
  • PLAYER_INTERNAL_BASE_URL - player address used by the server, default http://player:3001
  • PLAYER_PUBLIC_BASE_URL - player address shown in browser links, default http://localhost:3001

Player App

  • PLAYER_PORT - player port, default 3001

Docker Compose

The repository includes a docker-compose.yml file that starts three services:

  • web - the admin app on port 3000
  • player - the signage player on port 3001
  • mysql - the database on port 3306

By default, web and player use the published image from git.lzstealth.com/lzstealth/pulse-signage:latest. You can point both services at a specific release by setting PULSE_SIGNAGE_IMAGE to a tagged image such as git.lzstealth.com/lzstealth/pulse-signage:v1.0.0.

The Compose file also defines a shared uploads volume for media and a mysql_data volume for database persistence.

In Docker, upload storage is controlled by the uploads volume mount at /app/uploads. Outside Docker, the web app and player do not have to use the same upload location or even the same server, as long as each service can access its own configured media path.

Important Notes

  • The web app must be able to reach the player through PLAYER_INTERNAL_BASE_URL.
  • When running in Docker, that value should point to the Docker service name, not localhost.
  • Uploaded media is stored separately from the application source, so make sure it is backed up if you are not using Docker volumes.
S
Description
No description provided
Readme
7.6 MiB
Languages
JavaScript 78.7%
Handlebars 14.9%
CSS 4.5%
HTML 1.9%