ScreenTinker v2.6.0
@renebohne authored 3 of the 13 commits in this release (#569, #570, #571): display power schedules
and deep sleep for e-paper and other battery panels, device telemetry over HTTP polling, and
dithering profiles with remote reboot. Thank you, René.
Upgrade notes
- The first start after upgrading builds two indexes on
play_logs(#577). It is one synchronous
statement per index, so the server answers nothing until both finish, and the log says so before it
starts. On screentinker.com (5.2M plays) both took 10 s with a warm cache. A cold copy of the same
database took 48 s and 56 s at idle disk priority. Do not stop the server while it builds. Every
start after that skips them. - Roku screens need Chromium on the server for widgets, web pages and slides, which reach a Roku as
pictures the server draws (GET /api/player/raster). WithoutCHROME_PATH, those items answer 501
and the Roku skips them; images and video play either way. scripts/upgrade.shis a tracked file, so the copy that runs is the one from the release you are
leaving. Its pm2 support (below) helps from the upgrade after this one, or now if you run the new
script from outside the checkout withAPP_DIR=.
Added
- A ScreenTinker player for Roku (#576, #579). A native BrightScript app on the same socket protocol
as every other player. It pairs with a code, and plays playlists, schedules, play order, power
schedules and multi-zone layouts. Clocks are drawn on the Roku, and everything that needs a browser
is a frame the server renders. It needs Roku OS 15.1 or later. It is submitted to the Roku Channel
Store, and will be added with the channel codeScreentinkeronce Roku publishes it.- Server side: a
rokuplayer family,GET /api/player/raster(server-rendered frames, with an
ETag), and time-zone offset tables in the playlist payload, because a Roku has no time-zone
database. - Certification: the app no longer holds off the system screensaver, honours the Roku's Autoplay
setting (it waits for OK when Autoplay is off), sends Roku's launch and dialog beacons, accepts
Roku deep links, and leaves on Back from the first-run prompt. It declares RSG 1.3, logs its memory
limits and warnings, and usesStandardKeyboardDialogfor the server address. - Found on the first real Roku and fixed: a render-thread crash (black screen) from
roUrlTransfer
(nowroku/tests/check-threads.js, in CI); full Roku error details for videos that will not
decode; and a playlist with nothing playable no longer spins. It shows a message on screen and
retries after 30 s, doubling to 5 minutes, and failed attempts are not recorded as plays. - What a Roku cannot do is written down, not glossed over: it does not start by itself after a power
cut, cannot be rebooted, screenshotted or have its volume set remotely, and cannot decode H.264
taller than 1080 pixels (portrait clips). See the new guide (#580).
- Server side: a
- E-paper and battery panels follow display power schedules (#569, @renebohne). The embedded
renderer evaluates the device's power schedule, then its group's. During an off window it answers
with how long the panel may deep sleep, so a panel can sleep through the night on one charge.
A missing or broken schedule falls back to on. - Embedded panels report battery, Wi-Fi signal and firmware (#570, @renebohne) through
X-ST-Device-Battery,X-ST-Device-RSSIandX-ST-Firmware-Versionon their HTTP polls. Each poll
counts as a heartbeat. The display's page shows the battery and Wi-Fi cards, and the device name is
sent back inX-ST-Device-Name. - E-paper dithering profiles, and remote and scheduled reboot for embedded panels (#571,
@renebohne). Pick Floyd–Steinberg, Atkinson or none (threshold) per display. A reboot, from the
dashboard or the nightly reboot schedule, is queued and delivered on the next poll as
X-ST-Command: reboot. Controls a polling panel cannot honour are hidden. - Templates: ISO event times, larger
ST.data, and translations (#574). iCal data adds
event_N_start_iso/_end_iso/_all_day, andmax_eventsgoes up to 200.ST.dataholds up to
3000 keys per source, with byte caps that keep a template under the render limit. A template package
may carrylocales/<lang>.jsonfor ten languages, validated strictly at install, and slide
countdowns take alocale. - Templates library: search, filters and bulk install (#575). Search covers names, descriptions,
tags, id and author, in English and the translated text. You can filter by status, type,
orientation and tag. Install selected and Update all take one confirmation, which still names
every code template and the hosts it may contact. The Templates page is translated into de, es, fr,
hi, it, ja, nl, pt and zh. - Boot warnings for two silent self-hosting traps (#578).
[config]names any key inserver/.envor a repository-root.envthat the running server does
not have, and says why: the file is not read, it is read only bynpm start, or the environment
overrides it. Key names only, never values.[secrets]reports aJWT_SECRETthat changed under saved secrets: everyone is signed out and
saved secrets cannot be decrypted. When the server's generatedcerts/.jwt_secretis the previous
secret, the warning names it as the way back.
scripts/upgrade.shrestarts pm2 and anything else (#578). It usesRESTART_CMD, then the
systemd unit, then the pm2 process for this checkout. If none applies, it says the new release is
installed but not running, and exits 2. A failing step is named, with the advice not to finish by
git pull. Local edits to tracked files stop it before the backup.- A Roku guide, Roku in the platform lists, and the Roku Streaming Stick 4K under Known issues on the
certified hardware page (#580). That tier is not Certified Hardware and carries no support
commitment.
Fixed
- Deleting content or a widget froze the whole server (#577).
play_logs.content_idand
widget_idareON DELETE SET NULLforeign keys with no index since #451, so each delete scanned
every play synchronously. On screentinker.com that meant up to 34 s per delete, dropping screens
and dashboards. Account deletion paid one scan per item. Two partial indexes make each delete a
lookup (180 ms to 10 ms on 3M rows). - Every start rebuilt and then dropped a 260 MB index (#581).
schema.sql, which runs on every
boot, still createdidx_play_logs_content, which a migration drops. Starts and upgrades no longer
pay for it. - Sleeping e-paper panels no longer raise "display offline" alerts (#572). A render answer records
when the panel is next due, and the heartbeat sweep, the offline email and the alert channels
measure lateness from that. One poll writes one telemetry row, not two. - The
.env.exampleheader said the file is never loaded.npm startloadsserver/.env; pm2,
systemd andnode server.jsdo not. It now says where settings go (#578). - A rooms test depended on what UTC's tomorrow was (#573).
Artifacts
screentinker-2.6.0.tar.gz- bundle: server + frontend source + the Tizen .wgt (the signed Android APK is added at the root during release finalization).ScreenTinker.wgt- Tizen TV web app, unsigned - for inspection only.
Sign it with your own Samsung certificate (Tizen Studio + a profile that includes
your TV's DUID) to install, or - easiest - point a Tizen TV browser / URL Launcher
athttps://<your-instance>/player(no signing needed).ScreenTinker.ipk- LG webOS Signage app. Install from USB or an SI server; it then
updates itself from your instance. Built without LG's SCAP library (not redistributable),
so power and self-update controls need a build fromwebos/build-ipk.shwith the SDK
files inwebos/vendor/; seedocs/webos-player.md.autorun.zip- BrightSign player installer. Drop it on the root of a player's
storage (microSD, USB, or internal flash) and power-cycle: it unpacks itself and
reboots into the player. Editscreentinker.jsoninside the archive first to
point it at your own server.autorun-server.zip+server-payload.zip+server-payload.json- make a
BrightSign run the ScreenTinker server rather than just a player. Drop the
first on the player's storage root with anst-config.jsoncontaining
{"server": 1}; it fetches the payload on boot. PointpayloadUrlat your
own host - the default reaches ours, which is wrong for your site. The manifest
must sit beside the payload wherever you serve it: the launcher reads it to
decide whether an update is published.- Docker image:
ghcr.io/screentinker/screentinker:2.6.0(also:latest). ScreenTinker.apk- signed Android player (attached during release finalization).screentinker-sbom-2.6.0.cdx.json- CycloneDX 1.5 software bill of materials for the server's production dependencies, with the licence of every component.