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.
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.
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).