<?xml version="1.0" encoding="utf-8"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Anthias 2026.10.0 | Screenly</title><description>Fixes for players short of memory, for backups that left the database unreadable after a restore, and for a viewer that got stuck while starting. Screens showing the same playlist also stay in step longer.</description><link>https://www.screenly.io/releases/anthias/2026.10.0/</link><language>en</language><atom:link href="https://www.screenly.io/releases/anthias/2026.10.0/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></channel></rss>