Commit graph

593 commits

Author SHA1 Message Date
xadyz1 c3bebc06b7 Merge branch 'swiftdisplay1' of https://github.com/xadyz1/screentinker into swiftdisplay1 2026-07-26 20:11:01 +01:00
xadyz1 e996abb343 Revert "feat: rebrand to SwiftDisplay, update footer, safely remove GitHub/Open Source and emojis, update pricing to EUR without Free plan"
This reverts commit e9e3867bf1.
2026-07-26 20:10:56 +01:00
xadyz1 ba53c9c502 style: add standard background-clip CSS property to fix IDE warning 2026-07-26 20:09:16 +01:00
xadyz1 e9e3867bf1 feat: rebrand to SwiftDisplay, update footer, safely remove GitHub/Open Source and emojis, update pricing to EUR without Free plan 2026-07-26 20:04:48 +01:00
xadyz1 a9c288cb67 Create landing.html.tmp 2026-07-26 20:00:06 +01:00
xadyz1 a671504208 feat: rebrand to SwiftDisplay, update footer, remove GitHub/Open Source and emojis, update pricing to EUR without Free plan 2026-07-26 19:59:33 +01:00
xadyz1 f5ed7ae491 fix: handle empty API responses in frontend and return JSON on server crash 2026-07-26 19:53:23 +01:00
xadyz1 16fa1701d8 fix: replace ScreenTinker with SwiftDisplay logo in player and landing page 2026-07-26 19:44:17 +01:00
xadyz1 0b1f1bea33 fix: SwiftDisplay branding, euro currency, landing page fonts 2026-07-26 19:38:10 +01:00
xadyz1 5aad3ac383 fix: add build script to install server deps on Hostinger 2026-07-26 19:28:47 +01:00
xadyz1 d006776c8c Create package-lock.json 2026-07-26 19:17:22 +01:00
xadyz1 ad4b7d618e fix: upgrade uuid to v11 for Node 22 CJS compat 2026-07-26 19:10:32 +01:00
xadyz1 0ae0984126 fixversionuuuid 2026-07-26 18:55:17 +01:00
xadyz1 0bf4eec56f remiote 2026-07-26 18:27:22 +01:00
xadyz1 f011dd2764 da 2026-07-26 15:26:37 +01:00
xadyz1 edc98f4073 da 2026-07-26 15:26:30 +01:00
xadyz1 bf7fa80a25 ee 2026-07-26 15:26:09 +01:00
xadyz1 5987db1ae4 d 2026-07-26 15:22:36 +01:00
xadyz1 299cf7c44c crashlog 2026-07-26 15:22:31 +01:00
xadyz1 bf65f91865 fix 2026-07-26 14:58:12 +01:00
xadyz1 28c2615a15 .. 2026-07-26 14:56:46 +01:00
xadyz1 f83f82f962 . 2026-07-26 14:51:31 +01:00
xadyz1 df111e528b fixdb 2026-07-26 14:50:02 +01:00
xadyz1 be15e5b1dc Update remote_display.db-client_wal_index 2026-07-26 14:39:56 +01:00
xadyz1 5c39ae13e6 , 2026-07-26 14:33:28 +01:00
xadyz1 09eb887cf7 . 2026-07-26 14:31:15 +01:00
xadyz1 7aa5497360 fixhtaccess 2026-07-26 14:29:32 +01:00
xadyz1 6bec5f63a8 .. 2026-07-26 14:19:59 +01:00
xadyz1 abb9294e4e ,. 2026-07-26 14:19:48 +01:00
xadyz1 67c6e0a31a v1 2026-07-26 14:06:26 +01:00
xadyz1 e1b444f252 1 2026-07-26 13:12:02 +01:00
xadyz1 93fc5021a1 . 2026-07-26 13:08:57 +01:00
xadyz1 90e48581e2 Update database.js 2026-07-26 13:04:56 +01:00
xadyz1 6cf86533e4 c 2026-07-26 13:04:18 +01:00
xadyz1 c9adb31882 . 2026-07-26 13:03:11 +01:00
xadyz1 6923385398 buildfix 2026-07-22 14:01:30 +01:00
xadyz1 bb83bd885a . 2026-07-22 13:53:49 +01:00
xadyz1 c8cc12810a . 2026-07-22 13:39:12 +01:00
xadyz1 38fd41324d v1 2026-07-22 13:32:59 +01:00
ScreenTinker 2d4af97f67 docs: fix double-escaped < in API reference, add README hero image
Some checks are pending
CI / Unit tests (node --test) (push) Waiting to run
CI / OpenAPI spec lint (push) Waiting to run
CI / Android unit tests (Kotlin schedule evaluator vectors) (push) Waiting to run
CI / Boot smoke + version check (push) Waiting to run
- openapi.yaml: use the numeric entity &#60; so Redoc renders
  'read < write < full' in the scope-ladder nav + section header,
  instead of the double-escaped 'read &lt; write &lt; full'
