Skip to content

Releases: Screenly/Anthias

2026.06.3

09 Jun 08:05
fe8f054

Choose a tag to compare

Maintenance release rolling up everything since 2026.06.1 (the 2026.06.2 bump was never cut as a release). Focus areas: arm64/Qt6 board support, Sentry error tracking, viewer/webview crash-recovery, and server/celery resilience. Cutting this triggers the balena OTA deploy to all screenly_ose/anthias-* fleets; unpinned devices pull it and restart.

New boards & fleets

  • feat(viewer,build,balena): add arm64/Qt6 pi3-64 board and the Rock Pi 4 fleet; keep 32-bit pi3 as legacy (#2985).

Observability

  • feat(sentry): add Sentry error tracking to the Django services (#3007).
  • feat(sentry): tag events with device type, host kernel, and board model (#3021).
  • feat(sentry): stamp the release with the build hash and tag balena deploys (#3025).
  • fix(sentry): stop reporting transient redis blips and client disconnects (#3018), also drop transient redis TimeoutError events (#3028), and silence the celery redis-backend reconnect-retry log (#3036).
  • fix(celery): don't report the by-design codec rejection to Sentry (#3041).

Performance

  • perf(viewer): pace Qt6 video frame delivery to scene-render capacity (#3006).
  • fix(viewer): aspect-fit, gapless looping, and 30fps cap for pi1/2/3 video (#3004).

Viewer & webview

  • fix(viewer): run PulseAudio so Qt 6 video plays with audio (#3001).
  • fix(viewer): default x86 audio fallback to ALSA 'default' (#3038).
  • fix(viewer): wait for cage's Wayland socket before spawning the webview (#3030).
  • fix(webview): add a page-load watchdog so a stalled fetch can't freeze the display (#3003).
  • fix(viewer): respawn the webview when it dies mid-D-Bus call (#3012), before setup's bus.get (#3020), and on a video-play D-Bus death rather than log+stop (#3031).
  • fix(viewer): silence sh's monitor-thread crash report on webview exit (#3011).

Server & celery resilience

  • fix(server): open SQLite with WAL journaling and a busy timeout (#3015).
  • fix(celery): gate worker startup on applied database migrations (#3016).
  • fix(celery): catch the asset-probe timeout instead of hard-killing the worker (#3017).
  • fix(celery): store display_power in redis as a string, not a bool (#3032).
  • fix(server): survive unreadable static files instead of crash-looping (#3026).
  • fix(server): keep legacy host timezones from crash-looping Django (#3010).
  • fix(server): stream the backup download so large libraries don't time out (#3005).
  • fix(views): accept 12-hour AM/PM times in the asset edit form (#3002).
  • fix(server): surface the exception detail in GitHub update-check warnings (#3023) and log release-check failures at warning, not error (#3019).

Uploads

  • feat(server): offer HandBrake GUI steps for rejected video uploads (#3040).

Balena fleet automation

  • feat(balena): hourly job to unpin pinned fleet devices (#2980).
  • feat(balena): unpinner also rolls OS + supervisor updates (#2984).

Build & infra

  • fix(build): ship libwebpdemux2 so pi3 Pillow can save WebP (#3042).
  • fix(redis): persist data to the mounted volume so device identity survives recreation (#2983).
  • fix(docker): pull the BuildKit frontend via mirror.gcr.io (#3008).
  • Fixes SBOM (#2982).

Dependencies

  • Bump uvicorn 0.32.1 → 0.49.0 (#2991), pyyaml 6.0.2 → 6.0.3 (#2993), django-stubs 6.0.3 → 6.0.5 (#2989), types-python-dateutil (#2992), and the github-actions group (#2994).

2026.06.1

02 Jun 20:40
9e4d69a

Choose a tag to compare

Maintenance release focused on viewer video performance and display fixes. Cutting this triggers the balena OTA deploy to all screenly_ose/anthias-* fleets; unpinned devices pull it and restart.

Performance

  • perf(viewer): render video via QML VideoOutput in a QQuickWidget (#2975) — replaces the toImage GPU-readback presentation path that capped presented framerate at ~8 fps on Pi 4 and ~11 fps on Pi 5 even with hardware decode; video now presents through the RHI sink at full rate.
  • fix(viewer): play pi2/pi3 video via GStreamer HW pipeline (#2972) — replaces VLC with a GStreamer pipeline that uses the hardware decoder on Pi 2/Pi 3.

Fixes

  • fix(viewer): default WLR_DRM_NO_ATOMIC=1 on x86 (#2978) — atomic-commit EBUSY can no longer freeze the display.
  • fix(viewer): rotate Pi 4 (eglfs) display via QT_QPA_EGLFS_ROTATION (#2971) and emit 270° as -90 so portrait-inverted isn't stretched (#2973) — the rotation menu now works on Pi 4.
  • fix(viewer): retry AnthiasViewer spawn so the armv7 WebEngine-init crash self-heals (#2969).
  • fix(viewer): skip the Writeback connector in the eglfs headless guard (#2968).
  • fix(viewer): fix two startup warnings surfaced by the log cleanup (#2979).

Housekeeping

  • chore(viewer): drop the always-on Qt debug logging from the image (#2977).

2026.06.0

01 Jun 07:06
f060c42

Choose a tag to compare

Maintenance release. Cutting this triggers the balena OTA deploy to all screenly_ose/anthias-* fleets; unpinned devices pull it and restart.

Fixes

  • fix(balena): legacy data migration is now part of the canonical migrate_legacy_paths.sh (#2964, superseding #2963). Pre-rebrand devices kept their data in /data/.screenly; the post-rebrand container reads /data/.anthias, so on a balena upgrade the viewer came up with an empty playlist while the real DB sat untouched in the legacy path. The container now runs the same migration the host install does (against /data), and recovers devices that already booted the broken release (empty anthias.db → adopt the populated legacy screenly.db, keeping a .emptybak).
  • fix(balena): pi4 dtparam=audio=on (#2961) — the multi-value dtparam never converged in balena's config.txt reconcile and reboot-looped the pi4 fleet; the single value stops the loop.

Notes

  • Field devices already affected by the playlist wipe are also being remediated out-of-band; this release makes every legacy device self-heal on restart.

v2026.05.2

31 May 14:41
652c96d

Choose a tag to compare

Highlights ✨

A stability and maintenance release hardening the balena fleets and the
upgrade path after the 2026.05.1 HW-decode overhaul. No new user-facing
features — all fixes.

Bug Fixes 🐞

  • balena x86 — frozen on boot splash — quit Plymouth before cage
    starts so the viewer actually gets DRM master. Previously Plymouth held
    DRM master on x86 (libseat: Could not make device fd drm master), every
    atomic commit was rejected, and the screen stayed on the splash while the
    logs flooded with Swapchain for output 'DP-1' failed test (#2955)
  • balena Pi 4 — no display — repair the full-KMS graphics overlay and
    manage fleet config.txt as IAC (balena-host-config.json), fixing a
    malformed dtoverlay="vc4-kms-v3d" that stopped the eglfs renderer from
    starting (#2947, #2949)
  • Headless / slow-HDMI boards — crash loop — the linuxfb viewer (pi2/pi3)
    now waits for /dev/fb0 instead of aborting with heap corruption when no
    display is connected at boot; it self-heals on hotplug (#2959)
  • Pi 5 — CEC probe core dumps — stop the HDMI-CEC diagnostics probe from
    dumping cores (which could fill the SD card and crash-loop services) (#2957)
  • Upgraded devices — viewer crash loopchown the config directory so
    upgraded devices stop crash-looping on a PermissionError writing
    anthias.conf (#2953)
  • Deterministic file ownership — pin the viewer UID/GID across all images
    so bind-mounted config/asset ownership is stable across rebuilds (#2958)
  • balena Releases page — stamp the real CalVer version into balena.yml
    so releases show 2026.5.x instead of 0.0.0+revN (#2952)

Docs 📚

  • Document the rpi-imager 2.0.x macOS write-error when flashing images, and
    the workaround (#2948, #2950)

Upgrade Notes 🧭

  • No action required. Devices upgrading from an older build pick up the
    config-dir chown and the pinned viewer UID/GID automatically, which
    resolves the anthias.conf PermissionError crash loop on first boot of
    the new release (#2953, #2958).
  • balena Pi 4 fleets have their config.txt reconciled from
    balena-host-config.json at deploy time; any hand-edited dashboard
    config vars outside that file are pruned (#2947).

What's Changed

Other Changes 🔧

  • docs: rpi-imager macOS "Error writing to storage device" guidance (#2948) by @vpetersson in #2950
  • fix(balena): repair Pi 4 graphics overlay + manage fleet host config as IAC (#2947) by @vpetersson in #2949
  • fix(viewer): chown the config dir so upgraded devices don't crash-loop by @vpetersson in #2953
  • chore(deps): regenerate uv.lock to match dev-dependency pin bumps by @vpetersson in #2956
  • fix(diagnostics): stop CEC probe from dumping cores on Pi 5 by @vpetersson in #2957
  • fix(docker): pin viewer UID/GID across all images for deterministic ownership by @vpetersson in #2958
  • fix(viewer): wait for /dev/fb0 instead of crash-looping when headless by @vpetersson in #2959
  • fix(balena): quit Plymouth before cage so x86 viewer gets DRM master by @vpetersson in #2955
  • fix(balena): stamp real release version into balena.yml by @vpetersson in #2952
  • chore(release): bump to 2026.05.2 by @vpetersson in #2960

Full Changelog: v2026.05.1...v2026.05.2

v2026.05.1

28 May 06:53
b9095c3

Choose a tag to compare

Highlights ✨

  • Pi 4 / per-board HW decode overhaul — embedded QtMultimedia inside AnthiasWebview, eliminating the two-process DRM contention that caused Pi 4 frame drops; added per-board HW decode dispatch and upload-time codec gating (#2905, #2885)
  • 1 GB SBC enablement — low-RAM degradation gates so 1 GB boards (e.g. 1 GB Rock Pi 4) don't wedge under heavy assets (#2915)
  • Remote video URLs in the asset pipeline — server auto-downloads remote URLs and pushes them through the normalisation pipeline (#2912)
  • HDMI-CEC display on/off (experimental) — turn the connected TV on/off via CEC from settings (#2886)
  • Migrate-to-Screenly wizard — opt-in UI flow that pushes an existing Anthias playlist into Screenly via the v4.1 API (#2876)
  • Generic arm64 (Armbian) best-effort installer support (#2879)
  • UI-driven screen rotation — portrait / landscape toggle without editing config.txt (#2882)
  • x86 video playback under cage — dmabuf-wayland output with VAAPI HW decode (#2861)
  • Anthias outbound traffic now identifies via a User-Agent (#2897)
  • Release-flow split: master is testing, tagged releases are stable (#2854)

Security 🔒

  • CodeQL alert sweep — path-injection, URL-redirection, stack-trace-exposure (#2884)
  • CSRF: CSRF_TRUSTED_ORIGINS env var for host-rewriting proxies (#2901) + accept same-host Origin regardless of scheme (#2868)

Upgrade Notes 🧭

  • Existing Pi 5 / mainline-KMS hosts: the upgrader now bind-mounts /dev/cec0 so HDMI-CEC works after upgrade (#2938).
  • Legacy srly-ose-redis container is removed on upgrade (#2936).

What's Changed

Other Changes 🔧

  • docs(compat): clean up supported hardware references by @nicomiguelino in #2858
  • refactor(webview): inline build into viewer image as multi-stage by @vpetersson in #2855
  • refactor(ci): release flow per #2769 (master = testing, releases = stable) by @vpetersson in #2854
  • docs(website): link Screenly in footer and add tagline by @vpetersson in #2864
  • fix(ci): symlink bunx alongside bun in install script by @vpetersson in #2865
  • chore(deps-dev): bump urllib3 from 2.6.3 to 2.7.0 by @dependabot[bot] in #2866
  • fix(csrf): accept same-host Origin regardless of scheme (#2867) by @vpetersson in #2868
  • chore(deps): bump github/codeql-action from 4.35.2 to 4.35.4 in the github-actions group across 1 directory by @dependabot[bot] in #2860
  • fix(viewer): x86 video playback under cage (dmabuf-wayland + VAAPI) by @vpetersson in #2861
  • chore: drop MY_IP env-var IP injection (#2869) by @vpetersson in #2872
  • fix(splash): cover 4K displays — ship 4K master and upscale-fit by @vpetersson in #2874
  • fix(api): v1/v1.1 normalize dispatch + stuck-row reconciler (#2870) by @vpetersson in #2873
  • fix(viewer): skip deleted/deactivated asset immediately by @vpetersson in #2875
  • refactor(ansible): boot.yml as authoritative templates (incl. silent boot) by @vpetersson in #2810
  • Fix HDMI audio detection on Pi4 with dual HDMI ports by @vpetersson in #2811
  • chore(deps): bump Django to 5.2.14 and Pillow to 12.2.0 by @vpetersson in #2877
  • feat(ui): migrate-to-Screenly wizard with v4.1 API by @vpetersson in #2876
  • fix(viewer): send Accept-Language from system locale by @vpetersson in #2878
  • chore(install): replace gum with whiptail by @vpetersson in #2880
  • fix: e2e-test findings (host-agent venv, celery beat, asset GET 404) by @vpetersson in #2881
  • fix(security): address open CodeQL alerts (path-injection, url-redirection, stack-trace-exposure) by @vpetersson in #2884
  • feat(viewer): UI-driven screen rotation for portrait/landscape by @vpetersson in #2882
  • feat(install): generic-arm64 best-effort support (Armbian SBCs) by @vpetersson in #2879
  • feat(settings): experimental HDMI-CEC display on/off by @vpetersson in #2886
  • chore(deps): bump the bun group with 3 updates by @dependabot[bot] in #2893
  • chore(deps-dev): bump ansible-core from 2.19.9 to 2.20.5 by @dependabot[bot] in #2892
  • chore(deps-dev): bump pillow-heif from 1.2.1 to 1.3.0 by @dependabot[bot] in #2891
  • chore(deps-dev): bump pytz from 2025.2 to 2026.2 by @dependabot[bot] in #2890
  • chore(deps-dev): bump types-pytz from 2026.1.1.20260408 to 2026.2.0.20260506 by @dependabot[bot] in #2889
  • chore(deps-dev): bump djangorestframework from 3.16.1 to 3.17.1 by @dependabot[bot] in #2888
  • refactor: move webview/ into src/anthias_webview by @vpetersson in #2896
  • chore(cec): tidy up follow-ups from #2886 by @vpetersson in #2887
  • feat(tests): marketing screenshot testbed via integration suite by @vpetersson in #2895
  • chore(ci): replace nick-fields/retry with inline bash loop by @vpetersson in #2898
  • feat(http): identify Anthias outbound traffic with a User-Agent by @vpetersson in #2897
  • fix(csrf): CSRF_TRUSTED_ORIGINS env var for host-rewriting proxies by @vpetersson in #2901
  • feat(website): home-page screenshot slider fed from CI captures by @vpetersson in #2899
  • feat(website): deep-linkable anchors on FAQ entries by @vpetersson in #2903
  • feat(viewer,server): per-board HW decode dispatch + codec gate on upload by @vpetersson in #2885
  • feat(viewer,webview): embed QtMultimedia in AnthiasWebview, eliminate two-process DRM contention + Pi 4 drops by @vpetersson in #2905
  • fix(api,app): UI asset delete must remove the on-disk file by @vpetersson in #2909
  • fix(installer): keep dtoverlay and max_framebuffers on separate lines in config.txt by @vpetersson in #2911
  • feat(api,viewer): viewer REST shim + rename AnthiasWebview → AnthiasViewer by @vpetersson in #2907
  • feat(server,api): auto-download remote video URLs into the asset pipeline by @vpetersson in #2912
  • fix(remote_video): reject empty Content-Type on GET by @vpetersson in #2913
  • fix(rpi-imager): repair broken Anthias icon URL by @vpetersson in #2918
  • fix(ci): fetch install-bun.sh from workflow ref, not tag workspace by @vpetersson in #2921
  • fix(ci): trust @balena/compose-parser so balena deploy can parse compose by @vpetersson in #2922
  • fix(ci): use --version latest for balena os download (was: default) by @vpetersson in #2924
  • fix(ci): install balena-cli via npm so native postinstalls run by @vpetersson in #2925
  • fix(ci): x86 fleet uses generic-amd64, not genericx86-64-ext by @vpetersson in #2926
  • feat(viewer,server): 1 GB SBC enablement — low-RAM degradation gates by @vpetersson in #2915
  • chore(deps): bump idna from 3.13 to 3.15 by @dependabot[bot] in #2920
  • chore(deps-dev): bump certifi from 2026.4.22 to 2026.5.20 by @dependabot[bot] in #2931
  • chore(deps-dev): bump types-requests from 2.33.0.20260408 to 2.33.0.20260518 by @dependabot[bot] in #2929
  • chore(deps-dev): bump packaging from 26.1 to 26.2 by @dependabot[bot] in #2932
  • chore(deps-dev): bump time-machine from 2.15.0 to 3.2.0 by @dependabot[bot] in #2933
  • chore(deps-dev): bump mypy from 1.18.2 to 2.1.0 by @dependabot[...
Read more

v2026.05.0

08 May 14:32
fc2f2d4

Choose a tag to compare

What's Changed

Other Changes 🔧

  • chore(deps-dev): bump handlebars from 4.7.8 to 4.7.9 by @dependabot[bot] in #2716
  • chore(deps): replace eslint-plugin-react with @eslint-react/eslint-plugin by @nicomiguelino in #2725
  • chore(deps-dev): bump picomatch from 2.3.1 to 2.3.2 by @dependabot[bot] in #2729
  • feat: add support for Raspberry Pi OS Trixie by @nicomiguelino in #2732
  • fix(viewer): pre-parse media to reduce VLC playback startup gap by @nicomiguelino in #2736
  • chore(deps): bump the github-actions group with 2 updates by @dependabot[bot] in #2737
  • chore(deps): remove unused Mako dependency by @dependabot[bot] in #2740
  • chore(deps): manage Python deps via uv dependency-groups by @vpetersson in #2744
  • chore(build): replace webpack, npm, and jest with bun by @vpetersson in #2746
  • chore(deps-dev): bump the bun group with 3 updates by @dependabot[bot] in #2747
  • chore(deps): bump ansible-core from 2.18.3 to 2.19.9 by @dependabot[bot] in #2749
  • chore(deps): bump astral-sh/setup-uv from 7.6.0 to 8.1.0 in the github-actions group by @dependabot[bot] in #2748
  • chore(host): unify host Python install on uv, clean up ansible roles by @vpetersson in #2750
  • refactor: rename legacy 'screenly' dirs to 'anthias' with auto-migration by @vpetersson in #2753
  • fix(ci): unbreak 32-bit ARM builds and make latest-* tag updates atomic by @vpetersson in #2755
  • fix(ci): pin bun-builder stage to BUILDPLATFORM for 32-bit ARM by @vpetersson in #2756
  • refactor(server): collapse nginx + websocket containers into uvicorn by @vpetersson in #2757
  • ci: enforce strict mypy across the codebase by @vpetersson in #2752
  • fix: unblock docker-build CI and the viewer/celery regressions it gated by @vpetersson in #2758
  • ci: switch primary registry to ghcr, drop legacy srly-ose namespace by @vpetersson in #2761
  • fix(viewer): unbreak django.setup() in viewer container by @vpetersson in #2762
  • chore: drop wifi-connect service end-to-end by @vpetersson in #2763
  • refactor(messaging): replace ZMQ with Redis for all viewer signalling, drop pyzmq by @vpetersson in #2760
  • fix(build): force bun's prod JSX runtime so the React app mounts by @vpetersson in #2764
  • docs(issue-template): mark Trixie as supported in bug report template by @nicomiguelino in #2766
  • refactor(webview): audit, rebrand to Anthias, pi4-64 support, CalVer by @vpetersson in #2767
  • chore(deps): upgrade Django 4.2 LTS -> 5.2 LTS by @vpetersson in #2768
  • fix(build): use 64-bit balena base for pi4-64 viewer image by @vpetersson in #2770
  • fix(build): skip libraspberrypi0 for pi4-64 (arm64) builds by @vpetersson in #2771
  • fix(install): accept Python >=3.11 on host instead of pinning to 3.11 by @vpetersson in #2773
  • fix(viewer): route pi4-64 to mpv and enable HW decode by @vpetersson in #2774
  • fix(viewer): honor audio_output in mpv and clean up container env by @vpetersson in #2775
  • refactor(docker): drop celery image, restore base apt layer dedup by @vpetersson in #2776
  • fix(viewer): engage Pi 4 HW decode on pi4-64 to stop frame drops by @vpetersson in #2777
  • fix(install): resolve release tags via refs/tags/ in clone_repo by @vpetersson in #2787
  • chore(deps): bump python + bun deps with locked transitives by @vpetersson in #2788
  • fix(viewer): use v4l2m2m-copy for Pi 4 HW decode, not drm-copy by @vpetersson in #2789
  • fix: address top recurring forum complaints (Tier A bundle) by @vpetersson in #2778
  • chore(build): upgrade to Debian Trixie + Python 3.13, drop Balena base images by @vpetersson in #2779
  • fix(build): bump WebView to v2026.04.1 for trixie artifacts by @vpetersson in #2792
  • ci(sbom): version SBOMs by SHA on master, by tag on releases by @vpetersson in #2790
  • fix(build): cross-build pi4-64 / pi5 webview as arm64 via QEMU by @vpetersson in #2794
  • chore(build): trim runtime apt deps (drop X11/XCB, VLC on Qt6) by @vpetersson in #2793
  • chore(deps): audit and drop 17 unused Python dependency pins by @vpetersson in #2795
  • fix(viewer): pin mpv to 1080p on pi4-64/pi5 to fix video playback by @vpetersson in #2796
  • fix(server): unblock migrations + fix upstream version check by @vpetersson in #2797
  • feat(telemetry): move GA emission to Celery beat with refreshed schema by @vpetersson in #2798
  • fix(ci): use correct balena fleet slug for pi4 by @vpetersson in #2799
  • ci(docker): split latest-tag mirror per registry, soft-fail Docker Hub by @vpetersson in #2800
  • We keep hitting rate limiting from Docker Hub - let's say goodbye by @vpetersson in #2802
  • chore(viewer): remove dead Balena pre-wait and unused wait_for_node_ip by @vpetersson in #2804
  • refactor(tests): migrate Python test suite to pytest by @vpetersson in #2801
  • chore(deps-dev): bump pytest from 8.3.4 to 9.0.3 by @dependabot[bot] in #2809
  • Hugo website: docs migration, API reference, FAQ, and SEO by @vpetersson in #2807
  • feat(asset): move URL reachability ownership to the server by @vpetersson in #2805
  • refactor(splash): poll IPs from client instead of rendering server-side by @vpetersson in #2806
  • feat(scheduling): per-asset day-of-week and time-of-day windows by @vpetersson in #2751
  • fix(ansible): map pi4-64 device_type to arm64 docker (regression from #2779) by @vpetersson in #2815
  • refactor(packaging): adopt src/ layout with split server/viewer packages by @vpetersson in #2817
  • Replace React frontend with Django templates + HTMX/Alpine by @vpetersson in #2818
  • fix(ui): truncate long asset names with ellipsis and hover tooltip by @vpetersson in #2823
  • fix(youtube): move download to a Celery task and detect URLs in frontend by @vpetersson in #2822
  • feat(ui): modernize splash, login, and error pages by @vpetersson in #2824
  • fix(ui): publish bare next/previous to viewer for skip buttons (#2821) by @vpetersson in #2827
  • fix(ui): make dashboard responsive on mobile (#2826) by @vpetersson in #2829
  • fix(server): compare against latest release tag, not branch HEAD by @vpetersson in #2831
  • refactor(auth): migrate to django.contrib.auth by @vpetersson in #2828
  • chore(deps): bump @tabler/icons-webfont from 3.41.1 to 3.43.0 in the bun group by @dependabot[bot] in #2839
  • chore(deps-dev): bump certifi from 2025.10.5 to 2026.4.22 by @dependabot[bot] in #2836
  • chore(deps-dev): bump pytest-django from 4.10.0 to 4.12.0 by @dependabot[bot] in #2837
  • chore(deps-dev): bump tenacity from 9.1.2 to 9.1.4 by @dependabot[bot] in #2835
  • chore(deps-dev): bump pytest-mock from 3.14.0 to 3.15.1 by @dependabot[bot] in #2834
  • feat(processing): normalise HEIC/HEIF/TIFF images and exotic-codec videos at upload time by @vpetersson in #2832
  • fix(ui): use {% comment %} for multi-line upload-accept note by @vpetersson in #2840
  • feat(webview): per-asset auto-refresh interval for webpage assets by @vpetersson in #2841
  • chore(docker): drop the 2026-05-01 webview cache-bust step by @vpetersson ...
Read more

WebView-v2026.05.0

07 May 21:25
4f57e2b

Choose a tag to compare

WebView v2026.05.0

Adds the ``setReloadInterval(int seconds)`` D-Bus slot that backs the
per-asset webpage auto-refresh feature in PR #2841 / issue #2813.
The viewer arms a per-asset QTimer that calls ``currentWebView->reload()``
every N seconds; 0 disables. Timer is cleared on every ``loadPage`` /
``loadImage`` and only re-armed once the new page is actually visible
(via ``switchToNextWebView``) so it can't fire on the prior page during
a swap. Seconds are clamped to [0, 86400] to match the server-side
REFRESH_INTERVAL_S_MAX cap.

Built and tested against Qt6 trixie (x86); pi5/pi4-64 cross-build via
QEMU + pi2/pi3 Qt5 build paths exercised via the existing build-webview
workflow.

WebView-v2026.04.1

30 Apr 14:54
1d8c3be

Choose a tag to compare

This release completes the Debian Trixie + Python 3.13 migration across the entire WebView stack — the Qt 5 toolchains for pi2/pi3 are rebuilt on trixie, and the Qt 6 webviews for pi4-64, pi5, and x86 are rebuilt against trixie's qt6-webengine-dev.

Supersedes WebView-v2026.04.0 (the first CalVer-tagged WebView release, which carried the Anthias rebrand of D-Bus / install paths / on-disk resources, the new pi4-64 Qt 6 path, and the webview-<calver>-<debian>-<board>.tar.gz artifact naming on bookworm). Use 2026.04.1 — 2026.04.0's bookworm tarballs are obsolete.

Build pipeline

  • Qt 5 cross-build Dockerfile end-to-end fixes for trixie
    • python2.7 from bullseye archive (trixie main dropped py2; pyenv was effectively broken because its PATH only loaded via ~/.bashrc, never reached docker run)
    • sysroot now ships harfbuzz/lcms2/re2/xml2 dev libs (chromium pdfium needed them on host and sysroot)
    • bzip2.pc copied from /usr/share/pkgconfig — was silently missing, made fontconfig probe fail and QtWebEngine quietly skipped
    • -webengine-proprietary-codecs enabled — H.264, AAC, MP3 in the resulting QtWebEngine
    • MAKE_CORES capped at min(nproc, 8) so chromium under qemu-arm doesn't OOM on >8-core hosts
    • trixie apt renames in webview/Dockerfile: libpng16-16libpng16-16t64 (time64 transition), libgst-devlibgstreamer1.0-dev, libsqlite0-devlibsqlite3-dev, libsrtp0-devlibsrtp2-dev
  • Trixie + Python 3.13 across all containers (server, celery, viewer, webview) — drops Balena base images, which never published a trixie tag and last refreshed in May 2025
  • Pi keyring fetch hardened: HTTPS-only + SHA256 pinning on raspberrypi-archive-keyring and raspbian-archive-keyring .debs (the .deb is the trust anchor for everything fetched after it, so TLS alone wouldn't catch an upstream archive-side swap)
  • bin/rebuild_qt5_toolchain.sh — out-of-band toolchain rebuild helper for pi2/pi3
  • pi1 + 32-bit pi4 retired — surviving build matrix is pi2, pi3, pi4-64, pi5, x86; Qt 5 path is pi2/pi3 only

CI / release infrastructure

  • Qt 5 builder image moved off Docker Hub onto GHCR: screenly/ose-qt-builderghcr.io/screenly/anthias-webview-qt5-builder (image + :buildcache tag), aligning with the rest of the anthias-* packages
  • Qt 5 builder built inline in compile-webview-part-1 (no separate publish job)
  • Registry-cache backend for the Qt 5 builder, mirroring docker-build.yaml
  • USER root declared explicitly in webview/Dockerfile builder stage (sonar finding)

Viewer / pi4-64

  • pi4-64 routes to mpv with HW decode via v4l2m2m-copy (not drm-copy)
  • 64-bit balena base for pi4-64 viewer image
  • libraspberrypi0 skipped on arm64 (it's armhf-only)
  • audio_output setting honored in mpv

Webview UX (forum Tier-A bundle, #2778)

  • No more white flash on dark URL assetssetBackgroundColor(Qt::black) on QWebEnginePage so the gap between load start and first paint is no longer white (forum t/6610)
  • URL assets refresh every loopQWebEngineProfile switched to memory HTTP cache + clearHttpCache on startup, instead of lingering stale for days from the on-disk cache (forum t/983)
  • Auto Qt scaling on 4K+ screensbin/start_viewer.sh now reads the active mode from /sys/class/drm/card*-*/modes and exports QT_SCALE_FACTOR (3840→2x, 5120→3x, 7680→4x); manual overrides win (forum t/6538)

Install / deps

  • bin/install.sh accepts Python >=3.11 (was pinned to 3.11)
  • Resolves release tags via refs/tags/ in clone_repo
  • Django 4.2.30 → 5.2.13 (LTS)

Release artifacts

Board Qt Tarball(s)
pi2 5.15.14 + WebEngine (this release's trixie toolchain) qt5-5.15.14-trixie-pi2.tar.gz, webview-2026.04.1-trixie-pi2.tar.gz
pi3 5.15.14 + WebEngine (this release's trixie toolchain) qt5-5.15.14-trixie-pi3.tar.gz, webview-2026.04.1-trixie-pi3.tar.gz
pi4-64 Qt 6 + WebEngine (trixie apt) webview-2026.04.1-trixie-pi4-64.tar.gz
pi5 Qt 6 + WebEngine (trixie apt) webview-2026.04.1-trixie-pi5.tar.gz
x86 Qt 6 + WebEngine (trixie apt) webview-2026.04.1-trixie-x86.tar.gz

Bookworm tarballs (pi1, pi2, pi3, pi4 32-bit) remain on WebView-v0.3.5 for legacy installs.

WebView-v2026.04.0

28 Apr 21:41
abd9f8d

Choose a tag to compare

WebView-v2026.04.0 Pre-release
Pre-release
WebView v2026.04.0

First CalVer-tagged WebView release. Cut from the webview-fix PR
branch (PR #2767) ahead of merge so the viewer image build can fetch
the published artifacts on first try.

Highlights vs. the previous WebView-v0.3.12 release:

* Pi 4 64-bit (pi4-64) now produces a Qt 6 build alongside pi5 and
  x86, instead of being lumped with the legacy Qt 5 cross-compile.
* WebView binary, D-Bus service / object path, install dirs, and
  on-disk resources renamed from Screenly* to Anthias* (the parent
  Screenly Inc. attribution and ~/.screenly/ legacy paths are
  unchanged).
* Several latent correctness bugs fixed: stale image-reply race,
  animated GIF buffer ownership, page-load signal handler races,
  authenticationRequired signal-slot signature mismatch.
* Server host/port are now LISTEN/PORT env-overridable instead of
  hardcoded to anthias-server:8080.
* Artifact filenames switch to webview-<calver>-<debian>-<board>.tar.gz
  (Qt version and git short hash dropped); the Qt 5 toolchain
  archive (qt5-5.15.14-bookworm-<board>.tar.gz) keeps its Qt version.

uv-test

24 Apr 21:25
8d376e4

Choose a tag to compare

uv-test Pre-release
Pre-release

What's Changed

Other Changes 🔧

Full Changelog: v0.20.5...uv-test