ScreenTinker v2.0.7
Fixed — 2.0.6 broke the dashboard for everyone
frontend/js/views/schedule.js shipped with its new recurrence block inserted INSIDE an
unterminated import {, so the file was a syntax error. app.js imports that module statically,
which means the failure was never confined to the Schedule view: the whole dashboard module graph
stopped evaluating, and every page rendered blank and reported "Disconnected". The player and the
API were unaffected — screens carried on showing their playlists throughout — but nobody could
open the dashboard to see that.
The fix is a reordering; not a line of the recurrence logic changed.
Nothing in this repo had ever parsed browser code. The server has its own tests and CI lints
docs/openapi.yaml, but frontend/ was only ever read by a browser, so a file that could not be
parsed at all passed every gate we had. test/frontend-parses.test.js now parses every .js under
frontend/ and tizen/ — accepting module or classic-script syntax, since the tree holds both —
and asserts the static-import property that made this fatal rather than local.
Fixed — the dashboard no longer probes for a mesh it was told it does not have (#329)
The mesh routers mount conditionally, and the client discovered whether they existed by calling them
and reading the 404: /mesh/capabilities then /mesh/nodes on every sidebar render, /mesh/orgs
on every /me refresh, and /mesh/alerts and /mesh/uptime whenever those views opened. On an
install with no mesh — very nearly all of them — that is a steady trickle of 404s in the console for
a question the server settled at boot.
/api/auth/me now carries mesh: { enroll, hub }, recorded where the mount decision is actually
made, mirroring the existing hide_billing flag. The two are separate because the routes are: the
Servers nav turns on enroll (either half of a mesh), while the aggregate reads live in the hub
router and turn on hub.
An absent flag means UNKNOWN, not off. A server older than this field, or a user cached before it,
falls through to the original probe-and-catch path, so an older install still lights up its Servers
section correctly rather than silently hiding it.
Artifacts
screentinker-2.0.7.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).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.0.7(also:latest). ScreenTinker.apk- signed Android player (attached during release finalization).screentinker-sbom-2.0.7.cdx.json- CycloneDX 1.5 software bill of materials for the server's production dependencies, with the licence of every component.