Viktor Petersson eceba40467 refactor(messaging): replace ZMQ reply bus with Redis BLPOP + correlation IDs
Drops the second ZMQ leg — the viewer→server reply path — in favor of
Redis BLPOP keyed by a UUID correlation ID. Same channel layer that PR1
moved the command bus onto, so the entire viewer messaging path now
runs on Redis.

Wire format extends the existing 'command&parameter' encoding: the
'current_asset_id' command (currently the only request-reply command)
now carries the correlation ID in the parameter slot, and the viewer
LPUSHes its JSON reply onto 'anthias.reply.<corr-id>' (with a 30s
EXPIRE so unread replies don't accumulate). The server BLPOPs that key.

This also fixes a latent correctness bug: ZmqCollector had no
correlation, so concurrent /v1 ViewerCurrentAsset callers could
mismatch replies. That hazard was masked today by uvicorn running
single-worker; with Redis + correlation IDs, the reply path is now safe
across concurrent callers.

- settings.ZmqConsumer / ZmqCollector → settings.ReplySender /
  ReplyCollector (BLPOP). 'import zmq' drops out — pyzmq itself is
  removed in the next commit.
- lib.errors.ZmqCollectorTimeoutError → ReplyTimeoutError (the only
  catch site is implicit — it bubbles to a 500 — so the rename is
  mechanical).
- viewer/__init__.py: send_current_asset_id_to_server takes a
  correlation ID and uses ReplySender. The 'current_asset_id' command
  handler in the dispatch table threads the parameter (now the corr ID)
  into the function call.
- api/views/v1.py ViewerCurrentAssetViewV1: generates a UUID, sends it
  with the command, BLPOPs on it.
- api/tests/test_v1_endpoints.py: ZmqCollector mock → ReplyCollector;
  side_effect signature relaxed to '*_' since recv_json now takes two
  positional args (corr, timeout_ms).
- stubs/redis-stubs/client.pyi: add rpush() and blpop() narrowed to
  decode_responses=True return shapes (the rest of the stub follows the
  same convention).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-27 17:05:43 +00:00

Anthias · Open Source Digital Signage Solution for Raspberry Pi and PC

Run Unit Tests CodeQL Run Python Linter
GitHub release (latest by date)


Anthias Logo


About Anthias

Anthias is a digital signage platform for Raspberry Pi devices and PCs. Formerly known as Screenly OSE, it was rebranded to clear up the confusion between Screenly (the paid version) and Anthias. More details can be found in this blog post.

Want to help Anthias thrive? Support us using GitHub Sponsor.

🚀 Getting Started

See this page for options on how to install Anthias.

Compatibility

balenaOS

Note

See this page for instructions on how to install Anthias on balenaOS. You can either use the images from balenaHub or download the images from the releases.

Raspberry Pi OS

  • Raspberry Pi 5 Model B - 64-bit Trixie, 64-bit Bookworm
  • Raspberry Pi 4 Model B - 64-bit Trixie, 64-bit Bookworm
  • Raspberry Pi 3 Model B+ - 64-bit Trixie, 64-bit Bookworm
  • Raspberry Pi 3 Model B - 64-bit Trixie, 64-bit Bookworm
  • Raspberry Pi 2 Model B - 32-bit Trixie, 32-bit Bookworm
  • PC (x86 Devices) - 64-bit Trixie, 64-bit Bookworm
    • These devices can be something similar to a NUC.
    • See this page for instructions on how to install Debian in a specific way before running the installation script.

Note

We're still fixing the Raspberry Pi OS installer so that it'll work with Raspberry Pi Zero and Raspberry Pi 1. Should you encounter any issues, please file an issue either in this repository or in the forums.

Star History

Star History Chart

🐞 Issues and Bugs

Note

We are still in the process of knocking out some bugs. You can track the known issues here. You can also check the discussions in the Anthias forums.

Description
No description provided
Readme GPL-2.0 71 MiB
Languages
Python 70.7%
HTML 8.7%
Shell 5.4%
C++ 3.6%
SCSS 3.4%
Other 8.1%