(public) Add support for setting and retrieving proxy bypass list
(public) Report serial number, MAC addresses, local IP addresses, brand and application type in the Authentication.AuthenticateDevice handshake as deviceInfo, so the server can identify the hardware before the first telemetry arrives
(public) Report Device.TelemetryUPTIME: seconds since Management (CC) and Front (CA) started, plus device boot uptime and panel-on time where the platform exposes them
(public) Devices no longer randomly fail to authenticate when the server responds immediately after the connection is established (random "Device failed to connect" / "timeout reached" failures on device-gateway)
(public) Custom script results are no longer duplicated into an applet command, only legacy experimental requests still get one
(public) Failed custom script executions no longer report an empty failure — the error message is included
(public) Muted overlay of a keepAppletRunning timer is cleared by Applet enable, and by Display ON outside the timer's OFF window
(public) Runners and plugins start when the device boots without network, are reconciled on authentication, and the runner is restarted with a refreshed sos.config when its configuration changes
(internal) DeviceAlive system log is no longer sent while the device is online — the socket connection already proves aliveness — and its period was extended from 60 s to 200 s
(public) Preserve the supplied host when downloading custom-script archives
(public) CI jobs no longer stall indefinitely during npm ci. The unused puppeteer dev dependency is dropped — nothing imported it and the browser tests resolve Chrome through CHROME_BIN — but its postinstall downloaded ~250 MB of Chromium from Google's CDN on every install, which hung jobs for their full timeout once installs stopped using --ignore-scripts.
(public) Reject incomplete IndexedDB downloads instead of storing partial files
(public) Socket sync: sos.sync.cancelWait() is implemented for the sync-server engine — it emits sync_request_cancel and rejects every wait pending on the group, not only the most recent one. On a group that isn't joined it is a no-op, matching the p2p engine behind the same API.
(public) Socket sync: sos.sync.leaveGroup() and close() reject the waits still pending on the groups they drop, instead of leaving the applet holding a promise nothing can ever settle.
(public) Socket sync: sos.sync.joinGroup() and leaveGroup() no longer hang forever when the sync server's acknowledgement never arrives. Acknowledgements are now bounded (30 s), after which the call rejects and the instance-wide lock is released.
(public) Socket sync: losing the connection mid-joinGroup(), or losing its acknowledgement, now buffers the group as offline so the reconnect flush re-sends it. Previously the group was silently dropped while the server could still hold the device in it and stall the group's barrier.
(public) Report uid on Screen.SaveTakenScreenshot and new Device.Screenshot.TakeInstantScreenshotFailed actions
(public) A device whose auto-verification configuration is missing the organization ID now asks for manual verification instead of registering without it
(public) management() returns the application's stop again — a refactor left return { stop } pointing at the global DOM stop(), which crashed Node.js consumers (e.g. display-linux) with ReferenceError: stop is not defined and stopped page loading in browsers
(public) Set the correct Content-Type on applet files extracted from a package so module-based bundles (e.g. Angular) load correctly instead of failing with a MIME type error on <script type="module">
(public) Browser-runtime custom scripts are delegated to the platform driver's scripts.execute (with appletJsFile) when no DOM is available, so platforms with a Node.js management runtime (e.g. windows) can route them to a real browser; in-page BrowserRuntime execution is kept where a DOM exists
(public) Custom script execution failures are logged with console.warn instead of only the debug channel, so they are visible in device logs
(public) Harden plugin/runner execution: reliable startup, no duplicate or leaked runners, trusted and bounded telemetry, driver-routed config changes, and a resilient Node.js bootstrap
(public) P2P sync: make WaitService resilient to dropped messages and timing races — re-send wait state every 5 s and on MemberJoined, credit recent (≤ 10 s) matching peer waits at the start of a new wait, and resolve with own data after 60 s so the applet keeps playing instead of hanging on a black screen
(public) Muted overlay (proprietary timer OFF window with keepAppletRunning) now blurs the running applet on WebOS by applying a CSS filter to the content elements instead of backdrop-filter, which WebOS' Chromium reports as supported but never paints
(public) Power off the display panel when a proprietary timer enters its OFF window with keepAppletRunning=true, so the applet keeps running while the panel turns off instead of staying lit on the muted overlay
(public) Show a translucent blurred overlay over the running applet when a proprietary timer enters its OFF window with keepAppletRunning=true, signalling that the display is scheduled off while content keeps running
(public) sendUdp support in network management driver interface and message handler
(public) Shared sendUdpPacket dgram utility for platform drivers
(public) Periodic telemetry cache invalidation now persists its target time, re-checks it on every startup and also fires from an in-process timer so long-running devices invalidate without needing a reboot or reconnect
(public) HTMLVideo prepare promise now rejects immediately on native video error, preventing video player slots from being permanently locked when playback fails
(public) Allow parametrize socketName with an option
(public) Restore sos.config for archive custom scripts — addConfigToSos() was missing from the archive execution, causing sos.config to be undefined for all CLI-pushed scripts
(public) Handle hug.ping messages in custom script message handler to prevent DataCloneError when front-applet sends periodic ping messages
(public) Add methods for computing aHash from HTML canvas - calculateAHash() and calculateAHashFromBase64()
(public) Reporting telemetry INSTALLED_PACKAGES
(public) Allow overriding model, serial number and OS version from local storage in WebBrowser emulator. This is useful for testing and development purposes.
(public) New options for Wi-Fi Enterprise from JS API
(public) Stop sending actions SaveOfflineActionsFile - those files are now handled directly on upload and sending an additional action is not needed anymore
(public) Function sos.managamenent.screen.resize() now allows to properly resize screen with custom aspect ratio on devices that support it
(public) Removed old dependency circular-json which broke the returned values from functions like getStorageUnits() or getListFiles(). Returned JSON values linked to themselves which lead to errors in testing and telemetry values.
(public) Using named time constants in intervals and wait
(public) Remove unnecessary debug logs
(public) Type for better screenshot metadata handling
(public) Improve console.js on-screen console (on-screen console is now rendered in iframe, add support for Date objects, add query string settings, improve indentation, prevent pollution of global scope)
(public) OSD can now be opened once per 10 seconds. This prevents multiple requests to open OSD in a short time, which may break OSD and calling JS API in OSD.
(public) Auto reconnecting (autoReconnect: boolean) stream edge cases and race conditions. 1) Some platforms and streams can emit events error and ended at the same time. This case was fixed. 2) Multiple streams with reconnect enabled is fixed now.
(public) Improved P2P sync resilience against network issues. Reliability of P2P synchronization heavily depends on being able to deliver all message to all devices in the group, because each device has to hold the state of the entire network and constantly update it. If a device misses a message, it will have an inconsistent state and will not be able to recover from it. This change improves the reliability of the P2P synchronization by adding a mechanism that ensures that all messages are delivered to all devices in the group.