{"product":"anthias","releases":[{"date":"2026-06-02","entries":[{"areas":[],"breaking":false,"content_html":"\u003cp\u003eFrom Anthias 2026.06.1, a balena device installed before the Screenly to Anthias rename keeps its playlist and content when it upgrades. A device that already lost them gets them back when it starts 2026.06.1.\u003c/p\u003e\n\u003cp\u003eBefore, such a device could come up with an empty playlist after an upgrade, and many did when Anthias 2026.05.2 rolled out. Nothing had been deleted. Its data was still under \u003ccode\u003e/data/.screenly\u003c/code\u003e and \u003ccode\u003e/data/screenly_assets\u003c/code\u003e, but Anthias reads \u003ccode\u003e/data/.anthias\u003c/code\u003e and \u003ccode\u003e/data/anthias_assets\u003c/code\u003e, so it started with a new, empty database. Raspberry Pi OS and Debian installs weren\u0026#39;t affected, because the installer and the upgrade script already \u003ca href=\"/releases/anthias/2026.05.0/fewer-containers-and-anthias-folders/\"\u003erename those folders\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eNow the containers run that same migration against \u003ccode\u003e/data\u003c/code\u003e every time they start:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eOn a device that hasn\u0026#39;t been migrated yet, the configuration, database and content move to the \u003ccode\u003eanthias\u003c/code\u003e names, and the paths inside \u003ccode\u003eanthias.conf\u003c/code\u003e are rewritten to match.\u003c/li\u003e\n\u003cli\u003eOn a device that already came up empty, if \u003ccode\u003eanthias.db\u003c/code\u003e has no content and the old \u003ccode\u003escreenly.db\u003c/code\u003e does, the old database is copied into place. The empty one is kept as \u003ccode\u003eanthias.db.emptybak.\u0026lt;timestamp\u0026gt;\u003c/code\u003e. If \u003ccode\u003eanthias_assets\u003c/code\u003e is empty too, it becomes a link to the old media folder.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eAnthias 2026.06.0 already included this migration, but inside the containers it stopped with an error before doing anything, so it takes effect from 2026.06.1. You don\u0026#39;t need to do anything. The recovery only replaces a database with no content in it, so if you added content to an affected device after the upgrade, nothing is replaced, and the old database stays at \u003ccode\u003e/data/.screenly/screenly.db\u003c/code\u003e.\u003c/p\u003e\n","description":"A balena device that still keeps its data under the old Screenly folder names now carries its playlist and content over when it upgrades, and a device that already came up empty gets them back.","title":"Balena devices from before the Anthias rename keep or recover their playlist on upgrade","type":"fix","url":"https://www.screenly.io/releases/anthias/2026.06.1/older-balena-devices-keep-their-playlist-on-upgrade/"},{"areas":[],"breaking":false,"content_html":"\u003cp\u003eVideo on a Raspberry Pi 4 or Pi 5 plays smoothly in Anthias 2026.06.1. Since the viewer started \u003ca href=\"/releases/anthias/2026.05.1/video-decode-and-codec-check/\"\u003eplaying video itself in 2026.05.1\u003c/a\u003e, these boards decoded video without trouble but only got 8 to 12 frames per second onto the screen, so video looked choppy.\u003c/p\u003e\n\u003cp\u003eIn the project\u0026#39;s testing with a 1080p, 30 fps clip:\u003c/p\u003e\n\u003ctable\u003e\n\t\u003cthead\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003cth\u003eBoard\u003c/th\u003e\n\t\t\t\t\t\u003cth\u003eFrames per second on screen\u003c/th\u003e\n\t\t\t\t\t\u003cth\u003eViewer CPU use\u003c/th\u003e\n\t\t\t\u003c/tr\u003e\n\t\u003c/thead\u003e\n\t\u003ctbody\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eRaspberry Pi 4\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e8.3 before, 30 now\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eabout 115% before, 64% now\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eRaspberry Pi 5\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e11.7 before, 26.6 now\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eabout 155% before, 13% now\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003eThe old path copied every frame from the GPU back to the CPU before drawing it. Frames now stay on the GPU until they\u0026#39;re on the screen. x86 and generic arm64 boards use the same viewer, but the project measured the change on the Pi 4 and Pi 5 only. The Pi 4 decodes H.264 in hardware up to 1080p; a 4K H.264 file still decodes in software, which uses every core and drops frames.\u003c/p\u003e\n\u003cp\u003eIf you read the viewer\u0026#39;s playback log, \u003ccode\u003e/data/.anthias/playback-stats.log\u003c/code\u003e, the \u003ccode\u003eSAMPLE\u003c/code\u003e, \u003ccode\u003eEND_FILE\u003c/code\u003e and \u003ccode\u003eSTOP\u003c/code\u003e lines now have a \u003ccode\u003eframes-rendered\u003c/code\u003e field next to \u003ccode\u003eframes-delivered\u003c/code\u003e. \u003ccode\u003eframes-delivered\u003c/code\u003e counts frames the decoder handed over, and \u003ccode\u003eframes-rendered\u003c/code\u003e counts how often the picture was drawn to the screen, so a big gap between them means the screen isn\u0026#39;t keeping up. Fields are \u003ccode\u003ekey=value\u003c/code\u003e, and the new one sits in the middle of each line, so a script that reads them by position needs updating.\u003c/p\u003e\n","description":"Video on a Raspberry Pi 4 or Pi 5 no longer stutters along at 8 to 12 frames per second. A 30 fps clip now plays at or close to its own frame rate, and the viewer uses less CPU doing it.","title":"Smoother video on Raspberry Pi 4 and Pi 5","type":"improvement","url":"https://www.screenly.io/releases/anthias/2026.06.1/smoother-video-on-raspberry-pi-4-and-pi-5/"},{"areas":[],"breaking":false,"content_html":"\u003cp\u003eFrom Anthias 2026.06.1, video plays on a Raspberry Pi 2 or Pi 3. Before, the screen stayed black for the length of every video, while the viewer log said it was showing it:\u003c/p\u003e\n\u003cdiv class=\"code-block\"\u003e\n  \u003cbutton type=\"button\" class=\"code-copy\" aria-label=\"Copy code\" data-copy-code\u003e\n    \u003csvg data-copy viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.75\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\n      \u003crect x=\"9\" y=\"9\" width=\"11\" height=\"11\" rx=\"2\"\u003e\u003c/rect\u003e\n      \u003cpath d=\"M5 15V5a2 2 0 0 1 2-2h10\"\u003e\u003c/path\u003e\n    \u003c/svg\u003e\n    \u003csvg data-check viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\n      \u003cpath d=\"M20 6 9 17l-5-5\"\u003e\u003c/path\u003e\n    \u003c/svg\u003e\n  \u003c/button\u003e\n  \u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-text\" data-lang=\"text\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eShowing asset ... (video)\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003c/div\u003e\n\u003cp\u003eImages and web pages displayed as usual. This had been the case since the Pi 2 and Pi 3 images moved to Debian Bookworm in 2024, whatever OS version the Pi ran.\u003c/p\u003e\n\u003cp\u003eThese boards now play video with GStreamer, and the Pi\u0026#39;s video hardware does the heavy work: it decodes the H.264, then scales and converts the picture for the screen. VLC and the \u003ccode\u003epython-vlc\u003c/code\u003e package are no longer in the Pi 2 and Pi 3 image. In the project\u0026#39;s testing on a Pi 3, this pipeline handled 1080p video at about 40 frames per second with no dropped frames, more than a 30 fps clip needs.\u003c/p\u003e\n\u003cp\u003eUploads to these boards were already limited to H.264, the codec this hardware decodes. Video follows the \u0026quot;Screen rotation\u0026quot; setting, but rotated 1080p video plays at only 1 or 2 frames per second on these boards. \u003ca href=\"/releases/anthias/2026.07.4/rotated-video-on-pi-2-3/\"\u003eAnthias 2026.07.4\u003c/a\u003e speeds up 180°; 90° and 270° stay slow.\u003c/p\u003e\n","description":"Every video on a Raspberry Pi 2 or Pi 3 showed a black screen while images and web pages played as usual. Video plays now, and in the project's testing a Pi 3 handled 1080p with frames to spare.","title":"Raspberry Pi 2 and Pi 3 play video instead of a black screen","type":"fix","url":"https://www.screenly.io/releases/anthias/2026.06.1/pi-2-and-pi-3-play-video/"},{"areas":[],"breaking":false,"content_html":"\u003cp\u003eFrom Anthias 2026.06.1, the \u0026quot;Screen rotation\u0026quot; setting on the web interface\u0026#39;s Settings page turns the whole display on a Raspberry Pi 4. Web pages, images and video all turn together. In this release, 90° and 270° turn a Pi 4 the opposite way to a 32-bit Raspberry Pi 2 or 3; \u003ca href=\"/releases/anthias/2026.07.3/screen-rotation-the-same-on-every-board/\"\u003eAnthias 2026.07.3\u003c/a\u003e makes every board turn the same way.\u003c/p\u003e\n\u003cp\u003eBefore, only video turned on a Pi 4. Web pages and images stayed in landscape whatever you picked, as the \u003ca href=\"/releases/anthias/2026.05.1/screen-rotation-setting/\"\u003e2026.05.1 entry that introduced the setting\u003c/a\u003e described.\u003c/p\u003e\n\u003cp\u003eWhen you save a new rotation, the viewer restarts with it, with no reboot. On the Pi 4 the viewer sets \u003ccode\u003eQT_QPA_EGLFS_ROTATION\u003c/code\u003e from the setting each time it starts.\u003c/p\u003e\n","description":"On a Raspberry Pi 4, the Screen rotation setting now turns the whole display, so web pages and images go portrait or upside down along with video.","title":"Screen rotation turns web pages and images on Raspberry Pi 4","type":"fix","url":"https://www.screenly.io/releases/anthias/2026.06.1/screen-rotation-works-on-raspberry-pi-4/"},{"areas":[],"breaking":false,"content_html":"\u003cp\u003eIf the screen on an x86 PC, mostly one with Intel graphics, froze on a single frame when the playlist reached a complex web page, Anthias 2026.06.1 fixes it and you don\u0026#39;t need to do anything. The screen keeps updating now.\u003c/p\u003e\n\u003cp\u003eBefore, the screen stayed on the last frame it showed while the viewer carried on through the playlist behind it. Only restarting the viewer container brought the display back. The viewer log showed a line like this:\u003c/p\u003e\n\u003cdiv class=\"code-block\"\u003e\n  \u003cbutton type=\"button\" class=\"code-copy\" aria-label=\"Copy code\" data-copy-code\u003e\n    \u003csvg data-copy viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.75\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\n      \u003crect x=\"9\" y=\"9\" width=\"11\" height=\"11\" rx=\"2\"\u003e\u003c/rect\u003e\n      \u003cpath d=\"M5 15V5a2 2 0 0 1 2-2h10\"\u003e\u003c/path\u003e\n    \u003c/svg\u003e\n    \u003csvg data-check viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"\u003e\n      \u003cpath d=\"M20 6 9 17l-5-5\"\u003e\u003c/path\u003e\n    \u003c/svg\u003e\n  \u003c/button\u003e\n  \u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-text\" data-lang=\"text\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e[ERROR] [backend/drm/atomic.c:79] connector HDMI-A-1: Atomic commit failed: Device or resource busy\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003c/div\u003e\n\u003cp\u003eThe x86 viewer now sets \u003ccode\u003eWLR_DRM_NO_ATOMIC=1\u003c/code\u003e and \u003ccode\u003eWLR_DRM_NO_MODIFIERS=1\u003c/code\u003e by default. They make the display compositor use the older way of updating the screen, which copes when the graphics chip is still busy drawing a page. A single display doesn\u0026#39;t need anything the newer way adds.\u003c/p\u003e\n\u003cp\u003eBoth are defaults you can override: set either to \u003ccode\u003e0\u003c/code\u003e in the viewer\u0026#39;s environment, for example in a \u003ccode\u003edocker-compose.override.yml\u003c/code\u003e for the \u003ccode\u003eanthias-viewer\u003c/code\u003e service. Raspberry Pi and generic arm64 boards are unchanged.\u003c/p\u003e\n\u003cp\u003eThis covers the freeze that leaves \u003ccode\u003eAtomic commit failed\u003c/code\u003e lines in the log. A screen that freezes with nothing in the log, for example when the network drops while a page is loading, recovers from \u003ca href=\"/releases/anthias/2026.06.3/webview-recovery/\"\u003eAnthias 2026.06.3\u003c/a\u003e.\u003c/p\u003e\n","description":"An x86 device keeps updating its screen when it moves to a complex web page, instead of freezing on the last frame until the container restarts.","title":"x86 displays no longer freeze on a heavy web page","type":"fix","url":"https://www.screenly.io/releases/anthias/2026.06.1/x86-display-no-longer-freezes-on-the-last-frame/"},{"areas":[],"breaking":false,"content_html":"\u003ch2 id=\"fixes\"\u003eFixes\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eOn a Raspberry Pi 2 or Pi 3, the viewer often crashed while starting, with \u003ccode\u003emalloc(): unaligned tcache chunk detected\u003c/code\u003e in the log, and the container restarted in a loop. The viewer now retries the launch itself with a growing delay, up to 30 times at startup, and 3 times when it has to relaunch while content is playing, so playback doesn\u0026#39;t stall for minutes. That gets many players going, but on some the crash happens on every launch and the screen stays dark. \u003ca href=\"/releases/anthias/2026.07.2/pi-2-and-pi-3-blank-screen/\"\u003eAnthias 2026.07.2\u003c/a\u003e fixes the crash itself.\u003c/li\u003e\n\u003cli\u003eA Raspberry Pi 4 with no display attached could still crash-loop with \u003ccode\u003eno screens available\u003c/code\u003e on balenaOS 2026.x, despite the \u003ca href=\"/releases/anthias/2026.06.0/fixes-and-improvements/\"\u003ewait added in 2026.06.0\u003c/a\u003e. A virtual output that is always present was counted as a connected screen. It\u0026#39;s ignored now, so the Pi 4 waits for a real display.\u003c/li\u003e\n\u003cli\u003eOn x86, Raspberry Pi 5 and generic arm64 boards, the viewer no longer logs \u003ccode\u003eA configure is scheduled for an uninitialized xdg_surface\u003c/code\u003e when it starts.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"improvements\"\u003eImprovements\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eDevice logs are much easier to read. The viewer image no longer turns on Qt debug logging, which had been adding many lines a second to the logs on every board.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"for-contributors\"\u003eFor contributors\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eThe C++ viewer tests run with \u003ccode\u003eQT_QUICK_BACKEND=software\u003c/code\u003e, so the video scene loads on hosts without a usable OpenGL context.\u003c/li\u003e\n\u003cli\u003eThe Qt 6 viewer images install \u003ccode\u003eqt6-declarative-dev\u003c/code\u003e and the \u003ccode\u003eqml6-module-qtquick\u003c/code\u003e and \u003ccode\u003eqml6-module-qtmultimedia\u003c/code\u003e runtime modules, and no longer install \u003ccode\u003elibqt6multimediawidgets6\u003c/code\u003e. The QML modules aren\u0026#39;t linked at build time, so a build without them succeeds, and the viewer then exits at startup with \u003ccode\u003eVideoView: QML video scene unavailable\u003c/code\u003e in its log.\u003c/li\u003e\n\u003cli\u003eThe Pi 2 and Pi 3 viewer image installs \u003ccode\u003egstreamer1.0-tools\u003c/code\u003e and the \u003ccode\u003egstreamer1.0-plugins-base\u003c/code\u003e, \u003ccode\u003e-plugins-good\u003c/code\u003e, \u003ccode\u003e-plugins-bad\u003c/code\u003e and \u003ccode\u003egstreamer1.0-alsa\u003c/code\u003e packages in place of \u003ccode\u003evlc\u003c/code\u003e, and \u003ccode\u003epython-vlc\u003c/code\u003e is gone from the Python dependencies.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003edocs/board-enablement.md\u003c/code\u003e documents the Pi 2 and Pi 3 video path, the startup crash on the 32-bit viewer and the launch retries, and the new Pi 4 and Pi 5 video path.\u003c/li\u003e\n\u003c/ul\u003e\n","description":"A Raspberry Pi 4 with no display attached waits for one on balenaOS 2026.x, and device logs on every board no longer fill up with Qt debug output.","title":"Raspberry Pi 2 and Pi 3 viewers retry a crashed start, and other fixes","type":"roundup","url":"https://www.screenly.io/releases/anthias/2026.06.1/fixes-and-improvements/"}],"json":"https://www.screenly.io/releases/anthias/2026.06.1/v1.json","product":"anthias","product_label":"Anthias","url":"https://www.screenly.io/releases/anthias/2026.06.1/","version":"2026.06.1"}],"title":"Anthias 2026.06.1","url":"https://www.screenly.io/releases/anthias/2026.06.1/","version":1}