Skip to main content

Applet-Synchronizer Changelog

[3.1.0] - 2026-10-07​

Added​

  • /dashboard/view shows each group's organization prefix, so same-named groups no longer look duplicated.
  • /dashboard/view groups table: search, an organization filter, and sorting by peers or pending.

[3.0.0] - 2026-09-21​

Added​

  • join_group accepts an optional organizationUid. When the device sends it, it becomes the group prefix directly and neither Redis nor MongoDB is consulted — the lookup only runs for clients that don't. No deployed client sends it yet; docs/organization-scoping.md has what core and front-display need to implement.
  • GET /alive (liveness) and GET /ready (readiness) probes. /ready answers 503 until the socket handlers are attached — until then the port accepts connections no handler would answer. Neither checks MongoDB or Redis: /ready reports their state in its body only, because the service synchronizes without them. /status is unchanged.
  • Configuration option allowSlaveBroadcast to allow slave devices to broadcast values to all devices in a group via update_sync_config event.
  • Observability endpoints GET /dashboard (+ /dashboard/view) and GET /metrics (Prometheus, sos_applet_synchronizer_ prefix) surfacing sync counters, barrier fill latency, connected peers/active groups and duplicate-deviceIdentification group collisions.

Changed​

  • GET /metrics moved to the monitoring port (MONITORING_PORT, default 9999) without a token.
  • /alive and /ready also on the monitoring port, so the sos-service chart's default probes work.
  • Hosted service runs on Node 24; @signageos/lib 23.x, @signageos/user-domain-model 44.x, mongoose 8.20.
  • Abort barriers pending over 20s server-side and count them as dropped (env SYNC_BARRIER_TIMEOUT_MS, 0 disables).

Fixed​

  • A group whose last peers disconnect simultaneously no longer throws an uncaught TypeError from the barrier's master lookup (see public/CHANGELOG.md), which left stale pending requests behind and skipped the device_status update to the surviving peers.
  • join_group is now always acknowledged, so a server-side failure can no longer leave a device waiting indefinitely for an answer that never comes.
  • Evict empty sync groups from memory so the dashboard, metrics and the periodic status tick do not accumulate dead groups.
  • Emit device_status on device disconnect for organization-prefixed groups.
  • Register a joining peer only when deviceIdentification is provided (the guard was always true before).
  • Handle leave_group on the server so client leaveGroup() acks instead of hanging.

Security​

  • /dashboard(+/view) require dashboard_token (Bearer header or browser Basic prompt); 404 until set.

[2.2.0] - 2025-06-13​

Fixed​

  • Picking master device in the group based on deviceIdentification alphabetical order instead of the device creation date (keep the logic same with client - front-display).

Added​

  • Public build of the Applet Synchronizer service as @signageos/applet-synchronizer-public package in public registry npmjs.com.

[2.1.3] - 2024-11-13​

Fixed​

  • Fixed race condition during startup where some nested process would throw an unhandled error before the global handler is registered.
  • Status event contained group name with the internal organization uid prefix instead of the pure group name without the prefix.

[2.1.2] - 2024-01-18​

Security​

  • CVE-2017-16137

[2.1.1] - 2023-12-20​

Fixed​

  • Formatted repository

[2.1.0] - 2022-03-16​

Added​

  • Sending information about connected devices in group

[2.0.1] - 2020-07-29​

Fixed​

  • Failsafe connection to proprietary database replication

[2.0.0] - 2020-01-12​

Changed​

  • Change database implementation from RethinkDB to MongoDB

[1.0.4] - 2019-07-16​

Fixed​

  • Added missing /status page for healthcheck

[1.0.0] - 2018-07-17​

Added​

  • Changelog file containing all changes in current project

Changed​

  • Obfuscate all development details and publish a clean npm package that's safe to make public for on-premise installations