- README: add a centered dashboard hero image + quick-links row
  (Live demo / API reference / Self-hosting guide / Discord) at the top,
  and refresh the Support section

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-21 22:51:55 -05:00
screentinker 8c0bf77428
fix(web-player): reconcile advanceTimer on group/wall mode transitions (#200) (#208)
Some checks are pending
CI / Unit tests (node --test) (push) Waiting to run
CI / OpenAPI spec lint (push) Waiting to run
CI / Android unit tests (Kotlin schedule evaluator vectors) (push) Waiting to run
CI / Boot smoke + version check (push) Waiting to run
Reconcile advanceTimer on mode enter/exit via reconcileAdvanceTimerForMode in applyWallMode/applyGroupSync — fixes the group-entry zombie timer and the solo-exit frozen image. Closes #200.
2026-07-21 09:00:42 -05:00
screentinker 3efae1d2d6
feat(designer): edit designer-made widgets in the designer (+ legacy reconstruction) (#207)
Designs round-trip for visual editing: store the design source in the widget config, reroute Edit to the designer, reconstruct legacy HTML-only designs, PUT the original in place.
2026-07-21 09:00:36 -05:00
screentinker 397c4e1aec
fix(designer): let weather elements switch units to metric (#206)
Some checks failed
CI / Unit tests (node --test) (push) Waiting to run
CI / OpenAPI spec lint (push) Waiting to run
CI / Android unit tests (Kotlin schedule evaluator vectors) (push) Waiting to run
CI / Boot smoke + version check (push) Waiting to run
Shaders / Compile transition shaders (real WebGL) (push) Has been cancelled
Adds the missing Imperial/Metric units selector to the designer's weather element properties.
2026-07-20 18:22:42 -05:00
ScreenTinker 6b5b401f7c chore(release): v1.9.11 2026-07-20 16:59:56 -05:00
screentinker ba00dd2811
fix(transition-engine): Android supersede wedge/leak + web/Tizen stale-video guard (#205)
Pre-release review follow-up to #204: fixes the Android superseded-wipe playlist wedge + GL leak, and adds the stale-item guard to web/Tizen renderVideoBuffered.
2026-07-20 16:58:28 -05:00
screentinker 96b71a0d56
feat: transition engine — GL wipes across web, Tizen & Android (+ image↔video) (#204)
Client-side GL Transitions v1 across all three players with never-blank degradation: shader lib + generated manifest + real-WebGL CI, transition-as-widget normalization, persistent WebGL/GLES2 compositors (web/Tizen/native Android), image↔video wipes, SSRF-hardened media proxy, decode-gated image preload, dashboard picker. Fixes the playlist change-fingerprint that dropped transition edits. Alpha + on-device soak validated.
2026-07-20 16:45:32 -05:00
ScreenTinker af89eaa75b chore(release): v1.9.10
Some checks failed
CI / Unit tests (node --test) (push) Has been cancelled
CI / OpenAPI spec lint (push) Has been cancelled
CI / Android unit tests (Kotlin schedule evaluator vectors) (push) Has been cancelled
CI / Boot smoke + version check (push) Has been cancelled
2026-07-17 20:24:39 -05:00
screentinker 335681b907
feat(directory-board): panel-ring scroll + in-place refresh + per-device frame diagnostic (#203)
Compositor panel-ring board scroll (smooth on Blink+Gecko, no blank-on-refresh), a per-device frame-rate diagnostic widget + dashboard card, and web/Android/Tizen device-id passthrough to widget render URLs.
2026-07-17 20:17:21 -05:00
screentinker bb6c7597da
fix(web-player): buffered widget swap + schedule-aware solo-board hold (directory-board black flicker) (#202)
Some checks are pending
CI / Unit tests (node --test) (push) Waiting to run
CI / OpenAPI spec lint (push) Waiting to run
CI / Android unit tests (Kotlin schedule evaluator vectors) (push) Waiting to run
CI / Boot smoke + version check (push) Waiting to run
* fix(web-player): buffered widget swap + solo-board hold to end directory-board black flicker

A fullscreen widget (e.g. a solo directory board) re-rendered on the advance timer:
renderContent tore the container down to black (innerHTML='') BEFORE the replacement
iframe finished loading, and a single/only-active widget re-advanced to itself every
duration_sec — so the board cycled black every few seconds. That reload was ALSO the
only thing refreshing the board's static, server-rendered data, so simply holding it
in place would freeze the data.

- Buffered swap: build the new widget iframe hidden OVER the current content and reveal
  it on 'load', then tear down the outgoing content — no black frame on any widget
  transition. On a load timeout, keep the last-good board and discard the dead hidden
  frame via a shared cleanup path (don't reveal a blank frame); a transient server blip
  self-heals on the next refresh.
- Solo/held widget (nextActiveIndex === currentIndex): hold in place and refresh its
  DATA on a decoupled interval (WIDGET_SOLO_REFRESH_MS = 60s) via the buffered swap,
  instead of re-querying the DB + re-rendering full HTML every duration_sec, fleet-wide.

Scoped to non-wall fullscreen widgets; wall+widget keeps the legacy path.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* fix(web-player): route held directory-board refresh through nextItem (schedule-aware)

Follow-up to the buffered widget swap: the solo/held board refreshed via a bespoke
self-rescheduling loop that never re-evaluated the schedule — so a board could outlive
its daypart, and a newly-active sibling item was never picked up (the player stuck on
the board). Delete the duplicate loop entirely and advance via nextItem in both the
held (WIDGET_SOLO_REFRESH_MS cadence) and rotating (duration) cases: nextItem
re-evaluates the schedule every cycle and re-renders the held board through the buffered
swap (still no flash), and drops the duplicate code path that caused the bug.

Verified: the timer-lifecycle harness (6 scenarios / 68 assertions) still passes,
including widget->video transition and the leak/timer-count checks.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-17 13:42:12 -05:00
screentinker 5c1cb4b992
fix(server): floor duration_sec to prevent widget zero-duration player loop (#199)
A duration_sec=0 assignment (especially a widget) made the player schedule a 0ms
auto-advance, self-looping and black-screening the TV. #198 fixed the Android
client; this hardens the source so a 0 can't be stored or served in the first
place. assignments.js accepted an explicit 0 on the POST/PUT/copy write paths —
the `= 10` destructure default only covers an ABSENT field, not an explicit 0.

- Add normalizeDuration() and apply it on all assignment write paths so any
  missing/invalid/<1 duration is floored to the 10s default.
- Add an idempotent migration repairing existing playlist_items rows with
  duration_sec IS NULL OR < 1 (fixes the live widget on existing DBs).

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-17 13:41:52 -05:00