<?xml version="1.0" encoding="utf-8"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Anthias release notes | Screenly</title><description>Anthias, the open-source digital signage player. What has shipped, newest first.</description><link>https://www.screenly.io/releases/anthias/</link><language>en</language><atom:link href="https://www.screenly.io/releases/anthias/rss.xml" rel="self" type="application/rss+xml"/><lastBuildDate>Fri, 16 Oct 2026 00:00:00 +0000</lastBuildDate><item><title>Anthias 2026.10.0: The background worker stops killing its own processes</title><link>https://www.screenly.io/releases/anthias/2026.10.0/worker-stops-killing-its-own-processes/</link><guid isPermaLink="true">https://www.screenly.io/releases/anthias/2026.10.0/worker-stops-killing-its-own-processes/</guid><pubDate>Fri, 16 Oct 2026 00:00:00 +0000</pubDate><category>fix</category><description>&lt;p&gt;On a board short of memory, Anthias kept stopping and restarting parts of itself, which cost the
board time and memory it didn&amp;#39;t have. It was the largest single problem in the crash reports
Anthias devices send the project. Anthias 2026.10.0 stops it, and upgrading is all you need to do.&lt;/p&gt;
&lt;p&gt;Anthias runs uploads, downloads, video probing and housekeeping in a background worker, the
&lt;code&gt;anthias-celery&lt;/code&gt; container. That worker kept killing its own idle processes and starting
replacements. Its log filled with lines like these:&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-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Process &amp;#39;ForkPoolWorker-3&amp;#39; pid:412 exited with &amp;#39;exitcode 1&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Timed out waiting for UP message from &amp;lt;ForkProcess(ForkPoolWorker-4, started daemon)&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The trigger was the soft time limit, the warning a task gets before its hard limit cuts it off. On a
busy board that warning could arrive after the task had already finished, and the idle process that
received it exited. From Anthias 2026.10.0, a warning that arrives when no task is running, or that
was meant for an earlier task, is ignored. A task that really runs past its soft limit is still
stopped, and one that hangs is still cut off by its hard limit.&lt;/p&gt;
&lt;p&gt;The tasks that read the display&amp;#39;s power state over HDMI-CEC and send telemetry could also catch the
warning meant for them, carry on, and get killed by the hard limit. They now stop when they&amp;#39;re told
to.&lt;/p&gt;</description></item><item><title>Anthias 2026.10.0: Restoring a backup no longer corrupts or locks up the database</title><link>https://www.screenly.io/releases/anthias/2026.10.0/database-backups-restores-and-startup/</link><guid isPermaLink="true">https://www.screenly.io/releases/anthias/2026.10.0/database-backups-restores-and-startup/</guid><pubDate>Fri, 16 Oct 2026 00:00:00 +0000</pubDate><category>fix</category><description>&lt;p&gt;Restoring a backup from the Settings page could leave Anthias with a database it couldn&amp;#39;t read, or
one so locked that the web interface answered with server errors. A player upgraded from an older
install could hit the second one too. Anthias 2026.10.0 fixes both, and backups made by earlier
versions still restore.&lt;/p&gt;
&lt;p&gt;Both problems were in the one SQLite database where Anthias keeps its assets and settings,
&lt;code&gt;~/.anthias/anthias.db&lt;/code&gt;, which the web server, the background worker and the viewer all use at
once.&lt;/p&gt;
&lt;h2 id="backups-and-restores"&gt;Backups and restores&lt;/h2&gt;
&lt;p&gt;&amp;quot;Get backup&amp;quot;, under Backup &amp;amp; restore in Settings, used to put the database in the archive together
with its write-ahead log files, &lt;code&gt;anthias.db-wal&lt;/code&gt; and &lt;code&gt;anthias.db-shm&lt;/code&gt;, each read at a different
moment while Anthias kept writing. &amp;quot;Upload &amp;amp; recover&amp;quot; then unpacked the archive over the live
files. When the archive carried no log of its own, the old database&amp;#39;s log stayed next to the
restored database, SQLite replayed it into the wrong file, and the first read after the restore
failed with &lt;code&gt;database disk image is malformed&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Now a backup carries a single copy of the database, taken through SQLite at one moment, with
everything in the log included and no log files beside it. A restore deletes the log files of each
database it replaces before anything opens it.&lt;/p&gt;
&lt;p&gt;Backups made before 2026.10.0 still restore. Their log files are skipped, which avoids the
corruption but leaves out any changes that were still only in the log when the backup was made.&lt;/p&gt;
&lt;p&gt;If the database can&amp;#39;t be copied while its log holds changes that aren&amp;#39;t in the main file yet, the
backup now fails, and the &amp;quot;Get backup&amp;quot; download ends in an error, instead of producing an archive
without those changes.&lt;/p&gt;
&lt;h2 id="a-database-that-hasn39t-switched-to-write-ahead-logging"&gt;A database that hasn&amp;#39;t switched to write-ahead logging&lt;/h2&gt;
&lt;p&gt;Anthias runs the database with write-ahead logging, so reads and writes don&amp;#39;t block each other. It
used to ask SQLite to switch to that mode every time it opened a connection. On a database that
wasn&amp;#39;t switched yet, such as one from an older install or one just restored, the switch needs the
file to itself, and with 3 services using it the request failed with &lt;code&gt;database is locked&lt;/code&gt;. Each
failure left a file open, and the web interface answered with server errors. In the project&amp;#39;s crash
reports, one device went from &lt;code&gt;database is locked&lt;/code&gt; to &lt;code&gt;Too many open files&lt;/code&gt; to
&lt;code&gt;unable to open database file&lt;/code&gt; in a single afternoon.&lt;/p&gt;
&lt;p&gt;Now each service checks the mode once when it starts, and switches it if it can. If the database is
busy, Anthias carries on in the old mode, which is slower when several services write at once but
works, and tries again at the next start.&lt;/p&gt;</description></item><item><title>Anthias 2026.10.0: Media that takes too long to process no longer stays on Processing</title><link>https://www.screenly.io/releases/anthias/2026.10.0/assets-that-fail-say-why/</link><guid isPermaLink="true">https://www.screenly.io/releases/anthias/2026.10.0/assets-that-fail-say-why/</guid><pubDate>Fri, 16 Oct 2026 00:00:00 +0000</pubDate><category>fix</category><description>&lt;p&gt;While Anthias prepares an upload or downloads a video, the asset shows &amp;quot;Processing&amp;quot; in the asset
table. If that fails, the row shows &amp;quot;Failed&amp;quot;, and clicking it opens the asset with the reason.
Anthias 2026.10.0 fixes the cases where a slow job never got that far.&lt;/p&gt;
&lt;h2 id="jobs-that-run-too-long"&gt;Jobs that run too long&lt;/h2&gt;
&lt;p&gt;Five of these jobs had only a hard time limit: reading a video&amp;#39;s duration, preparing an image,
preparing a video, downloading from YouTube and downloading a video from a URL. One that ran over
was killed on the spot with no chance to update the asset, so the asset stayed on &amp;quot;Processing&amp;quot; with
nothing to say why.&lt;/p&gt;
&lt;p&gt;From Anthias 2026.10.0, each of them gets a warning 30 seconds before its hard limit and stops
cleanly. An image or video that runs out of time while being prepared or downloaded shows &amp;quot;Failed&amp;quot;
with a message such as &amp;quot;Timed out: processing did not finish within 270s&amp;quot;. A video whose duration
can&amp;#39;t be read in time leaves &amp;quot;Processing&amp;quot; without a message. The limits themselves are the same as
before: 2 minutes to read a video&amp;#39;s duration or prepare a video, 5 minutes to prepare an image, and
15 minutes for a download.&lt;/p&gt;
&lt;h2 id="images-over-the-size-limit"&gt;Images over the size limit&lt;/h2&gt;
&lt;p&gt;Anthias refuses images over 50 megapixels. An image between 50 and 100 megapixels already said so,
in a message written for developers. One over 100 megapixels, such as a large scan or a poster
export, failed with the image library&amp;#39;s own warning about a possible &amp;quot;decompression bomb DOS
attack&amp;quot;, which sounds far worse than an image that&amp;#39;s too big. Now both say how big the image is,
that the limit is 50,000,000 pixels, and to resize it and upload again.&lt;/p&gt;
&lt;h2 id="expected-failures-stop-looking-like-crashes"&gt;Expected failures stop looking like crashes&lt;/h2&gt;
&lt;p&gt;A YouTube link that YouTube refuses (a 403 or 404, an age restriction, a region block), an image
over the limit, and a source file that&amp;#39;s gone by the time processing starts, for example because
you deleted the asset while it was processing, are expected outcomes. The worker log now records
them as a single line instead of an error with a traceback, and they&amp;#39;re no longer sent as crash
reports. If you point crash reporting at your own Sentry project with &lt;code&gt;SENTRY_DSN&lt;/code&gt;, they stop
showing up there too. The asset table shows the same as before: a YouTube refusal still shows
&amp;quot;Failed&amp;quot; with YouTube&amp;#39;s reason, and a deleted asset is gone.&lt;/p&gt;</description></item><item><title>Anthias 2026.10.0: The viewer starts more reliably after restores, slow boots and display restarts</title><link>https://www.screenly.io/releases/anthias/2026.10.0/viewer-starts-more-reliably/</link><guid isPermaLink="true">https://www.screenly.io/releases/anthias/2026.10.0/viewer-starts-more-reliably/</guid><pubDate>Fri, 16 Oct 2026 00:00:00 +0000</pubDate><category>fix</category><description>&lt;p&gt;The viewer is the container that puts content on the screen. Anthias 2026.10.0 fixes 4 ways it
could get stuck starting up.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;On a slow first boot, or right after a restore, the viewer could ask for the asset table before
the database had its tables. It failed with &lt;code&gt;no such table: assets&lt;/code&gt; and the container restarted
into the same race. The viewer now waits until the database is fully set up, and logs
&lt;code&gt;Database is not migrated yet; delaying viewer startup&lt;/code&gt; every 30 seconds while it waits.&lt;/li&gt;
&lt;li&gt;If an earlier display process was still holding the &lt;code&gt;anthias.viewer&lt;/code&gt; name on the session bus,
every new attempt to start one failed within half a second, and the viewer spent all 30 of its
attempts on the same failure. In the project&amp;#39;s testing on a Pi 5 that was close to 7 minutes of
black screen. The viewer now finds the old process, asks it to exit, forces it if it won&amp;#39;t, and
starts the new one.&lt;/li&gt;
&lt;li&gt;On the boards that run the Wayland compositor (Pi 5, x86 and arm64), the viewer used to treat a
leftover socket from a compositor that had died as a running one, and gave up before the
compositor came back. It now connects to the socket and waits until the compositor answers.&lt;/li&gt;
&lt;li&gt;Changing &amp;quot;Screen rotation&amp;quot; or &amp;quot;Prefer dark mode&amp;quot; in Settings restarts the display process. The
viewer now waits for the old one to exit before loading the next asset, instead of sending the
asset to a process that was on its way out and stalling until it dropped off.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="clearer-errors-when-the-display-process-won39t-start"&gt;Clearer errors when the display process won&amp;#39;t start&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;When the display process dies before it finishes starting, the viewer&amp;#39;s error now says how it
ended, such as &lt;code&gt;killed by SIGSEGV (-11)&lt;/code&gt;. Before, it ended on whatever the process last printed.&lt;/li&gt;
&lt;li&gt;On the Pi 5, x86 and arm64 images, a display process that can&amp;#39;t register on the session bus
exits with status 1 and says which registration failed. It used to crash with SIGSEGV on the way
out, which looked like a crash in the display process.&lt;/li&gt;
&lt;li&gt;A display process that crashes now prints a stack trace on every board, which the viewer&amp;#39;s error
includes when the crash happens during startup. Before, only the 64-bit Pi 3 image printed one.&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Anthias 2026.10.0: Players showing the same playlist drift apart less</title><link>https://www.screenly.io/releases/anthias/2026.10.0/playlist-rotation-timing/</link><guid isPermaLink="true">https://www.screenly.io/releases/anthias/2026.10.0/playlist-rotation-timing/</guid><pubDate>Fri, 16 Oct 2026 00:00:00 +0000</pubDate><category>fix</category><description>&lt;p&gt;Two screens in a shop cycling the same menu board in German and English used to drift apart, until
after a few hours they switched languages seconds apart. The player started an asset&amp;#39;s countdown
only after it had refreshed the schedule, read the database and told the display to load the asset,
so each rotation took the asset&amp;#39;s duration plus that overhead, and the overhead differs from one
device to the next.&lt;/p&gt;
&lt;p&gt;From Anthias 2026.10.0, the countdown starts when the rotation does, so an image or web page with a
30 second duration rotates 30 seconds after its rotation began. If loading takes longer than a short
asset&amp;#39;s duration, the player moves straight on to the next one. The viewer log shows the wait next
to the duration, for example &lt;code&gt;Sleeping for 29.8 of 30s&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;A video&amp;#39;s duration is its length, so the overhead now comes off the end of the clip instead: the
last fraction of a second can be cut, more on a slow board. Stopping a video still adds time to each
rotation, so a playlist with videos still drifts, more slowly than before. In the project&amp;#39;s testing
on a Pi 2 with a mixed playlist, drift went from about 36 seconds an hour to about 28.5.&lt;/p&gt;
&lt;p&gt;Players still don&amp;#39;t line up with each other: each one starts its playlist when it boots.&lt;/p&gt;</description></item><item><title>Anthias 2026.10.0: The upgrade script no longer runs a Pi 2 or Pi 3 out of memory, and other fixes</title><link>https://www.screenly.io/releases/anthias/2026.10.0/fixes-and-improvements/</link><guid isPermaLink="true">https://www.screenly.io/releases/anthias/2026.10.0/fixes-and-improvements/</guid><pubDate>Fri, 16 Oct 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;Running &lt;code&gt;bin/upgrade_containers.sh&lt;/code&gt; yourself on a board with less than 1.5 GiB of memory, such as
a Pi 2 or Pi 3, now stops the viewer and the background worker before pulling new images, and
starts them again on the new ones. Pulling with the viewer running could use up memory and swap
and reset the board halfway through. The screen shows no content during the pull, and the web
interface stays up. Upgrades through the installer already stopped every container first.&lt;/li&gt;
&lt;li&gt;A memory card whose product name contains a byte that isn&amp;#39;t valid UTF-8 no longer stops storage
health monitoring, which the storage card on the System Info page relies on.&lt;/li&gt;
&lt;li&gt;Starting the viewer no longer logs &lt;code&gt;/proc/&amp;lt;pid&amp;gt;/oom_score_adj: No such file or directory&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="for-contributors"&gt;For contributors&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;A test fails the build if a background task has a hard time limit without a soft one below it,
and another fails it if a module the viewer imports pulls in celery, which the viewer image
doesn&amp;#39;t ship.&lt;/li&gt;
&lt;li&gt;New tests cover the soft time limit handling, the database readiness wait, the viewer&amp;#39;s startup
and respawn paths, and SQLite backup and restore.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Python, JavaScript and GitHub Actions dependencies are updated.&lt;/p&gt;</description></item><item><title>Anthias 2026.09.0: Large uploads work behind a proxy, and a failed upload says why</title><link>https://www.screenly.io/releases/anthias/2026.09.0/large-uploads-behind-a-proxy/</link><guid isPermaLink="true">https://www.screenly.io/releases/anthias/2026.09.0/large-uploads-behind-a-proxy/</guid><pubDate>Tue, 22 Sep 2026 00:00:00 +0000</pubDate><category>improvement</category><description>&lt;p&gt;Put Anthias behind a reverse proxy or a tunnel and large videos used to fail to upload, even though
everything else worked. Anthias puts no limit on how big an upload can be, but the proxy usually
does: Cloudflare&amp;#39;s Free and Pro plans, for example, cap a request at 100 MB, which a few minutes of
video clears easily. From Anthias 2026.09.0, Add asset &amp;gt; Upload file sends a file larger than
16 MiB in 16 MiB pieces, one after another, and the device puts them back together. Each piece
clears the proxy on its own. Smaller files upload in one request, as before.&lt;/p&gt;
&lt;p&gt;A piece that fails on a dropped connection or a server error is sent again, up to 2 more times, so
one hiccup doesn&amp;#39;t throw away an upload you&amp;#39;ve been waiting on. A file Anthias won&amp;#39;t accept, such
as an unsupported type, is refused on the first piece rather than after the whole file has gone
up. An upload you abandon halfway is cleaned up once it has sat for an hour without a new piece.&lt;/p&gt;
&lt;h2 id="changing-the-piece-size"&gt;Changing the piece size&lt;/h2&gt;
&lt;p&gt;If your proxy&amp;#39;s limit is lower than 16 MiB, ask for smaller pieces. Add &lt;code&gt;upload_chunk_size_mb&lt;/code&gt;
under &lt;code&gt;[main]&lt;/code&gt; in &lt;code&gt;~/.anthias/anthias.conf&lt;/code&gt;, which survives upgrades, and restart Anthias. On
balena, set the &lt;code&gt;ANTHIAS_UPLOAD_CHUNK_SIZE_MB&lt;/code&gt; device variable in the dashboard instead. If both
are set, &lt;code&gt;anthias.conf&lt;/code&gt; wins.&lt;/p&gt;
&lt;p&gt;The value is in MiB (1 MiB is 1,048,576 bytes), from 1 to 24. A value outside that range is moved
to the nearest limit, a decimal is rounded down, so 8.5 becomes 8, and anything that isn&amp;#39;t a number
is ignored in favor of the default of 16. Each request carries a little more than the piece itself,
so leave some room under your proxy&amp;#39;s limit.&lt;/p&gt;
&lt;h2 id="a-failed-upload-says-why"&gt;A failed upload says why&lt;/h2&gt;
&lt;p&gt;Before, almost every upload failure showed the same generic message, asking you to check the file
and try again. Now the message points at the cause:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A file the server or a proxy refuses as too large says it exceeds the upload size limit of the
server or a proxy in front of it, so you know to look at the proxy rather than the file.&lt;/li&gt;
&lt;li&gt;If a proxy refuses even a single piece, the message tells you to lower the upload chunk size.&lt;/li&gt;
&lt;li&gt;A connection that drops mid-transfer says so, and suggests a smaller file too, because some
browsers report a proxy&amp;#39;s size refusal as a dropped connection.&lt;/li&gt;
&lt;li&gt;If the last piece went up and no reply came back, the message says the upload may have finished
and to check the asset list before uploading again, since a second attempt would make a
duplicate.&lt;/li&gt;
&lt;li&gt;A page that has gone stale asks you to reload it and try again.&lt;/li&gt;
&lt;li&gt;A server error points you to the device logs.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="for-developers"&gt;For developers&lt;/h2&gt;
&lt;p&gt;Uploads through the API, &lt;code&gt;POST /api/v1/file_asset&lt;/code&gt; and &lt;code&gt;POST /api/v2/file_asset&lt;/code&gt;, are written to
disk as they arrive instead of being read into memory first. The content endpoints in API v1 and v2
(&lt;code&gt;assets/&amp;lt;id&amp;gt;/content&lt;/code&gt;) stream their response too, where they used to hold several copies of the
file in memory. In the project&amp;#39;s testing on a Raspberry Pi 3 B+, fetching a 150 MB asset through
the content endpoint ran the server out of memory, and the API stayed down for about 40 seconds
while it restarted. After the change, the same request added about 12 MB to the server&amp;#39;s memory.&lt;/p&gt;
&lt;p&gt;The content endpoints return the same JSON as before, with the file as base64 in &lt;code&gt;content&lt;/code&gt;. For
file assets the response is now always &lt;code&gt;application/json&lt;/code&gt;, so the browsable API page no longer
renders them.&lt;/p&gt;</description></item><item><title>Anthias 2026.09.0: Files dropped anywhere on Schedule Overview upload</title><link>https://www.screenly.io/releases/anthias/2026.09.0/drop-files-anywhere-on-schedule-overview/</link><guid isPermaLink="true">https://www.screenly.io/releases/anthias/2026.09.0/drop-files-anywhere-on-schedule-overview/</guid><pubDate>Tue, 22 Sep 2026 00:00:00 +0000</pubDate><category>improvement</category><description>&lt;p&gt;From Anthias 2026.09.0, you can drag images and videos from your desktop and drop them anywhere on
Schedule Overview, including the asset list, the navigation bar and the margins, and they upload.
Until now only the upload area inside Add asset took a drop. A file dropped anywhere else made the
browser open the file itself and leave the page.&lt;/p&gt;
&lt;p&gt;While you drag, the page shows &amp;quot;Drop to upload&amp;quot;. When you let go, Add asset opens on Upload file
and shows the progress there, &amp;quot;File 2 of 5&amp;quot; for example, then closes when the last file is in. If
a batch is already uploading, the page says &amp;quot;Upload already in progress&amp;quot; instead, and you can drop
the new files once it finishes. While another dialog is open, such as Edit asset or a preview, a
drop doesn&amp;#39;t upload, and a message asks you to close the dialog first.&lt;/p&gt;</description></item><item><title>Anthias 2026.09.0: Live updates in the web interface need a signed-in session</title><link>https://www.screenly.io/releases/anthias/2026.09.0/live-updates-need-a-signed-in-session/</link><guid isPermaLink="true">https://www.screenly.io/releases/anthias/2026.09.0/live-updates-need-a-signed-in-session/</guid><pubDate>Tue, 22 Sep 2026 00:00:00 +0000</pubDate><category>security</category><description>&lt;p&gt;If you only use the web interface in a browser, nothing changes for you. This only matters if you
turned on authentication and run a script or dashboard of your own that listens for the web
interface&amp;#39;s live updates: from Anthias 2026.09.0, it has to sign in first.&lt;/p&gt;
&lt;p&gt;The web interface keeps the asset list current through a WebSocket connection at &lt;code&gt;/ws&lt;/code&gt;. When
authentication is turned on, Anthias 2026.09.0 accepts that connection only from a browser with a
signed-in session, the same rule every page of the web interface already follows. A browser you
use the web interface in is already signed in, so nothing changes there. If you run Anthias without
authentication, which is the default, &lt;code&gt;/ws&lt;/code&gt; stays open as before.&lt;/p&gt;
&lt;p&gt;Turning authentication on or off, or changing the username or password, closes the open
connections. The web interface reconnects by itself and has to pass the new settings to get back
in.&lt;/p&gt;
&lt;p&gt;If you run Anthias with authentication on, upgrade to get this.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;If this affects you:&lt;/strong&gt; with authentication on, a script, dashboard or other client that opens
&lt;code&gt;/ws&lt;/code&gt; without signing in is refused from 2026.09.0, with a 403 at the handshake. Username and
password sent as HTTP Basic credentials aren&amp;#39;t accepted on &lt;code&gt;/ws&lt;/code&gt; either, even though the API
still takes them. Sign in through the web interface&amp;#39;s login page and send the session cookie you
get with the handshake.&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>Anthias 2026.09.0: Backups carry only what Anthias needs, and restores check the version</title><link>https://www.screenly.io/releases/anthias/2026.09.0/backups-and-restores/</link><guid isPermaLink="true">https://www.screenly.io/releases/anthias/2026.09.0/backups-and-restores/</guid><pubDate>Tue, 22 Sep 2026 00:00:00 +0000</pubDate><category>improvement</category><description>&lt;p&gt;A backup you download from the Settings page now holds your settings and content and leaves out
half-finished uploads, and a restore stops before changing anything if the backup&amp;#39;s database is
newer than the player can read. If you turned on HTTPS, keep your own copy of its certificate,
because backups no longer include it.&lt;/p&gt;
&lt;p&gt;From Anthias 2026.09.0, &amp;quot;Get backup&amp;quot; and &amp;quot;Upload &amp;amp; recover&amp;quot;, under Backup &amp;amp; restore on the Settings
page, work only with what Anthias runs on: the settings file &lt;code&gt;anthias.conf&lt;/code&gt;, the database, the
&lt;code&gt;backups&lt;/code&gt; folder of database dumps, the default assets list and your content. Before, a backup took
everything in &lt;code&gt;~/.anthias&lt;/code&gt; and &lt;code&gt;~/anthias_assets&lt;/code&gt;. Other files that sit in &lt;code&gt;~/.anthias&lt;/code&gt;, such as
the certificate and key that &lt;code&gt;bin/enable_ssl.sh&lt;/code&gt; installs in &lt;code&gt;~/.anthias/ssl&lt;/code&gt;, are no longer put in
a backup, and a restore won&amp;#39;t write them back. If you rely on those, keep your own copy.&lt;/p&gt;
&lt;p&gt;Half-finished uploads and downloads in the content folder are left out too. They can be gigabytes
of something nobody finished sending, and they only made the archive bigger.&lt;/p&gt;
&lt;h2 id="restores-check-the-version"&gt;Restores check the version&lt;/h2&gt;
&lt;p&gt;Each backup now records the Anthias release and the version of the database it came from. A backup
whose database is newer than the restoring Anthias understands is refused before anything is
written, with a message to upgrade Anthias to at least the release that made it. A backup from an
older version restores, and its database is brought up to date right after. Backups made before
2026.09.0 carry no version, so they count as older and still restore.&lt;/p&gt;</description></item><item><title>Anthias 2026.09.0: Upgrades remove the old Anthias images they replace</title><link>https://www.screenly.io/releases/anthias/2026.09.0/upgrades-remove-old-images/</link><guid isPermaLink="true">https://www.screenly.io/releases/anthias/2026.09.0/upgrades-remove-old-images/</guid><pubDate>Tue, 22 Sep 2026 00:00:00 +0000</pubDate><category>improvement</category><description>&lt;p&gt;Every upgrade pulls a fresh image for each Anthias service, and until now it left the previous ones
on the card. The installer&amp;#39;s cleanup only removed untagged layers, so the old tagged images stayed,
and a device that had upgraded a handful of times carried several full copies of Anthias. One
person who asked for a fix found the last 6 releases taking about 16 GB on their devices. Removing
them took the cards from 76% full to 26%.&lt;/p&gt;
&lt;p&gt;From Anthias 2026.09.0, the installer and &lt;code&gt;bin/upgrade_containers.sh&lt;/code&gt; remove the old images as their
last step, once the new containers are running. If the pull or the start fails, the old images stay
in place to fall back on.&lt;/p&gt;
&lt;p&gt;Only Anthias images are removed (&lt;code&gt;ghcr.io/screenly/anthias-*&lt;/code&gt;, plus the older &lt;code&gt;screenly/anthias-*&lt;/code&gt;
and &lt;code&gt;screenly/srly-ose-*&lt;/code&gt; names), and only those no container uses, running or stopped. Tagged
images for other containers you run on the same machine are left alone. Untagged leftovers, which
nothing can use, are pruned as the installer already did. Each removal is printed as &amp;quot;Reclaimed
superseded image&amp;quot; followed by the image name, and a device with nothing to clean prints nothing.&lt;/p&gt;
&lt;p&gt;To clear the leftovers from earlier releases without waiting for the next upgrade, run
&lt;code&gt;~/anthias/bin/purge_stale_images.sh&lt;/code&gt;. It&amp;#39;s safe to run at any time.&lt;/p&gt;</description></item><item><title>Anthias 2026.09.0: Boards recover on their own when memory runs out or the system hangs</title><link>https://www.screenly.io/releases/anthias/2026.09.0/recovery-from-memory-exhaustion/</link><guid isPermaLink="true">https://www.screenly.io/releases/anthias/2026.09.0/recovery-from-memory-exhaustion/</guid><pubDate>Tue, 22 Sep 2026 00:00:00 +0000</pubDate><category>improvement</category><description>&lt;p&gt;On a board short of memory, the screen could freeze, or the whole board could stop responding
until someone power cycled it. Anthias 2026.09.0 changes how both cases end.&lt;/p&gt;
&lt;h2 id="running-out-of-memory"&gt;Running out of memory&lt;/h2&gt;
&lt;p&gt;When memory runs out, the viewer container is meant to be what the system stops, because Docker
then restarts it clean. Before, only the small script that starts the viewer was marked to go
first, and stopping it freed almost nothing. In the project&amp;#39;s testing on a 2 GB board with an
RK3566 chip, the system stopped that script twice in a row, got back less than 200 KB each time,
and still had to stop something else. Every process in the viewer container is now marked, so the first thing
stopped is the viewer itself, and in the same test that freed about 100 MB at once.&lt;/p&gt;
&lt;h2 id="a-board-that-stops-responding"&gt;A board that stops responding&lt;/h2&gt;
&lt;p&gt;When you install or upgrade with the installer, it now sets up systemd&amp;#39;s watchdog with a 30 second
timeout, so a board whose system hangs reboots by itself. Which watchdog it uses depends on the
board:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Raspberry Pi boards use the Pi&amp;#39;s hardware watchdog. Raspberry Pi OS already had it switched on
with a 1 minute timeout, and Armbian and Debian ship it off.&lt;/li&gt;
&lt;li&gt;On x86, any hardware watchdog the machine exposes is used, and the kernel&amp;#39;s software watchdog
otherwise.&lt;/li&gt;
&lt;li&gt;Other boards, such as the Rock Pi 4 and the NanoPi R3S, use the software watchdog. In the
project&amp;#39;s testing, the hardware watchdog on both of those boards halted the board instead of
restarting it, and it stayed dark until someone power cycled it. The software watchdog
restarted the Rock Pi 4 within about 30 seconds.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A board with no watchdog that can restart it gets the watchdog switched off explicitly, rather than
left to the system default. A reboot that hangs while shutting down is forced through after 5
minutes.&lt;/p&gt;</description></item><item><title>Anthias 2026.09.0: Less black screen when a video gives way to an image, and other fixes</title><link>https://www.screenly.io/releases/anthias/2026.09.0/fixes-and-improvements/</link><guid isPermaLink="true">https://www.screenly.io/releases/anthias/2026.09.0/fixes-and-improvements/</guid><pubDate>Tue, 22 Sep 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;Add asset opens with an empty form every time. The URL of the last web asset you added no longer
sits in the box, one press of Enter away from a duplicate, and the Apps tab starts from the list
of apps instead of the last app&amp;#39;s form.&lt;/li&gt;
&lt;li&gt;The Actions column in the asset table fits its buttons, so the icons no longer spill past the
edge of the table.&lt;/li&gt;
&lt;li&gt;Going from a video or a web page to an image shows less black screen. While the image loads, the
screen holds the last image Anthias showed instead of going black.&lt;/li&gt;
&lt;li&gt;On Docker Compose installs of boards other than the Raspberry Pi, System info shows the board&amp;#39;s
name, such as FriendlyElec NanoPi R3S LTS, instead of &amp;quot;Generic aarch64 Device&amp;quot;. The
&lt;code&gt;device_model&lt;/code&gt; field of &lt;code&gt;/api/v2/info&lt;/code&gt;, which was empty on these boards, now has the name too.&lt;/li&gt;
&lt;li&gt;When Anthias can&amp;#39;t identify the board and so can&amp;#39;t check a video&amp;#39;s codec, the upload message
says what to check: on Docker Compose installs, that &lt;code&gt;anthias-host-agent&lt;/code&gt; and Redis are running.
It used to tell you to re-flash with a board-specific image that doesn&amp;#39;t exist.&lt;/li&gt;
&lt;li&gt;Installing on Raspberry Pi OS Trixie no longer fills the output with Ansible deprecation
warnings.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="for-contributors"&gt;For contributors&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;The Ansible playbook reads gathered facts through &lt;code&gt;ansible_facts&lt;/code&gt;, and the new
&lt;code&gt;ansible/ansible.cfg&lt;/code&gt; sets &lt;code&gt;inject_facts_as_vars = False&lt;/code&gt;, so a bare fact reference fails
instead of slipping back in. That file takes precedence over &lt;code&gt;/etc/ansible/ansible.cfg&lt;/code&gt; when the
installer runs the playbook.&lt;/li&gt;
&lt;li&gt;New tests cover chunked uploads and their error messages, page-wide drag and drop, and the Add
asset reset. A fake &lt;code&gt;docker&lt;/code&gt; command tests the image cleanup, and an Ansible test runs the
watchdog selection against made-up sysfs trees, which is how the x86 case is covered.&lt;/li&gt;
&lt;li&gt;The repository has an MJML newsletter template in &lt;code&gt;emails/&lt;/code&gt;, with a CI job that validates it and
checks the compiled size against Gmail&amp;#39;s clipping limit.&lt;/li&gt;
&lt;li&gt;The Anthias website adds pages on free digital signage software and on Yodeck and piSignage,
expands the Raspberry Pi pages, and links to the Screenly shop for buying a player.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Django moves from 5.2.14 to 5.2.17, which brings its upstream security fixes, along with the usual
Python, JavaScript and GitHub Actions dependency updates.&lt;/p&gt;</description></item><item><title>Anthias 2026.08.2: A warning on every page when a Raspberry Pi isn't getting enough power</title><link>https://www.screenly.io/releases/anthias/2026.08.2/under-voltage-warning/</link><guid isPermaLink="true">https://www.screenly.io/releases/anthias/2026.08.2/under-voltage-warning/</guid><pubDate>Mon, 17 Aug 2026 00:00:00 +0000</pubDate><category>release</category><description>&lt;p&gt;A Raspberry Pi on a weak power supply freezes, glitches and shows stray text along the edge of the screen, and nothing on the player said why. Left alone, a weak supply can also corrupt the memory card until the player stops starting up. From Anthias 2026.08.2, the web interface tells you when it&amp;#39;s happening, with a banner at the top of every page, the Schedule page included.&lt;/p&gt;
&lt;p&gt;The banner has 2 forms:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&amp;quot;This player isn&amp;#39;t getting enough power&amp;quot; while the voltage is too low right now.&lt;/li&gt;
&lt;li&gt;&amp;quot;This player briefly lost power&amp;quot; when it dropped earlier and is steady again. It says how many times that happened since the player last restarted, and how long ago the last one was.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Under &amp;quot;What to do&amp;quot;, the first step is the official Raspberry Pi power supply for your model, which the banner calls the fix in almost every case. Then the cable that came with it, unplugging USB drives, hubs and keyboards powered by the player, and not running the player from a TV&amp;#39;s USB socket or a phone charger.&lt;/p&gt;
&lt;p&gt;You can&amp;#39;t dismiss the banner, since a weak supply keeps damaging the card while it&amp;#39;s ignored. It goes away once the player restarts with a supply that holds. When a storage warning shows as well, the power banner comes first, because a bad supply is one of the main reasons cards fail.&lt;/p&gt;
&lt;p&gt;System Info has a new &amp;quot;Power supply&amp;quot; card with the same verdict, how many drops there have been since the last restart, and when the first and most recent were.&lt;/p&gt;
&lt;h2 id="which-players-show-it"&gt;Which players show it&lt;/h2&gt;
&lt;p&gt;Raspberry Pi players: the Pi 2, Pi 3, Pi 4 and Pi 5 images, installed with the installer or through balena. Anthias reads the kernel&amp;#39;s &lt;code&gt;rpi_volt&lt;/code&gt; sensor under &lt;code&gt;/sys/class/hwmon&lt;/code&gt;, which works from inside the containers, so it needs no host agent. On x86 and other boards that have no such sensor, the &amp;quot;Power supply&amp;quot; card says &amp;quot;Not monitored&amp;quot;, and no banner appears.&lt;/p&gt;
&lt;p&gt;The kernel wakes Anthias whenever the reading changes, and every page load reads the sensor again, so the banner is current when you open the page. On current Raspberry Pi kernels, &lt;code&gt;vcgencmd get_throttled&lt;/code&gt; no longer keeps a record of earlier drops, so Anthias counts them itself. The count starts over at every reboot.&lt;/p&gt;
&lt;h2 id="for-developers"&gt;For developers&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;/api/v2/info&lt;/code&gt; has a new &lt;code&gt;under_voltage&lt;/code&gt; object with &lt;code&gt;supported&lt;/code&gt;, &lt;code&gt;active&lt;/code&gt;, &lt;code&gt;seen_since_boot&lt;/code&gt;, &lt;code&gt;first_seen&lt;/code&gt;, &lt;code&gt;last_seen&lt;/code&gt; and &lt;code&gt;count&lt;/code&gt;. Check &lt;code&gt;supported&lt;/code&gt; first: when it&amp;#39;s &lt;code&gt;false&lt;/code&gt;, the device has no sensor and the other fields carry no information. &lt;code&gt;bin/collect_debug.sh&lt;/code&gt; saves the &lt;code&gt;/api/v2/info&lt;/code&gt; response in the bundle as &lt;code&gt;api-info.json&lt;/code&gt;, and also reads the sensor and the kernel&amp;#39;s under-voltage messages directly, for a player too broken to answer.&lt;/p&gt;</description></item><item><title>Anthias 2026.08.2: The web interface warns when a player's storage is failing or full</title><link>https://www.screenly.io/releases/anthias/2026.08.2/storage-health-warnings/</link><guid isPermaLink="true">https://www.screenly.io/releases/anthias/2026.08.2/storage-health-warnings/</guid><pubDate>Mon, 17 Aug 2026 00:00:00 +0000</pubDate><category>release</category><description>&lt;p&gt;A memory card that is going bad rarely says so. The screen keeps playing what it already has, so nothing looks wrong from the front, while uploads, schedule changes and settings quietly stop sticking. From Anthias 2026.08.2, the player checks the storage it runs from and shows a banner at the top of every page of the web interface when something is wrong. Like the power warning, you can&amp;#39;t dismiss it, and when both show, it sits under the power one.&lt;/p&gt;
&lt;p&gt;The banner names the problem, because each one has a different fix:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&amp;quot;This player has run out of space&amp;quot;: the storage is full. This one isn&amp;#39;t a hardware fault, and the advice is to delete content you no longer need from the Schedule page. Videos are usually what filled it.&lt;/li&gt;
&lt;li&gt;&amp;quot;This player has stopped saving changes&amp;quot;: the storage has switched to read-only. The screen keeps playing, but anything you change is lost at the next restart.&lt;/li&gt;
&lt;li&gt;&amp;quot;This player can&amp;#39;t save anything&amp;quot;: Anthias couldn&amp;#39;t save a small test file, or read back something different from what it wrote.&lt;/li&gt;
&lt;li&gt;&amp;quot;The memory card is returning errors&amp;quot;: storage errors since the player last restarted.&lt;/li&gt;
&lt;li&gt;&amp;quot;The memory card has recorded errors&amp;quot;: errors the filesystem logged earlier, which it keeps across reboots. Saving still works.&lt;/li&gt;
&lt;li&gt;&amp;quot;This player&amp;#39;s storage is wearing out&amp;quot;: built-in storage (eMMC) or an SSD reports that it&amp;#39;s near the end of its rated life, for example with 80 percent or more of its rated writes used. A plain SD card doesn&amp;#39;t report this.&lt;/li&gt;
&lt;li&gt;&amp;quot;The drive is developing bad spots&amp;quot;: an SSD or hard drive reports blocks that have gone bad.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The wording follows the hardware: &amp;quot;memory card&amp;quot; for an SD card, &amp;quot;built-in storage&amp;quot; for eMMC and &amp;quot;drive&amp;quot; for an SSD or hard drive. So does the advice. Every warning except a full disk says to take a backup from Settings while the storage can still be read, and to replace the card or drive. For an SD card it adds to buy an A1 or A2 card from a brand you recognize. Built-in eMMC is soldered to the board, so there the advice is to plan to replace the player.&lt;/p&gt;
&lt;p&gt;System Info has a new storage card next to the &amp;quot;Disk&amp;quot; card, with the same verdict, plus the details for a support conversation: the card&amp;#39;s maker, model and manufacture date, the filesystem&amp;#39;s error count, how much has been written to it, the result of the last write test and, on drives that report it, SMART health, bad blocks and wear.&lt;/p&gt;
&lt;h2 id="how-it-checks"&gt;How it checks&lt;/h2&gt;
&lt;p&gt;An SD card has no health register, so Anthias combines what the kernel does expose: the ext4 error counters stored in the filesystem, a test file it writes and reads back, and the wear registers on eMMC. It reads the counters every minute, and on every page load, and writes the test file every 15 minutes. A full disk shows up through that test, so the &amp;quot;run out of space&amp;quot; banner can take up to 15 minutes to appear. All of this works from inside the containers, so balena installs get the warnings too.&lt;/p&gt;
&lt;p&gt;On the x86, arm64 and Raspberry Pi 5 images, which can run from an SSD, the viewer also reads the drive&amp;#39;s SMART data with &lt;code&gt;smartctl&lt;/code&gt; once an hour. The viewer runs as an unprivileged user, so its image has a sudoers rule that lets that user run only &lt;code&gt;smartctl --json -H -A -i&lt;/code&gt; on a device under &lt;code&gt;/dev/&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;In Anthias 2026.08.2, a memory card whose product name isn&amp;#39;t valid UTF-8 stopped storage monitoring from starting at all. Anthias 2026.10.0 &lt;a href="https://www.screenly.io/releases/anthias/2026.10.0/fixes-and-improvements/"&gt;fixes that&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="for-developers"&gt;For developers&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;/api/v2/info&lt;/code&gt; has a new &lt;code&gt;storage&lt;/code&gt; object. Check &lt;code&gt;supported&lt;/code&gt; first, then branch on &lt;code&gt;status&lt;/code&gt;, one of &lt;code&gt;ok&lt;/code&gt;, &lt;code&gt;wear&lt;/code&gt;, &lt;code&gt;errors&lt;/code&gt;, &lt;code&gt;full&lt;/code&gt;, &lt;code&gt;failing&lt;/code&gt; or &lt;code&gt;unknown&lt;/code&gt;. &lt;code&gt;errors_count&lt;/code&gt; covers the life of the filesystem and survives reboots. &lt;code&gt;errors_new&lt;/code&gt; and the write test fields reset when the player reboots. &lt;code&gt;bin/collect_debug.sh&lt;/code&gt; adds a &lt;code&gt;storage.txt&lt;/code&gt; to the bundle with block devices, mount flags, the ext4 error counters, card identity, SMART output and the kernel&amp;#39;s storage errors.&lt;/p&gt;</description></item><item><title>Anthias 2026.08.2: Settings flags a player that skips SSL certificate checks, and other fixes</title><link>https://www.screenly.io/releases/anthias/2026.08.2/fixes-and-improvements/</link><guid isPermaLink="true">https://www.screenly.io/releases/anthias/2026.08.2/fixes-and-improvements/</guid><pubDate>Mon, 17 Aug 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;Notifications in the web interface show their success, error or info icon, and the Load Average card on System Info shows its icon when the load is steady. Both spaces were empty.&lt;/li&gt;
&lt;li&gt;In the Edit asset dialog for a web page, the &amp;quot;Auto-refresh interval (seconds)&amp;quot; and &amp;quot;Custom HTTP headers&amp;quot; labels no longer sit on top of their example text.&lt;/li&gt;
&lt;li&gt;In Settings &amp;gt; Import content, each platform&amp;#39;s import button sits beside its description instead of under it.&lt;/li&gt;
&lt;li&gt;The &amp;quot;Try again&amp;quot; and &amp;quot;Copy ffmpeg command&amp;quot; buttons in the asset dialog have a button style. They showed without one.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="improvements"&gt;Improvements&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;When &amp;quot;Verify SSL certificates&amp;quot; is off, Settings shows a &amp;quot;Not secure&amp;quot; badge next to it, so a player that skips certificate checks is easy to spot. It appears as soon as you switch the setting off, before you save.&lt;/li&gt;
&lt;li&gt;The disk chart on System Info no longer shows used space in red. It uses the same colors as the memory chart, and a storage problem shows up in the new storage card instead.&lt;/li&gt;
&lt;li&gt;The import pages under Settings &amp;gt; Import content use the web interface&amp;#39;s own colors. Their progress bar was a blue used nowhere else.&lt;/li&gt;
&lt;li&gt;On a board with little memory, the &amp;quot;Low-RAM mode&amp;quot; note on System Info&amp;#39;s Memory card is in a darker amber that&amp;#39;s easier to read on white.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="for-contributors"&gt;For contributors&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;The web interface&amp;#39;s colors, fonts and sizes are defined once, in &lt;code&gt;src/anthias_server/app/static/src/tailwind.css&lt;/code&gt;, with dark values in &lt;code&gt;css/theme-dark.css&lt;/code&gt; next to it. The older SCSS copy, which had been overriding them, is gone, and tests fail if one comes back.&lt;/li&gt;
&lt;li&gt;A design-system page at &lt;code&gt;/_design/&lt;/code&gt; shows every color and component, in light and dark. It exists only in development builds and tests (&lt;code&gt;DEBUG&lt;/code&gt; or &lt;code&gt;IS_TEST&lt;/code&gt;), so production images don&amp;#39;t have the route.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;bin/shoot_pages.py&lt;/code&gt; screenshots the web interface pages in both themes and at several window sizes, without the Docker stack.&lt;/li&gt;
&lt;li&gt;The host agent lists network addresses through the kernel&amp;#39;s rtnetlink interface with the Python standard library. The &lt;code&gt;netifaces&lt;/code&gt; and &lt;code&gt;netifaces2&lt;/code&gt; packages are gone, and so is &lt;code&gt;python3-netifaces&lt;/code&gt; in the viewer image. &lt;code&gt;uv sync --group test&lt;/code&gt; works on a plain development machine, where &lt;code&gt;netifaces&lt;/code&gt; used to fail to build.&lt;/li&gt;
&lt;li&gt;The release and hardware-testing guides for coding agents in &lt;code&gt;.claude/skills&lt;/code&gt; add a burn-in run on the test boards before a release is published.&lt;/li&gt;
&lt;li&gt;Tests cover the power and storage checks, SMART parsing, the network address listing and the design-system page.&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Anthias 2026.08.1: A new display schedule blanks the screen outside opening hours</title><link>https://www.screenly.io/releases/anthias/2026.08.1/display-schedule/</link><guid isPermaLink="true">https://www.screenly.io/releases/anthias/2026.08.1/display-schedule/</guid><pubDate>Fri, 14 Aug 2026 00:00:00 +0000</pubDate><category>release</category><description>&lt;p&gt;A screen in an office or a shop stays lit all night and all weekend for nobody. People have asked Anthias for a way to turn it off out of hours since 2012, and some ran their own cron job to do it. Anthias 2026.08.1 adds a display schedule to Settings that switches the screen off at closing time and back on in the morning.&lt;/p&gt;
&lt;p&gt;The schedule is off by default, so a player that has always stayed lit keeps doing so after the upgrade. Turn on &amp;quot;Enable schedule&amp;quot; under Settings &amp;gt; Display schedule, then set:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&amp;quot;Turn on at&amp;quot;, 08:00 by default.&lt;/li&gt;
&lt;li&gt;&amp;quot;Turn off at&amp;quot;, 18:00 by default.&lt;/li&gt;
&lt;li&gt;The days it runs. If you uncheck every day, it runs every day.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Times are in the player&amp;#39;s timezone. An overnight schedule belongs to the day it starts: with 18:00 to 06:00 and only Friday checked, the screen comes on Friday evening and stays on until 06:00 on Saturday.&lt;/p&gt;
&lt;h2 id="what-the-screen-does"&gt;What the screen does&lt;/h2&gt;
&lt;p&gt;At each change, Anthias blanks or unblanks the screen itself, and pauses or resumes playback with it. On the Raspberry Pi 5, x86 and arm64 images the display output is switched off, so the display gets no signal. On the Raspberry Pi 2, 3 and 4 images the viewer shows a black screen instead.&lt;/p&gt;
&lt;p&gt;Anthias also sends the HDMI-CEC standby or power-on command to every HDMI port with a CEC display attached. Doing both means a plain monitor goes dark, a TV that obeys CEC goes into standby, and a player with one of each on its 2 ports handles both. You don&amp;#39;t need a CEC adapter or a CEC display for the schedule: it isn&amp;#39;t hidden on boards without one.&lt;/p&gt;
&lt;p&gt;The schedule is checked every minute, so a change lands within about a minute of the time you set. Anthias also repeats the current state about every 10 minutes. That&amp;#39;s what puts a black screen back after the viewer restarts in the middle of the night, and it also means that if you switch the screen on by hand during off hours, it goes off again within about 10 minutes.&lt;/p&gt;
&lt;p&gt;Turning the schedule off while the screen is off brings the screen back on within a minute.&lt;/p&gt;
&lt;h2 id="what-to-check-on-your-setup"&gt;What to check on your setup&lt;/h2&gt;
&lt;p&gt;Whether a TV goes into standby is up to the TV. Anthias 2026.08.1 hasn&amp;#39;t been tested end to end against a CEC-capable display, so if you rely on a TV powering down, watch it the first evening and report what you see. &lt;a href="https://www.screenly.io/releases/anthias/2026.08.1/hdmi-cec-rewrite/"&gt;HDMI-CEC display controls no longer fail on a Raspberry Pi 2, 3 or 4&lt;/a&gt; has the rest of what changed for CEC in this release.&lt;/p&gt;
&lt;h2 id="for-developers"&gt;For developers&lt;/h2&gt;
&lt;p&gt;The schedule is 4 fields on &lt;code&gt;/api/v2/device_settings&lt;/code&gt;, readable with &lt;code&gt;GET&lt;/code&gt; and writable with &lt;code&gt;PATCH&lt;/code&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;display_power_schedule_enabled&lt;/code&gt;, a boolean.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;display_power_on_time&lt;/code&gt; and &lt;code&gt;display_power_off_time&lt;/code&gt;, as &lt;code&gt;HH:MM&lt;/code&gt;. &lt;code&gt;HH:MM:SS&lt;/code&gt; is accepted and stored as &lt;code&gt;HH:MM&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;display_power_days&lt;/code&gt;, a comma-separated list of weekday numbers from &lt;code&gt;0&lt;/code&gt; to &lt;code&gt;6&lt;/code&gt;, where Monday is &lt;code&gt;0&lt;/code&gt;. An empty value means every day. Asset &lt;code&gt;play_days&lt;/code&gt; counts Monday as &lt;code&gt;1&lt;/code&gt;, so the 2 don&amp;#39;t match.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A malformed time or weekday gets a &lt;code&gt;400&lt;/code&gt; response from the API. In the web form, a malformed time keeps its previous value and shows an error.&lt;/p&gt;</description></item><item><title>Anthias 2026.08.1: HDMI-CEC display controls no longer fail on a Raspberry Pi 2, 3 or 4</title><link>https://www.screenly.io/releases/anthias/2026.08.1/hdmi-cec-rewrite/</link><guid isPermaLink="true">https://www.screenly.io/releases/anthias/2026.08.1/hdmi-cec-rewrite/</guid><pubDate>Fri, 14 Aug 2026 00:00:00 +0000</pubDate><category>fix</category><description>&lt;p&gt;If you use Anthias to turn a TV on and off over HDMI, that never worked on a Raspberry Pi 2, 3 or 4, and on a Raspberry Pi 5 only one of the 2 HDMI ports got the command. Anthias 2026.08.1 fixes both, and stops calling an ordinary monitor an error. After upgrading, try it with your TV, because it hasn&amp;#39;t been tested end to end with one yet.&lt;/p&gt;
&lt;p&gt;Before Anthias 2026.08.1, the &lt;a href="https://www.screenly.io/releases/anthias/2026.05.1/hdmi-cec-display-power/"&gt;HDMI-CEC display controls&lt;/a&gt; could only fail on a Raspberry Pi 2, 3 or 4. The &amp;quot;Display Power (CEC)&amp;quot; card on the System Info page read &amp;quot;CEC error&amp;quot;, and &amp;quot;Turn display on&amp;quot; and &amp;quot;Turn display off&amp;quot; in Settings failed, even with a TV that supports CEC.&lt;/p&gt;
&lt;p&gt;From Anthias 2026.08.1, CEC commands go out on the Raspberry Pi 2, 3, 4 and 5 and the Rock Pi 4. They go to every HDMI port that has a CEC display attached, so a second screen isn&amp;#39;t left out. When no port has one, the buttons say &amp;quot;no CEC link on any HDMI port&amp;quot; instead of failing with no reason. Whether the TV then turns on or off is still up to the TV.&lt;/p&gt;
&lt;h2 id="system-info-tells-a-plain-monitor-from-a-fault"&gt;System Info tells a plain monitor from a fault&lt;/h2&gt;
&lt;p&gt;Most desktop monitors don&amp;#39;t support CEC, and Anthias used to report that as &amp;quot;CEC error&amp;quot;. The &amp;quot;Display Power (CEC)&amp;quot; card now reads:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&amp;quot;True&amp;quot; or &amp;quot;False&amp;quot; when every display that answered is on, or in standby.&lt;/li&gt;
&lt;li&gt;&amp;quot;Mixed&amp;quot; when 2 displays disagree, or one is switching.&lt;/li&gt;
&lt;li&gt;&amp;quot;No CEC display detected&amp;quot; when nothing answers. That&amp;#39;s normal for a plain monitor, not a fault.&lt;/li&gt;
&lt;li&gt;&amp;quot;Not available&amp;quot; on a board with no CEC hardware, such as most x86 PCs, as before.&lt;/li&gt;
&lt;li&gt;&amp;quot;CEC error&amp;quot; only when Anthias couldn&amp;#39;t ask at all.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="what-to-check-on-your-setup"&gt;What to check on your setup&lt;/h2&gt;
&lt;p&gt;Anthias 2026.08.1 hasn&amp;#39;t been tested end to end against a CEC-capable display: no test setup had one. Finding the CEC hardware and telling which ports have a CEC display was checked on a Raspberry Pi 2, 3, 4 and 5, a Rock Pi 4 and an x86 machine. USB CEC adapters haven&amp;#39;t been tried. If you use CEC to turn a TV on and off, try it after upgrading and report what you see.&lt;/p&gt;
&lt;p&gt;The viewer container now does the CEC work for the whole player, so if the viewer isn&amp;#39;t running, the card reads &amp;quot;CEC error&amp;quot; and the buttons fail.&lt;/p&gt;
&lt;h2 id="for-people-who-build-on-anthias"&gt;For people who build on Anthias&lt;/h2&gt;
&lt;p&gt;The images no longer include libcec or &lt;code&gt;cec-client&lt;/code&gt;, since Anthias talks to the kernel&amp;#39;s CEC devices (&lt;code&gt;/dev/cec*&lt;/code&gt;) itself. The viewer container is privileged and already sees them, so the server and Celery containers get no CEC devices: the compose templates drop their &lt;code&gt;/dev/vchiq&lt;/code&gt; entries, and &lt;code&gt;bin/upgrade_containers.sh&lt;/code&gt;, &lt;code&gt;bin/deploy_to_balena.sh&lt;/code&gt; and &lt;code&gt;bin/balena_ota_deploy.sh&lt;/code&gt; no longer rewrite the device list per board. Needing no device list is also what lets CEC work on balena installs, though it hasn&amp;#39;t been tried on a balena device yet.&lt;/p&gt;
&lt;p&gt;On &lt;code&gt;/api/v1/info&lt;/code&gt; and &lt;code&gt;/api/v2/info&lt;/code&gt;, &lt;code&gt;display_power&lt;/code&gt; is still a string or &lt;code&gt;null&lt;/code&gt;. Its values are &lt;code&gt;True&lt;/code&gt;, &lt;code&gt;False&lt;/code&gt;, &lt;code&gt;Mixed&lt;/code&gt;, &lt;code&gt;No CEC display detected&lt;/code&gt;, &lt;code&gt;Not available&lt;/code&gt;, &lt;code&gt;CEC error&lt;/code&gt; and, rarely, &lt;code&gt;No CEC adapter&lt;/code&gt;. &lt;code&gt;Unknown&lt;/code&gt;, which a working adapter with nothing answering used to return, is now &lt;code&gt;No CEC display detected&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>Anthias 2026.08.1: Large JPEG and PNG uploads are resized on boards with little RAM</title><link>https://www.screenly.io/releases/anthias/2026.08.1/large-jpeg-png-low-ram-boards/</link><guid isPermaLink="true">https://www.screenly.io/releases/anthias/2026.08.1/large-jpeg-png-low-ram-boards/</guid><pubDate>Fri, 14 Aug 2026 00:00:00 +0000</pubDate><category>improvement</category><description>&lt;p&gt;A phone photo is 12 to 50 megapixels, and a 1080p screen shows about 2 of them. From Anthias 2026.08.1, a board with less than 1.5 GB of RAM shrinks a JPEG or PNG upload that has more pixels than a 1920x1080 image down to about that many, keeping its shape. That covers the Raspberry Pi 2, the Pi 3 and 1 GB boards such as a 1 GB Pi 4. A board with more memory leaves your files as they are.&lt;/p&gt;
&lt;p&gt;In the project&amp;#39;s testing on a 64-bit Raspberry Pi 3, a 6000x4000 photo was stored at 1762x1175, and the viewer used less than half the memory to show it.&lt;/p&gt;
&lt;p&gt;Anthias 2026.08.0 started doing this for images it converts to WebP on upload, such as HEIC and TIFF. JPEG and PNG skip that conversion, so until this release they stayed at full size.&lt;/p&gt;
&lt;h2 id="what-happens-to-your-file"&gt;What happens to your file&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;It keeps its format, and the asset shows as processing until the resize is done.&lt;/li&gt;
&lt;li&gt;A JPEG is saved again at quality 90. A PNG stays lossless.&lt;/li&gt;
&lt;li&gt;A phone photo&amp;#39;s rotation is applied to the pixels and its EXIF data is dropped, so it stays upright.&lt;/li&gt;
&lt;li&gt;GIF, WebP and SVG files aren&amp;#39;t resized.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A resized PNG can end up larger on disk than the original. A flat graphic with big areas of one color compresses very well at full size and less well once it&amp;#39;s scaled down, while a photographic PNG gets smaller. The resize is there to cut the memory the viewer needs to draw the image, so Anthias keeps the resized file either way.&lt;/p&gt;</description></item><item><title>Anthias 2026.08.1: Menu Board's items and World Clock's cities can be set from the Apps tab</title><link>https://www.screenly.io/releases/anthias/2026.08.1/menu-board-installs-with-its-menu/</link><guid isPermaLink="true">https://www.screenly.io/releases/anthias/2026.08.1/menu-board-installs-with-its-menu/</guid><pubDate>Fri, 14 Aug 2026 00:00:00 +0000</pubDate><category>fix</category><description>&lt;p&gt;Installing Menu Board from the Apps tab in &amp;quot;Add asset&amp;quot; gave you a board with your title and footer and no menu under them. Its items are a list, and the form left out any setting that takes a list, so there was nowhere to type them. World Clock&amp;#39;s cities had the same problem.&lt;/p&gt;
&lt;p&gt;From Anthias 2026.08.1, a list setting shows as rows, one per item, with the fields for that item, such as a menu entry&amp;#39;s section, name and price. &amp;quot;Add&amp;quot; puts in a new row and each row has its own remove button. When you edit an installed app, its saved items load back into the rows.&lt;/p&gt;
&lt;p&gt;This closes the gap left when the &lt;a href="https://www.screenly.io/releases/anthias/2026.07.1/signage-app-store/"&gt;Apps tab arrived in Anthias 2026.07.1&lt;/a&gt;, which couldn&amp;#39;t set a list.&lt;/p&gt;</description></item><item><title>Anthias 2026.08.1: A player with nothing to show stops filling its log, and other fixes</title><link>https://www.screenly.io/releases/anthias/2026.08.1/fixes-and-improvements/</link><guid isPermaLink="true">https://www.screenly.io/releases/anthias/2026.08.1/fixes-and-improvements/</guid><pubDate>Fri, 14 Aug 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;A player with an empty playlist, or with an asset it can&amp;#39;t show, no longer writes the same log line every few seconds. The viewer logs the first time and stays quiet until something changes. The journal on a player is small, and the repeats pushed out the log lines you&amp;#39;d need after a crash.&lt;/li&gt;
&lt;li&gt;On the Raspberry Pi 2 and 32-bit Pi 3 images, a display that disappears while the player runs no longer leaves the viewer retrying on a black screen first, which at startup could take several minutes. The viewer gives up on the first failed start and its container restarts, which is what finds the display again.&lt;/li&gt;
&lt;li&gt;On the Raspberry Pi 5, x86 and arm64 images, when the viewer restarts itself because it started without seeing a connected display, it logs that as a warning instead of an error, so a recovery that worked no longer sends an error report.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="improvements"&gt;Improvements&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Anthias&amp;#39;s usage statistics now include the Anthias version, as &lt;code&gt;version_name&lt;/code&gt;, next to the commit and branch they already sent. With &lt;code&gt;analytics_opt_out&lt;/code&gt; set in the player&amp;#39;s config, nothing is sent, as before.&lt;/li&gt;
&lt;li&gt;The API reference on the Anthias website is built from the API itself and updates when the API changes. The old copy was missing 9 endpoints, including the display power and viewer endpoints.&lt;/li&gt;
&lt;li&gt;The Anthias website has pages on using a Raspberry Pi for digital signage, as an advertising display and as an info screen, a link to the signage app store at &lt;a href="https://signage-apps.com/" target="_blank" rel="noopener"&gt;signage-apps.com&lt;/a&gt;, and a Trust Center link with an FAQ entry on where to get the SBOM. It also says plainly that the Raspberry Pi Imager images are the balenaHub Fleets for Good images, which update over the air.&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 front-end tests that need a page, using happy-dom, starting with the app settings form.&lt;/li&gt;
&lt;li&gt;New tests for the CEC code, the display schedule, telemetry, image processing and the viewer&amp;#39;s log changes.&lt;/li&gt;
&lt;li&gt;The README no longer carries the broken Star History chart or the stale &amp;quot;Issues and Bugs&amp;quot; note.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Django REST framework, uvicorn, Python development tools and the GitHub Actions used in CI, including CodeQL, were updated.&lt;/p&gt;</description></item><item><title>Anthias 2026.08.0: Anthias installs and runs behind an HTTP proxy</title><link>https://www.screenly.io/releases/anthias/2026.08.0/http-proxy-support/</link><guid isPermaLink="true">https://www.screenly.io/releases/anthias/2026.08.0/http-proxy-support/</guid><pubDate>Wed, 05 Aug 2026 00:00:00 +0000</pubDate><category>release</category><description>&lt;p&gt;If your network only lets a player out through an HTTP proxy, Anthias 2026.08.0 can now be installed and run there. The installer asks for the proxy and sets it up for you. If your player reaches the internet directly, leave that question blank and nothing changes.&lt;/p&gt;
&lt;p&gt;Before, someone running Anthias on a PC behind a proxy had to set it by hand for the installer, apt, Docker, the host agent and the containers, one at a time, and a hand-written bypass list could cut the viewer off from the server and blank the screen.&lt;/p&gt;
&lt;h2 id="setting-a-proxy"&gt;Setting a proxy&lt;/h2&gt;
&lt;p&gt;Run the installer as usual. It now asks for a proxy URL, for example &lt;code&gt;http://proxy.example.com:3128&lt;/code&gt;, and then for any hosts on your network that should skip the proxy. The one URL is used for both HTTP and HTTPS. Leave the first question blank if the player has direct internet access.&lt;/p&gt;
&lt;p&gt;If you export &lt;code&gt;HTTP_PROXY&lt;/code&gt;, &lt;code&gt;HTTPS_PROXY&lt;/code&gt; and &lt;code&gt;NO_PROXY&lt;/code&gt; (upper or lower case) before you run the installer, the questions start with those values. On a host that doesn&amp;#39;t have &lt;code&gt;whiptail&lt;/code&gt; yet, the questions can&amp;#39;t appear, so export the variables first.&lt;/p&gt;
&lt;p&gt;The installer asks every time it runs, and it doesn&amp;#39;t fill in the proxy you gave it last time. When you run it again to upgrade, enter the proxy again or export it first. If you leave the question blank, the installer takes the proxy back out.&lt;/p&gt;
&lt;h2 id="where-the-proxy-applies"&gt;Where the proxy applies&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;The installer&amp;#39;s own downloads and the Ansible steps it runs.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;apt&lt;/code&gt;, through &lt;code&gt;/etc/apt/apt.conf.d/00anthias-proxy&lt;/code&gt;, so your own &lt;code&gt;apt&lt;/code&gt; runs on the player stay proxied afterward.&lt;/li&gt;
&lt;li&gt;The Docker daemon, so it can pull the Anthias images. This adds a systemd drop-in at &lt;code&gt;/etc/systemd/system/docker.service.d/http-proxy.conf&lt;/code&gt; and restarts Docker.&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;anthias-host-agent&lt;/code&gt; service.&lt;/li&gt;
&lt;li&gt;The server, viewer and Celery containers, including the web pages the viewer shows on screen.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Anthias keeps the values in &lt;code&gt;/etc/anthias/proxy.env&lt;/code&gt;. A proxy URL can carry a username and password, so the file is readable only by root and the Anthias user&amp;#39;s group. The installer rewrites it on every run, and it always adds &lt;code&gt;localhost&lt;/code&gt;, &lt;code&gt;127.0.0.1&lt;/code&gt;, &lt;code&gt;::1&lt;/code&gt;, &lt;code&gt;anthias-server&lt;/code&gt; and &lt;code&gt;redis&lt;/code&gt; to the bypass list, so traffic between the Anthias containers never goes through your proxy.&lt;/p&gt;
&lt;p&gt;To change the proxy, run the installer again with the new value. To remove it, run the installer with the question left blank and nothing exported: it deletes &lt;code&gt;proxy.env&lt;/code&gt;, the apt setting and the Docker drop-in.&lt;/p&gt;
&lt;p&gt;The balena images don&amp;#39;t use the installer, and this release doesn&amp;#39;t cover them.&lt;/p&gt;</description></item><item><title>Anthias 2026.08.0: A TV switched on after the player boots gets a picture on Raspberry Pi 5 and x86</title><link>https://www.screenly.io/releases/anthias/2026.08.0/display-recovers-after-late-power-on/</link><guid isPermaLink="true">https://www.screenly.io/releases/anthias/2026.08.0/display-recovers-after-late-power-on/</guid><pubDate>Wed, 05 Aug 2026 00:00:00 +0000</pubDate><category>fix</category><description>&lt;p&gt;If your TV switches on after the player has started, for example on a power timer, the screen could stay on &amp;quot;No Signal&amp;quot; until someone rebooted the player. From Anthias 2026.08.0 the picture comes up on its own after a short wait. It affects a Raspberry Pi 5, an x86 PC or a board running the generic arm64 image, and there&amp;#39;s nothing to set.&lt;/p&gt;
&lt;p&gt;On those boards, a player that booted while its TV was off stayed on &amp;quot;No Signal&amp;quot; after the TV came on. The only way out was to restart the viewer container or reboot the player. Anthias 2026.07.2 &lt;a href="https://www.screenly.io/releases/anthias/2026.07.2/fixes-and-improvements/"&gt;added a check&lt;/a&gt; that restarts the viewer when a display turns up after boot, but it only acted once the display had reported its resolutions to the player. A TV that was plugged in but off at boot never got that far, so the check never fired. From Anthias 2026.08.0 it acts on any connected display that has no picture: after 60 seconds, the viewer container restarts so the display is detected again. In the project&amp;#39;s testing on a Pi 5, the first restart brought the picture back, about 70 seconds after the display was connected.&lt;/p&gt;
&lt;p&gt;The restarts are capped at 3 per boot. A display that never answers, such as one on a faulty cable, gets 3 attempts. Then the viewer logs that it gave up and stops restarting, so a failed screen can&amp;#39;t keep the viewer cycling all night. The count starts over when the display comes up, when it&amp;#39;s unplugged, or when the player reboots.&lt;/p&gt;
&lt;p&gt;The Raspberry Pi 2, 3 and 4 images use a different display path, and this change doesn&amp;#39;t affect them.&lt;/p&gt;</description></item><item><title>Anthias 2026.08.0: Portrait photos from a phone or camera display upright</title><link>https://www.screenly.io/releases/anthias/2026.08.0/portrait-photos-display-upright/</link><guid isPermaLink="true">https://www.screenly.io/releases/anthias/2026.08.0/portrait-photos-display-upright/</guid><pubDate>Wed, 05 Aug 2026 00:00:00 +0000</pubDate><category>fix</category><description>&lt;p&gt;A phone or camera usually saves a portrait photo as a landscape image, with a tag that says to turn it 90 degrees when it&amp;#39;s shown. Anthias ignored that tag on JPEG and AVIF files, so those photos appeared sideways on the screen.&lt;/p&gt;
&lt;p&gt;From Anthias 2026.08.0 they display upright:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A JPEG is turned by the viewer as it draws the photo, so JPEGs you uploaded before the upgrade come out upright too.&lt;/li&gt;
&lt;li&gt;An AVIF photo is turned while Anthias converts it to WebP on upload. An AVIF you uploaded before the upgrade was converted sideways and stays that way, so upload it again.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;HEIC photos, the format an iPhone saves, and TIFF files already displayed upright.&lt;/p&gt;</description></item><item><title>Anthias 2026.08.0: URL and web page content loads after a cold boot on x86</title><link>https://www.screenly.io/releases/anthias/2026.08.0/url-content-after-cold-boot-on-x86/</link><guid isPermaLink="true">https://www.screenly.io/releases/anthias/2026.08.0/url-content-after-cold-boot-on-x86/</guid><pubDate>Wed, 05 Aug 2026 00:00:00 +0000</pubDate><category>fix</category><description>&lt;p&gt;If your Anthias player is a PC rather than a Raspberry Pi, web pages could go missing from its playlist after it was switched on, while images and videos kept playing. Upgrading to Anthias 2026.08.0 with the installer fixes it. On a Debian 13 PC installed from the netinst image, read the known problem below before you run the installer.&lt;/p&gt;
&lt;p&gt;On some x86 players, web pages and other URL content were skipped after a cold boot, while images and videos stored on the player played fine. The viewer log showed &lt;code&gt;Asset ... is not available, skipping&lt;/code&gt;, and only restarting Docker or the Anthias containers brought the content back, until the next reboot.&lt;/p&gt;
&lt;p&gt;The containers could start before the player had its DNS servers, and they kept that empty DNS setup until they were recreated. The project reproduced it on Debian 13, on a PC whose network card is set up by Debian&amp;#39;s own network configuration rather than NetworkManager.&lt;/p&gt;
&lt;p&gt;From Anthias 2026.08.0, the installer sets up &lt;code&gt;systemd-resolved&lt;/code&gt; on x86 and makes &lt;code&gt;/etc/resolv.conf&lt;/code&gt; a link to &lt;code&gt;/run/systemd/resolve/stub-resolv.conf&lt;/code&gt;, a local resolver at &lt;code&gt;127.0.0.53&lt;/code&gt; that the containers can always reach. Run the installer to upgrade and the change is made. Raspberry Pi and arm64 installs don&amp;#39;t get it.&lt;/p&gt;
&lt;p&gt;The installer makes this change even if you chose not to let Anthias manage the network, and it replaces an &lt;code&gt;/etc/resolv.conf&lt;/code&gt; you manage yourself.&lt;/p&gt;
&lt;h2 id="known-problem-dns-can-stop-while-the-installer-runs"&gt;Known problem: DNS can stop while the installer runs&lt;/h2&gt;
&lt;p&gt;On a Debian 13 PC installed from the netinst image, where &lt;code&gt;dhcpcd&lt;/code&gt; sets up the network, the switch to &lt;code&gt;systemd-resolved&lt;/code&gt; can leave the player with no working DNS. The installer then stops at its next download with &lt;code&gt;Temporary failure in name resolution&lt;/code&gt;. In the project&amp;#39;s testing, name lookups on such a PC also stopped again some minutes after a reboot. The installer still does this as of Anthias 2026.10.0.&lt;/p&gt;
&lt;p&gt;Before you run the installer on such a PC, give &lt;code&gt;systemd-resolved&lt;/code&gt; a fallback DNS server, such as your router&amp;#39;s address:&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-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo mkdir -p /etc/systemd/resolved.conf.d
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#24909d"&gt;printf&lt;/span&gt; &lt;span style="color:#ed9d13"&gt;&amp;#39;[Resolve]\nFallbackDNS=&amp;lt;your router IP&amp;gt;\n&amp;#39;&lt;/span&gt; | sudo tee /etc/systemd/resolved.conf.d/99-fallback.conf&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;If the installer already stopped, do the same, run &lt;code&gt;sudo systemctl restart systemd-resolved&lt;/code&gt;, and run the installer again.&lt;/p&gt;</description></item><item><title>Anthias 2026.08.0: Large HEIC, TIFF and AVIF photos no longer reboot boards with little memory, and other fixes</title><link>https://www.screenly.io/releases/anthias/2026.08.0/fixes-and-improvements/</link><guid isPermaLink="true">https://www.screenly.io/releases/anthias/2026.08.0/fixes-and-improvements/</guid><pubDate>Wed, 05 Aug 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 boards with less than 1.5 GB of RAM, such as the Raspberry Pi 2 and 3, a HEIC, TIFF, AVIF or other photo that Anthias converts to WebP on upload is first shrunk to fit within the pixel count of 1920x1080, keeping its shape. In the project&amp;#39;s testing, a 24 megapixel photo used more memory than the board could give the conversion, and the board rebooted. JPEG and PNG uploads &lt;a href="https://www.screenly.io/releases/anthias/2026.08.1/large-jpeg-png-low-ram-boards/"&gt;got the same treatment in Anthias 2026.08.1&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;On a Raspberry Pi, running the installer from the player&amp;#39;s own screen and keyboard blanked the screen partway through and removed the login prompt, which left you locked out if SSH was off. This happened since Anthias 2026.05.1. The install now finishes on screen, and the login prompt is still gone after the reboot at the end, as intended.&lt;/li&gt;
&lt;li&gt;While the web interface was open, the server logged a Redis timeout and an &lt;code&gt;Exception in ASGI application&lt;/code&gt; error about every 5 seconds. It no longer does.&lt;/li&gt;
&lt;li&gt;The API&amp;#39;s &lt;code&gt;file_asset&lt;/code&gt;, &lt;code&gt;recover&lt;/code&gt; and &lt;code&gt;assets/order&lt;/code&gt; endpoints answer a request body that&amp;#39;s a JSON list instead of an object with a &lt;code&gt;400&lt;/code&gt; response, instead of a &lt;code&gt;500&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Running the Ansible playbook yourself on a PC or other board that isn&amp;#39;t a Raspberry Pi no longer fails at the step that writes the Raspberry Pi boot settings.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="improvements"&gt;Improvements&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;When the installer is about to discard your edits to files tracked in the Anthias checkout, it prints a warning first. It still discards them. Untracked files are left alone.&lt;/li&gt;
&lt;li&gt;When the Docker repository key is already on the player, the installer no longer downloads it again, so a machine prepared ahead of time doesn&amp;#39;t need network access for that step.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="for-contributors"&gt;For contributors&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;The Ruff linter now runs its expanded default rule set (about 413 rules, up from 59), and the findings across the codebase were fixed. &lt;code&gt;BLE001&lt;/code&gt; (blind &lt;code&gt;except&lt;/code&gt;) stays off on purpose, because the player is meant to degrade rather than crash.&lt;/li&gt;
&lt;li&gt;Tests cover the entry point of the GStreamer framebuffer video player used on the Raspberry Pi 2 and 3.&lt;/li&gt;
&lt;li&gt;The Anthias website&amp;#39;s API page has an overview of the base URL, versioning, authentication and errors, the guide to migrating to Screenly covers what gets migrated and how to troubleshoot it, and broken links across the site are fixed.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Python and front-end dependencies and GitHub Actions were updated.&lt;/p&gt;</description></item><item><title>Anthias 2026.07.4: The Audio output setting decides where sound plays on x86 PCs and arm64 boards</title><link>https://www.screenly.io/releases/anthias/2026.07.4/audio-output-on-pcs-and-arm-boards/</link><guid isPermaLink="true">https://www.screenly.io/releases/anthias/2026.07.4/audio-output-on-pcs-and-arm-boards/</guid><pubDate>Tue, 28 Jul 2026 00:00:00 +0000</pubDate><category>fix</category><description>&lt;p&gt;If you run Anthias on a PC or on a board like the Rock Pi 4 and video sound came out of the wrong
speakers, the Audio output setting now works there. Pick HDMI or 3.5mm jack in Settings and the
sound goes where you chose.&lt;/p&gt;
&lt;p&gt;Before, on an x86 PC, or on a board running the &lt;code&gt;arm64&lt;/code&gt; image such as the Rock Pi 4, the Audio
output setting did nothing. Video sound came out of whichever output the system had picked as its default,
whether you chose HDMI or 3.5mm jack in Settings. On a laptop with HDMI selected, for example, the
sound still played through the built-in speakers. From Anthias 2026.07.4, HDMI plays through the
HDMI output and 3.5mm jack plays through the analog output.&lt;/p&gt;
&lt;p&gt;A laptop or desktop often has HDMI and the analog jack on the same sound card, with only one of them
active at a time. When the output you chose isn&amp;#39;t the active one, Anthias switches the card over to
it. If Anthias can&amp;#39;t find a matching output, for example HDMI to a display that doesn&amp;#39;t take audio,
it plays through the system default as before. Raspberry Pi boards pick their output the same way
they did.&lt;/p&gt;
&lt;p&gt;If sound still comes from the wrong place, run &lt;code&gt;pactl list short sinks&lt;/code&gt; inside the viewer container
to see which outputs exist. Anthias matches outputs by name (&lt;code&gt;hdmi&lt;/code&gt;, &lt;code&gt;analog&lt;/code&gt;, &lt;code&gt;headphone&lt;/code&gt; and
similar), and when none matches the setting, the viewer logs a warning that lists the outputs it
found.&lt;/p&gt;</description></item><item><title>Anthias 2026.07.4: Video plays at full frame rate at 180° on Raspberry Pi 2 and 32-bit Pi 3</title><link>https://www.screenly.io/releases/anthias/2026.07.4/rotated-video-on-pi-2-3/</link><guid isPermaLink="true">https://www.screenly.io/releases/anthias/2026.07.4/rotated-video-on-pi-2-3/</guid><pubDate>Tue, 28 Jul 2026 00:00:00 +0000</pubDate><category>fix</category><description>&lt;p&gt;On a Raspberry Pi 2, or a Raspberry Pi 3 running the 32-bit image, video with Screen rotation set to
Landscape, inverted (180°) played at about 2 frames per second, because the board turned every frame
in software. From Anthias 2026.07.4 the board&amp;#39;s video hardware flips the picture instead. In the
project&amp;#39;s testing on a Pi 2 with a 1080p, 30 frames per second video, that took playback from about
2 to about 27 frames per second, the same as with no rotation.&lt;/p&gt;
&lt;p&gt;Portrait is different. The video hardware on these boards can flip a picture but can&amp;#39;t turn it by a
quarter, so Portrait (90°) and Portrait, inverted (270°) still go through the software path. The
picture is right, but 1080p video plays at about 2 frames per second on a Pi 2. Images and web pages
rotate with no such cost. For portrait video, use a Raspberry Pi 4 or 5. The board notes in
&lt;code&gt;docs/board-enablement.md&lt;/code&gt; now say the same.&lt;/p&gt;</description></item><item><title>Anthias 2026.07.4: Images added from a URL preview and download in the web interface, and other fixes</title><link>https://www.screenly.io/releases/anthias/2026.07.4/fixes-and-improvements/</link><guid isPermaLink="true">https://www.screenly.io/releases/anthias/2026.07.4/fixes-and-improvements/</guid><pubDate>Tue, 28 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;Previewing or downloading an image added from a URL showed nothing in the web interface. Both now
open the image from its own address.&lt;/li&gt;
&lt;li&gt;When &lt;code&gt;sqlite3&lt;/code&gt; wasn&amp;#39;t installed on the host, &lt;code&gt;bin/collect_debug.sh&lt;/code&gt; put a Python error in its
report where the asset count should be. It now reads the database inside the server container,
and the report lists each asset with whether Anthias could reach it.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="improvements"&gt;Improvements&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;The Anthias website answers &amp;quot;Is Anthias the same as Screenly OSE?&amp;quot;, and the page data search
engines read no longer wraps titles and answers in extra quote marks.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="for-contributors"&gt;For contributors&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;The settings-save tests write to a temporary config file instead of &lt;code&gt;~/.anthias/anthias.conf&lt;/code&gt;, so
they no longer change the defaults that later tests read when both test suites share a data
volume.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;CLAUDE.md&lt;/code&gt; describes the current layout of the code, and a &lt;code&gt;.claude/skills&lt;/code&gt; folder adds notes for
AI coding assistants on the boards, the viewer, testing on real hardware and cutting a release.&lt;/li&gt;
&lt;li&gt;Dependabot no longer proposes &lt;code&gt;pillow-heif&lt;/code&gt; 1.5 or newer. It can&amp;#39;t be built for the 32-bit &lt;code&gt;pi2&lt;/code&gt;
and &lt;code&gt;pi3&lt;/code&gt; images against the &lt;code&gt;libheif&lt;/code&gt; in Debian Trixie, so &lt;code&gt;pillow-heif&lt;/code&gt; stays at 1.4.0.&lt;/li&gt;
&lt;li&gt;The Marketing Screenshots workflow runs from the branch you pick in GitHub when you start it by
hand. Its separate &lt;code&gt;ref&lt;/code&gt; input is gone.&lt;/li&gt;
&lt;li&gt;Dependencies and GitHub Actions updated.&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Anthias 2026.07.3: Screen rotation turns content the same way on every board</title><link>https://www.screenly.io/releases/anthias/2026.07.3/screen-rotation-the-same-on-every-board/</link><guid isPermaLink="true">https://www.screenly.io/releases/anthias/2026.07.3/screen-rotation-the-same-on-every-board/</guid><pubDate>Thu, 16 Jul 2026 00:00:00 +0000</pubDate><category>fix</category><description>&lt;p&gt;From Anthias 2026.07.3, each &amp;quot;Screen rotation&amp;quot; choice turns the picture the same way on every board.
&amp;quot;Portrait (90°)&amp;quot; turns it a quarter turn clockwise and &amp;quot;Portrait, inverted (270°)&amp;quot; a quarter turn
anticlockwise, and images, web pages, video and streams all turn together.&lt;/p&gt;
&lt;p&gt;Before, the direction depended on the board. A 32-bit Raspberry Pi 2 or 3 turned video clockwise for
&amp;quot;Portrait (90°)&amp;quot;, while a Raspberry Pi 3 running the 64-bit image, a Pi 4, a Pi 5, a PC and generic
arm64 boards turned the picture anticlockwise for the same setting.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;If you have a portrait screen on a Raspberry Pi 3 running the 64-bit image, a Pi 4, a Pi 5, a PC
or a generic arm64 board such as the Rock Pi 4:&lt;/strong&gt; after upgrading to Anthias 2026.07.3, the picture
shows upside down. In the web interface, open Settings and, under &amp;quot;Display &amp;amp; playback&amp;quot;, switch
&amp;quot;Screen rotation&amp;quot; from &amp;quot;Portrait (90°)&amp;quot; to &amp;quot;Portrait, inverted (270°)&amp;quot;, or the other way round. If
you set it through the API, swap &lt;code&gt;screen_rotation&lt;/code&gt; between &lt;code&gt;90&lt;/code&gt; and &lt;code&gt;270&lt;/code&gt;. &amp;quot;Landscape (0°)&amp;quot; and
&amp;quot;Landscape, inverted (180°)&amp;quot; look the same as before, and a 32-bit Raspberry Pi 2 or 3 needs no
change.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="images-and-web-pages-on-a-32-bit-raspberry-pi-2-or-3"&gt;Images and web pages on a 32-bit Raspberry Pi 2 or 3&lt;/h2&gt;
&lt;p&gt;On a Raspberry Pi 2 or 3 running a 32-bit image, only video followed &amp;quot;Screen rotation&amp;quot;, as the
&lt;a href="https://www.screenly.io/releases/anthias/2026.05.1/screen-rotation-setting/"&gt;2026.05.1 entry that introduced the setting&lt;/a&gt;
described. Images and web pages stayed upright whatever you picked. From Anthias 2026.07.3 they turn
at 90°, 180° and 270°, in the same direction as video.&lt;/p&gt;
&lt;p&gt;Rotated video on these boards still played at only a few frames per second in this release.
&lt;a href="https://www.screenly.io/releases/anthias/2026.07.4/rotated-video-on-pi-2-3/"&gt;Anthias 2026.07.4&lt;/a&gt; brought 180° up to full
speed.&lt;/p&gt;
&lt;h2 id="video-on-a-64-bit-raspberry-pi-3"&gt;Video on a 64-bit Raspberry Pi 3&lt;/h2&gt;
&lt;p&gt;On a Raspberry Pi 3 running the 64-bit image (&lt;code&gt;pi3-64&lt;/code&gt;), video ignored &amp;quot;Screen rotation&amp;quot; and stayed
upright while images and web pages turned. That started when
&lt;a href="https://www.screenly.io/releases/anthias/2026.07.2/raspberry-pi-3-64-bit-video/"&gt;Anthias 2026.07.2 brought hardware video to this board&lt;/a&gt;.
Video now turns with everything else.&lt;/p&gt;
&lt;p&gt;At 180°, video still plays at full frame rate. This board&amp;#39;s video hardware can&amp;#39;t turn a picture by a
quarter, so at 90° and 270° video plays through a software path instead: about 9 to 10 frames per
second for 1080p in the project&amp;#39;s testing. For portrait video, a Raspberry Pi 4 or 5 is the better
board.&lt;/p&gt;</description></item><item><title>Anthias 2026.07.3: Anthias container images come with signed build provenance</title><link>https://www.screenly.io/releases/anthias/2026.07.3/verifiable-container-images/</link><guid isPermaLink="true">https://www.screenly.io/releases/anthias/2026.07.3/verifiable-container-images/</guid><pubDate>Thu, 16 Jul 2026 00:00:00 +0000</pubDate><category>release</category><description>&lt;p&gt;This is for people who check where software comes from before they run it, such as a security
team. Nothing changes on your screens and you don&amp;#39;t need to do anything, but you can now confirm
with 1 command that the software on a player was built by the Anthias project itself.&lt;/p&gt;
&lt;p&gt;An Anthias player runs 3 containers, server, viewer and redis, pulled from GitHub Container Registry,
with a copy of each image on Docker Hub. From Anthias 2026.07.3, every one of those images, for every
board, is published with a signed build provenance attestation. It records the repository, workflow
and commit that built the image, so you can check that an image came from the Anthias build before
you run it.&lt;/p&gt;
&lt;p&gt;Check an image with the GitHub CLI:&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-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;gh attestation verify &lt;span style="color:#ed9d13"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; oci://ghcr.io/screenly/anthias-server:&amp;lt;short-hash&amp;gt;-&amp;lt;board&amp;gt; &lt;span style="color:#ed9d13"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --repo Screenly/Anthias&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;code&gt;&amp;lt;board&amp;gt;&lt;/code&gt; is one of &lt;code&gt;pi2&lt;/code&gt;, &lt;code&gt;pi3&lt;/code&gt;, &lt;code&gt;pi3-64&lt;/code&gt;, &lt;code&gt;pi4-64&lt;/code&gt;, &lt;code&gt;pi5&lt;/code&gt;, &lt;code&gt;x86&lt;/code&gt; or &lt;code&gt;arm64&lt;/code&gt;. A release&amp;#39;s short hash
is in the &lt;code&gt;docker-tag&lt;/code&gt; file attached to its GitHub release: for 2026.07.3 it&amp;#39;s &lt;code&gt;a782add&lt;/code&gt;. Put
&lt;code&gt;anthias-viewer&lt;/code&gt; or &lt;code&gt;anthias-redis&lt;/code&gt; in place of &lt;code&gt;anthias-server&lt;/code&gt; to check the other 2.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;latest-&amp;lt;board&amp;gt;&lt;/code&gt; tags point at the same images and pass the same check. So does the Docker Hub
copy, &lt;code&gt;oci://docker.io/screenly/anthias-server:&amp;lt;short-hash&amp;gt;-&amp;lt;board&amp;gt;&lt;/code&gt;, because the attestation belongs
to the image itself rather than to one registry.&lt;/p&gt;
&lt;p&gt;Images built for earlier releases have no attestation. The disk images on the release page aren&amp;#39;t
covered either: check those against the &lt;code&gt;.sha256&lt;/code&gt; file published next to each one.&lt;/p&gt;</description></item><item><title>Anthias 2026.07.3: The Anthias boot splash shows on a Raspberry Pi 2</title><link>https://www.screenly.io/releases/anthias/2026.07.3/pi-2-boot-splash/</link><guid isPermaLink="true">https://www.screenly.io/releases/anthias/2026.07.3/pi-2-boot-splash/</guid><pubDate>Thu, 16 Jul 2026 00:00:00 +0000</pubDate><category>fix</category><description>&lt;p&gt;On a Raspberry Pi 2 installed with the install script, the screen showed plain text on black while
the board booted, not the Anthias splash. The boot splash only waited 8 seconds for a display to
appear, and on the Pi 2 the project tested, the display came up about 14 seconds into boot. By then
the splash had settled on text. It now waits up to 30 seconds, so the Anthias splash appears.&lt;/p&gt;
&lt;p&gt;The fix arrives when you upgrade with &lt;code&gt;bin/run_upgrade.sh&lt;/code&gt;, which runs the installer again, and takes
effect at the next reboot. Players installed from a disk image or Raspberry Pi Imager run balenaOS,
which the installer doesn&amp;#39;t set up, so this change doesn&amp;#39;t touch them.&lt;/p&gt;
&lt;h2 id="for-contributors"&gt;For contributors&lt;/h2&gt;
&lt;p&gt;The wait is &lt;code&gt;DeviceTimeout=30&lt;/code&gt; in the Plymouth config the &lt;code&gt;splashscreen&lt;/code&gt; Ansible role installs.
Plymouth reads its theme and settings from the copy in the initramfs, so the role now rebuilds the
initramfs once, after every file is in place, instead of partway through.&lt;/p&gt;</description></item><item><title>Anthias 2026.07.3: App settings use your browser's date and time pickers, and other improvements</title><link>https://www.screenly.io/releases/anthias/2026.07.3/fixes-and-improvements/</link><guid isPermaLink="true">https://www.screenly.io/releases/anthias/2026.07.3/fixes-and-improvements/</guid><pubDate>Thu, 16 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;Anthias 2026.07.3 reports itself as 2026.07.3 in System Info. The previous release
&lt;a href="https://www.screenly.io/releases/anthias/2026.07.2/fixes-and-improvements/"&gt;reported itself as 2026.07.1&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="improvements"&gt;Improvements&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;An app setting that holds a date, a time or both, like the Timer app&amp;#39;s &amp;quot;Target date &amp;amp; time&amp;quot;, opens
your browser&amp;#39;s date and time picker instead of a text box you had to type an ISO 8601 value into.
It&amp;#39;s there when you add an app and when you edit one.&lt;/li&gt;
&lt;li&gt;The install guide and the website&amp;#39;s get-started page recommend Raspberry Pi Imager for most
people. The one-line install script is marked as advanced, and the guide shows how to download it
and read it before you run it.&lt;/li&gt;
&lt;li&gt;The hardware table on the website&amp;#39;s get-started page lists the Raspberry Pi 3 Model A+ as not recommended: its
512 MB of RAM is too little for Anthias. Pick a board with at least 1 GB, a Pi 3 Model B or newer.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="for-contributors"&gt;For contributors&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;The SBOM workflow adds an SBOM for the website&amp;#39;s dependencies, alongside the JavaScript and Python
ones, and runs for release tags only. Each SBOM is still uploaded to sbomify and attested, and is
now filed under its Anthias release there.&lt;/li&gt;
&lt;li&gt;Dependabot uses the &lt;code&gt;uv&lt;/code&gt; ecosystem for Python, so &lt;code&gt;uv.lock&lt;/code&gt; is updated together with
&lt;code&gt;pyproject.toml&lt;/code&gt;, and it no longer proposes Django major upgrades in the grouped Python update.&lt;/li&gt;
&lt;li&gt;Dependencies updated, including yt-dlp and Ansible.&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Anthias 2026.07.2: Raspberry Pi 2 and 32-bit Pi 3 players stop crashing to a blank screen</title><link>https://www.screenly.io/releases/anthias/2026.07.2/pi-2-and-pi-3-blank-screen/</link><guid isPermaLink="true">https://www.screenly.io/releases/anthias/2026.07.2/pi-2-and-pi-3-blank-screen/</guid><pubDate>Mon, 13 Jul 2026 00:00:00 +0000</pubDate><category>fix</category><description>&lt;p&gt;If your Raspberry Pi 2 or Raspberry Pi 3 player sat on a blank screen and played nothing, or went blank now and then, upgrading to Anthias 2026.07.2 fixes it. It affects the 32-bit images only.&lt;/p&gt;
&lt;p&gt;On a Raspberry Pi 2, or a Raspberry Pi 3 running the 32-bit image (&lt;code&gt;pi2&lt;/code&gt; and &lt;code&gt;pi3&lt;/code&gt;), the viewer could crash as it started, restart, and crash again. On some players that happened on every start, so the screen stayed blank and nothing played. On others it happened now and then, and the viewer came back on the next try.&lt;/p&gt;
&lt;p&gt;From Anthias 2026.07.2 the viewer runs steadily on these boards. In the project&amp;#39;s testing on a Pi 2 and a 32-bit Pi 3, it showed web pages, images and video for hours without a single crash.&lt;/p&gt;
&lt;p&gt;The 64-bit images, including the 64-bit Raspberry Pi 3 image (&lt;code&gt;pi3-64&lt;/code&gt;), build their web view a different way and don&amp;#39;t need this fix.&lt;/p&gt;
&lt;p&gt;After the upgrade, System Info still shows 2026.07.1, because &lt;a href="https://www.screenly.io/releases/anthias/2026.07.2/fixes-and-improvements/"&gt;this release reports the previous version number&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="for-contributors"&gt;For contributors&lt;/h2&gt;
&lt;p&gt;The &lt;code&gt;pi2&lt;/code&gt; and &lt;code&gt;pi3&lt;/code&gt; images don&amp;#39;t compile Qt. The image builder downloads a prebuilt Qt 5.15.19 toolchain, QtWebEngine included, from a &lt;code&gt;WebView-v*&lt;/code&gt; GitHub release and builds the &lt;code&gt;AnthiasViewer&lt;/code&gt; app against it. At this tag, &lt;code&gt;qt5_toolchain_url&lt;/code&gt; in &lt;code&gt;tools/image_builder/utils.py&lt;/code&gt; points at &lt;code&gt;WebView-v2026.07.1&lt;/code&gt;, whose tarballs carry the fix, so a viewer image you build from 2026.07.2 gets it with no other change.&lt;/p&gt;
&lt;p&gt;The crash came from the compiler. Debian&amp;#39;s armhf gcc turns some struct copies into 64-bit NEON stores that require 8-byte alignment, and QtWebEngine sometimes passes them memory aligned to only 4 bytes. The Cortex-A7 and Cortex-A53 fault on that, and the kernel can&amp;#39;t fix up a NEON access, so the viewer dies with &lt;code&gt;Unhandled fault: alignment exception (0x801)&lt;/code&gt; in &lt;code&gt;dmesg&lt;/code&gt;. &lt;code&gt;src/anthias_webview/build_qt5.sh&lt;/code&gt; now builds QtWebEngine&amp;#39;s Chromium with &lt;code&gt;arm_use_neon=false&lt;/code&gt; and wraps the armhf &lt;code&gt;gcc&lt;/code&gt; and &lt;code&gt;g++&lt;/code&gt; with &lt;code&gt;-mno-unaligned-access&lt;/code&gt;, so the toolchain no longer contains those stores. The script also runs on Debian Trixie&amp;#39;s Python 3.13 now, with shims for the &lt;code&gt;imp&lt;/code&gt;, &lt;code&gt;pipes&lt;/code&gt; and &lt;code&gt;cgi&lt;/code&gt; modules that Chromium 87&amp;#39;s build scripts still import.&lt;/p&gt;</description></item><item><title>Anthias 2026.07.2: Anthias imports content from Yodeck, ScreenCloud, piSignage, and Xibo</title><link>https://www.screenly.io/releases/anthias/2026.07.2/import-content-from-other-platforms/</link><guid isPermaLink="true">https://www.screenly.io/releases/anthias/2026.07.2/import-content-from-other-platforms/</guid><pubDate>Mon, 13 Jul 2026 00:00:00 +0000</pubDate><category>release</category><description>&lt;p&gt;If you&amp;#39;re moving screens to Anthias from another signage platform, Anthias 2026.07.2 can copy your content across for you. Settings has a new Import content section with 4 platforms: Yodeck, ScreenCloud, piSignage, and Xibo (Xibo Cloud or a self-hosted CMS).&lt;/p&gt;
&lt;p&gt;Select the button for the platform you&amp;#39;re leaving, such as &amp;quot;Import from Yodeck&amp;quot;, and paste your credentials for it. Anthias lists the media it finds there. Pick what you want, and Anthias downloads each item onto the player and adds it as an asset, showing the progress of each one. If some fail, you can retry just those.&lt;/p&gt;
&lt;p&gt;What you paste depends on the platform. Anthias uses it for this import only and doesn&amp;#39;t store it.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Yodeck: an API token, from Account Settings &amp;gt; Advanced Settings &amp;gt; API Tokens.&lt;/li&gt;
&lt;li&gt;ScreenCloud: an API token, from Studio &amp;gt; Account Settings &amp;gt; Developer. Anthias works out your region on its own.&lt;/li&gt;
&lt;li&gt;piSignage: your account&amp;#39;s subdomain, email and password, joined with colons as &lt;code&gt;subdomain:email:password&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Xibo: the CMS address, an API application&amp;#39;s client ID and its client secret, separated by spaces.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Images and videos come across from all 4 platforms, up to 5 GiB per file. Web pages come across from Yodeck and ScreenCloud. Anything Anthias can&amp;#39;t play stays behind and is listed with the reason: audio, documents, and the built-in widgets some platforms draw themselves (weather, clocks, RSS feeds), since a widget&amp;#39;s address only works inside the platform it came from.&lt;/p&gt;
&lt;p&gt;Imported assets start playing straight away unless you untick &amp;quot;Enable imported assets so they play immediately&amp;quot;. Your existing assets aren&amp;#39;t touched, and running an import again skips items that came across the first time.&lt;/p&gt;
&lt;p&gt;The piSignage and Xibo imports follow those platforms&amp;#39; API documentation and hadn&amp;#39;t been tried against a live account when this release shipped.&lt;/p&gt;
&lt;h2 id="from-the-command-line"&gt;From the command line&lt;/h2&gt;
&lt;p&gt;The same import runs over SSH. &lt;code&gt;--dry-run&lt;/code&gt; lists what would be imported without copying anything:&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-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#24909d"&gt;cd&lt;/span&gt; ~/anthias
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo docker compose &lt;span style="color:#24909d"&gt;exec&lt;/span&gt; anthias-server &lt;span style="color:#ed9d13"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; python -m anthias_server.manage import_content --provider yodeck --token &lt;span style="color:#ed9d13"&gt;&amp;#39;&amp;lt;credentials&amp;gt;&amp;#39;&lt;/span&gt; --dry-run&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;code&gt;--provider&lt;/code&gt; takes &lt;code&gt;yodeck&lt;/code&gt;, &lt;code&gt;screencloud&lt;/code&gt;, &lt;code&gt;pisignage&lt;/code&gt; or &lt;code&gt;xibo&lt;/code&gt;, and &lt;code&gt;--token&lt;/code&gt; takes the same credentials the web interface asks for. Leave out &lt;code&gt;--dry-run&lt;/code&gt; to run the import.&lt;/p&gt;</description></item><item><title>Anthias 2026.07.2: A new Timezone setting, and a Device time card on System Info</title><link>https://www.screenly.io/releases/anthias/2026.07.2/timezone-setting-and-device-clock/</link><guid isPermaLink="true">https://www.screenly.io/releases/anthias/2026.07.2/timezone-setting-and-device-clock/</guid><pubDate>Mon, 13 Jul 2026 00:00:00 +0000</pubDate><category>release</category><description>&lt;p&gt;People have asked since 2023 for a way to see and set the time from the web interface. Anthias 2026.07.2 adds a Timezone setting under Settings &amp;gt; Display &amp;amp; playback. The timezone you pick decides when content with a play window or chosen weekdays plays, and how times are shown across the web interface. A change applies as soon as you save, with no restart.&lt;/p&gt;
&lt;p&gt;This matters most on balena installs, where the host runs on UTC and Anthias had no way to follow your local time. It works the same on every install. Leave it on &amp;quot;System default&amp;quot; and Anthias follows the &lt;code&gt;TZ&lt;/code&gt; environment variable if the container has one, then the host&amp;#39;s timezone, then UTC.&lt;/p&gt;
&lt;p&gt;System Info has a new Device time card. It shows the player&amp;#39;s date and time in the timezone Anthias is using, with its offset from UTC, and keeps ticking while the page is open. The time comes from the player, not your browser, so a player with a wrong clock shows up straight away instead of looking right on your laptop.&lt;/p&gt;
&lt;p&gt;Setting the clock itself, or choosing an NTP server, still happens outside Anthias.&lt;/p&gt;
&lt;h2 id="for-developers"&gt;For developers&lt;/h2&gt;
&lt;p&gt;The choice is stored as &lt;code&gt;timezone&lt;/code&gt; in the &lt;code&gt;[main]&lt;/code&gt; section of &lt;code&gt;anthias.conf&lt;/code&gt;, as an IANA name such as &lt;code&gt;Europe/London&lt;/code&gt;. An empty value means &amp;quot;System default&amp;quot;. It&amp;#39;s also the &lt;code&gt;timezone&lt;/code&gt; field of &lt;code&gt;/api/v2/device_settings&lt;/code&gt;, and &lt;code&gt;/api/v2/info&lt;/code&gt; has a new &lt;code&gt;time&lt;/code&gt; object with the player&amp;#39;s &lt;code&gt;iso&lt;/code&gt; time, &lt;code&gt;timezone&lt;/code&gt; and &lt;code&gt;offset&lt;/code&gt;. Anthias refuses a name the player&amp;#39;s &lt;code&gt;tzdata&lt;/code&gt; doesn&amp;#39;t have, and a bad value written to the file by hand is ignored rather than stopping the web interface from starting.&lt;/p&gt;</description></item><item><title>Anthias 2026.07.2: Images and web pages on servers with self-signed certificates can play</title><link>https://www.screenly.io/releases/anthias/2026.07.2/self-signed-https-content/</link><guid isPermaLink="true">https://www.screenly.io/releases/anthias/2026.07.2/self-signed-https-content/</guid><pubDate>Mon, 13 Jul 2026 00:00:00 +0000</pubDate><category>release</category><description>&lt;p&gt;Images and web pages on an internal server often use a self-signed certificate. Anthias couldn&amp;#39;t verify it, so it marked the asset unreachable and skipped it, or the screen stayed blank where the content should be. From Anthias 2026.07.2 you can let them through, for one asset or for the whole player.&lt;/p&gt;
&lt;p&gt;For one asset, open it with &amp;quot;Edit&amp;quot; and turn on &amp;quot;Skip SSL verification&amp;quot;. The switch shows up when the asset&amp;#39;s address starts with &lt;code&gt;https://&lt;/code&gt;. For the whole player, go to Settings &amp;gt; Display &amp;amp; playback and turn off &amp;quot;Verify SSL certificates&amp;quot;. That switches off certificate checks for every asset, so leave it on unless you need it.&lt;/p&gt;
&lt;p&gt;Both cover images and web pages, and the check Anthias runs to see whether an asset is reachable. A video file added by its address is downloaded to the player first, and that download still checks the certificate.&lt;/p&gt;
&lt;h2 id="for-developers"&gt;For developers&lt;/h2&gt;
&lt;p&gt;The v2 asset endpoints have a &lt;code&gt;skip_ssl_verify&lt;/code&gt; field. The player-wide setting is &lt;code&gt;verify_ssl&lt;/code&gt; in the &lt;code&gt;[viewer]&lt;/code&gt; section of &lt;code&gt;anthias.conf&lt;/code&gt;, &lt;code&gt;True&lt;/code&gt; by default, and &lt;code&gt;verify_ssl&lt;/code&gt; in &lt;code&gt;/api/v2/device_settings&lt;/code&gt;. Setting it to &lt;code&gt;False&lt;/code&gt; in the file used to change nothing, because the check stayed on regardless. It takes effect from this release.&lt;/p&gt;</description></item><item><title>Anthias 2026.07.2: Web page assets can send custom HTTP headers</title><link>https://www.screenly.io/releases/anthias/2026.07.2/custom-http-headers-for-web-pages/</link><guid isPermaLink="true">https://www.screenly.io/releases/anthias/2026.07.2/custom-http-headers-for-web-pages/</guid><pubDate>Mon, 13 Jul 2026 00:00:00 +0000</pubDate><category>release</category><description>&lt;p&gt;If a dashboard you&amp;#39;d like on a screen needs a token to open, such as a private Grafana board, you can show it from Anthias 2026.07.2 without making it public. You add the token to the web page asset, and web pages that don&amp;#39;t need one work as they did.&lt;/p&gt;
&lt;p&gt;Pages like that expect the token in an HTTP header, like a Grafana dashboard that expects an &lt;code&gt;Authorization&lt;/code&gt; header. A web page asset can now carry its own HTTP headers, so the page loads on the screen. It was asked for on GitHub in 2025.&lt;/p&gt;
&lt;p&gt;Open a web page asset with &amp;quot;Edit&amp;quot; and fill in &amp;quot;Custom HTTP headers&amp;quot;, one &lt;code&gt;Name: Value&lt;/code&gt; per line, for example &lt;code&gt;Authorization: Bearer &amp;lt;token&amp;gt;&lt;/code&gt;. Leave it empty for none.&lt;/p&gt;
&lt;p&gt;The headers go only to the asset&amp;#39;s own origin: the same scheme, host and port as the address you entered. The page&amp;#39;s requests to anywhere else, including a redirect to another site or from &lt;code&gt;https&lt;/code&gt; to &lt;code&gt;http&lt;/code&gt;, go out without them, so a token can&amp;#39;t leak to an ad or analytics server the page loads. An asset can have up to 20 headers. Lines that aren&amp;#39;t a valid &lt;code&gt;Name: Value&lt;/code&gt; pair are dropped when you save.&lt;/p&gt;
&lt;h2 id="for-developers"&gt;For developers&lt;/h2&gt;
&lt;p&gt;v2 asset responses include &lt;code&gt;custom_headers&lt;/code&gt;, an object of header names to values, and you can write it on create and update. Writes are validated strictly: a bad name or value, or more than 20 headers, returns an error instead of being dropped. Only web page assets use it.&lt;/p&gt;</description></item><item><title>Anthias 2026.07.2: Video shows on a 64-bit Raspberry Pi 3 instead of a black screen</title><link>https://www.screenly.io/releases/anthias/2026.07.2/raspberry-pi-3-64-bit-video/</link><guid isPermaLink="true">https://www.screenly.io/releases/anthias/2026.07.2/raspberry-pi-3-64-bit-video/</guid><pubDate>Mon, 13 Jul 2026 00:00:00 +0000</pubDate><category>fix</category><description>&lt;p&gt;If videos on your Raspberry Pi 3 showed a black screen while images and web pages played fine, upgrading to Anthias 2026.07.2 fixes it. It affects a Pi 3 running the 64-bit image.&lt;/p&gt;
&lt;p&gt;On that image (&lt;code&gt;pi3-64&lt;/code&gt;), video assets could show a black screen. People reported it on Anthias 2026.06.3 and kept seeing it after upgrading.&lt;/p&gt;
&lt;p&gt;From Anthias 2026.07.2, video on this board goes through the Pi&amp;#39;s own hardware decoder straight to the display, with sound on a separate path so a problem with the audio can&amp;#39;t stop the picture. In the project&amp;#39;s testing, a 1080p, 30 frames per second H.264 clip played at its full frame rate, with no frames dropped once it was running. H.264 is the only video format Anthias accepts on this board.&lt;/p&gt;
&lt;p&gt;When a video&amp;#39;s time on screen is longer than the clip, it loops. On this board the pause where it starts over is shorter now, about half what it was in the project&amp;#39;s testing, though not gone.&lt;/p&gt;
&lt;p&gt;In this release, video on this board ignores the Screen rotation setting and plays landscape. &lt;a href="https://www.screenly.io/releases/anthias/2026.07.3/screen-rotation-the-same-on-every-board/"&gt;Anthias 2026.07.3&lt;/a&gt; fixes that.&lt;/p&gt;</description></item><item><title>Anthias 2026.07.2: Chunked uploads through the API now carry an upload ID</title><link>https://www.screenly.io/releases/anthias/2026.07.2/upload-id-for-chunked-uploads/</link><guid isPermaLink="true">https://www.screenly.io/releases/anthias/2026.07.2/upload-id-for-chunked-uploads/</guid><pubDate>Mon, 13 Jul 2026 00:00:00 +0000</pubDate><category>improvement</category><description>&lt;p&gt;Anthias used to keep a file that was still uploading under a name based on its file name. Two uploads of files with the same name, at the same time or after an earlier one was interrupted, could end up mixed into one corrupt file. From Anthias 2026.07.2, every upload gets its own temporary file, whatever it&amp;#39;s called.&lt;/p&gt;
&lt;p&gt;Uploads from the web interface need nothing from you. The change is for integrations that upload through &lt;code&gt;/api/v1/file_asset&lt;/code&gt; or &lt;code&gt;/api/v2/file_asset&lt;/code&gt; in chunks with a &lt;code&gt;Content-Range&lt;/code&gt; header. Anthias can no longer tell from the file name which chunks belong together, so it gives each upload an ID instead:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The response to every upload now includes &lt;code&gt;upload_id&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Send that value as an &lt;code&gt;X-Upload-Id&lt;/code&gt; header with every later chunk of the same file, and the chunks are put together as before.&lt;/li&gt;
&lt;li&gt;A chunk without &lt;code&gt;X-Upload-Id&lt;/code&gt; starts a new upload. A malformed &lt;code&gt;X-Upload-Id&lt;/code&gt; gets a &lt;code&gt;400&lt;/code&gt; response.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;If you upload in chunks through the API:&lt;/strong&gt; read &lt;code&gt;upload_id&lt;/code&gt; from the response to the first chunk and send it as &lt;code&gt;X-Upload-Id&lt;/code&gt; with each chunk after it. Without it, each chunk is stored on its own and the asset you create from the last chunk&amp;#39;s &lt;code&gt;uri&lt;/code&gt; comes out broken.&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>Anthias 2026.07.2: Web page transitions stop flashing another page, and other fixes</title><link>https://www.screenly.io/releases/anthias/2026.07.2/fixes-and-improvements/</link><guid isPermaLink="true">https://www.screenly.io/releases/anthias/2026.07.2/fixes-and-improvements/</guid><pubDate>Mon, 13 Jul 2026 00:00:00 +0000</pubDate><category>roundup</category><description>&lt;h2 id="version-number"&gt;Version number&lt;/h2&gt;
&lt;p&gt;Anthias 2026.07.2 reports itself as 2026.07.1. System Info shows v2026.07.1, so does &lt;code&gt;anthias_version&lt;/code&gt; in &lt;code&gt;/api/v2/info&lt;/code&gt;, and outside balena the &amp;quot;Update available&amp;quot; badge on System Info stays on until you move to a newer release. You&amp;#39;re running 2026.07.2 all the same. Anthias 2026.07.3 reports its own version correctly.&lt;/p&gt;
&lt;h2 id="fixes"&gt;Fixes&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;On a Raspberry Pi 4 (64-bit), a Raspberry Pi 5, x86 and other boards with 2 GB of RAM or more, moving from one web page to the next could briefly show a different page from the rotation. Every transition now goes straight to the next page. These boards now run one web view instead of two, which frees about 100 MB of memory in the project&amp;#39;s testing.&lt;/li&gt;
&lt;li&gt;A web page asset with &amp;quot;No cache&amp;quot; turned on could still come from the cache when it came around again. It&amp;#39;s now fetched fresh every time it&amp;#39;s shown.&lt;/li&gt;
&lt;li&gt;On a Raspberry Pi 5, x86 or a generic arm64 board such as the Rock Pi 4, a player that booted with no display plugged in could stay black after you plugged one in. The viewer now restarts itself about a minute after the display appears, and the picture comes up. A display that was plugged in but switched off at boot still stayed black until &lt;a href="https://www.screenly.io/releases/anthias/2026.08.0/display-recovers-after-late-power-on/"&gt;Anthias 2026.08.0&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;The viewer no longer keeps everything the video player prints in memory, only the last 64 KB. Some MP4 files make the video decoder print a warning for every frame, and on a 2 GB Raspberry Pi 4 with large files that output filled the memory and blanked the screen for minutes between assets. A report after this fix says long blank gaps can still happen on such a board.&lt;/li&gt;
&lt;li&gt;On boards with less than 1.5 GB of RAM, such as a 1 GB Raspberry Pi 3B+, cycling through web pages could fill the memory until the screen went black. Web pages on those boards now run in Chromium&amp;#39;s low-memory mode, and the &amp;quot;Low-RAM mode&amp;quot; note on System Info says so.&lt;/li&gt;
&lt;li&gt;An upgrade could stop partway on a board short on memory, at the Ansible step that turns swap off. The upgrade now stops the Anthias containers first, skips turning swap off when memory is tight, and carries on if that step still fails.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="improvements"&gt;Improvements&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Selecting several assets and choosing &amp;quot;Edit&amp;quot; also lets you set &amp;quot;No cache&amp;quot; and &amp;quot;Skip asset check&amp;quot;, each to on or off, alongside the dates, duration, play times and weekdays it already covered.&lt;/li&gt;
&lt;li&gt;The API reference on the Anthias website shows endpoint paths, status codes and field names. It used to show them as 0, 1, 2 and so on.&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;bin/start_viewer.sh&lt;/code&gt; is split into a shared script and one per display stack (Wayland, eglfs and linuxfb) under &lt;code&gt;bin/lib/viewer/&lt;/code&gt;, with no change in behavior.&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;ANTHIAS_LOW_RAM&lt;/code&gt; variable for the viewer container is gone, since every board now runs a single web view.&lt;/li&gt;
&lt;li&gt;Error reports to Sentry leave out more expected events: requests with a Host header the player doesn&amp;#39;t answer to, a browser that disconnects while the web interface is being told about a change or while a file is still downloading, and the warnings about missing or outdated basic-auth credentials that a database upgrade can log. The background task that recovers assets stuck in processing now stops cleanly at its time limit instead of being killed.&lt;/li&gt;
&lt;li&gt;The Anthias website publishes &lt;code&gt;llms.txt&lt;/code&gt; and &lt;code&gt;llms-full.txt&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;More test coverage for the import providers, the viewer and timezone handling.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Dependency updates also went in, among them Pillow, uvicorn and TypeScript, which moved to version 7, plus GitHub Actions.&lt;/p&gt;</description></item><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><item><title>Anthias 2026.07.0: Bulk actions for assets, and uploads of several files at once</title><link>https://www.screenly.io/releases/anthias/2026.07.0/bulk-asset-actions/</link><guid isPermaLink="true">https://www.screenly.io/releases/anthias/2026.07.0/bulk-asset-actions/</guid><pubDate>Thu, 02 Jul 2026 00:00:00 +0000</pubDate><category>release</category><description>&lt;p&gt;Changing the schedule of 40 assets used to mean opening &amp;quot;Edit asset&amp;quot; 40 times, and people have asked on the forum for a way around that for years. From Anthias 2026.07.0, every row on the home page has a checkbox, and the header of each list, &amp;quot;Enabled&amp;quot; and &amp;quot;Inactive&amp;quot;, has one that selects the whole list. Once something is selected, a bar shows how many assets you picked, with these actions:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&amp;quot;Enable&amp;quot; and &amp;quot;Disable&amp;quot; move the selected assets between the 2 lists.&lt;/li&gt;
&lt;li&gt;&amp;quot;Edit&amp;quot; changes the schedule of all of them at once.&lt;/li&gt;
&lt;li&gt;&amp;quot;Delete&amp;quot; removes them all. Deleting can&amp;#39;t be undone.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="editing-a-selection"&gt;Editing a selection&lt;/h2&gt;
&lt;p&gt;The &amp;quot;Edit&amp;quot; dialog has 4 groups of settings, each with its own switch: &amp;quot;Start &amp;amp; end dates&amp;quot;, &amp;quot;Duration&amp;quot;, &amp;quot;Play from / until times&amp;quot; and &amp;quot;Days of week&amp;quot;. Only the groups you switch on are changed. Everything else stays as it is on each asset, so changing the duration of 12 assets leaves their dates alone. &amp;quot;No cache&amp;quot; and &amp;quot;Skip asset check&amp;quot; joined the dialog in &lt;a href="https://www.screenly.io/releases/anthias/2026.07.2/fixes-and-improvements/"&gt;Anthias 2026.07.2&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Duration doesn&amp;#39;t apply to videos, which keep their own length. Switching on &amp;quot;Play from / until times&amp;quot; and leaving both times empty removes the time window, so the assets play all day.&lt;/p&gt;
&lt;h2 id="uploading-several-files-at-once"&gt;Uploading several files at once&lt;/h2&gt;
&lt;p&gt;In Add asset &amp;gt; Upload file you can pick several files again, as you could before the web interface was redesigned in Anthias 2026.05.0, or drop them on the upload area. They upload one after another, and the dialog shows which file it&amp;#39;s on, such as &amp;quot;File 2 of 5&amp;quot;, along with the progress of the current one.&lt;/p&gt;</description></item><item><title>Anthias 2026.07.0: A Prefer dark mode setting shows web pages in dark colors</title><link>https://www.screenly.io/releases/anthias/2026.07.0/prefer-dark-mode/</link><guid isPermaLink="true">https://www.screenly.io/releases/anthias/2026.07.0/prefer-dark-mode/</guid><pubDate>Thu, 02 Jul 2026 00:00:00 +0000</pubDate><category>release</category><description>&lt;p&gt;Anthias 2026.07.0 adds a &amp;quot;Prefer dark mode&amp;quot; switch to Settings. Turn it on and the viewer shows the web pages in your playlist in dark colors, with no change to the pages themselves.&lt;/p&gt;
&lt;p&gt;The darkening is automatic, so it also applies to pages that were never designed with a dark theme. Check how your own pages look with it on before you leave it that way.&lt;/p&gt;
&lt;p&gt;The setting is off by default. Saving it restarts the viewer&amp;#39;s web view, so the change shows on screen without a reboot. Images and videos aren&amp;#39;t affected.&lt;/p&gt;
&lt;h2 id="for-developers"&gt;For developers&lt;/h2&gt;
&lt;p&gt;The setting is the &lt;code&gt;prefer_dark_mode&lt;/code&gt; field of &lt;code&gt;/api/v2/device_settings&lt;/code&gt;, which you can read with &lt;code&gt;GET&lt;/code&gt; and change with &lt;code&gt;PATCH&lt;/code&gt;. The viewer passes it to the web view as &lt;code&gt;ANTHIAS_PREFER_DARK_MODE=1&lt;/code&gt;, which turns on Chromium&amp;#39;s automatic dark mode (&lt;code&gt;--blink-settings=forceDarkModeEnabled=true&lt;/code&gt;).&lt;/p&gt;</description></item><item><title>Anthias 2026.07.0: New blank and unblank commands turn a screen dark and wake it</title><link>https://www.screenly.io/releases/anthias/2026.07.0/display-blank-unblank/</link><guid isPermaLink="true">https://www.screenly.io/releases/anthias/2026.07.0/display-blank-unblank/</guid><pubDate>Thu, 02 Jul 2026 00:00:00 +0000</pubDate><category>release</category><description>&lt;p&gt;From Anthias 2026.07.0 you can turn a screen dark outside opening hours or during a meeting, then wake it again, and it works with any display. There&amp;#39;s no button for it in the web interface, so it&amp;#39;s for people who can send a command to the player&amp;#39;s API, for example from a script.&lt;/p&gt;
&lt;p&gt;It&amp;#39;s 2 new commands for the viewer, &lt;code&gt;blank&lt;/code&gt; and &lt;code&gt;unblank&lt;/code&gt;. Until now the only way to do that from Anthias was the &lt;a href="https://www.screenly.io/releases/anthias/2026.05.1/hdmi-cec-display-power/"&gt;experimental HDMI-CEC controls&lt;/a&gt;, which work only with a TV that accepts CEC commands.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;blank&lt;/code&gt; pauses the playlist and turns the screen dark.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;unblank&lt;/code&gt; turns the screen on and resumes the playlist. Sending &lt;code&gt;play&lt;/code&gt; while the screen is blank does the same.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;What dark means depends on the board. On x86, Raspberry Pi 5 and generic arm64 boards such as the Rock Pi 4, &lt;code&gt;blank&lt;/code&gt; switches off the video signal on every connected output, so a monitor goes into standby. On the Raspberry Pi 2, 3 and 4, Anthias can&amp;#39;t switch the output off, so it shows a black image instead and the display stays on.&lt;/p&gt;
&lt;p&gt;There&amp;#39;s no button for these commands in the web interface. Send them through the API&amp;#39;s playback control endpoint, the one that takes &lt;code&gt;next&lt;/code&gt; and &lt;code&gt;previous&lt;/code&gt;, with the same authentication as any other API call:&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-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;curl http://&amp;lt;device-ip&amp;gt;/api/v2/assets/control/blank
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;curl http://&amp;lt;device-ip&amp;gt;/api/v2/assets/control/unblank&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The API reference lists only &lt;code&gt;next&lt;/code&gt;, &lt;code&gt;previous&lt;/code&gt; and &lt;code&gt;asset&lt;/code&gt; for this endpoint, but it passes any command on to the viewer.&lt;/p&gt;</description></item><item><title>Anthias 2026.07.0: Screen rotation turns the display on Raspberry Pi 5 and generic arm64 boards</title><link>https://www.screenly.io/releases/anthias/2026.07.0/screen-rotation-pi5/</link><guid isPermaLink="true">https://www.screenly.io/releases/anthias/2026.07.0/screen-rotation-pi5/</guid><pubDate>Thu, 02 Jul 2026 00:00:00 +0000</pubDate><category>fix</category><description>&lt;p&gt;On a Raspberry Pi 5, picking a value in Settings &amp;gt; &amp;quot;Screen rotation&amp;quot; saved without complaint and left the picture as it was, as the &lt;a href="https://www.screenly.io/releases/anthias/2026.05.1/screen-rotation-setting/"&gt;2026.05.1 entry that introduced the setting&lt;/a&gt; described. From Anthias 2026.07.0, &amp;quot;Portrait (90°)&amp;quot;, &amp;quot;Landscape, inverted (180°)&amp;quot; and &amp;quot;Portrait, inverted (270°)&amp;quot; turn the whole display on a Raspberry Pi 5, and the change applies as soon as you save, with no reboot. In this release 90° and 270° turn the picture the opposite way to a 32-bit Raspberry Pi 2 or 3; &lt;a href="https://www.screenly.io/releases/anthias/2026.07.3/screen-rotation-the-same-on-every-board/"&gt;Anthias 2026.07.3&lt;/a&gt; makes every board turn the same way.&lt;/p&gt;
&lt;p&gt;The same fix covers generic arm64 boards such as the Rock Pi 4, which run the viewer the same way as the Pi 5.&lt;/p&gt;</description></item></channel></rss>