Releases: Screenly/Anthias
2026.06.3
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_powerin 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
2026.06.1
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
toImageGPU-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=1on x86 (#2978) — atomic-commitEBUSYcan 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
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 (emptyanthias.db→ adopt the populated legacyscreenly.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
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 withSwapchain for output 'DP-1' failed test(#2955) - balena Pi 4 — no display — repair the full-KMS graphics overlay and
manage fleetconfig.txtas IAC (balena-host-config.json), fixing a
malformeddtoverlay="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/fb0instead 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 loop —
chownthe config directory so
upgraded devices stop crash-looping on aPermissionErrorwriting
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 show2026.5.xinstead of0.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-dirchownand the pinned viewer UID/GID automatically, which
resolves theanthias.confPermissionErrorcrash loop on first boot of
the new release (#2953, #2958). - balena Pi 4 fleets have their
config.txtreconciled from
balena-host-config.jsonat 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
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:
masteris testing, tagged releases are stable (#2854)
Security 🔒
- CodeQL alert sweep — path-injection, URL-redirection, stack-trace-exposure (#2884)
- CSRF:
CSRF_TRUSTED_ORIGINSenv var for host-rewriting proxies (#2901) + accept same-hostOriginregardless of scheme (#2868)
Upgrade Notes 🧭
- Existing Pi 5 / mainline-KMS hosts: the upgrader now bind-mounts
/dev/cec0so HDMI-CEC works after upgrade (#2938). - Legacy
srly-ose-rediscontainer 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[...
v2026.05.0
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 ...
WebView-v2026.05.0
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
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 thewebview-<calver>-<debian>-<board>.tar.gzartifact 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.7from bullseye archive (trixie main dropped py2; pyenv was effectively broken because its PATH only loaded via~/.bashrc, never reacheddocker run)- sysroot now ships
harfbuzz/lcms2/re2/xml2dev libs (chromium pdfium needed them on host and sysroot) bzip2.pccopied from/usr/share/pkgconfig— was silently missing, made fontconfig probe fail and QtWebEngine quietly skipped-webengine-proprietary-codecsenabled — H.264, AAC, MP3 in the resulting QtWebEngineMAKE_COREScapped at min(nproc, 8) so chromium under qemu-arm doesn't OOM on >8-core hosts- trixie apt renames in
webview/Dockerfile:libpng16-16→libpng16-16t64(time64 transition),libgst-dev→libgstreamer1.0-dev,libsqlite0-dev→libsqlite3-dev,libsrtp0-dev→libsrtp2-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-keyringandraspbian-archive-keyring.debs(the.debis 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-builder→ghcr.io/screenly/anthias-webview-qt5-builder(image +:buildcachetag), aligning with the rest of theanthias-*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 rootdeclared explicitly inwebview/Dockerfilebuilder stage (sonar finding)
Viewer / pi4-64
- pi4-64 routes to mpv with HW decode via
v4l2m2m-copy(notdrm-copy) - 64-bit balena base for pi4-64 viewer image
libraspberrypi0skipped on arm64 (it's armhf-only)audio_outputsetting honored in mpv
Webview UX (forum Tier-A bundle, #2778)
- No more white flash on dark URL assets —
setBackgroundColor(Qt::black)onQWebEnginePageso the gap between load start and first paint is no longer white (forum t/6610) - URL assets refresh every loop —
QWebEngineProfileswitched to memory HTTP cache +clearHttpCacheon startup, instead of lingering stale for days from the on-disk cache (forum t/983) - Auto Qt scaling on 4K+ screens —
bin/start_viewer.shnow reads the active mode from/sys/class/drm/card*-*/modesand exportsQT_SCALE_FACTOR(3840→2x, 5120→3x, 7680→4x); manual overrides win (forum t/6538)
Install / deps
bin/install.shaccepts Python>=3.11(was pinned to 3.11)- Resolves release tags via
refs/tags/inclone_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
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
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
Full Changelog: v0.20.5...uv-test