{"product":"anthias","releases":[{"date":"2026-07-08","entries":[{"areas":[],"breaking":false,"content_html":"\u003cp\u003eA clock in the lobby or a news feed in the break room no longer needs a web page you found and pasted in yourself. Anthias 2026.07.1 adds a third tab, \u0026quot;Apps\u0026quot;, to the \u0026quot;Add asset\u0026quot; window, next to \u0026quot;From URL\u0026quot; and \u0026quot;Upload file\u0026quot;. It lists the apps in the signage app store, each with an icon, a short description and tags.\u003c/p\u003e\n\u003cp\u003ePick an app and fill in its settings, such as a time zone, a location on a map or the feed to show, then select \u0026quot;Add app\u0026quot;. The name is filled in for you. For an app you set up by picking from a list, such as the feed in RSS Reader, it\u0026#39;s the option you picked, so 2 RSS Reader assets showing different feeds get different names.\u003c/p\u003e\n\u003cp\u003eAn app plays as a web page, so scheduling, durations and ordering on the home page work as they do for any other asset. When an app says how often its page should reload, Anthias reloads it on that schedule. To change an app\u0026#39;s settings later, open the asset with \u0026quot;Edit\u0026quot;: the \u0026quot;App settings\u0026quot; section has the same form, filled in with your current values.\u003c/p\u003e\n\u003cp\u003eA setting that takes a list, such as the cities in a world clock, can\u0026#39;t be set from Anthias. Some apps then show nothing for it: Menu Board came up with your title and footer but no menu items, until \u003ca href=\"/releases/anthias/2026.08.1/menu-board-installs-with-its-menu/\"\u003eAnthias 2026.08.1\u003c/a\u003e.\u003c/p\u003e\n\u003ch2 id=\"where-the-apps-come-from\"\u003eWhere the apps come from\u003c/h2\u003e\n\u003cp\u003eThe apps come from \u003ca href=\"https://signage-apps.com/\" target=\"_blank\" rel=\"noopener\"\u003eSignage Apps\u003c/a\u003e, a free catalog you can also browse on its own website. Your browser loads the list from there when you open the tab, so the player doesn\u0026#39;t have to reach the store for you to browse it. To show an app, the player loads the app\u0026#39;s own address, like any other web page, so it needs to reach that.\u003c/p\u003e\n\u003cp\u003eAnthias only adds an app whose address is on a domain ending in \u003ccode\u003e.srly.io\u003c/code\u003e or \u003ccode\u003e.signage-apps.com\u003c/code\u003e. To point a player at another catalog, such as a store you host yourself, set these environment variables on the server container:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003eAPP_STORE_INDEX_URL\u003c/code\u003e, the catalog address, \u003ccode\u003ehttps://signage-apps.com/manifest.json\u003c/code\u003e by default\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eAPP_STORE_ALLOWED_HOST_SUFFIXES\u003c/code\u003e, a comma-separated list of the domains apps may live on, \u003ccode\u003e.srly.io,.signage-apps.com\u003c/code\u003e by default\u003c/li\u003e\n\u003c/ul\u003e\n","description":"A clock in the lobby or a news feed in the break room no longer means hunting for a web page to paste in. Pick an app from the signage app store in Add asset \u003e Apps, fill in its settings, and it plays like any other asset.","title":"A new Apps tab for adding ready-made signage apps","type":"release","url":"https://www.screenly.io/releases/anthias/2026.07.1/signage-app-store/"},{"areas":[],"breaking":true,"content_html":"\u003cp\u003eAnthias 2026.07.1 protects the files on your player when assets are created through the API. We recommend upgrading every player.\u003c/p\u003e\n\u003cp\u003eThe change is to creating an asset with a \u003ccode\u003ePOST\u003c/code\u003e to \u003ccode\u003e/api/v1/assets\u003c/code\u003e, \u003ccode\u003e/api/v1.1/assets\u003c/code\u003e, \u003ccode\u003e/api/v1.2/assets\u003c/code\u003e or \u003ccode\u003e/api/v2/assets\u003c/code\u003e. Two kinds of request that used to be accepted are now refused:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eA \u003ccode\u003euri\u003c/code\u003e that is a file path has to point at a file inside the player\u0026#39;s asset folder. A file uploaded through \u003ccode\u003e/api/v1/file_asset\u003c/code\u003e or \u003ccode\u003e/api/v2/file_asset\u003c/code\u003e lands there, so uploading a file and then creating the asset from the \u003ccode\u003euri\u003c/code\u003e the upload returns works as before.\u003c/li\u003e\n\u003cli\u003eAn asset whose \u003ccode\u003emimetype\u003c/code\u003e is \u003ccode\u003eyoutube_asset\u003c/code\u003e needs a YouTube link as its \u003ccode\u003euri\u003c/code\u003e: an \u003ccode\u003ehttp\u003c/code\u003e or \u003ccode\u003ehttps\u003c/code\u003e address on \u003ccode\u003eyoutube.com\u003c/code\u003e, \u003ccode\u003ewww.youtube.com\u003c/code\u003e, \u003ccode\u003em.youtube.com\u003c/code\u003e, \u003ccode\u003emusic.youtube.com\u003c/code\u003e or \u003ccode\u003eyoutu.be\u003c/code\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eA refused request gets a \u003ccode\u003e400\u003c/code\u003e response with the reason under \u003ccode\u003euri\u003c/code\u003e, either \u003ccode\u003eInvalid file path. Failed to add asset.\u003c/code\u003e or \u003ccode\u003eA youtube_asset URI must point at a YouTube URL.\u003c/code\u003e:\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-json\" data-lang=\"json\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e{\u003cspan style=\"color:#6ab825;font-weight:bold\"\u003e\u0026#34;uri\u0026#34;\u003c/span\u003e: [\u003cspan style=\"color:#ed9d13\"\u003e\u0026#34;Invalid file path. Failed to add asset.\u0026#34;\u003c/span\u003e]}\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003c/div\u003e\n\u003cp\u003eA \u003ccode\u003euri\u003c/code\u003e that isn\u0026#39;t a valid address now gets a \u003ccode\u003e400\u003c/code\u003e the same way, with \u003ccode\u003eInvalid URL. Failed to add asset.\u003c/code\u003e under \u003ccode\u003euri\u003c/code\u003e. Before, a file path that didn\u0026#39;t exist and an invalid address both got a \u003ccode\u003e500\u003c/code\u003e response with the message under \u003ccode\u003eerror\u003c/code\u003e.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u003cstrong\u003eIf this affects you:\u003c/strong\u003e if your integration creates assets from files already on the player, upload each file through \u003ccode\u003efile_asset\u003c/code\u003e first and create the asset from the \u003ccode\u003euri\u003c/code\u003e that comes back. If it sends links that aren\u0026#39;t YouTube videos as \u003ccode\u003eyoutube_asset\u003c/code\u003e, send them with the \u003ccode\u003emimetype\u003c/code\u003e that matches, such as \u003ccode\u003ewebpage\u003c/code\u003e. If it looks for \u003ccode\u003eerror\u003c/code\u003e in a \u003ccode\u003e500\u003c/code\u003e response to spot a bad address, read \u003ccode\u003euri\u003c/code\u003e in the \u003ccode\u003e400\u003c/code\u003e response instead.\u003c/p\u003e\n\u003c/blockquote\u003e\n","description":"Creating an asset through the API now protects the files on your player: a file path has to point into the asset folder, and a youtube_asset needs a YouTube link. An integration that relied on either may need a change.","title":"The API checks file paths and YouTube links when you create an asset","type":"security","url":"https://www.screenly.io/releases/anthias/2026.07.1/api-asset-uri-checks/"},{"areas":[],"breaking":false,"content_html":"\u003cp\u003eIf the TV on a Raspberry Pi 2, or on a Raspberry Pi 3 running the 32-bit image, switched itself off and on, for example on a power schedule, the picture could come back at 1024x768 and stay there until someone power-cycled the Pi.\u003c/p\u003e\n\u003cp\u003eFrom Anthias 2026.07.1, the viewer watches the Pi\u0026#39;s HDMI ports. When a display reconnects, it sets the resolution back to the one the display reports as its preferred mode, so any panel size works, and restarts the viewer once so content is drawn at that size. Expect a short gap in playback when the TV wakes up.\u003c/p\u003e\n\u003cp\u003eIt waits 5 seconds after the display reconnects before it does this. To change that, set \u003ccode\u003eANTHIAS_HOTPLUG_SETTLE_SECONDS\u003c/code\u003e on the viewer container.\u003c/p\u003e\n\u003cp\u003eThe same release fixes a related case on these boards: a Pi that started with no display connected could keep waiting for one after you plugged it in. The viewer container now restarts when a display appears and starts showing content.\u003c/p\u003e\n\u003cp\u003eIt checks the HDMI connection every 3 seconds, so a TV that switches off and on again faster than that can be missed, and a receiver or HDMI switch that keeps the connection up while the TV is off hides the change. Only the \u003ccode\u003epi2\u003c/code\u003e and \u003ccode\u003epi3\u003c/code\u003e images run this. On the 64-bit images the viewer keeps control of the display mode itself, and on a 64-bit Raspberry Pi 3 the picture stayed at 1920x1080 through an HDMI unplug in testing.\u003c/p\u003e\n","description":"On the 32-bit Raspberry Pi 2 and Pi 3 images, a TV that switched itself off and on could leave the picture stuck at 1024x768 until the Pi was power-cycled. The TV's own resolution now returns when it wakes, and a Pi that started with no display starts showing content when you plug one in.","title":"Raspberry Pi 2 and Pi 3 keep full resolution when the TV turns off and on","type":"fix","url":"https://www.screenly.io/releases/anthias/2026.07.1/hdmi-hotplug-resolution/"},{"areas":[],"breaking":false,"content_html":"\u003cp\u003eTyping a very large duration to keep an asset on screen forever, such as 9999999999999 seconds, made the viewer crash when that asset came up, and crash again after every restart while the asset stayed in the schedule.\u003c/p\u003e\n\u003cp\u003eFrom Anthias 2026.07.1, a duration can be at most 31,536,000 seconds, which is 1 year:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eIn the web interface, a longer duration is saved as 1 year. The same goes for \u0026quot;Default duration (seconds)\u0026quot; and \u0026quot;Default streaming duration (seconds)\u0026quot; in Settings.\u003c/li\u003e\n\u003cli\u003eThe API, from v1 to v2, answers a duration below 0 or above 31,536,000 with a \u003ccode\u003e400\u003c/code\u003e response, when creating or updating an asset. On v2 the same limit applies to \u003ccode\u003edefault_duration\u003c/code\u003e and \u003ccode\u003edefault_streaming_duration\u003c/code\u003e in the device settings.\u003c/li\u003e\n\u003cli\u003eA video file that reports an impossibly long length is given 1 year instead.\u003c/li\u003e\n\u003cli\u003eAn asset saved with a longer duration before you upgrade plays for 1 year at most instead of crashing the viewer.\u003c/li\u003e\n\u003c/ul\u003e\n","description":"A duration such as 9999999999999 seconds, typed to keep an asset on screen forever, made the viewer crash and restart over and over. Anthias 2026.07.1 limits durations to 1 year.","title":"A very long asset duration no longer crashes the viewer","type":"fix","url":"https://www.screenly.io/releases/anthias/2026.07.1/asset-duration-limit/"},{"areas":[],"breaking":false,"content_html":"\u003ch2 id=\"fixes\"\u003eFixes\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eOn the images with the Qt 6 viewer (the 64-bit Raspberry Pi 3, Pi 4, Pi 5, x86 and arm64), video could play without sound after a reboot or a restart of the viewer container. It has sound after a reboot now.\u003c/li\u003e\n\u003cli\u003eRestoring a backup through \u003ccode\u003e/api/v1/recover\u003c/code\u003e or \u003ccode\u003e/api/v2/recover\u003c/code\u003e no longer loads the whole backup into memory, so a large backup restores on a board with 1 GB of RAM, such as a Raspberry Pi 3, instead of running it out of memory. The restore in Settings \u0026gt; Backup \u0026amp; restore already worked this way.\u003c/li\u003e\n\u003cli\u003eUploading to a device whose disk is full now says the disk is full and suggests deleting assets you no longer use. Through the API, \u003ccode\u003efile_asset\u003c/code\u003e answers with a \u003ccode\u003e507\u003c/code\u003e response. Before, the upload failed with an error that didn\u0026#39;t say why.\u003c/li\u003e\n\u003cli\u003eChunked uploads to \u003ccode\u003efile_asset\u003c/code\u003e that arrive out of order are put together correctly. The \u003ccode\u003eContent-Range\u003c/code\u003e header has to be in the form \u003ccode\u003ebytes \u0026lt;start\u0026gt;-\u0026lt;end\u0026gt;/\u0026lt;total\u0026gt;\u003c/code\u003e, with a known total. A header that isn\u0026#39;t gets a \u003ccode\u003e400\u003c/code\u003e response.\u003c/li\u003e\n\u003cli\u003eReboot and shutdown on a balena device keep trying for up to 2 minutes while the balena supervisor is down or restarting, as it is right after an update. Before, they gave up after a few seconds and the device didn\u0026#39;t reboot or shut down.\u003c/li\u003e\n\u003cli\u003eThe \u0026quot;Update available\u0026quot; notice on the System Info page, and \u003ccode\u003eup_to_date\u003c/code\u003e in the API\u0026#39;s \u003ccode\u003einfo\u003c/code\u003e endpoint, compare your version with the newest Anthias release. When the newest release on GitHub was something else, such as a WebView toolchain release, the check stopped updating.\u003c/li\u003e\n\u003cli\u003eThe installer no longer stops to ask for a sudo password when your user already has passwordless \u003ccode\u003esudo\u003c/code\u003e, as the first user on Raspberry Pi OS does. Unattended installs used to hang at Ansible\u0026#39;s \u003ccode\u003eBECOME password:\u003c/code\u003e prompt.\u003c/li\u003e\n\u003cli\u003eOn a device with no CEC adapter, such as an x86 PC, the \u0026quot;Display Power (CEC)\u0026quot; card on the System Info page shows \u0026quot;Not available\u0026quot; instead of \u0026quot;CEC error\u0026quot;. So does \u003ccode\u003edisplay_power\u003c/code\u003e in the v2 \u003ccode\u003einfo\u003c/code\u003e endpoint.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"improvements\"\u003eImprovements\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eThe 64-bit Raspberry Pi 3 image (\u003ccode\u003epi3-64\u003c/code\u003e) ships the Raspberry Pi build of ffmpeg, like the Pi 4, Pi 5 and arm64 images, so H.264 video is decoded by the Pi 3\u0026#39;s hardware decoder instead of its CPU. Video on that image could still show a black screen until \u003ca href=\"/releases/anthias/2026.07.2/raspberry-pi-3-64-bit-video/\"\u003eAnthias 2026.07.2\u003c/a\u003e.\u003c/li\u003e\n\u003cli\u003eThe web view on the 32-bit Raspberry Pi 2 and Pi 3 images is built on Qt 5.15.19, up from 5.15.14.\u003c/li\u003e\n\u003cli\u003eOn x86, the \u0026quot;Device model\u0026quot; card on the System Info page shows the board on one line and the CPU on the next, and drops suffixes such as \u0026quot;Corporation\u0026quot; from the maker\u0026#39;s name.\u003c/li\u003e\n\u003cli\u003eThe footer of the web interface has \u0026quot;Star on GitHub\u0026quot; and \u0026quot;Review on G2\u0026quot; links. After you add an asset to a device with at least 3 enabled assets of your own, a card asks whether you\u0026#39;re enjoying Anthias, with the same 2 links. \u0026quot;Maybe later\u0026quot; hides it for 90 days, following either link hides it for good, and the choice is saved on the player, so it holds in every browser.\u003c/li\u003e\n\u003cli\u003eThe guide to moving assets to Screenly walks through the Migrate to Screenly page in Settings, with no SSH or script.\u003c/li\u003e\n\u003cli\u003eThe Anthias website and install docs point to Raspberry Pi Imager as the quickest way to install on any Raspberry Pi, the Pi 5 included, under Other specific-purpose OS \u0026gt; Digital signage and kiosks \u0026gt; Anthias. The get-started page lists the 64-bit Raspberry Pi 3 as supported instead of in maintenance.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"for-contributors\"\u003eFor contributors\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003ebun run test\u003c/code\u003e runs TypeScript unit tests with \u003ccode\u003ebun test\u003c/code\u003e, starting with how the Apps tab builds an app\u0026#39;s address and name.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003ebin/rebuild_qt5_toolchain.sh\u003c/code\u003e builds Qt 5.15.19, keeps the QtWebEngine build to \u003ccode\u003eMAKE_CORES\u003c/code\u003e parallel jobs so it doesn\u0026#39;t run the build machine out of memory, and reads CI\u0026#39;s public build cache.\u003c/li\u003e\n\u003cli\u003eError reports to Sentry leave out expected events: an upload that isn\u0026#39;t a valid backup, a failed YouTube or video download, a device with no working DNS, a jump to an asset that was deleted or is still processing, and the background worker briefly losing Redis.\u003c/li\u003e\n\u003c/ul\u003e\n","description":"Large backups restore through the API on boards with 1 GB of RAM, uploads to a full disk say so, and a balena device carries out a reboot even while its supervisor restarts.","title":"Video keeps its sound after a reboot, and other fixes","type":"roundup","url":"https://www.screenly.io/releases/anthias/2026.07.1/fixes-and-improvements/"}],"json":"https://www.screenly.io/releases/anthias/2026.07.1/v1.json","product":"anthias","product_label":"Anthias","url":"https://www.screenly.io/releases/anthias/2026.07.1/","version":"2026.07.1"}],"title":"Anthias 2026.07.1","url":"https://www.screenly.io/releases/anthias/2026.07.1/","version":1}