<?xml version="1.0" encoding="utf-8"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Anthias 2026.07.1 | Screenly</title><description>A new Apps tab adds ready-made signage apps such as clocks and news feeds, and a very long asset duration no longer crashes the viewer. If you create assets through the API, check the stricter rules for file paths and YouTube links.</description><link>https://www.screenly.io/releases/anthias/2026.07.1/</link><language>en</language><atom:link href="https://www.screenly.io/releases/anthias/2026.07.1/rss.xml" rel="self" type="application/rss+xml"/><lastBuildDate>Wed, 08 Jul 2026 00:00:00 +0000</lastBuildDate><item><title>Anthias 2026.07.1: A new Apps tab for adding ready-made signage apps</title><link>https://www.screenly.io/releases/anthias/2026.07.1/signage-app-store/</link><guid isPermaLink="true">https://www.screenly.io/releases/anthias/2026.07.1/signage-app-store/</guid><pubDate>Wed, 08 Jul 2026 00:00:00 +0000</pubDate><category>release</category><description>&lt;p&gt;A 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, &amp;quot;Apps&amp;quot;, to the &amp;quot;Add asset&amp;quot; window, next to &amp;quot;From URL&amp;quot; and &amp;quot;Upload file&amp;quot;. It lists the apps in the signage app store, each with an icon, a short description and tags.&lt;/p&gt;
&lt;p&gt;Pick an app and fill in its settings, such as a time zone, a location on a map or the feed to show, then select &amp;quot;Add app&amp;quot;. 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&amp;#39;s the option you picked, so 2 RSS Reader assets showing different feeds get different names.&lt;/p&gt;
&lt;p&gt;An 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&amp;#39;s settings later, open the asset with &amp;quot;Edit&amp;quot;: the &amp;quot;App settings&amp;quot; section has the same form, filled in with your current values.&lt;/p&gt;
&lt;p&gt;A setting that takes a list, such as the cities in a world clock, can&amp;#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 &lt;a href="https://www.screenly.io/releases/anthias/2026.08.1/menu-board-installs-with-its-menu/"&gt;Anthias 2026.08.1&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="where-the-apps-come-from"&gt;Where the apps come from&lt;/h2&gt;
&lt;p&gt;The apps come from &lt;a href="https://signage-apps.com/" target="_blank" rel="noopener"&gt;Signage Apps&lt;/a&gt;, 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&amp;#39;t have to reach the store for you to browse it. To show an app, the player loads the app&amp;#39;s own address, like any other web page, so it needs to reach that.&lt;/p&gt;
&lt;p&gt;Anthias only adds an app whose address is on a domain ending in &lt;code&gt;.srly.io&lt;/code&gt; or &lt;code&gt;.signage-apps.com&lt;/code&gt;. To point a player at another catalog, such as a store you host yourself, set these environment variables on the server container:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;APP_STORE_INDEX_URL&lt;/code&gt;, the catalog address, &lt;code&gt;https://signage-apps.com/manifest.json&lt;/code&gt; by default&lt;/li&gt;
&lt;li&gt;&lt;code&gt;APP_STORE_ALLOWED_HOST_SUFFIXES&lt;/code&gt;, a comma-separated list of the domains apps may live on, &lt;code&gt;.srly.io,.signage-apps.com&lt;/code&gt; by default&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Anthias 2026.07.1: The API checks file paths and YouTube links when you create an asset</title><link>https://www.screenly.io/releases/anthias/2026.07.1/api-asset-uri-checks/</link><guid isPermaLink="true">https://www.screenly.io/releases/anthias/2026.07.1/api-asset-uri-checks/</guid><pubDate>Wed, 08 Jul 2026 00:00:00 +0000</pubDate><category>security</category><description>&lt;p&gt;Anthias 2026.07.1 protects the files on your player when assets are created through the API. We recommend upgrading every player.&lt;/p&gt;
&lt;p&gt;The change is to creating an asset with a &lt;code&gt;POST&lt;/code&gt; to &lt;code&gt;/api/v1/assets&lt;/code&gt;, &lt;code&gt;/api/v1.1/assets&lt;/code&gt;, &lt;code&gt;/api/v1.2/assets&lt;/code&gt; or &lt;code&gt;/api/v2/assets&lt;/code&gt;. Two kinds of request that used to be accepted are now refused:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A &lt;code&gt;uri&lt;/code&gt; that is a file path has to point at a file inside the player&amp;#39;s asset folder. A file uploaded through &lt;code&gt;/api/v1/file_asset&lt;/code&gt; or &lt;code&gt;/api/v2/file_asset&lt;/code&gt; lands there, so uploading a file and then creating the asset from the &lt;code&gt;uri&lt;/code&gt; the upload returns works as before.&lt;/li&gt;
&lt;li&gt;An asset whose &lt;code&gt;mimetype&lt;/code&gt; is &lt;code&gt;youtube_asset&lt;/code&gt; needs a YouTube link as its &lt;code&gt;uri&lt;/code&gt;: an &lt;code&gt;http&lt;/code&gt; or &lt;code&gt;https&lt;/code&gt; address on &lt;code&gt;youtube.com&lt;/code&gt;, &lt;code&gt;www.youtube.com&lt;/code&gt;, &lt;code&gt;m.youtube.com&lt;/code&gt;, &lt;code&gt;music.youtube.com&lt;/code&gt; or &lt;code&gt;youtu.be&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A refused request gets a &lt;code&gt;400&lt;/code&gt; response with the reason under &lt;code&gt;uri&lt;/code&gt;, either &lt;code&gt;Invalid file path. Failed to add asset.&lt;/code&gt; or &lt;code&gt;A youtube_asset URI must point at a YouTube URL.&lt;/code&gt;:&lt;/p&gt;
&lt;div class="code-block"&gt;
&lt;button type="button" class="code-copy" aria-label="Copy code" data-copy-code&gt;
&lt;svg data-copy viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"&gt;
&lt;rect x="9" y="9" width="11" height="11" rx="2"&gt;&lt;/rect&gt;
&lt;path d="M5 15V5a2 2 0 0 1 2-2h10"&gt;&lt;/path&gt;
&lt;/svg&gt;
&lt;svg data-check viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"&gt;
&lt;path d="M20 6 9 17l-5-5"&gt;&lt;/path&gt;
&lt;/svg&gt;
&lt;/button&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{&lt;span style="color:#6ab825;font-weight:bold"&gt;&amp;#34;uri&amp;#34;&lt;/span&gt;: [&lt;span style="color:#ed9d13"&gt;&amp;#34;Invalid file path. Failed to add asset.&amp;#34;&lt;/span&gt;]}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;A &lt;code&gt;uri&lt;/code&gt; that isn&amp;#39;t a valid address now gets a &lt;code&gt;400&lt;/code&gt; the same way, with &lt;code&gt;Invalid URL. Failed to add asset.&lt;/code&gt; under &lt;code&gt;uri&lt;/code&gt;. Before, a file path that didn&amp;#39;t exist and an invalid address both got a &lt;code&gt;500&lt;/code&gt; response with the message under &lt;code&gt;error&lt;/code&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;If this affects you:&lt;/strong&gt; if your integration creates assets from files already on the player, upload each file through &lt;code&gt;file_asset&lt;/code&gt; first and create the asset from the &lt;code&gt;uri&lt;/code&gt; that comes back. If it sends links that aren&amp;#39;t YouTube videos as &lt;code&gt;youtube_asset&lt;/code&gt;, send them with the &lt;code&gt;mimetype&lt;/code&gt; that matches, such as &lt;code&gt;webpage&lt;/code&gt;. If it looks for &lt;code&gt;error&lt;/code&gt; in a &lt;code&gt;500&lt;/code&gt; response to spot a bad address, read &lt;code&gt;uri&lt;/code&gt; in the &lt;code&gt;400&lt;/code&gt; response instead.&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>Anthias 2026.07.1: Raspberry Pi 2 and Pi 3 keep full resolution when the TV turns off and on</title><link>https://www.screenly.io/releases/anthias/2026.07.1/hdmi-hotplug-resolution/</link><guid isPermaLink="true">https://www.screenly.io/releases/anthias/2026.07.1/hdmi-hotplug-resolution/</guid><pubDate>Wed, 08 Jul 2026 00:00:00 +0000</pubDate><category>fix</category><description>&lt;p&gt;If 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.&lt;/p&gt;
&lt;p&gt;From Anthias 2026.07.1, the viewer watches the Pi&amp;#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.&lt;/p&gt;
&lt;p&gt;It waits 5 seconds after the display reconnects before it does this. To change that, set &lt;code&gt;ANTHIAS_HOTPLUG_SETTLE_SECONDS&lt;/code&gt; on the viewer container.&lt;/p&gt;
&lt;p&gt;The 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.&lt;/p&gt;
&lt;p&gt;It 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 &lt;code&gt;pi2&lt;/code&gt; and &lt;code&gt;pi3&lt;/code&gt; 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.&lt;/p&gt;</description></item><item><title>Anthias 2026.07.1: A very long asset duration no longer crashes the viewer</title><link>https://www.screenly.io/releases/anthias/2026.07.1/asset-duration-limit/</link><guid isPermaLink="true">https://www.screenly.io/releases/anthias/2026.07.1/asset-duration-limit/</guid><pubDate>Wed, 08 Jul 2026 00:00:00 +0000</pubDate><category>fix</category><description>&lt;p&gt;Typing 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.&lt;/p&gt;
&lt;p&gt;From Anthias 2026.07.1, a duration can be at most 31,536,000 seconds, which is 1 year:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;In the web interface, a longer duration is saved as 1 year. The same goes for &amp;quot;Default duration (seconds)&amp;quot; and &amp;quot;Default streaming duration (seconds)&amp;quot; in Settings.&lt;/li&gt;
&lt;li&gt;The API, from v1 to v2, answers a duration below 0 or above 31,536,000 with a &lt;code&gt;400&lt;/code&gt; response, when creating or updating an asset. On v2 the same limit applies to &lt;code&gt;default_duration&lt;/code&gt; and &lt;code&gt;default_streaming_duration&lt;/code&gt; in the device settings.&lt;/li&gt;
&lt;li&gt;A video file that reports an impossibly long length is given 1 year instead.&lt;/li&gt;
&lt;li&gt;An asset saved with a longer duration before you upgrade plays for 1 year at most instead of crashing the viewer.&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Anthias 2026.07.1: Video keeps its sound after a reboot, and other fixes</title><link>https://www.screenly.io/releases/anthias/2026.07.1/fixes-and-improvements/</link><guid isPermaLink="true">https://www.screenly.io/releases/anthias/2026.07.1/fixes-and-improvements/</guid><pubDate>Wed, 08 Jul 2026 00:00:00 +0000</pubDate><category>roundup</category><description>&lt;h2 id="fixes"&gt;Fixes&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;On 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.&lt;/li&gt;
&lt;li&gt;Restoring a backup through &lt;code&gt;/api/v1/recover&lt;/code&gt; or &lt;code&gt;/api/v2/recover&lt;/code&gt; 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 &amp;gt; Backup &amp;amp; restore already worked this way.&lt;/li&gt;
&lt;li&gt;Uploading to a device whose disk is full now says the disk is full and suggests deleting assets you no longer use. Through the API, &lt;code&gt;file_asset&lt;/code&gt; answers with a &lt;code&gt;507&lt;/code&gt; response. Before, the upload failed with an error that didn&amp;#39;t say why.&lt;/li&gt;
&lt;li&gt;Chunked uploads to &lt;code&gt;file_asset&lt;/code&gt; that arrive out of order are put together correctly. The &lt;code&gt;Content-Range&lt;/code&gt; header has to be in the form &lt;code&gt;bytes &amp;lt;start&amp;gt;-&amp;lt;end&amp;gt;/&amp;lt;total&amp;gt;&lt;/code&gt;, with a known total. A header that isn&amp;#39;t gets a &lt;code&gt;400&lt;/code&gt; response.&lt;/li&gt;
&lt;li&gt;Reboot 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&amp;#39;t reboot or shut down.&lt;/li&gt;
&lt;li&gt;The &amp;quot;Update available&amp;quot; notice on the System Info page, and &lt;code&gt;up_to_date&lt;/code&gt; in the API&amp;#39;s &lt;code&gt;info&lt;/code&gt; 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.&lt;/li&gt;
&lt;li&gt;The installer no longer stops to ask for a sudo password when your user already has passwordless &lt;code&gt;sudo&lt;/code&gt;, as the first user on Raspberry Pi OS does. Unattended installs used to hang at Ansible&amp;#39;s &lt;code&gt;BECOME password:&lt;/code&gt; prompt.&lt;/li&gt;
&lt;li&gt;On a device with no CEC adapter, such as an x86 PC, the &amp;quot;Display Power (CEC)&amp;quot; card on the System Info page shows &amp;quot;Not available&amp;quot; instead of &amp;quot;CEC error&amp;quot;. So does &lt;code&gt;display_power&lt;/code&gt; in the v2 &lt;code&gt;info&lt;/code&gt; endpoint.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="improvements"&gt;Improvements&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;The 64-bit Raspberry Pi 3 image (&lt;code&gt;pi3-64&lt;/code&gt;) 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&amp;#39;s hardware decoder instead of its CPU. Video on that image could still show a black screen until &lt;a href="https://www.screenly.io/releases/anthias/2026.07.2/raspberry-pi-3-64-bit-video/"&gt;Anthias 2026.07.2&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;The 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.&lt;/li&gt;
&lt;li&gt;On x86, the &amp;quot;Device model&amp;quot; card on the System Info page shows the board on one line and the CPU on the next, and drops suffixes such as &amp;quot;Corporation&amp;quot; from the maker&amp;#39;s name.&lt;/li&gt;
&lt;li&gt;The footer of the web interface has &amp;quot;Star on GitHub&amp;quot; and &amp;quot;Review on G2&amp;quot; links. After you add an asset to a device with at least 3 enabled assets of your own, a card asks whether you&amp;#39;re enjoying Anthias, with the same 2 links. &amp;quot;Maybe later&amp;quot; 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.&lt;/li&gt;
&lt;li&gt;The guide to moving assets to Screenly walks through the Migrate to Screenly page in Settings, with no SSH or script.&lt;/li&gt;
&lt;li&gt;The 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 &amp;gt; Digital signage and kiosks &amp;gt; Anthias. The get-started page lists the 64-bit Raspberry Pi 3 as supported instead of in maintenance.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="for-contributors"&gt;For contributors&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;bun run test&lt;/code&gt; runs TypeScript unit tests with &lt;code&gt;bun test&lt;/code&gt;, starting with how the Apps tab builds an app&amp;#39;s address and name.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;bin/rebuild_qt5_toolchain.sh&lt;/code&gt; builds Qt 5.15.19, keeps the QtWebEngine build to &lt;code&gt;MAKE_CORES&lt;/code&gt; parallel jobs so it doesn&amp;#39;t run the build machine out of memory, and reads CI&amp;#39;s public build cache.&lt;/li&gt;
&lt;li&gt;Error reports to Sentry leave out expected events: an upload that isn&amp;#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.&lt;/li&gt;
&lt;/ul&gt;</description></item></channel></rss>