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 in #2844
- fix(install): tmpdir installer_venv on Bookworm; drop getmac dep by @vpetersson in #2843
- ci(mirror): cache oven/bun in ghcr.io/screenly/bun by @vpetersson in #2847
- ci(docker): pull bun from ghcr.io/screenly mirror by @vpetersson in #2848
- chore(server): bake collectstatic into image, drop runtime scratch mount by @vpetersson in #2846
- perf(website): WebP via Hugo Pipes, defer GA, gate chroma.css by @vpetersson in #2851
- fix(readme): fix broken Anthias logo by @salmanfarisvp in #2850
- ci(website): override addopts for rpi-imager pytest run by @vpetersson in #2852
- fix(compose): route container logs to journald to bound disk usage by @vpetersson in #2853
Full Changelog: v0.20.5...v2026.05.0