# Anthias - Free Open Source Digital Signage Software > Anthias is the world’s most popular open source digital signage software. It turns a Raspberry Pi, x86 PC, or generic 64-bit ARM board into a digital sign that displays images, videos, and web pages, scheduled from a self-hosted web dashboard. No subscriptions, no cloud lock-in. This file concatenates the full text of every page on https://anthias.screenly.io. Each section is one page, with its source URL. --- # Anthias - Free Open Source Digital Signage Software Source: https://anthias.screenly.io > Free, open source digital signage software. Runs on Raspberry Pi, x86 PCs and ARM single-board computers. Schedule images, videos and web pages. No subscriptions, no per-screen fees. ## Free digital signage for everyone. Turn a Raspberry Pi or any PC into a digital sign. Schedule images, videos, and web pages from a web interface. No subscriptions, no cloud lock-in. Formerly **Screenly OSE**, same project, renamed in 2022. Get Started [Buy a Player](https://shop.screenly.io/products/anthias-player-mk2?utm_source=anthias.screenly.io&utm_medium=referral&utm_campaign=buy-a-player&utm_content=home-hero) See Features [Star on GitHub](https://github.com/Screenly/Anthias) [Sponsor](https://github.com/sponsors/Screenly) anthias.local 01 / 04 01 Manage every asset from one dashboard 02 Upload media or point at any URL 03 Configure the player without touching the CLI 04 Live diagnostics at a glance 3,500+ GitHub stars Since 2012 Active development 6 boards Pi 2 through Pi 5 + x86 100% free Open source, forever ### What Anthias does A complete digital signage platform that runs on hardware you already own. #### Multiple content types Display images, videos, and web pages. Upload files or point to any URL. #### Content scheduling Set start and end dates for each asset. Control duration and playlist order. #### REST API Automate content updates and manage devices programmatically. See all features → ### Get running in minutes The recommended way is to flash an SD card with Raspberry Pi Imager, no command line needed. Advanced users can install over an existing Raspberry Pi OS / Debian system. #### Raspberry Pi Imager Recommended Open [Raspberry Pi Imager](https://www.raspberrypi.com/software/), pick *Other specific-purpose OS → Digital signage and kiosks → Anthias*, choose your Pi model, and flash. The SD card boots straight into Anthias, no SSH, no installer prompts. Raspberry Pi 2 through Pi 5. These are [balenaHub Fleets for Good](https://hub.balena.io/fleets-for-good) images, so the device updates over the air automatically. #### One-line install (advanced) On a running Raspberry Pi OS Lite or Debian system, run: `bash <(curl -sL https://install-anthias.srly.io)` Raspberry Pi, x86, and 64-bit ARM SBCs. All installation options → ### Open source digital signage you control Free and self-hosted, developed in the open since 2012, running on hardware you already own. Anthias is a free, self-hosted digital signage platform for Raspberry Pi and x86 PCs. Formerly known as Screenly OSE, it has been developed in the open since 2012 and is one of the most widely deployed open source signage projects in the world. Once a screen is running, you manage it from a simple web interface: upload an image or video, point to a web page or a free [signage app](https://signage-apps.com/?utm_source=anthias.screenly.io&utm_medium=referral&utm_campaign=home-body) such as weather, a world clock, or a news feed, then set how long each asset shows and give it a start and end date. Anthias loops through the active playlist automatically, so a Pi tucked behind a display can run unattended for months. Explore all features → #### Why teams choose Anthias - Free and open source On GitHub under a permissive license, maintained by Screenly with a large community of contributors. - Self-hosted and private Your content stays on your own network, with no cloud account to sign up for. - No per-screen fees Run one screen or a hundred at no software cost. - Runs on hardware you own Raspberry Pi 2 through Pi 5, and ordinary x86 PCs. - Automate with a REST API Manage and update dozens of screens programmatically. Where teams use it Menu boards Wayfinding & reception Operations dashboards Retail promotions Schools Churches Community spaces ### Ready to set up your digital sign? Anthias is free and open source. Get started in minutes on any Raspberry Pi or x86 PC. Get Started [Browse free apps](https://signage-apps.com/?utm_source=anthias.screenly.io&utm_medium=referral&utm_campaign=home-cta) [View on GitHub](https://github.com/Screenly/Anthias) --- # Features - Anthias Digital Signage Source: https://anthias.screenly.io/features > Anthias features: content scheduling, multiple media types, REST API, web dashboard, Docker deployment, and more. ## Features Everything Anthias does, in plain language: what you can show, when it plays, and how you manage it all. ### What you can show Photos, videos, web pages, YouTube, live streams. If it goes on a screen, Anthias plays it. #### Anything that goes on a screen Photos, videos, web pages, and live video feeds, all in one playlist. Drag a file in or paste a link. That's the whole workflow. #### Phone photos just work iPhone photos, screenshots, and pictures straight off a camera all upload and play without anyone having to convert them first. #### Uploads never interrupt the screen If a file isn't quite right for your hardware, Anthias quietly prepares it in the background while whatever's already on screen keeps playing. #### YouTube without ads or buffering Paste a YouTube link. Anthias downloads the video and plays it locally, so your screen never buffers and never shows ads or recommended videos. #### Live web pages and dashboards Point Anthias at any web page (a status board, a weather widget, a live feed, an internal report) and set an auto-refresh interval so the page reloads on its own and stays current. #### Sharp full-HD picture and sound 1080p output with smooth, hardware-accelerated video. Sound goes out through HDMI or the headphone jack, whichever you prefer. ### When things play Schedule by date, day of the week, or time of day. Anthias takes care of switching things on and off for you. #### Schedule by date range Set a start and end date so an asset appears for a campaign and disappears on its own when it's over. No reminders, no manual cleanup. #### Pick the days of the week Run one playlist on weekdays, another on weekends, or something special only on Fridays. Each item picks its own days. #### Pick the time of day Show "we're open" content from 9 to 5, then switch to something else overnight. Schedules that cross midnight work too. #### Set how long each item plays Tell each photo or web page exactly how long to stay on screen. Videos figure out their own length automatically. #### Drag to reorder, or shuffle Arrange your playlist by dragging items into place, or turn on shuffle to mix things up on every loop. #### Skip ahead, skip back, pause an item Jump forward, jump back, or temporarily turn an item off without deleting it. All from the dashboard. ### Run it from your browser A clean dashboard for managing your screen, with a clear view of how the device is doing. #### No app to install Open the dashboard from your laptop, phone, or tablet. There's no cloud account. Anthias runs on the device itself, on your own network. #### Preview before you publish Click any photo, video, or web page to see exactly what your screen will show, right inside the dashboard. #### Know when your screen is dark Anthias can tell whether the connected TV is actually powered on, so you can spot a dark display at a glance instead of walking over to check. #### System info at a glance See how long the device has been running, how much storage and memory is in use, the software version, and the device's address on your network. #### Tells you when there's an update When a newer version of Anthias is released, the dashboard quietly says so. No mailing lists, no checking the website. #### Restart and shut down remotely Reboot or power off the player from the dashboard, without walking over to the screen. Useful when your displays are scattered around a building. ### First-boot and access Set up a new screen in minutes, then lock it down to whoever should have the keys. #### Onboarding right on the screen On first boot, your TV shows the device's network address and a QR code. Scan it with your phone and you land straight on the dashboard. #### Optional password protection Turn on a username and password so only the people you trust can change what's playing. Off by default for quick setup, on whenever you want it. #### Easy HTTPS encryption Encrypt the dashboard with one command. Pick a self-signed certificate for a private setup, a free auto-renewing one for your own domain, or bring your own certificate. ### Backups and integrations Move things around, plug Anthias into your tools, or manage many screens at once. #### Backup and restore in one file Download a single file with your settings and asset list. Upload it later to put everything back, or move it to a brand-new device. #### Plays well with your tools Push content and control playback from your own scripts. The programmable interface is fully documented and stays compatible with older integrations. #### Manage many screens with Balena Deploy and update Anthias across a fleet of devices through Balena, with over-the-air updates handled for you. ### Supported hardware Anthias runs on Raspberry Pi single-board computers and 64-bit x86 PCs. Pi 5 64-bit Pi 4 64-bit Pi 3 B+ 64-bit Pi 3 B 64-bit Pi 2 B 32-bit x86 PC 64-bit Pi 2 and Pi 3 are in maintenance mode. We recommend Pi 4 or later for new installations. ### Ready to try Anthias? Free, open source, and yours to run on any supported device. Get Started [View on GitHub](https://github.com/Screenly/Anthias) --- # Get Started - Anthias Digital Signage Source: https://anthias.screenly.io/get-started > Install Anthias on Raspberry Pi, x86 PC, or generic 64-bit ARM SBC (Rock Pi, Orange Pi, Banana Pi…). Pre-built disk images, one-line installer, and balenaHub options. ## Get Started Choose the installation method that works best for your hardware and setup. 1 ### Flash an SD card with Raspberry Pi Imager The recommended way to get started: no command line, no SSH. Open [Raspberry Pi Imager](https://www.raspberrypi.com/software/), choose **Other specific-purpose OS → Digital signage and kiosks → Anthias**, pick the entry for your Pi model (Pi 2 through Pi 5), select your SD card, and flash. Insert the card into your Pi and power it on. It boots straight into Anthias, and because these are balenaHub Fleets for Good images, the device updates over the air automatically. Prefer the command line? See the advanced methods below. 2 ### Open the dashboard Once the installation completes, open a browser and navigate to your device's IP address. The Anthias web dashboard will be ready at port 80. 3 ### Add your content Upload images and videos, or add URLs to web pages. Set a schedule for each asset, and Anthias takes care of the rest. ### Advanced & alternative installation methods #### Install with one command (advanced) For users comfortable with the command line who want to install over an existing Raspberry Pi OS Lite or Debian system (including a PC). On a fresh install, run: `bash <(curl -sL https://install-anthias.srly.io)` Sets up Docker, pulls the images, and starts Anthias (~10–15 min). Prefer to read the script before running it? See the installation guide. #### Pre-built disk images Download a disk image from the [latest GitHub release](https://github.com/Screenly/Anthias/releases/latest) and flash it to an SD card with Raspberry Pi Imager or balenaEtcher. Images are compressed with xz (.img.xz). #### balenaHub The Raspberry Pi Imager and pre-built disk images are [balenaHub Fleets for Good](https://hub.balena.io/fleets-for-good) builds, so devices join the fleet and update over the air automatically. You can also browse and download the Pi 2 through Pi 5 images directly from balenaHub. ### Supported hardware Anthias runs on Raspberry Pi single-board computers, 64-bit x86 PCs, and 64-bit ARM single-board computers (Rock Pi, Orange Pi, Banana Pi and similar via Armbian). Supported on Raspberry Pi OS, Debian (Trixie or Bookworm), and the corresponding Armbian builds. | Device | Architecture | Status | | --- | --- | --- | | Raspberry Pi 5 Model B | 64-bit | Recommended | | Raspberry Pi 4 Model B | 64-bit | Recommended | | Raspberry Pi 3 Model B+ | 64-bit | Supported | | Raspberry Pi 3 Model B | 64-bit | Supported | | Raspberry Pi 3 (legacy 32-bit image) | 32-bit | Maintenance | | Raspberry Pi 2 Model B | 32-bit | Maintenance | | Raspberry Pi 3 Model A+ (512 MB) | 32-bit | Not recommended | | x86 PC (NUC or similar) | 64-bit | Recommended | | Generic 64-bit ARM SBC (Rock Pi, Orange Pi, Banana Pi…) | 64-bit | Best-effort | The **Raspberry Pi 3 Model A+** ships with only 512 MB of RAM, too little to run the Anthias stack comfortably, so it’s **not recommended**. For a low-cost board, choose a Pi with at least 1 GB (Pi 3 Model B/B+ or newer). Generic 64-bit ARM SBCs run the same Anthias stack on **Debian-based Armbian** (Bookworm / Trixie) with software video decode. Ubuntu-based Armbian builds aren’t supported: the installer wires up the Debian Docker apt repository, so Ubuntu releases fail at “apt update”. Hardware video decode varies per SoC and isn’t wired up out of the box, so expect software decode (smooth at 720p, stutter-prone at 1080p, CPU-heavy at 4K). Per-SoC hardware decode is a follow-up; see [issue #2849](https://github.com/Screenly/Anthias/issues/2849). ### Need help? Check the documentation, ask on the forum, or file an issue on GitHub. Documentation [Forum](https://forums.screenly.io) [Report an Issue](https://github.com/Screenly/Anthias/issues) --- # API Reference - Anthias Digital Signage Source: https://anthias.screenly.io/api > REST API reference for Anthias. Endpoints for managing assets, device settings, backups, and integrations. ## API Reference Anthias API v2.0.0. Manage assets, device settings, backups, and integrations over HTTP. assets backup device_settings display file_asset info integrations network reboot recover shutdown viewer ### Overview Anthias exposes a REST API so you can manage a player without touching the web interface: script asset uploads, rotate playlists, trigger backups, or wire the device into your own tooling. Everything the dashboard does is available over HTTP, which makes Anthias straightforward to automate across a fleet of screens. The API runs directly on each device, so the base URL is simply the player’s own address on your network, under `/api/`: ``` http:///api/ ``` That is port 80 on a normal install; a development environment serves the same API on port 8000. If you have enabled SSL on the device, use `https://` with the hostname on the certificate instead. Requests and responses are JSON, except for asset uploads, which use `multipart/form-data`. ### Versioning The API is versioned in the path, and several versions are served side by side so existing integrations keep working as new ones are added: - **v2** (`/api/v2/…`): the current version. Use this for new integrations. It exposes the full asset model, including the scheduling fields (`play_order`, duration, and the active date window). - **v1, v1.1, v1.2** (`/api/v1/…`, `/api/v1.1/…`, `/api/v1.2/…`): retained for backwards compatibility. Their request and response shapes stay stable, but the older versions do not expose the newer scheduling fields. Pin your integration to a specific version so a future release cannot change the shape of the responses you depend on. ### Authentication The API is designed for use on a trusted local network and does not require an API token. Because there is no authentication layer in front of it, do **not** expose a device’s HTTP port directly to the public internet. Keep it behind your LAN, a VPN, or a reverse proxy that adds its own access control. ### Responses and errors Successful requests return a `2xx` status with a JSON body. Client mistakes (a missing field, a malformed asset) return `4xx` with a JSON error describing what went wrong; unexpected server-side failures return `5xx`. Each endpoint below lists the response codes it can return and the schema of the body that comes with them. Expand a response to see the full field list. ### Endpoints The complete endpoint reference follows, grouped by tag. Each entry shows the method, path, parameters, request body, and every response it can return. ### assets get `/api/v2/assets` List assets #### Responses 200 Array of: `AssetSerializerV2` | Field | Type | Notes | | --- | --- | --- | | asset_id* | string | read-only | | custom_headers* | object | read-only | | duration | integer (int64) \| null | | | end_date | string (date-time) \| null | | | is_active* | boolean | read-only | | is_enabled | boolean | | | is_processing | boolean | | | is_reachable* | boolean | read-only | | last_reachability_check* | string (date-time) \| null | read-only | | metadata* | object | read-only | | mimetype | string \| null | | | name | string \| null | | | nocache | boolean | | | play_days* | integer[] | read-only | | play_order | integer (int64) | | | play_time_from | string (time) \| null | | | play_time_to | string (time) \| null | | | refresh_interval_s* | integer | read-only | | skip_asset_check | boolean | | | skip_ssl_verify | boolean | | | start_date | string (date-time) \| null | | | uri | string \| null | | post `/api/v2/assets` Create asset #### Request body application/json Schema: `CreateAssetSerializerV2` | Field | Type | Notes | | --- | --- | --- | | asset_id* | string | read-only | | custom_headers | object | write-only | | duration* | integer | | | end_date* | string (date-time) | | | ext | string | write-only | | is_enabled* | boolean | | | is_processing | boolean | | | mimetype* | string | | | name* | string | | | nocache | boolean | | | play_days | integer[] | | | play_order | integer | | | play_time_from | string (time) \| null | | | play_time_to | string (time) \| null | | | refresh_interval_s | integer | write-only | | skip_asset_check | boolean | | | skip_ssl_verify | boolean | | | start_date* | string (date-time) | | | uri* | string | | #### Responses 201 Schema: `AssetSerializerV2` | Field | Type | Notes | | --- | --- | --- | | asset_id* | string | read-only | | custom_headers* | object | read-only | | duration | integer (int64) \| null | | | end_date | string (date-time) \| null | | | is_active* | boolean | read-only | | is_enabled | boolean | | | is_processing | boolean | | | is_reachable* | boolean | read-only | | last_reachability_check* | string (date-time) \| null | read-only | | metadata* | object | read-only | | mimetype | string \| null | | | name | string \| null | | | nocache | boolean | | | play_days* | integer[] | read-only | | play_order | integer (int64) | | | play_time_from | string (time) \| null | | | play_time_to | string (time) \| null | | | refresh_interval_s* | integer | read-only | | skip_asset_check | boolean | | | skip_ssl_verify | boolean | | | start_date | string (date-time) \| null | | | uri | string \| null | | get `/api/v2/assets/control/{command}` Control asset playback Use any of the following commands to control asset playback: * `next` - Show the next asset * `previous` - Show the previous asset * `asset&{asset_id}` - Show the asset with the specified `asset_id` #### Parameters | Name | In | Type | Required | | --- | --- | --- | --- | | command | path | string | yes | #### Responses 200 string post `/api/v2/assets/order` Update playlist order #### Request body application/json Schema: `PlaylistOrderSerializerMixin` | Field | Type | Notes | | --- | --- | --- | | ids* | string | Comma-separated list of asset IDs in the order they should be played. For example: `793406aa1fd34b85aa82614004c0e63a,1c5cfa719d1f4a9abae16c983a18903b,9c41068f3b7e452baf4dc3f9b7906595`write-only | #### Responses 204 No response body get `/api/v2/assets/{asset_id}` Get asset #### Parameters | Name | In | Type | Required | | --- | --- | --- | --- | | asset_id | path | string | yes | #### Responses 200 Schema: `AssetSerializerV2` | Field | Type | Notes | | --- | --- | --- | | asset_id* | string | read-only | | custom_headers* | object | read-only | | duration | integer (int64) \| null | | | end_date | string (date-time) \| null | | | is_active* | boolean | read-only | | is_enabled | boolean | | | is_processing | boolean | | | is_reachable* | boolean | read-only | | last_reachability_check* | string (date-time) \| null | read-only | | metadata* | object | read-only | | mimetype | string \| null | | | name | string \| null | | | nocache | boolean | | | play_days* | integer[] | read-only | | play_order | integer (int64) | | | play_time_from | string (time) \| null | | | play_time_to | string (time) \| null | | | refresh_interval_s* | integer | read-only | | skip_asset_check | boolean | | | skip_ssl_verify | boolean | | | start_date | string (date-time) \| null | | | uri | string \| null | | put `/api/v2/assets/{asset_id}` Update asset #### Parameters | Name | In | Type | Required | | --- | --- | --- | --- | | asset_id | path | string | yes | #### Request body application/json Schema: `UpdateAssetSerializerV2` | Field | Type | Notes | | --- | --- | --- | | custom_headers | object | | | duration* | integer | | | end_date* | string (date-time) | | | is_enabled* | boolean | | | is_processing | boolean | | | name* | string | | | nocache | boolean | | | play_days | integer[] | | | play_order | integer | | | play_time_from | string (time) \| null | | | play_time_to | string (time) \| null | | | refresh_interval_s | integer | | | skip_asset_check | boolean | | | skip_ssl_verify | boolean | | | start_date* | string (date-time) | | #### Responses 200 Schema: `AssetSerializerV2` | Field | Type | Notes | | --- | --- | --- | | asset_id* | string | read-only | | custom_headers* | object | read-only | | duration | integer (int64) \| null | | | end_date | string (date-time) \| null | | | is_active* | boolean | read-only | | is_enabled | boolean | | | is_processing | boolean | | | is_reachable* | boolean | read-only | | last_reachability_check* | string (date-time) \| null | read-only | | metadata* | object | read-only | | mimetype | string \| null | | | name | string \| null | | | nocache | boolean | | | play_days* | integer[] | read-only | | play_order | integer (int64) | | | play_time_from | string (time) \| null | | | play_time_to | string (time) \| null | | | refresh_interval_s* | integer | read-only | | skip_asset_check | boolean | | | skip_ssl_verify | boolean | | | start_date | string (date-time) \| null | | | uri | string \| null | | patch `/api/v2/assets/{asset_id}` Update asset #### Parameters | Name | In | Type | Required | | --- | --- | --- | --- | | asset_id | path | string | yes | #### Request body application/json Schema: `PatchedUpdateAssetSerializerV2` | Field | Type | Notes | | --- | --- | --- | | custom_headers | object | | | duration | integer | | | end_date | string (date-time) | | | is_enabled | boolean | | | is_processing | boolean | | | name | string | | | nocache | boolean | | | play_days | integer[] | | | play_order | integer | | | play_time_from | string (time) \| null | | | play_time_to | string (time) \| null | | | refresh_interval_s | integer | | | skip_asset_check | boolean | | | skip_ssl_verify | boolean | | | start_date | string (date-time) | | #### Responses 200 Schema: `AssetSerializerV2` | Field | Type | Notes | | --- | --- | --- | | asset_id* | string | read-only | | custom_headers* | object | read-only | | duration | integer (int64) \| null | | | end_date | string (date-time) \| null | | | is_active* | boolean | read-only | | is_enabled | boolean | | | is_processing | boolean | | | is_reachable* | boolean | read-only | | last_reachability_check* | string (date-time) \| null | read-only | | metadata* | object | read-only | | mimetype | string \| null | | | name | string \| null | | | nocache | boolean | | | play_days* | integer[] | read-only | | play_order | integer (int64) | | | play_time_from | string (time) \| null | | | play_time_to | string (time) \| null | | | refresh_interval_s* | integer | read-only | | skip_asset_check | boolean | | | skip_ssl_verify | boolean | | | start_date | string (date-time) \| null | | | uri | string \| null | | delete `/api/v2/assets/{asset_id}` Delete asset #### Parameters | Name | In | Type | Required | | --- | --- | --- | --- | | asset_id | path | string | yes | #### Responses 204 No response body get `/api/v2/assets/{asset_id}/content` Get asset content The content of the asset. `type` can either be `file` or `url`. In case of a file, the fields `mimetype`, `filename`, and `content` will be present. In case of a URL, the field `url` will be present. #### Parameters | Name | In | Type | Required | | --- | --- | --- | --- | | asset_id | path | string | yes | #### Responses 200 | Field | Type | Notes | | --- | --- | --- | | content | string | | | filename | string | | | mimetype | string | | | type | string | | | url | string | | post `/api/v2/assets/{asset_id}/recheck` Recheck asset reachability On-demand reachability recheck, called from the viewer. The viewer cannot attach operator BasicAuth credentials, so this endpoint uses a lightweight internal token derived from the shared ``anthias.conf`` secret instead. The request still remains side-effect-only and rate-limited: it returns no asset data, queue churn is debounced here, and the Celery task enforces the longer per-asset probe cooldown. #### Parameters | Name | In | Type | Required | | --- | --- | --- | --- | | asset_id | path | string | yes | #### Responses 202 No response body 403 No response body 404 No response body ### backup post `/api/v2/backup` Create backup Create a backup of the current Anthias instance, which includes the following: * current settings * image and video assets * asset metadata (e.g. name, duration, play order, status), which is stored in a SQLite database #### Responses 201 string ### device settings get `/api/v2/device_settings` Get device settings #### Responses 200 Schema: `DeviceSettingsSerializerV2` | Field | Type | Notes | | --- | --- | --- | | audio_output* | string | | | auth_backend* | string | | | date_format* | string | | | debug_logging* | boolean | | | default_assets* | boolean | | | default_duration* | integer | | | default_streaming_duration* | integer | | | display_power_days* | string | | | display_power_off_time* | string | | | display_power_on_time* | string | | | display_power_schedule_enabled* | boolean | | | player_name* | string | | | prefer_dark_mode* | boolean | | | screen_rotation* | ScreenRotationEnum | | | show_splash* | boolean | | | shuffle_playlist* | boolean | | | timezone* | string | | | use_24_hour_clock* | boolean | | | username* | string | | | verify_ssl* | boolean | | patch `/api/v2/device_settings` Update device settings #### Request body application/json Schema: `PatchedUpdateDeviceSettingsSerializerV2` | Field | Type | Notes | | --- | --- | --- | | audio_output | string | | | auth_backend | any | | | current_password | string | | | date_format | string | | | debug_logging | boolean | | | default_assets | boolean | | | default_duration | integer | | | default_streaming_duration | integer | | | display_power_days | string | | | display_power_off_time | string | | | display_power_on_time | string | | | display_power_schedule_enabled | boolean | | | password | string | | | password_2 | string | | | player_name | string | | | prefer_dark_mode | boolean | | | screen_rotation | ScreenRotationEnum | | | show_splash | boolean | | | shuffle_playlist | boolean | | | timezone | string | | | use_24_hour_clock | boolean | | | username | string | | | verify_ssl | boolean | | #### Responses 200 | Field | Type | Notes | | --- | --- | --- | | message | string | | 400 | Field | Type | Notes | | --- | --- | --- | | error | string | | ### display post `/api/v2/display/{state}` Set display power state (experimental, HDMI-CEC) #### Parameters | Name | In | Type | Required | | --- | --- | --- | --- | | state | path | string | yes | #### Request body application/json Schema: `DisplayPowerViewSerializerMixin` | Field | Type | Notes | | --- | --- | --- | | message* | string | read-only | #### Responses 200 Schema: `DisplayPowerViewSerializerMixin` | Field | Type | Notes | | --- | --- | --- | | message* | string | read-only | 400 Schema: `DisplayPowerViewSerializerMixin` | Field | Type | Notes | | --- | --- | --- | | message* | string | read-only | 502 Schema: `DisplayPowerViewSerializerMixin` | Field | Type | Notes | | --- | --- | --- | | message* | string | read-only | 503 Schema: `DisplayPowerViewSerializerMixin` | Field | Type | Notes | | --- | --- | --- | | message* | string | read-only | ### file asset post `/api/v2/file_asset` Upload file asset #### Parameters | Name | In | Type | Required | | --- | --- | --- | --- | | X-Upload-Id | header | string | no | #### Request body multipart/form-data | Field | Type | Notes | | --- | --- | --- | | file_upload | string (binary) | | #### Responses 200 | Field | Type | Notes | | --- | --- | --- | | ext | string | | | upload_id | string | | | uri | string | | ### info get `/api/v2/info` Get system information #### Responses 200 | Field | Type | Notes | | --- | --- | --- | | anthias_version | string | | | device_model | string | | | display_power | string \| null | | | free_space | string | | | host_user | string | | | ip_addresses | string[] | | | loadavg | number | | | mac_address | string | | | memory | object | | | storage | object | Health of the filesystem this device runs from, assembled from ext4 superblock error counters, a periodic write-and-read-back check, and eMMC wear registers where present. Branch on `status`. Check `supported` first: when it is false the filesystem could not be resolved and no other field carries information. `errors_count` is cumulative over the life of the filesystem and survives reboots; `errors_new` and the write-check fields reset on reboot. | | time | object | | | under_voltage | object | Power-supply health from the kernel rpi_volt sensor. Check `supported` first: when it is false this device has no such sensor and the other fields carry no information. Counters and timestamps reset when the device reboots. | | up_to_date | boolean | | | uptime | object | | | viewlog | string | | ### integrations get `/api/v2/integrations` Get integrations information #### Responses 200 Schema: `IntegrationsSerializerV2` | Field | Type | Notes | | --- | --- | --- | | balena_app_id | string \| null | | | balena_app_name | string \| null | | | balena_device_id | string \| null | | | balena_device_name_at_init | string \| null | | | balena_host_os_version | string \| null | | | balena_supervisor_version | string \| null | | | is_balena* | boolean | | post `/api/v2/integrations/import/{provider}/item` Import one media item from a provider Import a single remote media item as an Anthias asset. Per-item (not batch) for the same reason as ``ScreenlyMigrateAssetViewV2``: the wizard shows live progress and keeps going past individual failures. Known per-item failures return 200 with ``success: False`` so the queue keeps advancing; only a transport failure is a 502. #### Parameters | Name | In | Type | Required | | --- | --- | --- | --- | | provider | path | string | yes | #### Request body application/json Schema: `ImportItemSerializerV2` | Field | Type | Notes | | --- | --- | --- | | enable | boolean | | | remote_id* | string | | | token* | string | write-only | #### Responses 200 | Field | Type | Notes | | --- | --- | --- | | asset_id | string \| null | | | error | string \| null | | | reason | string \| null | | | skipped | boolean | | | success | boolean | | post `/api/v2/integrations/import/{provider}/validate` Validate an import provider token and list its media Validate an import provider's token and enumerate its media. Inbound counterpart to ``ScreenlyValidateTokenViewV2``: validation and listing happen in one round-trip so the wizard's Continue button goes straight from the token field to the item picker. The token is not stored; each request forwards it inline. ``provider`` is the registry key from the URL (``yodeck``, later ``screencloud`` …). #### Parameters | Name | In | Type | Required | | --- | --- | --- | --- | | provider | path | string | yes | #### Request body application/json Schema: `ImportValidateSerializerV2` | Field | Type | Notes | | --- | --- | --- | | token* | string | write-only | #### Responses 200 | Field | Type | Notes | | --- | --- | --- | | error | string \| null | | | items | object[] | | | valid | boolean | | post `/api/v2/integrations/screenly/migrate` Migrate one asset to Screenly v4.1 Forward a single Anthias asset to the configured Screenly account. Per-asset rather than batch on purpose: the UI shows live progress and continues past individual failures, which matches the way operators run this (large libraries, some assets reachable, some not). Batching would either swallow partial failures or hand-roll the same loop server-side with worse feedback. #### Request body application/json Schema: `ScreenlyMigrateAssetSerializerV2` | Field | Type | Notes | | --- | --- | --- | | asset_group_id | string | | | asset_id* | string | | | token* | string | write-only | #### Responses 200 | Field | Type | Notes | | --- | --- | --- | | error | string \| null | | | screenly_asset_id | string \| null | | | success | boolean | | post `/api/v2/integrations/screenly/validate` Validate a Screenly v4.1 API token and prepare the migration asset-group Probe a Screenly v4.1 API token and reserve the migration group. Two steps in one round-trip because the wizard's UX is "click Continue → either an error or the asset picker". Validating the token alone would leave a follow-up call between Continue and the next screen, and the asset-group creation is cheap (idempotent get-or-create against ``/asset-groups``). The token is not stored; each request forwards it inline. #### Request body application/json Schema: `ScreenlyTokenSerializerV2` | Field | Type | Notes | | --- | --- | --- | | token* | string | write-only | #### Responses 200 | Field | Type | Notes | | --- | --- | --- | | asset_group_id | string \| null | | | asset_group_title | string \| null | | | error | string \| null | | | valid | boolean | | ### network get `/api/v2/network/ip-addresses` Get device IP addresses (for splash poll) Lightweight IP-list endpoint for the splash page to poll. Unauth'd because the splash page itself is unauth'd and the viewer isn't a credentialed client. The data here is already disclosed by /splash-page rendering — there's no new exposure. Narrow on purpose: only IPs, no diagnostics. /api/v2/info covers the "everything about the device" case but is auth'd and does heavier work (psutil, statvfs, version checks) that would compound on a 2-second poll. Don't bolt onto this; add a sibling endpoint if a different unauth'd value is ever needed. **KNOWN LIMITATION (deferred to broader auth work).** This GET has a side effect — ``_resolve_node_ip`` calls ``_publish_refresh()`` on cache miss / hit / empty-list, which publishes ``hostcmd: set_ip_addresses`` to host_agent. ``host_agent.set_ip_addresses`` in turn does an internet probe (``requests.get`` to 1.1.1.1 with a 10×1s tenacity retry). An unauthenticated LAN client can drive that side effect at the debounce-bounded rate (one publish per ``_IP_REFRESH_DEBOUNCE_S``). The mitigations already in place keep blast radius bounded: * SETNX-debounced publishes (only one refresh per 12s window regardless of poll volume), * the response body carries no data not already disclosed by the splash page itself, * host_agent's own retry/throttle behavior caps the downstream cost. The proper fix is a shared internal-auth gate (matching the one on AssetRecheckViewV2) — but the splash polling endpoint is consumed by the viewer's webview from the device's local network with no way to attach BasicAuth, so internal-auth here needs to be designed alongside the broader auth rework. Tracked in the same followup as AssetRecheckViewV2's gating. #### Responses 200 | Field | Type | Notes | | --- | --- | --- | | ip_addresses | string[] | | ### reboot post `/api/v2/reboot` Reboot system #### Responses 200 No response body ### recover post `/api/v2/recover` Recover from backup Recover data from a backup file. The backup file must be a `.tar.gz` file. #### Request body multipart/form-data | Field | Type | Notes | | --- | --- | --- | | backup_upload | string (binary) | | #### Responses 200 string ### shutdown post `/api/v2/shutdown` Shut down system #### Responses 200 No response body ### viewer get `/api/v2/viewer/playlist` Get the active playlist and next re-evaluation deadline Active assets + next deadline, evaluated against server time. Intended for the C++ viewer (GH #2906 Phase 3) so the viewer no longer needs Django ORM access or its own ``Asset.is_active()`` re-implementation. The Python viewer keeps using ``anthias_viewer.scheduling.generate_asset_list()`` directly until Phase 3 swaps it. Internal-auth gated for the same reason as ``AssetRecheckViewV2``: the viewer can't attach operator BasicAuth, so it presents the shared token derived from ``anthias.conf``. #### Responses 200 Schema: `ViewerPlaylistSerializerV2` | Field | Type | Notes | | --- | --- | --- | | assets* | AssetSerializerV2[] | | | deadline* | string (date-time) \| null | | | now* | string (date-time) | | 403 No response body get `/api/v2/viewer/settings` Get viewer-relevant device settings Viewer-relevant settings subset for the C++ viewer. Narrower than ``DeviceSettingsViewV2`` on purpose: only the keys the viewer reads at runtime are exposed, so the internal-auth path doesn't surface operator credential fields. Internal-auth gated like ``ViewerPlaylistViewV2`` above. #### Responses 200 Schema: `ViewerSettingsSerializerV2` | Field | Type | Notes | | --- | --- | --- | | audio_output* | string | | | debug_logging* | boolean | | | screen_rotation* | ScreenRotationEnum | | | show_splash* | boolean | | | shuffle_playlist* | boolean | | 403 No response body --- # FAQ - Anthias Digital Signage Source: https://anthias.screenly.io/faq > Frequently asked questions about Anthias open source digital signage. ## FAQ Common questions about Anthias. ### About Is Anthias the same as Screenly OSE? Yes. Anthias is the current name for the project formerly called **Screenly OSE** (Open Source Edition). It was renamed in December 2022 to clear up the confusion between Screenly, the paid platform, and the open-source project, see the announcement . Nothing was discontinued in the rename. It is the same project, the same maintainers, and the same [repository](https://github.com/Screenly/Anthias) . If you are running an older Screenly OSE install, see the installation options to move to a current release. What is the difference between Anthias and Screenly? Anthias is free, open-source digital signage software built by Screenly, Inc. Screenly is a paid, cloud-managed digital signage platform designed for professional multi-screen deployments. You can learn more about the differences on screenly.io . Choose **Screenly** if you need multi-screen management from a single account, enterprise user management, or professional support. Choose **Anthias** if you’re comfortable managing individual devices and want a free, self-hosted solution. What hardware do I need? Anthias runs on [Raspberry Pi](https://www.raspberrypi.com/) 2 through 5, 64-bit x86 PCs (Intel NUC or similar), and, on a best-effort basis, generic 64-bit ARM single-board computers via [Armbian](https://www.armbian.com/) (Rock Pi, Orange Pi, Banana Pi and similar boards). You’ll also need a screen with an HDMI input. We recommend a Raspberry Pi 4 or 5 for new installations. Can I buy a ready-made Anthias player? Yes. Screenly sells the **Anthias Player Mk2**, a fanless arm64 player with 4 GB of RAM, 16 GB of industrial-grade flash storage, and the power, Ethernet, and HDMI cables in the box. One player runs one screen, so order one player per screen. See the [Screenly shop](https://shop.screenly.io/products/anthias-player-mk2?utm_source=anthias.screenly.io&utm_medium=referral&utm_campaign=buy-a-player&utm_content=faq) for the current price and shipping. The player is hardware only: Anthias is not preinstalled, so you install the free software yourself the same way you would on any other supported board. Buying hardware is entirely optional, since Anthias runs just as well on a Raspberry Pi or PC you already own. Does Anthias require an internet connection? No. Anthias runs entirely on your local network. You only need internet access for the initial installation and to display content from external URLs. Uploaded images and videos play from local storage. Can I manage multiple screens? Each Anthias instance manages one screen. You can run multiple instances on separate devices, but each has its own dashboard. If you need centralized multi-screen management, [Screenly](https://www.screenly.io) is designed for that. Can I use Anthias commercially? Yes. Anthias is dual-licensed under [GPLv2](https://github.com/Screenly/Anthias/blob/master/LICENSE) and a commercial license. You can deploy it commercially under GPLv2, including in customer-facing storefronts and lobbies, as long as you comply with the GPL’s copyleft terms when redistributing modified versions. If you need a non-copyleft license, professional support, or fleet-scale management, see [Screenly](https://www.screenly.io) . Is there support for Anthias? Anthias is a community-supported project. You can get help on the [Anthias forum](https://forums.screenly.io) or file issues on [GitHub](https://github.com/Screenly/Anthias/issues) . For professional support, SLAs, and managed infrastructure, consider [Screenly](https://www.screenly.io) . ### Installation & updates How do I install Anthias with Raspberry Pi Imager? Open [Raspberry Pi Imager](https://www.raspberrypi.com/software/) (v1.9.4 or newer), click **Choose OS** → **Other specific-purpose OS** → **Digital signage and kiosks** → **Anthias**, then pick the entry that matches your Pi (Pi 2, Pi 3, Pi 4, or Pi 5). Select your SD card under **Choose Storage** and click **Write**. When the flash finishes, insert the card into the Pi and power it on. Anthias boots straight into the dashboard. Open `http://` in a browser on the same network to start adding assets. If you want shell access on the device, enable SSH via Raspberry Pi Imager’s **OS customization** (gear icon) before flashing. The Anthias image doesn’t ship with SSH on by default. How do I update Anthias? If you installed from a disk image or via balenaHub, updates are applied automatically over the air. The device tracks the latest stable release. For command-line installations, re-run the installer ( `$HOME/anthias/bin/run_upgrade.sh` ) or pull the latest Docker images. How do I configure Wi-Fi or change networks? Anthias uses [NetworkManager](https://wiki.debian.org/NetworkManager) for networking when the installer’s “manage the network” prompt is enabled. SSH into the device and run `sudo nmtui` for an interactive UI, or use `nmcli device wifi connect password ` from the command line. The legacy WiFi-Connect captive portal has been removed; `nmtui` / `nmcli` are the supported path going forward. Can I assign a static IP address? Yes, via NetworkManager. SSH in and run `sudo nmtui` → **Edit a connection** → choose your interface → set **IPv4 Configuration** to *Manual* and fill in the address, gateway, and DNS. Apply and reboot to confirm. You can also do this with `nmcli` non-interactively if you’re scripting deployments. How do I enable SSH on the device? Whether SSH is enabled depends on the OS image, not on Anthias itself. The installer doesn’t touch `sshd`. - **Anthias Raspberry Pi Imager image**: SSH is *not* on by default. Before flashing, click the gear icon in Raspberry Pi Imager (“OS customization”) and check **Enable SSH**, set a username/password (or paste in a public key), and write the SD card. The same Imager dialog can preconfigure Wi-Fi, hostname, and locale. - **balenaHub fleets**: SSH is on out of the box via the balena supervisor. - **Raspberry Pi OS Lite** (you flashed it yourself): use Raspberry Pi Imager’s OS customization to pre-enable SSH and set a username, or drop an empty file named `ssh` into the `/boot` partition before first boot. - **Debian on PC**: the Debian installer leaves SSH on if you selected the *SSH server* package during install. Then connect with `ssh @`. I'm installing Anthias on Debian on x86 and `sudo` is missing, how do I add it? A stock Debian install doesn’t include `sudo` (and often not `curl` either) if you set a root password during installation. Bootstrap both as root before running the Anthias installer: ``` $ su - # apt update && apt install -y sudo curl # usermod -aG sudo # exit ``` Log out and back in so your shell picks up the new group, then continue with the x86 install steps . If you instead reinstall Debian and leave the root password blank, the Debian installer wires your regular user up as a `sudo` user automatically and you can skip this step. Raspberry Pi Imager fails with "Error writing to storage device" on macOS, what's wrong? This is a bug in **Raspberry Pi Imager 2.0.2–2.0.7 on macOS**, not in the Anthias image or your SD card. Those versions abort mid-write with *“Error writing to storage device. Some writes failed to complete.”* whenever the image is decompressed on the fly. It affects our `.img.xz` images as well as plain `.img` files (rpi-imager [#1605](https://github.com/raspberrypi/rpi-imager/issues/1605) , [#1489](https://github.com/raspberrypi/rpi-imager/issues/1489) ). The fix was merged upstream in [rpi-imager#1621](https://github.com/raspberrypi/rpi-imager/pull/1621) (May 2026), so the cleanest fix is to **update Raspberry Pi Imager to a release newer than 2.0.7**. If you can’t update yet, decompress the image yourself and flash the resulting `.img`: ``` xz -d --
-anthias-.img.xz ``` Then point Raspberry Pi Imager (or [balenaEtcher](https://etcher.balena.io/) ) at the extracted `.img`. Flashing an already-decompressed file skips the code path that trips the bug. ### Display & playback How do I rotate the screen for portrait orientation? Use the Settings page in the Anthias dashboard (“Screen rotation”). On Pi 5 / x86 / arm64 the viewer runs under the `cage` kiosk Wayland compositor and the rotation is applied via `wlr-randr`. On Pi 2 / Pi 3 / Pi 4 the viewer renders to the Linux framebuffer directly and the transform is applied inside the media player; the Settings page works the same way. Edit `/boot/firmware/config.txt` and add one of: ``` display_rotate=1 # 90° display_rotate=2 # 180° display_rotate=3 # 270° ``` Then reboot. If `display_rotate` doesn’t take effect on a particular Pi 5 / KMS setup, set the rotation on the kernel cmdline instead, edit `/boot/firmware/cmdline.txt` and append `video=HDMI-A-1:1920x1080@60,rotate=90` (or 180/270) on the same line. Many displays also expose a rotation setting in their own OSD as a fallback. How do I change the screen resolution? Does Anthias support 4K? Anthias displays at whatever resolution the OS reports. There’s no resolution setting in the dashboard. Set the output mode at the OS level: on Raspberry Pi OS, use `sudo raspi-config` → **Display Options** → **Resolution**, or set `hdmi_group` / `hdmi_mode` in `/boot/firmware/config.txt`. 4K is supported on Pi 5 / x86 / arm64, those run the viewer under the `cage` Wayland compositor and the GPU handles the upscale for free. On Pi 4 the viewer renders to the Linux framebuffer directly and mpv hands video scaling to the V3D, so 1080p source on a 4K connector works smoothly; demanding 4K-source video on Pi 4 will drop frames, however, because the V3D doesn’t have the bandwidth headroom Pi 5’s V3D 7.1 has. My screen is black or stuck on "Manage the content", what now? This usually means the viewer container can’t reach the server, or there are no active assets. Try these in order: 1. SSH in and run `docker compose ps` from `~/anthias/`: all four containers (`anthias-server`, `anthias-celery`, `anthias-viewer`, `redis`) should be `Up`. 2. If a container is restarting, tail its logs: `docker logs -f anthias-anthias-viewer-1` (or `…-server-1`). 3. Open the dashboard from another device and confirm at least one asset is **enabled** with a current schedule. 4. If the display has gone to power save, briefly unplug and reconnect the HDMI cable, or check the TV’s input source. Anthias renders directly to KMS (via `cage` on Pi 5 / x86 / arm64, or Qt `linuxfb` on Pi 2 / Pi 3 / Pi 4) and uses no X server, so `xset` won’t help. If a recent update broke the display, running `~/anthias/bin/upgrade_containers.sh` re-creates the containers cleanly. What image and video files can I upload? Pretty much anything you’d take with a phone or download from the web. Photos from iPhones (HEIC), Android phones, scanners, and screenshots all work. Anthias quietly converts unusual formats into something it knows how to display. Videos work the same way. Drop in a clip from your phone or a camera, or pick something off your computer; if it’s not in a format your screen plays smoothly, Anthias prepares it for you in the background. Most files don’t need any conversion at all and start playing right away. While a file is being prepared you’ll see a **Processing** badge next to it in the dashboard. If something goes wrong (a corrupt file, for example), you’ll see a **Failed** badge with a brief explanation when you hover over it, so you can fix or remove it without hunting through logs. Can I display YouTube videos? Yes, paste a YouTube URL into the **Add Asset** dialog. Anthias downloads the video and stores it on the device, so playback is smooth, doesn’t buffer, and never shows ads or recommended-video overlays. If a particular video fails to load, it’s almost always because YouTube has changed something on their end. Updating Anthias to the latest release usually fixes it. How do I switch audio between HDMI and the 3.5mm jack? Open the web dashboard, go to **Settings**, and pick **HDMI** or **3.5mm jack** under *Audio output*. The change applies to video assets immediately, no reboot required. Note: Raspberry Pi 5 only exposes the **HDMI** option in the dropdown. The 3.5mm jack was removed from the Pi 5 hardware, so the dashboard hides that choice on Pi 5 devices. Does Anthias work on Rock Pi, Orange Pi, Banana Pi, and other non-Pi single-board computers? Yes, on a best-effort basis. If you flash a **Debian-based [Armbian](https://www.armbian.com)**image (Bookworm / Trixie) onto a 64-bit ARM board (Rock Pi, Orange Pi, Banana Pi and similar), the Anthias installer recognises it and sets things up the same way it does on a Raspberry Pi. The dashboard, scheduling, and asset library all work exactly as you’d expect. **Pick the Debian build of the Armbian image for your board.** The installer wires Docker’s apt repository under the Debian namespace; Ubuntu-based Armbian downloads (Jammy / Noble) fail at the very first `apt update` because Docker doesn’t publish those codenames there. Supporting Ubuntu-based Armbian is a follow-up. A few things to know before you pick a board for a serious deployment: - **Videos play, but the work is done in software.** Raspberry Pi and modern Intel PCs have a dedicated video chip that does the heavy lifting; on these other boards we haven’t wired that up yet, so the main CPU is doing the decoding. In practice, anything up to a smooth 720p clip is fine. 1080p is usable on faster boards but can stutter on slower ones. 4K isn’t a good fit. **If your content is mostly video, especially HD video walls, stick with a Raspberry Pi 4 / 5 or an x86 mini-PC.** - **Images and web pages are no problem.** Slideshows, dashboards, menus, and most web content run beautifully across the whole range. The limitation above is specifically about video. - **No Anthias boot splash.** Most non-Pi boards don’t display our splash. You’ll see the kernel boot log scroll on the screen until Anthias starts and shows your first asset (usually a minute or two from power-on). Everything works fine; startup just looks less polished than on a Raspberry Pi. - **Tested boards.** Rock Pi 4, Rock 5, Orange Pi 5, and Banana Pi M5 are known to work well. Orange Pi Zero 3 (and other Allwinner H616 / H618 boards) currently have weaker mainline driver support and are best limited to images and web content. See [issue #2849](https://github.com/Screenly/Anthias/issues/2849) for the roadmap on per-board hardware video acceleration. Can I add transitions (fade / crossfade) between assets? Not currently. Anthias plays one asset, then immediately switches to the next. Adding crossfades would require composited rendering on the viewer side, which the lightweight Pi WebView pipeline doesn’t do. If this matters for your deployment, [Screenly](https://www.screenly.io) supports transitions. A multi-language website displays in English instead of my language, how do I fix it? Anthias sends an HTTP `Accept-Language` header derived from the device’s system locale, and sites that ship multiple languages use that header to pick which version to serve. Out of the box the locale is whatever the OS image was built with (usually `en_GB.UTF-8` on the Anthias Raspberry Pi image), so multi-language URL assets default to English. Set the locale to the language you want and the site will follow. - **Raspberry Pi OS / Debian:** SSH in and run `sudo raspi-config` → **Localisation Options** → **Locale**, tick the locales you need, then pick one as the default, or, non-interactively, `sudo update-locale LANG=nl_NL.UTF-8` (substitute your locale). Re-run `~/anthias/bin/upgrade_containers.sh` so the new `LANG` is baked into the viewer container. - **balena:** open your fleet/device in the [balena dashboard](https://dashboard.balena-cloud.com/) , add a **Device Variable** (or Service Variable scoped to `anthias-viewer`) with name `LANG` and value e.g. `nl_NL.UTF-8`. The balena supervisor restarts the viewer container with the new env var; no SSH needed. Either way, the change takes effect after the viewer container restarts. Open a multi-language site in the dashboard’s **Add Asset** preview to confirm it picks up the new language. ### Operations How do I get logs from Anthias? SSH into the device and use either of these: ``` # Tail a single container directly docker logs -f anthias-anthias-server-1 # Or via Compose (run from ~/anthias/) cd ~/anthias docker compose logs -f anthias-server ``` The container names are `anthias-anthias-server-1`, `anthias-anthias-celery-1`, `anthias-anthias-viewer-1`, and `anthias-redis-1`. If TLS is enabled, there’s also `anthias-anthias-caddy-1`. Where are my assets stored, and how do I back them up? The easy way: open the dashboard, go to **Settings**, and click **Get Backup** to download a single-file archive. To restore, click **Upload and Recover** on the same page. If you’d rather copy the files manually, asset binaries live in `~/anthias_assets/` and configuration plus the SQLite database (`anthias.db`) live in `~/.anthias/`. Backing up both directories captures everything. How do I enable HTTPS? From `~/anthias/` , run `./bin/enable_ssl.sh` . The default mode uses Caddy’s built-in local CA, which is fine for IP-based LAN access. For Let’s Encrypt or bring-your-own certificate, see the [TLS / SSL section in the docs](/docs/#tls--ssl) . Is there a software bill of materials (SBOM) for Anthias? Yes. Anthias publishes a software bill of materials (SBOM) that lists the components it ships, so you can audit its dependencies for security and compliance. View and download the current SBOMs from the Anthias Trust Center . How do I run Anthias behind my own reverse proxy? Most reverse proxies (nginx, Apache `mod_proxy`, IIS ARR) rewrite the upstream `Host` header by default. When that happens, Django’s CSRF protection rejects every POST with `Origin checking failed` and uploads, asset changes, and settings updates all fail. You have two options: **1. Preserve the upstream `Host` (preferred).** Tell the proxy to pass the original `Host` through: | Proxy | Directive | | --- | --- | | nginx | `proxy_set_header Host $host;` | | Apache | `ProxyPreserveHost On` | | IIS ARR | `preserveHostHeader="true"` (or the GUI toggle) | | Caddy | preserved by default, no action needed | | Traefik | preserved by default (`passHostHeader: true`) | With `Host` preserved, Anthias’s built-in same-host CSRF fallback handles HTTP-to-HTTPS scheme drift automatically. **2. Tell Anthias the public hostname directly.** If you can’t (or don’t want to) change the proxy config, list the public origin in `CSRF_TRUSTED_ORIGINS`. From `~/anthias/`, edit `.env` (or your compose override) and add: ``` CSRF_TRUSTED_ORIGINS=https://signage.example.com ``` Multiple origins are comma-separated. Restart with `docker compose up -d`. A proxy can also cap how large an upload may be, which is a different failure from the `Host` problem above: everything works except large videos. Anthias sets no size limit of its own, and the bundled Caddy sidecar disables one explicitly, so any limit you hit belongs to your proxy. nginx defaults to 1 MB, and Cloudflare rejects request bodies over 100 MB on its Free and Pro plans. | Proxy | Directive | | --- | --- | | nginx | `client_max_body_size 0;` | | Apache | `LimitRequestBody 0` (already the default) | | Caddy | `request_body { max_size 0 }` | | Cloudflare | your plan sets the ceiling; you can lower it, not raise it | The bundled `./bin/enable_ssl.sh` Caddy sidecar handles all of this for you. The above is only relevant if you’re terminating TLS or proxying with something else. Where is the API reference? See the API page for endpoints grouped by tag with their parameters and response schemas. The live ReDoc-rendered docs are also served straight from each device at `http:///api/docs/` . How do I authenticate API calls? Devices with the **Basic** authentication mode enabled in **Settings** require credentials on every API call. Two paths resolve to the same operator account: - **Browser session cookie**: what the dashboard uses. Treat this path as **browser-only**: a naive headless POST to `/login/` will 403 because the login form itself is CSRF-protected (the script has to GET `/login/` first, parse out the `csrfmiddlewaretoken` form field and the `csrftoken` cookie, then POST both back), and DRF’s `SessionAuthentication` enforces CSRF *again* on every API write (`POST` / `PUT` / `PATCH` / `DELETE`) by requiring an `X-CSRFToken` header. Cookie-only scripts that skip either step get 403s. - **HTTP Basic** *(legacy, deprecated: use this for headless automation today)*. `Authorization: Basic `. Retained for back-compat with pre-2826 Anthias-CLI and third-party scripts; the server logs a `DEPRECATED:` warning the first time it sees each `(user, client IP, path)` tuple and then again roughly once an hour for the same tuple (throttled so a polling client doesn’t flood the log). A UI-managed personal-token system that will replace Basic for headless callers is tracked as a follow-up. Devices with authentication disabled (the default on a fresh install) accept either of these but don’t require them. ### Still have questions? Ask on the forum or open a GitHub discussion. [Visit the Forum](https://forums.screenly.io) [GitHub Discussions](https://github.com/Screenly/Anthias/discussions) --- # Documentation Source: https://anthias.screenly.io/docs > Anthias documentation: installation, deployment, development, and operations. ## Documentation Anthias documentation: installation, deployment, development, and operations. [Asset SchedulingRestrict assets to specific days of the week and time-of-day windows.](/docs/asset-scheduling/) [balena Fleet DeploymentDeploy Anthias on your own balena fleet.](/docs/balena/) [Developer DocumentationDevelop and contribute to Anthias: architecture, services, building, and testing.](/docs/development/) [Display ScheduleSwitch the screen off outside opening hours on a daily on/off schedule.](/docs/display-schedule/) [Importing Content from Other PlatformsBring images, videos, and web pages into Anthias from another digital signage platform.](/docs/import-content/) [Installation OptionsInstall Anthias on Raspberry Pi or Debian: imager, balenaHub, releases, or scripted install.](/docs/install/) [Migrating Assets to ScreenlyCopy a player's assets from Anthias to a Screenly cloud account.](/docs/migrate-to-screenly/) [PC (x86) InstallationInstall Anthias on PC / x86 hardware running Debian 13 (Trixie) or Debian 12 (Bookworm).](/docs/pc/) [QA ChecklistManual testing checklist for Anthias.](/docs/qa/) [Raspberry Pi 5 SSD InstallInstall Anthias on a Raspberry Pi 5 with an SSD.](/docs/pi5-ssd/) ### How to get logs from Anthias SSH into your Raspberry Pi. For instance, if you’ve set `pi` for the username and `raspberrypi` for the hostname, then run: ``` $ ssh pi@raspberrypi ``` Anthias ships its container logs through the host’s `systemd-journald`, so the system handles rotation and retention for you. The four core services (`anthias-server`, `anthias-viewer`, `anthias-celery`, `redis`) plus the optional `anthias-caddy` TLS sidecar all use the journald driver, so they don’t write the unbounded `*-json.log` files under `/var/lib/docker/containers/` that can fill an SD card on long-running installs. You can read the logs three ways: `docker logs`, `docker compose logs`, or `journalctl` directly. > Note > > Switching the driver only affects future writes. Devices that were on the old `json-file` driver will still have the existing log files on disk after upgrading. To reclaim that space, truncate the leftover files in place (Docker keeps them open, so deleting can confuse the daemon, `truncate -s 0` is safe): > > ``` > $ sudo find /var/lib/docker/containers/ -name "*-json.log" \ > -exec truncate -s 0 {} + > ``` #### Using `docker logs` For instance, the command below will show you the logs from the server container: ``` $ docker logs -f anthias-anthias-server-1 ``` If you’d want to see the logs from other containers, simply replace the name of the container in the command above. Here’s a table of the available containers: | Container Name | Description | | --- | --- | | `anthias-anthias-server-1` | uvicorn (HTTP, WebSocket at `/ws`, static + media file serving) | | `anthias-anthias-celery-1` | Celery worker (async tasks) | | `anthias-anthias-viewer-1` | Viewer service driving the screen | | `anthias-redis-1` | Redis (Celery broker + Channels layer) | > Note > > If TLS is enabled via `bin/enable_ssl.sh`, an additional `anthias-anthias-caddy-1` container runs as a reverse-proxy sidecar. #### Using `docker compose logs` > Important > > Before running the succeeding commands, make sure that you’re in the `/home/${USER}/anthias` directory: > > ``` > $ cd /home/${USER}/anthias # e.g., /home/pi/anthias if the user is `pi` > ``` If you’d like to see the logs of a specific container or service via Docker Compose, you can run the following: ``` $ docker compose logs -f ${SERVICE_NAME} # e.g., docker compose logs -f anthias-server ``` Check out [this section](/docs/development/#understanding-the-components-that-make-up-anthias) of the Developer documentation page for the list of available services. #### Using `journalctl` Each service is tagged in the journal so you can pull logs without docker. Useful when you want to grep across a long time range or combine container logs with system logs: ``` $ sudo journalctl -f CONTAINER_TAG=anthias-server $ sudo journalctl --since "1 hour ago" CONTAINER_TAG=anthias-viewer ``` The available tags are `anthias-server`, `anthias-viewer`, `anthias-celery`, `anthias-redis`, and (when TLS is enabled) `anthias-caddy`. > Note > > The Anthias installer adds your user to the `adm` group, which on Debian/Raspberry Pi OS grants read access to the journal once you’ve logged out and back in (and provided the journal is persistent, i.e. `/var/log/journal/` exists). On systems where that’s set up you can drop the `sudo` from the commands above. Journal retention is controlled by `systemd-journald` (see `/etc/systemd/journald.conf`, `SystemMaxUse` caps total disk usage, defaulting to 10% of the filesystem). If you want to free space immediately: ``` $ sudo journalctl --vacuum-time=2d # drop entries older than 2 days $ sudo journalctl --vacuum-size=200M # cap journal at 200 MB ``` ### Enabling SSH See [the official documentation](https://www.raspberrypi.org/documentation/remote-access/ssh/) ### Updating Anthias Run the following command in your console: ``` $ bash <(curl -sL https://install-anthias.srly.io) ``` Alternatively, you can also run the following command: ``` $ $HOME/anthias/bin/run_upgrade.sh ``` ### Accessing the REST API The full endpoint reference is on the API page : endpoints, parameters, and response schemas grouped by tag. If you’d prefer the live ReDoc-rendered docs straight from your device, open `http:///api/docs/` (or `http://localhost:8000/api/docs/` in development mode). ### TLS / SSL Anthias supports two independent SSL features: #### 1. Serving HTTPS (Caddy sidecar) `bin/enable_ssl.sh` writes a `docker-compose.ssl.override.yml` that adds a `caddy:2-alpine` sidecar in front of `anthias-server`. Caddy terminates TLS on host ports 80 (redirected to HTTPS) and 443, and reverse-proxies plain HTTP to `anthias-server:8080`. There are three modes: ``` # Default: Caddy issues a cert from its built-in local CA. Good for # IP-based LAN access; browsers will warn that the CA is untrusted. $ ./bin/enable_ssl.sh # Auto Let's Encrypt: needs the domain to resolve to this host and # port 80 to be reachable from the internet for the HTTP-01 challenge. $ ./bin/enable_ssl.sh --domain example.com --email $ ./bin/enable_ssl.sh --domain example.com --staging # ACME staging # Bring your own certificate. $ ./bin/enable_ssl.sh --cert /path/to/cert.pem --key /path/to/key.pem # Turn it back off (Caddy + override removed; cert files are kept). $ ./bin/disable_ssl.sh ``` When SSL is *not* enabled, no Caddy container is pulled or run. The default install is unchanged. #### 2. Trusting a custom CA for outbound requests If Anthias needs to fetch assets from an internal HTTPS server signed by a private CA, install the CA into the `anthias-server` and `anthias-viewer` trust stores: > Warning > > This section only works for devices running Raspberry Pi OS Lite. > > ``` > $ cd $HOME/anthias > $ ./bin/add_certificate.sh /path/to/certificate.crt > ``` For more details, see this [guide to generating self-signed certificates with OpenSSL](https://devopscube.com/create-self-signed-certificates-openssl/) . --- # Asset Scheduling Source: https://anthias.screenly.io/docs/asset-scheduling > Restrict assets to specific days of the week and time-of-day windows. [← Documentation](/docs/) ## Asset Scheduling Restrict assets to specific days of the week and time-of-day windows. Each asset can be restricted to a specific set of days of the week and a daily time window, on top of the existing `start_date` / `end_date` range. With the defaults, scheduling is a no-op and assets behave as before. ### Field reference | Field | Type | Default | Effect | | --- | --- | --- | --- | | `play_days` | JSON list of ints `1`-`7` (Mon-Sun, ISO weekday) | `[1,2,3,4,5,6,7]` | Days of week the asset is eligible to play | | `play_time_from` | `time` (HH:MM:SS) | `null` | Start of daily play window. `null` together with `play_time_to=null` means “anytime” | | `play_time_to` | `time` (HH:MM:SS) | `null` | End of daily play window (exclusive). `null` together with `play_time_from=null` means “anytime” | `is_enabled`, `start_date`, `end_date`, `play_order`, `duration`, and `skip_asset_check` keep their existing meanings. ### When is an asset active? An asset is active (and therefore eligible for the playlist) only when **all** of the following are true: | Check | Active when… | | --- | --- | | Enabled | `is_enabled = true` | | Date range | `start_date < now < end_date` (both must be set) | | Day of week | local weekday is in `play_days` | | Time of day | local time is in `[play_time_from, play_time_to)`, or both fields are `null` | Time-of-day and day-of-week checks use the device’s local timezone. ### Common patterns | Goal | `start_date` / `end_date` | `play_days` | `play_time_from` | `play_time_to` | | --- | --- | --- | --- | --- | | Always (legacy behavior) | covering the desired range | `[1,2,3,4,5,6,7]` | `null` | `null` | | Weekdays only | covering the desired range | `[1,2,3,4,5]` | `null` | `null` | | Weekday business hours | covering the desired range | `[1,2,3,4,5]` | `09:00:00` | `17:00:00` | | Weekend evenings | covering the desired range | `[6,7]` | `18:00:00` | `23:00:00` | | Lunchtime menu | covering the desired range | `[1,2,3,4,5,6,7]` | `11:30:00` | `14:00:00` | | Friday late-night promo | covering the desired range | `[5]` | `22:00:00` | `02:00:00` | | Single-day takeover | `2026-11-27` / `2026-11-28` | `[1,2,3,4,5,6,7]` | `null` | `null` | | Mon morning rotation, 5 weeks | range that covers 5 Mondays | `[1]` | `09:00:00` | `12:00:00` | ### Overnight windows When `play_time_from > play_time_to`, the window wraps past midnight. `play_days` refers to the **start** day of the window. For example, an asset with `play_days=[1]` (Mon) and `22:00 → 06:00`: | Local time | Active? | Why | | --- | --- | --- | | Mon 21:30 | No | Before window | | Mon 22:00 | Yes | Window starts on Mon | | Mon 23:30 | Yes | Pre-midnight portion of Mon’s window | | Tue 02:30 | Yes | Post-midnight portion; “yesterday” was Mon (in days) | | Tue 06:00 | No | Window ends (exclusive) | | Tue 22:00 | No | Tue not in `play_days` | | Wed 02:30 | No | “Yesterday” was Tue (not in days) | ### Notes - `play_time_to` is **exclusive**: `09:00:00 → 17:00:00` covers up to but not including 17:00:00. To include the boundary minute, set `play_time_to` one second past it (e.g. `17:00:01`) via the v2 REST API. The web UI’s `` is minute-precision, so second-level boundaries can only be set through the API. - The viewer re-evaluates the playlist when an asset’s window opens or closes; transitions are picked up within ~60 seconds. - DST and other clock changes use wall-clock semantics: a window configured for the spring-forward gap (02:00–03:00 on the affected day) simply will not fire that day; a window during the fall-back hour will fire twice. - v1.x of the REST API does not expose these fields; use v2 to set them. Existing v1.x clients see no change in behavior. ### Related documentation - Importing content from other platforms : add assets you can then schedule. - Display schedule : switch the screen itself off outside opening hours. - API reference : set scheduling fields programmatically with the v2 API. - All documentation : the full Anthias documentation index. --- # balena Fleet Deployment Source: https://anthias.screenly.io/docs/balena > Deploy Anthias on your own balena fleet. [← Documentation](/docs/) ## balena Fleet Deployment Deploy Anthias on your own balena fleet. You can use the Balena disk images provided in the releases page to install Anthias in your device. However, if you want more control and transparency over the Balena deployment, follow through the steps below to deploy Anthias on your Balena fleet. ### Getting started - Create a [balenaCloud](https://www.balena.io/cloud) account if you don’t have one already. - Install the [balena CLI](https://docs.balena.io/reference/balena-cli/) on your computer. It’s recommended to install it on a Linux machine but it should work on Windows and macOS as well. If you’re on Windows, you can use the Windows Subsystem for Linux (WSL) to install the CLI. See the [balena CLI installation instructions](https://github.com/balena-io/balena-cli/blob/master/INSTALL.md) . - On your terminal, login to your balenaCloud account using the CLI by running `balena login`. You’ll be prompted to select a login method. Select **Web authorization**, which is the recommended way to login. The browser will open a new tab. Click **Authorize** to proceed. - Install [balenaEtcher](https://etcher.balena.io/) on your computer. ### Create and configure a new fleet Open your browser and go to the [balenaCloud dashboard](https://dashboard.balena-cloud.com) . Login to your balenaCloud account if you haven’t already. You should be redirected to the dashboard. Click on the `Create fleet` button. Give your fleet a name and select the appropriate device type. Click on the `Create new fleet` button. You should be redirected to the fleet’s summary page. We’ll be doing the initial fleet configuration via CLI. Open your terminal and run the following commands: ``` $ balena env set BALENA_HOST_CONFIG_gpu_mem $GPU_MEM_VALUE --fleet $FLEET_NAME $ balena env set BALENA_HOST_CONFIG_dtoverlay vc4-kms-v3d --fleet $FLEET_NAME ``` If your display does have overscan issues like having a black border around the screen, you can disable overscan by running the following command: ``` $ balena env set BALENA_HOST_CONFIG_disable_overscan 1 --fleet $FLEET_NAME ``` Replace `$GPU_MEM_VALUE` with the GPU memory value you want to use, as long as it’s less than the total memory of your device. For example, for a 4GB Raspberry Pi 4, you can use `256` as the GPU memory value. Having insufficient GPU memory might cause video playback issues. You can confirm that the changes went through by running the following command: ``` balena envs --fleet $FLEET_NAME --config ``` Here’s a sample output: ``` ID NAME VALUE FLEET 1979572 BALENA_HOST_CONFIG_dtoverlay vc4-kms-v3d gh_nicomiguelino/anthias-pi4 1979571 BALENA_HOST_CONFIG_gpu_mem 1024 gh_nicomiguelino/anthias-pi4 ``` > Tip > > Alternatively, you can check the releases page of that fleet and look for the `BALENA_HOST_CONFIG_gpu_mem` and `BALENA_HOST_CONFIG_dtoverlay` variables. ### Deploy changes to the fleet Before proceeding, make sure that you have logged in by running `balena login`. You can verify if you’re logged in by running `balena whoami`. Open your terminal and clone the Anthias repository if you haven’t already: ``` $ cd $WORKSPACE_DIRECTORY $ git clone https://github.com/Screenly/Anthias.git $ cd Anthias/ ``` Run the following command: ``` $ ./bin/deploy_to_balena.sh \ --board $BOARD_TYPE \ --fleet $FLEET_NAME \ ``` `$BOARD_TYPE` is one of `pi2`, `pi3`, `pi3-64`, `pi4-64`, or `pi5` (`pi3` is the legacy 32-bit Raspberry Pi 3 image; `pi3-64` is the recommended 64-bit/Qt 6 image for Pi 3 hardware). Run `./bin/deploy_to_balena.sh --help` for the current list of supported boards. Running the command above will pull the latest Docker images from GHCR and push them to your balenaCloud account. It will also create a new release and deploy it to your fleet. If you want to deploy your local changes, run the following command instead: ``` # Take note of the --dev flag. $ ./bin/deploy_to_balena.sh \ --board $BOARD_TYPE \ --fleet $FLEET_NAME \ --dev ``` You can also include a `--shm-size` flag to specify the shared memory size, which defaults to `256mb`. For example: ``` $ ./bin/deploy_to_balena.sh \ --board $BOARD_TYPE \ --fleet $FLEET_NAME \ --shm-size 512mb ``` It would take a while for the deployment to finish. Once it’s done, you should see the new release in the fleet’s summary page. You can now add your devices to the fleet and they should be able to download the new release. ### Add a new device to the fleet Insert a microSD card to your computer. Open your browser and go to the [balenaCloud dashboard](https://dashboard.balena-cloud.com) . You should be redirected to your balenaCloud dashboard. Click on the fleet you created earlier. Click “Add device” on the fleet’s summary page. The “Add new device” page should appear. Leave the default values unchanged. Click “Flash” when ready. A new browser tab will open prompting you to open balenaEtcher. Click “Open” to proceed. Select the microSD card you inserted earlier and click “Flash”. Wait for the flashing process to finish. Remove the microSD card from your computer and insert it to your device. Power on the device and wait for it to appear on the fleet’s summary page. Once it appears, click on the device’s name to go to its summary page. Be patient while balenaCloud downloads the Docker images and starts the containers. It might take a while for the device to appear online. Once done, the display should show the Anthias splash screen. You can now add assets via the web interface. --- # Developer Documentation Source: https://anthias.screenly.io/docs/development > Develop and contribute to Anthias: architecture, services, building, and testing. [← Documentation](/docs/) ## Developer Documentation Develop and contribute to Anthias: architecture, services, building, and testing. ### Understanding the components that make up Anthias Here is a high-level overview of the different components that make Anthias: These components and their dependencies are mostly installed and handled with Ansible and Docker. - The **web app** component (`anthias-server`) is the single HTTP entrypoint, served by uvicorn (ASGI). It runs the Django front-end + REST API, serves static assets via WhiteNoise, streams uploaded media at `/anthias_assets/`, and exposes the WebSocket endpoint at `/ws` via Django Channels. Always plain HTTP, TLS is opt-in via the **anthias-caddy** sidecar that `bin/enable_ssl.sh` installs (Caddy local CA by default, or Let’s Encrypt with `--domain`). - The **viewer** (`anthias-viewer`) is what drives the screen (e.g., shows web page, image or video). It fetches media from `anthias-server` over HTTP. - The **Celery** (`anthias-celery`) component is for asynchronously queueing and executing tasks outside the HTTP request-response cycle (e.g., yt-dlp downloads, asset cleanup). It pushes asset-update events to connected WebSocket clients via the Redis-backed Channels layer. - **Redis** (`redis`) is used as the Celery broker/result backend and as the Channels channel layer. - The **database** component uses **SQLite** for storing the assets information. ### Dockerized development environment To simplify development of the server module of Anthias, we’ve created a Docker container. This is intended to run on your local machine with the Anthias repository mounted as a volume. > Important > > - Make sure that you have [installed Docker](https://docs.docker.com/engine/install/) on your machine before proceeding. > - Anthias is using Docker’s [buildx](https://docs.docker.com/engine/reference/commandline/buildx/) for the image builds. This is used both for cross compilation as well as for local caching. You might need to run `docker buildx create --use` first. Assuming you’re in the source code repository, simply run: ``` $ ./bin/start_development_server.sh # The console output was truncated for brevity. # ... [+] Running 4/4 ✔ Network anthias_default Created 0.1s ✔ Container anthias-redis-1 Started 0.2s ✔ Container anthias-anthias-server-1 Started 0.3s ✔ Container anthias-anthias-celery-1 Started 0.4s ``` > Note > > Running the script will install Python 3.11, [pyenv](https://github.com/pyenv/pyenv) , and [uv](https://docs.astral.sh/uv/) inside a Docker container on your machine. This is to ensure that the development environment is consistent across different machines. > > The script currently supports Debian-based systems and macOS. Running the command above will start the development server and you should be able to access the web interface at `http://localhost:8000`. To stop the development server, run the following: ``` docker compose -f docker-compose.dev.yml down ``` ### Building containers on the Raspberry Pi > Note > > Make sure that you have Docker installed on the device before proceeding. ``` $ ENVIRONMENT=production \ ./bin/generate_dev_mode_dockerfiles.sh $ MODE=build \ ./bin/upgrade_containers.sh ``` ### Django admin site Create a superuser account: ``` $ export COMPOSE_FILE=docker-compose.dev.yml $ docker compose exec anthias-server \ python manage.py createsuperuser # You will be prompted to enter a username, an email address, and a password. ``` Once you have created a superuser account, you can open the Django admin site at `http://localhost:8000/admin/` (with a trailing slash) and login with the credentials you just created. ### Testing #### Running the unit tests Build and start the containers. ``` $ uv run python -m tools.image_builder \ --dockerfiles-only \ --disable-cache-mounts \ --service redis \ --service test $ docker compose \ -f docker-compose.test.yml up -d --build ``` Run the unit tests. ``` $ docker compose \ -f docker-compose.test.yml \ exec anthias-test bash ./bin/prepare_test_environment.sh -s # Integration and non-integration tests should be run separately as the # former doesn't run as expected when run together with the latter. $ docker compose \ -f docker-compose.test.yml \ exec anthias-test ./manage.py test --exclude-tag=integration $ docker compose \ -f docker-compose.test.yml \ exec anthias-test ./manage.py test --tag=integration ``` #### The QA checklist We’ve also provided a checklist that can serve as a guide for testing Anthias manually. ### Generating CSS and JS files To get started, you need to start the development server first. See this section for details. #### Starting the bundler in development mode To start [Bun](https://bun.sh/) in development (watch) mode, run the following command: ``` $ docker compose -f docker-compose.dev.yml exec anthias-server \ bun run dev ``` This runs `bun build --watch` for JS/TS and `sass --watch` for SCSS in parallel. Making changes to the TypeScript, TSX, or SCSS files will automatically trigger a recompilation, generating the corresponding bundle and CSS files. #### Formatting and linting TypeScript code To run the linting and formatting checks on the TypeScript code, run the following command: ``` $ docker compose -f docker-compose.dev.yml exec anthias-server \ bun run lint:check $ docker compose -f docker-compose.dev.yml exec anthias-server \ bun run format:check ``` If you want to fix the linting errors and formatting issues, run the following command: ``` $ docker compose -f docker-compose.dev.yml exec anthias-server \ bun run lint:fix $ docker compose -f docker-compose.dev.yml exec anthias-server \ bun run format:fix ``` #### Closing the transpiler Just press `Ctrl-C` to close the bundler watch. ### Linting Python code locally The project uses `ruff` for linting the Python codebase. While the linter is being run on the CI/CD pipeline, you can also run it locally. There are several ways to do this. #### Run the linter using `act` [`act`](https://nektosact.com/) lets you run GitHub Actions locally. This is useful for testing the CI/CD pipeline locally. See the [act installation instructions](https://nektosact.com/installation/index.html) . After installing and setting up `act`, run the following command: ``` $ act -W .github/workflows/python-lint.yaml ``` The command above will run the linter on the all the Python files in the repository. If you want to run the linter on a specific file, you can try the commands in the next section. #### Running the linter using `uv` You have to install `uv` first. See the [uv installation instructions](https://docs.astral.sh/uv/getting-started/installation/) . After installing uv, run the following commands: ``` # Install the dependencies $ uv venv $ uv pip install --group dev-host $ uv run ruff check . ``` To run the linter on a specific file, run the following command: ``` $ uv run ruff check /path/to/file.py ``` ### Managing releases #### Creating a new release Check what the latest release is: ``` $ git pull $ git tag # Running the `git tag` command should output something like this: # 0.16 # ... # v0.18.6 ``` Create a new release: ``` $ git tag -a v0.18.7 -m "Test new automated disk images" ``` Push release: ``` $ git push origin v0.18.7 ``` #### Delete a broken release ``` $ git tag -d v0.18.5 [±master ✓] Deleted tag 'v0.18.5' (was 9b86c39) $ git push --delete origin v0.18.5 [±master ✓] ``` ### Directories and files explained In this section, we’ll explain the different directories and files that are present in a Raspberry Pi with Anthias installed. #### `/home/${USER}/anthias/` - All of the files and folders from the Github repo should be cloned into this directory. - On installations created before the rename, this directory is `/home/${USER}/screenly/`: the installer migrates it to `anthias/` on upgrade and leaves a back-compat symlink at the old path for one release. #### `/home/${USER}/.anthias/` - `default_assets.yml`: configuration file which contains the default assets that get added to the assets list if enabled - `anthias.conf`: configuration file for web interface settings - `anthias.db` – database file containing current assets information. - On pre-rename installations this directory is `~/.screenly/` containing `screenly.conf` / `screenly.db`; the installer migrates them. #### `/etc/systemd/system/` - `anthias-host-agent.service`: starts the Python script `host_agent.py`, which subscribes from the Redis component and performs a system call to shutdown or reboot the device when the message is received. #### `/etc/sudoers.d/anthias_overrides` - `sudoers` configuration file that allows pi user to execute certain `sudo` commands without being a superuser (i.e., `root`) #### `/usr/share/plymouth/themes/anthias` - `anthias.plymouth`: Plymouth config file (sets module name, `ImageDir` and `ScriptFile` dir) - `anthias.script` – plymouth script file that loads and scales the splash screen image during the boot process - `splashscreen.png`: the splash screen image that is displayed during the boot process ### Debugging the Anthias WebView ``` export QT_LOGGING_DEBUG=1 export QT_LOGGING_RULES="*.debug=true" export QT_QPA_EGLFS_DEBUG=1 ``` The Anthias WebView is a custom-built web browser based on the [Qt](https://www.qt.io/) toolkit framework. The browser is assembled with a Dockerfile and built by a `src/anthias_webview/build_qt#.sh` script. For further info on these files and more, browse the [`anthias_webview` source directory on GitHub](https://github.com/Screenly/Anthias/tree/master/src/anthias_webview) . ### Related documentation - QA checklist : the manual testing guide referenced above. - Installation options : set up a device to test your changes on. - API reference : the REST API you’ll build against. - All documentation : the full Anthias documentation index. --- # Display Schedule Source: https://anthias.screenly.io/docs/display-schedule > Switch the screen off outside opening hours on a daily on/off schedule. [← Documentation](/docs/) ## Display Schedule Switch the screen off outside opening hours on a daily on/off schedule. A device can switch its screen off outside opening hours and back on in the morning, on a daily schedule with per-weekday selection. The schedule is **off by default**, so a device that has always stayed lit keeps doing so after an upgrade. Configure it under **Settings → Display schedule**. ### What actually happens at the scheduled time Two things are sent on every transition, not one, because a device can have a TV on one HDMI port and a plain monitor on another: | Layer | Effect | | --- | --- | | HDMI-CEC | A TV that supports CEC genuinely powers down and back up. Sent to **every** HDMI port with a live CEC link, so a second attached display is not left lit. | | Local blanking | The viewer blacks the screen out. On wayland boards this is a real DPMS off via `wlr-randr`; on the eglfs and linuxfb boards the viewer paints the screen black, because the Qt app holds DRM master and an external blank would be rejected. | Most desktop monitors do not answer CEC at all, so on those the screen goes black rather than powering down. Nothing needs configuring for this: the schedule is not hidden or disabled on a device with no CEC adapter. ### Field reference | Field | Type | Default | Effect | | --- | --- | --- | --- | | `display_power_schedule_enabled` | bool | `false` | Master switch for the schedule | | `display_power_on_time` | `HH:MM` | `08:00` | Time of day the display switches on | | `display_power_off_time` | `HH:MM` | `18:00` | Time of day the display switches off | | `display_power_days` | comma-separated ints `0`-`6` (Mon=0 … Sun=6) | `0,1,2,3,4,5,6` | Weekdays on which an on-period **begins** | Times are wall-clock in the device’s configured timezone (**Settings → Timezone**), so they follow DST rather than drifting with it. > Note > > The weekday numbering here is Monday=0 … Sunday=6, which is *not* the Monday=1 … Sunday=7 numbering used by asset scheduling ’s `play_days`. The two features were added at different times against different conventions; the web UI hides the difference behind the same day chips in both places. ### Days and overnight schedules `display_power_days` selects the days an on-period *starts*. For a schedule that runs past midnight, the small hours belong to the previous day’s on-period, so they are governed by the previous day’s checkbox. For example, on 18:00 → 06:00 with only Friday selected: | Local time | Display | Why | | --- | --- | --- | | Fri 17:30 | Off | Before the on-period | | Fri 18:00 | On | On-period starts on Fri | | Sat 02:00 | On | Still Friday’s on-period | | Sat 06:00 | Off | On-period ends | | Sat 18:00 | Off | Sat is not selected | A same-day schedule (on 08:00 → off 18:00) needs no special handling: the whole on-period falls on the selected day. If the on and off times are identical, the schedule describes neither an on-period nor an off-period, and the device is left alone. Deselecting every day means *every* day, not *no* day: an enabled schedule with no days selected would be silently inert, so the empty selection is treated as the full week. To stop the schedule entirely, switch it off. ### Turning the schedule off Disabling the schedule while the display is switched off restores it on the next tick, rather than leaving a black screen with no way back. This matters on a device with no CEC adapter, where the manual display-power buttons are hidden entirely. ### Setting it through the API The four fields are readable and writable on the v2 device-settings endpoint, alongside the rest of the settings page: ``` $ curl http:///api/v2/device_settings $ curl -X PATCH http:///api/v2/device_settings \ -H 'Content-Type: application/json' \ -d '{ "display_power_schedule_enabled": true, "display_power_on_time": "07:30", "display_power_off_time": "22:00", "display_power_days": "0,1,2,3,4" }' ``` Unlike the web form, which keeps the previous value and shows a warning, the API returns `400` for a malformed time or weekday: a client that explicitly sent a field should be told the value was wrong rather than have it reinterpreted. `HH:MM:SS` is accepted and normalized to `HH:MM`, and an empty `display_power_days` normalizes to every day. See the API page for the full endpoint reference. ### Manual control **Settings → Display power** (marked *Experimental*) has “Turn display on” / “Turn display off” buttons for a one-off change. That section is CEC-only and appears only on devices that expose a CEC adapter, so it is not a substitute for the schedule on a plain monitor. A manual change is temporary while the schedule is enabled. The schedule re-asserts the state it thinks the display should be in roughly every 10 minutes, so switching the screen on during an off-period buys about 10 minutes before it goes off again. That re-assertion is what makes the feature survive a viewer restart: without it, a viewer that restarted at 22:00 would come back lit and stay lit until morning. ### Notes and limitations - Transitions are applied within about 60 seconds of the configured time. - Whether HDMI-CEC works at all depends on the display, the cable and the port. Many desktop monitors advertise no CEC in their EDID, and most x86 PCs have no CEC adapter. In that case the screen still goes black on schedule via local blanking; it just is not powered down. - CEC is driven by the `anthias-viewer` container, which is the only one that can reach `/dev/cec*` on every board and every deployment. If the viewer is not running, display power reports an error. - The **System Info** page has a “Display Power (CEC)” card showing what the device last read back over CEC: | Reading | Meaning | | --- | --- | | `True` / `False` | Every display that answered is on / in standby | | `Mixed` | Two displays are attached and disagree, or one is mid-transition | | `No CEC display detected` | Nothing answered. The normal reading for a plain monitor, and not a fault | | `No CEC adapter` | The board exposes no CEC hardware at all | | `Not available` | Same, short-circuited before the query was sent | | `CEC error` | The query could not be completed. The only reading that means something is wrong | ### Related documentation - Asset scheduling : restrict individual assets to days and time windows. - API reference : set the schedule programmatically with the v2 API. - All documentation : the full Anthias documentation index. --- # Importing Content from Other Platforms Source: https://anthias.screenly.io/docs/import-content > Bring images, videos, and web pages into Anthias from another digital signage platform. [← Documentation](/docs/) ## Importing Content from Other Platforms Bring images, videos, and web pages into Anthias from another digital signage platform. Moving to Anthias from another digital signage platform? Anthias ships a built-in import wizard that copies your media across using the other platform’s API, so no SSH or scripts are required. Your existing Anthias assets are left untouched, and re-running an import skips anything already brought over, so it is safe to run more than once. **Supported platforms:** Yodeck, ScreenCloud, piSignage, and Xibo (Xibo Cloud or self-hosted). ### What gets imported Anthias imports the content types it can play natively: - **Images** and **videos**: the file is downloaded onto your player and added to the schedule (the original where the platform exposes it, or the best available rendition otherwise). - **Web pages**: added as a web asset pointing at the same URL. Anything Anthias cannot play, or that would not work outside the source platform, is **skipped and reported** rather than imported half-way: - **Audio** and **documents** (PDF, PowerPoint, and similar). - **Apps and internally-generated content**: weather, clock, RSS, and dashboard widgets render inside the source platform, so their internal URLs would only produce broken assets on Anthias. - **Files with no downloadable URL**: when the platform exposes neither the original nor a usable rendition, the item is flagged for you to re-upload manually. ### Before you start You will need API credentials for the platform you are importing from. What to enter differs slightly per platform, and the wizard shows a reminder for each. Credentials are **not** stored on the device; they are only used to talk to the platform’s API while the import runs. | Platform | What to enter in the wizard | Where to create it | | --- | --- | --- | | **Yodeck** | Your API token | Account Settings → Advanced Settings → API Tokens | | **ScreenCloud** | Your API token (the region is detected automatically) | Studio → Account Settings → Developer → New Token | | **piSignage** | `subdomain:email:password` (the `` in `.pisignage.com`, plus your login) | Your piSignage account login | | **Xibo** | `cms-url client_id client_secret` (space separated; the CMS URL works for Xibo Cloud or self-hosted) | Applications → Add (an API application) | ### Run the import 1. Open your Anthias web interface and go to **Settings**. 2. In the **Import content** section, click **Import from **** for the platform you are moving from. 3. Paste your credentials and click **Continue**. Anthias validates them before listing your media. 4. Review the list of media found. Supported items are selected by default; unsupported items are shown with the reason they will be skipped. Use **Select all** / **Select none** or the per-item checkboxes to adjust. 5. Leave **Enable imported assets** ticked to have them start playing right away, or untick it to import them disabled and enable them later. 6. Click **Import *N* items**. Each selected item is copied in turn, with live per-item progress. 7. When it finishes, any items that failed can be retried with the **Retry *N* failed** button, without repeating the ones that already succeeded. That is it. Your imported media now lives on your Anthias player, ready to schedule like any other asset. ### Prefer the command line? The same import runs headlessly for support and automation: ``` $ docker compose exec anthias-server \ python manage.py import_content --provider yodeck --token '' ``` Use `--provider` with one of `yodeck`, `screencloud`, `pisignage`, or `xibo`, and pass the same credentials you would enter in the wizard. Add `--dry-run` to list what would be imported without copying anything. ### Related documentation - Asset scheduling : schedule the assets you import. - Migrating assets to Screenly : move assets the other way, up to a Screenly cloud account. - All documentation : the full Anthias documentation index. --- # Installation Options Source: https://anthias.screenly.io/docs/install > Install Anthias on Raspberry Pi or Debian: imager, balenaHub, releases, or scripted install. [← Documentation](/docs/) ## Installation Options Install Anthias on Raspberry Pi or Debian: imager, balenaHub, releases, or scripted install. ### Recommended: Raspberry Pi Imager > **Recommended for most users** > > No command line, no scripts, just flash an SD card and boot. If you’re not sure which method to use, use this one. The scripted install further down is for advanced users who want to install onto an existing Raspberry Pi OS Lite / Debian system or a PC. The quickest way to get started on a Raspberry Pi is to use [Raspberry Pi Imager](https://www.raspberrypi.com/software/) , where you can find Anthias under **Other specific-purpose OS → Digital signage and kiosks → Anthias**. Pick the entry that matches your Pi (Pi 2, Pi 3, Pi 4, or Pi 5), select your SD card, and flash. The device boots straight into Anthias. ### Using the images from balenaHub > Important > > This option is recommended for those who want to install Anthias without touching the command line interface. When a new rolling release is available, updates will automatically be installed on your device. Balena made a [big update to their IoT marketplace](https://blog.balena.io/creating-an-iot-marketplace/) . Included in that change is the launch of [Fleets for Good](https://hub.balena.io/fleets-for-good) . With that, you may find it hard to find the Anthias images on the marketplace. In the meantime, here are the links to the images: - [Raspberry Pi 5](https://hub.balena.io/fleets-for-good/2209774/anthias-pi5) - [Raspberry Pi 4](https://hub.balena.io/fleets-for-good/1971389/anthias-pi4) - Raspberry Pi 3 (64-bit) : recommended for Pi 3 hardware (Qt 6 viewer); ships as `anthias-pi3-64` in the pre-built release images - [Raspberry Pi 3 (32-bit)](https://hub.balena.io/fleets-for-good/1971388/anthias-pi3) : legacy; consider the 64-bit image above - [Raspberry Pi 2](https://hub.balena.io/fleets-for-good/1971385/anthias-pi2) - Rock Pi 4 (Model B) : ships as `anthias-rockpi4` in the pre-built release images Go to one of the links above and click the *Join* button, then select either *Ethernet only* or *Wifi + Ethernet* for Network options. You can either click the *Flash* button to open balenaEtcher (make sure that it’s installed) or download the image file and flash it using your preferred imager. Flash the SD card and boot up your Raspberry Pi. It will take a few minutes to boot up and start the services. Alternatively, you can download our pre-built Balena disk images from the releases . ### Using the images from the releases You can find the [latest release on GitHub](https://github.com/Screenly/Anthias/releases/latest) . From there, you can download the disk image that you need and flash it to your SD card. The image file looks something like `--
-anthias-.img.xz`. Take note that the `.img` file is compressed in this `.img.xz` file. > Note > > We release the images in `.img.xz` format so that they are smaller in size. Both [Raspberry Pi Imager](https://www.raspberrypi.com/software/) and [balenaEtcher](https://etcher.balena.io/) flash `.img.xz` files directly. There’s no need to decompress them first. If you ever want the raw `.img`, you can extract it yourself: > > ``` > xz -d --
-anthias-.img.xz > ``` > **macOS: “Error writing to storage device”** > > Raspberry Pi Imager **2.0.2 through at least 2.0.7** has a macOS bug that aborts mid-write with *“Error writing to storage device. Some writes failed to complete.”* It is triggered by writing any image that is decompressed on the fly, our `.img.xz` images as well as uncompressed `.img` files (see rpi-imager [#1605](https://github.com/raspberrypi/rpi-imager/issues/1605) and [#1489](https://github.com/raspberrypi/rpi-imager/issues/1489) ). The card itself is fine. > > The fix was merged upstream in [rpi-imager#1621](https://github.com/raspberrypi/rpi-imager/pull/1621) (May 2026), so the simplest solution is to **update Raspberry Pi Imager to a release newer than 2.0.7**. If you can’t update, work around it by decompressing the image yourself and flashing the resulting `.img`: > > ``` > xz -d --
-anthias-.img.xz > ``` > > Then select the extracted `.img` in Raspberry Pi Imager (or [balenaEtcher](https://etcher.balena.io/) ), which skips the on-the-fly decompression path that trips the bug. Devices installed from a disk image join the balena fleet and track the latest stable release. The image ships preloaded with the release it was built from, so the device boots and runs fully offline out of the box, then receives later releases automatically over the air once it has connectivity. ### Advanced: scripted install on Raspberry Pi OS Lite or Debian > **Advanced method** > > This method uses the command line and is aimed at users who want more control, a specific OS, an existing Raspberry Pi OS Lite / Debian install, or a PC (x86). **If you just want to get going on a Raspberry Pi, use the Raspberry Pi Imager method above instead.** ##### Overview If you’d like more control over your digital signage instance, you can install it on Raspberry Pi OS Lite or Debian with a single command. > Important > > Installing on a **PC (x86)**? Follow the PC installation guide first to prepare Debian, the script below assumes that setup. > Note > > For Raspberry Pi 5: > > - We recommend using the 64-bit version of Raspberry Pi OS Lite (Trixie or Bookworm) > - 32-bit Raspberry Pi OS is not supported on Pi 5 > - If you experience any issues, please report them either: > > - On our [forums](https://forums.screenly.io) > - As a [GitHub issue](https://github.com/Screenly/Anthias/issues) > - In [GitHub Discussions](https://github.com/Screenly/Anthias/discussions) The TL;DR for on [Raspberry Pi OS](https://www.raspberrypi.com/software/) or Debian is: ``` $ bash <(curl -sL https://install-anthias.srly.io) ``` > **Prefer to read the script before running it?** > > Piping a remote script straight into your shell is convenient, but it’s perfectly reasonable to want to see what it does first. Download it, review it, then run it: > > ``` > curl -fsSL https://install-anthias.srly.io -o install-anthias.sh > less install-anthias.sh # read through it > bash install-anthias.sh > ``` > > The installer is open source. You can also read it in the [Anthias repository](https://github.com/Screenly/Anthias/blob/master/bin/install.sh) . You’ll be prompted with the following questions: - Do you still want to continue? - Would you like Anthias to manage the network for you? - Which version of Anthias would you like to install? - Would you like to perform a full system upgrade as well? You can either use the arrow keys to select your choice and then press Enter or type `y` or `n` (for yes-no questions). The installer will display your responses before proceeding with the installation. **This installation will take 15 minutes to several hours**, depending on variables such as: - The Raspberry Pi hardware version - The SD card - The internet connection > Note > > During ideal conditions (Raspberry Pi 3 Model B+, class 10 SD card and fast internet connection), the installation normally takes 15-30 minutes. ##### Prompt: Network Management Opting for network management will enable and configure the [NetworkManager](https://wiki.debian.org/NetworkManager) service on your device. ##### Prompt: Version Selection You can choose between the following choices: `latest` and `tag`. - Selecting `latest` will install the version from the `master` branch. - Selecting `tag` will prompt you to enter a specific tag to install. - Do take note that `latest` is a rolling release, so you’ll always get the latest changes. ###### Installing from a Specific Tag Select this option if you want to install a pinned version of Anthias. You’ll be prompted to enter a specific tag to install. You can find the tags in the [releases](https://github.com/Screenly/Anthias/releases) page. The script will check if the tag specified is valid and can be installed. If it’s not, you need to run the script again and enter a valid tag. ##### Prompt: Full System Upgrade If you’ve selected **Yes** when prompted for an upgrade – i.e., “Would you like to perform a full system upgrade as well?” – you’ll get the following message when the installer is almost done executing: ``` Please reboot and run `/home/$USER/anthias/bin/upgrade_containers.sh` to complete the installation. Would you like to reboot now? ``` You have the option to reboot now or later. On the next boot, make sure to run `upgrade_containers.sh`, as mentioned above. Otherwise, if you’ve selected **No** for the system upgrade, then you don’t need to do a reboot for the containers to be started. However, it’s still recommended to do a reboot. ### Installing with Balena Go through the steps in this documentation to deploy Anthias on your own Balena fleet. ### Installing on a Raspberry Pi 5 with an SSD Go through the steps in this documentation to deploy Anthias on a Pi5 with an SSD --- # Migrating Assets to Screenly Source: https://anthias.screenly.io/docs/migrate-to-screenly > Copy a player's assets from Anthias to a Screenly cloud account. [← Documentation](/docs/) ## Migrating Assets to Screenly Copy a player's assets from Anthias to a Screenly cloud account. Screenly is the commercial, cloud-managed sibling of Anthias. If you want to move a player’s assets up to a Screenly account, Anthias ships a built-in migration wizard, no SSH or scripts required. Existing assets already on Screenly are left untouched. ### Before you start You’ll need a Screenly API token: 1. **Sign up or sign in to Screenly** at [login.screenlyapp.com](https://login.screenlyapp.com/login) . 2. In the Screenly dashboard, go to **Settings → Security → API Tokens** and create a new token. 3. Keep the token handy. It looks like `abcdef.123456…`. The token is not stored on the device. It is only used to talk to Screenly’s API while the migration runs. ### Run the migration 1. Open your Anthias web interface and go to **Settings**. 2. In the **Migrate to Screenly** section, click **Start migration**. 3. On the **Get started** screen, review the steps and click **I have a token**. 4. Paste your Screenly API token and click **Continue**. Anthias validates the token against Screenly before moving on. 5. Choose which assets to migrate. All assets are selected by default; use **Select all** / **Select none** or the per-asset checkboxes to adjust. 6. Click the **Migrate *N* assets** button. Each selected asset is uploaded to Screenly in turn, with live per-asset progress. 7. When it finishes, any assets that failed can be re-uploaded with the **Retry *N* failed** button, without repeating the ones that already succeeded. That’s it. Your selected assets now live in your Screenly account. ### What gets migrated The wizard copies the **media assets** stored on the device, images, videos, and web-page URLs, up to your Screenly account. Each asset keeps its name and its underlying file. What does **not** transfer automatically: - **Schedules and playlists.** Screenly and Anthias model scheduling differently, so start/end times, durations, and playlist order are not carried over. You rebuild those in the Screenly dashboard once the assets have landed. - **Device settings.** Network, SSL, and display configuration are specific to the Anthias host and stay on the device. - **Assets already in Screenly.** The wizard skips anything it detects is already present, so re-running a migration will not create duplicates. ### Good to know - The migration is **non-destructive**: your assets remain on the Anthias device after they are copied. Nothing is deleted locally. - You can run the wizard as many times as you like, for example, to push a new batch of assets you added after the first run. - Large videos take longer to upload; the per-asset progress bar shows which asset is in flight so you can leave it running unattended. ### Troubleshooting - **“Invalid token.”** Double-check that you copied the whole token (they look like `abcdef.123456…`) and that it has not been revoked in **Settings → Security → API Tokens** on Screenly. - **An asset fails to upload.** Use the **Retry *N* failed** button. It re-uploads only the assets that did not succeed, so you never re-send the ones that already made it across. - **The device can’t reach Screenly.** The migration talks to Screenly’s API over HTTPS, so the device needs outbound internet access. Confirm the player is online before starting. ### Related documentation - Importing content from other platforms : bring assets *into* Anthias from other digital-signage tools. - Asset scheduling : how scheduling works on Anthias. - All documentation : the full Anthias documentation index. --- # PC (x86) Installation Source: https://anthias.screenly.io/docs/pc > Install Anthias on PC / x86 hardware running Debian 13 (Trixie) or Debian 12 (Bookworm). [← Documentation](/docs/) ## PC (x86) Installation Install Anthias on PC / x86 hardware running Debian 13 (Trixie) or Debian 12 (Bookworm). Anthias runs on any 64-bit PC (something like an Intel NUC works well) once you’ve prepared a fresh Debian install. Pre-built BalenaOS images aren’t available for PC hardware yet, so you’ll install Debian manually and then run the standard Anthias installer on top of it. > Note > > Anthias supports **64-bit Debian 13 (Trixie)** and **64-bit Debian 12 (Bookworm)** on PCs. > **No desktop environment required (or wanted)** > > The host runs headless, no GNOME, no KDE, no Xorg, no display manager. The Anthias viewer container ships its own minimal Wayland compositor (`cage`, a wlroots-based kiosk compositor) which acquires DRM master directly from the kernel and renders straight to the HDMI output. A pre-installed desktop would compete with it for the display and break the boot-to-content experience. > > If you already installed Debian with a desktop, remove it (`sudo apt purge --auto-remove gnome\* xserver-xorg\* lightdm gdm3 sddm` and reboot) before continuing. ### What you’ll need - A 64-bit PC (most NUCs, mini-PCs, and old laptops work). - A USB drive (4 GB or larger) to write the Debian installer to. - A keyboard, monitor, and network cable for the PC during install. ### Step 1: Download Debian Download the **netinst** image for AMD64 from the [official Debian website](https://www.debian.org/download) . The filename will look like: ``` debian-13.x.x-amd64-netinst.iso ``` ### Step 2: Write the installer to a USB drive Flash the ISO to a USB drive using one of: - [balenaEtcher](https://www.balena.io/etcher/) : recommended, cross-platform. - Raspberry Pi Imager: pick **Use custom** and select the ISO. ### Step 3: Install Debian 1. Plug the USB drive into the PC. 2. Set the boot order in BIOS/UEFI to boot from USB first. 3. Power on the PC and follow the Debian installer prompts. When you reach these screens, choose: - **Root password:** leave it blank. When you skip the root password, the Debian installer installs `sudo` and adds your regular user to the `sudo` group automatically. If you *set* a root password instead, Debian does **neither**: `sudo` won’t even be installed, and you’ll have extra work to do in Step 4. Leaving it blank is strongly recommended. - **Partitioning:** use the entire disk. - **Software selection:** check only **SSH server** and **standard system utilities**. **Uncheck every desktop environment** (GNOME, Xfce, KDE Plasma, …): Anthias renders from inside a container and does not use any host-side graphical session. 4. When the installer finishes, remove the USB drive **before** the system reboots into the freshly installed Debian. ### Step 4: Prepare the system for Anthias Once you can SSH (or log in locally) to the new install: > **If you set a root password in Step 3** > > Your user can’t run `sudo` yet. In fact `sudo` isn’t installed, so every command below will fail with `sudo: command not found`. Fix this once, as `root`, then continue: > > ``` > $ su - # enter the root password you set > # apt update && apt install -y sudo > # /usr/sbin/usermod -aG sudo # replace > # exit > ``` > > Log out and back in (so your new group membership takes effect), then continue below. If you left the root password blank, skip this box. `sudo` already works. 1. Install `curl` if it isn’t already there: ``` $ sudo apt update $ sudo apt install -y curl ``` 2. Allow your user to run `sudo` without entering a password. The Anthias installer expects this. Open the sudoers file: ``` $ sudo visudo ``` Add this line at the end (replace `` with your actual username): ``` ALL=(ALL) NOPASSWD: ALL ``` Save and exit the editor. ### Step 5: Run the Anthias installer You’re now ready to run the standard installer. Follow the [scripted install steps](/docs/install/#advanced-scripted-install-on-raspberry-pi-os-lite-or-debian) . They’re the same on PC as on a Raspberry Pi. ### References - [Official Debian Installation Guide (Trixie / amd64)](https://www.debian.org/releases/trixie/amd64) --- # Raspberry Pi 5 SSD Install Source: https://anthias.screenly.io/docs/pi5-ssd > Install Anthias on a Raspberry Pi 5 with an SSD. [← Documentation](/docs/) ## Raspberry Pi 5 SSD Install Install Anthias on a Raspberry Pi 5 with an SSD. ### Hardware The following guide has been tested using a Raspberry Pi 5 with 8GB RAM and a [GeeekPi P33 PoE+PCI-e HAT](https://pipci.jeffgeerling.com/hats/geeekpi-p33-m2-nvme-poe-hat.html) . Other HATs should work just fine as long as they are supported by the Pi. The author of this guide used a 256GB M.2 NVMe SSD as it came in the 2242 (22mm x 44mm) form factor. The original version of the P33 HAT only supported 2230 and 2242 SSDs, but a newer version extends further and supports 2260 and 2280 SSDs as well. ### Booting Early Pi 5s do not support PCIe boot as part of the factory bootloader configuration. If you have a version of the bootloader prior to at least **Mon 23 Sep 13:02:56 UTC 2024 (1727096576)** then it is likely that you will need to follow the Boot from SD steps first. ### Installation Using the Raspberry Pi Imager and appropriate USB adapters, write the 64-bit version of **Raspberry Pi OS Lite (Trixie or Bookworm)** to the microSD card. Depending on your deployment preference, you can either write the same OS or you can deploy the **BalenaOS** image to the SSD. There are a few alternative ways to install: - Network boot (if enabled on the Pi) - Booting from the microSD card and using the SD Card copier utility to copy the OS to the SSD - Booting from the microSD and using the Raspberry Pi Imager to write a fresh copy to the SSD - Using `rpiboot` mode to display the SSD as a mass storage device on a PC. Do whatever is easiest for you! #### Boot from SD Depending on the bootloader version of your Pi (confirmed that as of at least **Mon 23 Sep 13:02:56 UTC 2024 (1727096576)** you do not need to perform this step), you may need to boot from microSD first and set the bootloader to boot from PCIe. > Note > > You can check the bootloader version by using the command `sudo rpi-eeprom-update` which will tell you what version your Pi 5 is running. This command will also tell you if an update is available, which you can install with `sudo rpi-eeprom-update -a`. The author of this document would welcome feedback if once the above update is performed, whether you still need to run the command below. The author tested the below and found it successful, then updated the bootloader so your mileage may vary! This looks a little bit like the following: - Once booted, run the RPI EEPROM configurator: `sudo rpi-eeprom-config -edit`. This will open up the [Nano](https://www.nano-editor.org/) text editor. - Change the boot order to: `BOOT_ORDER=0xf614` - Add the line: `PCIE_PROBE=1` - Type **Ctrl-O** to save the file. - Type **Ctrl-X** to exit the editor. - Remove the microSD card, and power cycle the Pi. #### Boot from SSD Once your Pi is booting from the SSD, if you installed the Raspberry Pi OS image you have a couple of housekeeping tasks to perform; - Update the OS using `sudo apt update` and `sudo apt full-upgrade -y` - Check the bootloader is at the latest version using `sudo rpi-eeprom-update` - If there is an EEPROM update, then use `sudo raspi-config` to update it - Go to `6 Advanced Options` → `A5 Bootloader Version` → `E1 Latest`, then select `Yes` - Reboot the Pi. - Finally, you’ll need to run the Anthias installer: `bash <(curl -sL https://install-anthias.srly.io)` - Follow the prompts to install and reboot the Pi - Once the install has completed, don’t forget to change the password for your Pi using `passwd` #### Check your boot order You can view your current boot order by running `rpi-eeprom-config` and checking the output. Using [this document](https://www.raspberrypi.com/documentation/computers/raspberry-pi.html#BOOT_ORDER) you can view the boot options and configure your boot order to suit your requirements. #### Post Install Issues > Note > > If you still get a black screen after the installation completes and after a reboot, simply press `Ctrl-Alt-F1` to get into the console (or SSH in) and then run `./anthias/bin/upgrade_containers.sh`. This should re-run the container creation step and have the system up and running properly. --- # QA Checklist Source: https://anthias.screenly.io/docs/qa > Manual testing checklist for Anthias. [← Documentation](/docs/) ## QA Checklist Manual testing checklist for Anthias. Running unit tests is a good way to make sure that the code is working as expected. However, it’s also important to do manual testing as some bugs may not be caught by unit tests. This document contains a list of things that you can do to test the application manually. > Note > > The list is not exhaustive, but you can use it as your guide when testing Anthias. ### General 1. Make sure that device is connected to the internet (e.g., via Ethernet). 2. Turn on the device and wait for the splash page to appear. 3. Make sure that the splash page is being displayed properly. 4. Use the provided IP address and make sure that entering it in a browser will redirect you to the web UI home page (the assets page). ### Content page 1. Add assets (image, video, or webpage) and make them active by toggling the switch. 2. Make sure that these assets are shown on the screen. 3. Disable the assets and make sure that the screen is in standby mode, which means that it displays the Anthias standby page. 4. Change a duration for any asset and make sure that it is being displayed for the specified duration. 5. Change the start and end dates and make sure that the asset is being displayed only during the specified period. 6. Turn on some assets and change their order (by dragging and dropping them). Make sure that the assets are being displayed in the correct order. 7. Try to change a name of any asset. 8. Turn on some assets. Click on Previous asset and on Next asset. Make sure that the screen displays the asset that comes before or after the current asset. 9. Click on the download button near any asset. The asset should be downloaded into your computer. ### Settings page 1. Go to the Settings page. 2. If desired, change the device’s **Player name**. 3. Change a default value for the **Default duration** and upload any asset. Make sure that the duration value is correct. 4. Change a default value for the **Default streaming duration** and upload any stream. Make sure that the asset is being displayed for the specified duration. 5. Enable **Show splash screen** and reboot the device. Make sure that the splash screen is being displayed upon boot. 6. Enable **Default assets** and make sure that the default assets are added to the list of active assets. Also make sure that the assets are being displayed on the screen. 7. Disable **Default assets** and make sure that the assets are deleted from the list of active assets. Also make sure that the assets are not being displayed on the screen. 8. Enable **Shuffle playlist**. Activate some assets and make sure that the assets are being displayed in random order. 9. Enable **Use 24-hour clock**. Go to the assets page and make sure that the time field uses correct format. 10. Enable any video asset with sounds and choose **HDMI** for the **Audio output**. Make sure that the sound works. 11. Enable any video file with sounds and choose **3.5mm** jack for the **Audio output**. Make sure that the sound works. 12. Choose any format for the **Date format**. Go to the assets page and make sure that the date field uses the correct format. 13. Enable authentication by selecting **Basic** from the **Authentication** dropdown, set a username + password, save, then reload. You should be prompted to log in. Verify both credential paths still reach the API: - Browser session: log in via the form, dashboard works. - Legacy HTTP Basic: `curl -u user:pass http:///api/v2/assets` still works, and the server logs a `DEPRECATED: HTTP Basic auth used …` warning. 14. Click the **Get Backup** button. Delete all assets. Click on **Upload and Recover** and make sure that the assets are restored. 15. Try to reboot or shutdown the device by clicking on the **Reboot** or **Shutdown** buttons, respectively. Make sure that the device does the corresponding action. 16. Go to the **System Info** page and make sure that all information are correct. 17. Make sure that all the footer links are being displayed correctly. 18. Connect to the device by ssh. Run `./bin/enable_ssl.sh` script. Make sure the site URL uses SSL. --- # Free Digital Signage Software Source: https://anthias.screenly.io/free-digital-signage-software > Anthias is free digital signage software for Raspberry Pi, x86 PCs and ARM single-board computers. Open source, self-hosted, with no subscriptions, no per-screen fees and no trial period. ## Free Digital Signage Software Anthias is free digital signage software for Raspberry Pi, x86 PCs and ARM single-board computers. Open source, self-hosted, with no subscriptions, no per-screen fees and no trial period. Anthias is **free digital signage software**. Not a trial, not a one-screen teaser plan, and not a free tier designed to run out. It is open source under GPLv2, it runs on hardware you already own, and there is no paid version of it to upgrade to. ### What “free” means here Most digital signage freeware turns out to be a limited edition of a paid product. Anthias is the whole thing: - **No subscription.** No monthly bill, ever, at any number of screens. - **No per-screen license.** Run one display or fifty at no software cost. - **No account.** Nothing to sign up for, no email address, no card. - **No time limit or watermark.** Nothing expires and nothing is stamped on your content. - **Open source.** Read, modify and redistribute it under [GPLv2](https://github.com/Screenly/Anthias/blob/master/LICENSE) . ### Runs on hardware you already have You are not buying into a proprietary player. Anthias runs on: - **Raspberry Pi 2 through Pi 5.** A Pi 4 or Pi 5 is the recommendation for anything new. - **64-bit x86 PCs**, including an Intel NUC, a mini PC, or an old desktop or laptop you have retired. - **Generic 64-bit ARM single-board computers** via [Armbian](https://www.armbian.com/) , such as Rock Pi, Orange Pi and Banana Pi boards, on a best-effort basis. Add a screen with an HDMI input and that is the whole bill of materials. Your only costs are the hardware and the electricity. ### What you get Upload an image or video, or point a screen at any web page, then set how long each item shows and give it a start and end date. Anthias loops the active playlist automatically and plays uploaded media from local storage, so the screen keeps running if the network drops. Paste a YouTube link and the video is downloaded to play locally, without buffering and without ads or recommended videos appearing over your content. Scheduling goes down to days of the week and a daily time window, uploads never interrupt what is on screen, and a single backup file holds your settings and asset list so you can restore it later or move it to a new device. There is also a REST API if you would rather drive content from a script than by hand, and a library of [free signage apps](https://signage-apps.com/?utm_source=anthias.screenly.io&utm_medium=referral&utm_campaign=free-software) that drop straight in, including [weather](https://signage-apps.com/weather/?utm_source=anthias.screenly.io&utm_medium=referral&utm_campaign=free-software) , news feeds and a [world clock](https://signage-apps.com/world-clock/?utm_source=anthias.screenly.io&utm_medium=referral&utm_campaign=free-software) . ### The honest limits Free is only useful if you know the trade. Anthias manages **content per device**, and each install has its own dashboard, so there is no single screen where you set tomorrow’s playlist for ten displays at once. You host it yourself, and support comes from the [community forum](https://forums.screenly.io) and [GitHub](https://github.com/Screenly/Anthias/issues) rather than a helpdesk with an SLA. Setting up several devices is less repetitive than that makes it sound. A backup file holds your settings and asset list so you can restore it onto the next device, a fleet can be deployed and updated over the air through Balena , and the built-in importer brings a library across from Yodeck, ScreenCloud, piSignage or Xibo. For one screen, or a handful you are content to manage individually, none of that is a problem and nothing is held back. ### Install it Flash a disk image, run the one-line installer on an existing Linux system, or deploy from balenaHub. See Get Started for every option, the feature list for what it does, or Raspberry Pi digital signage if a Pi is your hardware. ### Frequently asked questions #### Is Anthias really free, or is there a paid tier? Anthias is free, with no screen limit, no paid edition and nothing time-limited. It is released under [GPLv2](https://github.com/Screenly/Anthias/blob/master/LICENSE) , so you can download, run, modify and redistribute it. #### What hardware does free digital signage software run on? Raspberry Pi 2 through Pi 5, 64-bit x86 PCs such as an Intel NUC or a retired desktop, and generic 64-bit ARM single-board computers via Armbian on a best-effort basis. You also need a screen with an HDMI input. #### Can I use free digital signage software commercially? Yes. Anthias is dual-licensed under GPLv2 and a commercial license, so you can run it in shops, cafes, lobbies and offices. Comply with the copyleft terms if you redistribute a modified version. #### Is free digital signage software good enough for real use? For a single screen driven by one device, yes. Anthias has been developed in the open since 2012 and runs in schools, workshops, offices and storefronts. #### How does this compare to a commercial free plan? Commercial platforms often give you one screen free and charge per screen after that. Anthias never charges per screen, but you host and maintain it yourself. See Anthias vs Yodeck for a worked comparison. Get Started [Browse free apps →](https://signage-apps.com/?utm_source=anthias.screenly.io&utm_medium=referral&utm_campaign=pi-landing) --- # piSignage Alternative Source: https://anthias.screenly.io/pisignage-alternative > Anthias is free digital signage for every screen you own, with no player licenses, no account and no database to run. A straight comparison with piSignage for Raspberry Pi. ## piSignage Alternative Anthias is free digital signage for every screen you own, with no player licenses, no account and no database to run. A straight comparison with piSignage for Raspberry Pi. Anthias is free digital signage for **every** screen you own. piSignage is free for two. That is the difference in one line, and everything below is the detail behind it. Both run on a Raspberry Pi and both will get a sign on the wall. Where they part company is what happens when you add the third screen, what you have to run yourself to avoid paying for it, and how much of the software you can actually see. ### Anthias vs piSignage at a glance | | Anthias | piSignage | | --- | --- | --- | | Screens included free | **unlimited** | 2 | | Cost beyond that | **none, ever** | annual subscription per player | | Account required | **no** | yes, for the hosted dashboard | | To self-host instead | nothing extra, it is the default | Node.js, MongoDB, FFmpeg, ImageMagick | | Player source code | **published, GPLv2** | not published | | Server source code | published, GPLv2 | published, MIT | | In Raspberry Pi Imager | **yes, Pi 2 to Pi 5** | not listed | | Works with no internet | **yes, dashboard included** | hosted dashboard needs the cloud | | Updates | **atomic over the air, with rollback** | in-place upgrade scripts, reflash for a new OS | | Hardware | Raspberry Pi 2 to 5, 64-bit x86, ARM boards via Armbian | Raspberry Pi and other Linux boards | piSignage figures are its published list prices as of August 2026: two free players, then $35 per player for a new player’s first year and $20 per player per year to renew. Check piSignage’s own pricing page for current numbers. ### What it costs over a year Both are free for one or two screens. Past that, one of them starts invoicing. Crediting piSignage’s two free players and using its list prices: | Screens | Anthias | piSignage, first year | piSignage, renewing | | --- | --- | --- | --- | | 2 | $0 | $0 | $0 | | 5 | **$0** | $105 | $60 | | 10 | **$0** | $280 | $160 | | 25 | **$0** | $805 | $460 | | 50 | **$0** | $1,680 | $960 | Anthias never charges per screen, so there is no renewal date, no license count to reconcile, and no year two. ### The free route is not the same free route piSignage does publish an open-source server, so in principle you can avoid the subscription. In practice that means standing up and maintaining Node.js, MongoDB, FFmpeg and ImageMagick, then keeping that server patched for as long as your screens are on the wall. You have swapped a subscription for a database to administer. Anthias has no such fork in the road. Self-hosted **is** the product. Open [Raspberry Pi Imager](https://www.raspberrypi.com/software/) , pick Anthias from the Digital signage and kiosks list, and flash. The device boots into its own dashboard on your network with no server to build, no database, no account and nothing to renew. The free path is the default path, and it starts from the official Raspberry Pi tool rather than a PDF. ### Licensing you can rely on Anthias is released under [GPLv2](https://github.com/Screenly/Anthias/blob/master/LICENSE) , with a commercial license available if copyleft does not suit your deployment. Whichever you choose, your rights are written down. piSignage publishes its **server** under MIT, and that is a real open-source project. The **player**, which is the part that actually runs on your Pi, is a different matter. As of August 2026 we could not find its source published anywhere: the repository that carries the piSignage name holds documentation, release notes, install guides, example widgets and translation files, with no player application in it and no license file. That distinction matters more than a license line. If the software driving your screens is not published, you cannot audit what it does, you cannot fix it yourself, and you cannot keep it alive if the vendor moves on. Every part of Anthias, the player included, is in one public repository under GPLv2. ### Choose Anthias if - You expect to run more than two screens and would rather spend the money on hardware than on licenses. - You do not want an account, a cloud dependency, or a MongoDB instance in your signage stack. - You want the dashboard to keep working when the internet does not, because it runs on your own network. - You want to read the code that runs on your screens, not just the code that manages them. - You show YouTube content. Paste a link and Anthias downloads the video to play locally, so the screen never buffers and never shows ads or recommended videos. - You want to be running in about fifteen minutes from a flashed card. ### Bringing your content with you Anthias imports directly from piSignage, so switching is not a retyping exercise. 1. In Anthias, open **Settings** and choose **Import from piSignage** under *Import content*. 2. Enter `subdomain:email:password`, where the subdomain is the `` in `.pisignage.com`. 3. Review the media it finds and import it. Your images, videos and web pages are copied onto the player and added to the schedule, with per-item progress and a retry for anything that fails. Existing assets are untouched, and re-running the import skips whatever already came across. Your credentials are used to talk to the API during the import and are not stored on the device. Audio and documents such as PDF and PowerPoint are skipped, because Anthias does not play them, as is any widget whose content is generated inside piSignage. The wizard tells you what it skipped and why. Full detail is in the import documentation . ### Updates that cannot half-brick a screen Anthias updates over the air atomically. It runs on balenaOS, which keeps two system partitions: an update is written to the spare one and the device only switches over once the whole image is in place, rolling back on its own if something goes wrong. A screen on a wall in another building moves to a new version, base OS included, without a visit and without a half-applied update leaving it dark. piSignage updates in place. Its player image carries a single root partition and a set of upgrade shell scripts that run against the live system, and a larger jump means downloading a fresh image and running the installer again. There is no second partition to fall back to, so an update that fails partway leaves the device in whatever state it stopped at. Moving the base operating system forward means reflashing the card by hand. This is not a hypothetical difference. It is why a signage OS that cannot push a full-image update over the air tends to leave older hardware on whatever it originally shipped with, sometimes years later, while an atomic-OTA device keeps current on its own. ### Try it on a spare Pi No account, no card, no trial clock. Put Anthias on a spare Raspberry Pi next to your current setup and judge it on the wall rather than on a comparison table. Start with Get Started , or read Raspberry Pi digital signage and free digital signage software . ### Frequently asked questions #### Is Anthias cheaper than piSignage? At one or two screens both are free. From the third screen on, Anthias is cheaper by the whole invoice: it has no player license at any count, while piSignage charges an annual subscription per additional player. Over ten screens that is nothing against $160 to $280 a year, every year. #### Can I import my content from piSignage? Yes, with a built-in wizard. Enter `subdomain:email:password` and Anthias copies your images, videos and web pages across using the piSignage API, then adds them to the schedule. #### Do I need an account or a server? Neither. Anthias runs entirely on the device, so there is nothing to sign up for and no back end to stand up. That is also why the dashboard keeps working during an internet outage. #### Is piSignage open source too? Partly. Its server is published under MIT and is genuinely open source. We could not find published source for its player, the component that runs on the Pi: as of August 2026 the repository bearing the piSignage name contains documentation, release notes, install guides, examples and translations rather than player code, and carries no license. Anthias publishes everything, player included, in one repository under GPLv2, with a commercial license available as an alternative. #### How do updates work? Anthias updates over the air through balenaOS, which writes a new system image to a spare partition and switches over only when it is complete, rolling back automatically if it fails. That covers the base OS as well as the app. piSignage updates its player in place with shell scripts, and a base-OS move means reflashing the card. #### How do I manage several Anthias screens? Each device runs its own dashboard, and two features keep that from being repetitive: deploy and update a whole fleet over the air through Balena , and use the backup file to configure one device then restore that setup onto the rest. What Anthias does not offer is one dashboard that changes every screen’s playlist at once. #### Does Anthias run on the same hardware? Yes, and more of it. Raspberry Pi 2 through Pi 5, 64-bit x86 PCs such as an Intel NUC or a retired desktop, and generic 64-bit ARM single-board computers via Armbian on a best-effort basis. Get Started [Browse free apps →](https://signage-apps.com/?utm_source=anthias.screenly.io&utm_medium=referral&utm_campaign=pi-landing) --- # Raspberry Pi Advertising Display Source: https://anthias.screenly.io/raspberry-pi-advertising-display > Build a Raspberry Pi advertising display for free with Anthias. Loop promotions, offers, and video ads on any screen, with day-parting, portrait mode, and out-of-hours screen shutoff. No subscriptions or per-screen fees. ## Raspberry Pi Advertising Display Build a Raspberry Pi advertising display for free with Anthias. Loop promotions, offers, and video ads on any screen, with day-parting, portrait mode, and out-of-hours screen shutoff. No subscriptions or per-screen fees. Anthias turns a Raspberry Pi into an **advertising display** for any screen, for free. Connect a Pi to a TV or monitor, install Anthias, and loop your promotions, offers, and video ads from a simple web dashboard. It is open source, self-hosted, and has no subscriptions or per-screen fees. ### A low-cost way to run in-store ads Commercial advertising players are expensive and usually lock you into a monthly plan per screen. A Raspberry Pi running Anthias does the same job for the price of the hardware. That makes it a practical choice for small retailers, cafes, gyms, waiting rooms, and events that want eye-catching screens without an ongoing bill. - **No per-screen fees.** Run one screen or a hundred at no software cost. - **Full-screen playback.** Images and video loop automatically, all day. - **Scheduling built in.** Give each ad a start and end date so campaigns rotate on their own. ### Choosing the hardware | Part | What to get | | --- | --- | | Raspberry Pi | Pi 4 or Pi 5 if your ads include video. Pi 2 and Pi 3 are fine for still images and light loops. | | Storage | A reputable microSD card. On a Pi 5, an SSD is worth it for a screen that will run for years. | | Screen | Any display with an HDMI input. A commercial panel is built for long hours, but an ordinary TV works. | | Power | The official supply for your Pi model. | Resolution is worth a moment’s thought. A Pi 5 drives 4K, and a Pi 4 will happily send 1080p content to a 4K panel, but genuine 4K *source* video on a Pi 4 will drop frames. For advertising loops, 1080p content is almost always the right call: it looks sharp on the wall and encodes small. Anthias also runs on x86 mini PCs and ARM single-board computers if a Pi is not your preference, though a Pi 4 or Pi 5 remains the easiest route for video. ### Putting your ads on screen Upload your images and videos, or point the display at a web page, and set how long each one shows. Anthias plays the active playlist on a loop and stores uploaded media locally, so the screen keeps running through a network outage. That matters in a shop, where a blank screen looks worse than a slightly stale one. Most files just work. Photos from a phone, screenshots, and ordinary video clips are accepted, and anything in an awkward format is converted in the background before it plays. Uploading does not interrupt whatever is currently on screen, and you can preview an item before you publish it. If your ad already lives on YouTube, paste the link. Anthias downloads the video and plays it locally, so the screen never buffers and never surfaces ads or recommended videos over your own content, which is the usual reason not to point a shop screen at YouTube. You can drag items to reorder the loop, or shuffle it so a repeat visitor does not see the same sequence in the same order. You can mix promotions with useful ambient content so the screen stays fresh. Browse the [free signage apps](https://signage-apps.com/?utm_source=anthias.screenly.io&utm_medium=referral&utm_campaign=pi-ads) that drop straight into Anthias, such as [weather](https://signage-apps.com/weather/?utm_source=anthias.screenly.io&utm_medium=referral&utm_campaign=pi-ads) , news feeds, and a [countdown timer](https://signage-apps.com/timer/?utm_source=anthias.screenly.io&utm_medium=referral&utm_campaign=pi-ads) for a sale. ### Day-parting: the right ad at the right hour An advertising screen earns more when the content matches the moment. Breakfast offers before eleven, lunch specials at midday, happy hour from five. Anthias handles this per asset, so you load a campaign once and let it run. Each ad can be restricted by date range, by day of the week, and by a daily time window: | Goal | Days | From | To | | --- | --- | --- | --- | | Weekday business hours | Mon to Fri | 09:00 | 17:00 | | Lunchtime menu | every day | 11:30 | 14:00 | | Weekend evenings | Sat and Sun | 18:00 | 23:00 | | Friday late-night promo | Fri | 22:00 | 02:00 | | Single-day sale takeover | date range of one day | anytime | anytime | Windows that cross midnight work as you would expect: a Friday window running 22:00 to 02:00 keeps playing into Saturday morning. Times use the device’s own timezone, and the screen picks up a window opening or closing within about a minute. Full detail is in the asset scheduling documentation , and the v2 API can set these fields programmatically if you would rather drive campaigns from a script. ### Portrait orientation Retail ad creative is often portrait. Set this under **Settings** in the dashboard, using the **Screen rotation** option, and it applies whichever Pi you are on. Many displays also offer a rotation setting in their own on-screen menu as a fallback. The FAQ covers the boot-config route if you need it. ### Switching the screen off after hours A shop window screen does not need to run at 3am. Under **Settings** there is a **Display schedule** that turns the screen off outside opening hours and back on in the morning, with per-weekday selection. It is off by default. On a TV that supports HDMI-CEC the panel genuinely powers down, which saves electricity and adds years to its life. Most desktop monitors do not answer CEC, so on those the screen goes black instead. Either way it is one setting, not a timer plug. See the display schedule documentation . ### Making ads that actually read on a wall The screen is usually seen in passing, from across a room, by someone who did not intend to look at it. A few habits help: - **One idea per slide.** A price, an offer, a name. Anything needing a second read is wasted. - **Big type and strong contrast.** If it is not legible from across the room, it is not legible. - **Design at the screen’s resolution** and in its orientation, so nothing is scaled or letterboxed. - **Keep video short.** Ten to fifteen seconds keeps the loop moving and the file small. - **Give stills a few seconds each.** Long enough to read, short enough that a passer-by sees more than one. - **Put the offer in the safe area.** Some TVs still overscan slightly, so avoid the outer edge. ### Running more than one screen Anthias manages content per device, each with its own dashboard, so several screens means several Pis. That is less work than it sounds: - **Clone a configured device.** Download a backup file holding your settings and asset list, then restore it onto a new device instead of setting it up from scratch. - **Deploy and update a fleet over the air** through Balena , so you are not carrying cards around to push an update. - **Bring a library in from another platform** with the built-in importer , which supports Yodeck, ScreenCloud, piSignage and Xibo. What you do not get is one dashboard where you change tomorrow’s loop for every screen at once. For a window bank or a handful of sites that is rarely the blocker; for a large estate it will be. ### Getting started Flash a Raspberry Pi with a pre-built Anthias image using Raspberry Pi Imager, run the one-line installer on an existing system, or deploy from balenaHub. See Get Started for the full walkthrough, or the installation options for every route. For the wider picture, see Raspberry Pi digital signage and free digital signage software . ### Frequently asked questions #### Can a Raspberry Pi really run an advertising screen? Yes. A Raspberry Pi 4 or Pi 5 comfortably loops full-screen images and video on a single display, which covers the vast majority of in-store advertising needs. #### Is there any monthly cost? No. Anthias is free and open source, so there are no software subscriptions or per-screen fees. You only pay for the Pi and the screen. #### Can I schedule ads for specific times of day? Yes. Each ad takes a date range, a set of weekdays, and a daily time window, so a lunch offer or a Friday-night promo can be loaded ahead and left to run. Windows may cross midnight. #### Can the display run in portrait? Yes. Set **Screen rotation** in the dashboard’s Settings page. It works across the supported Pi models, and most displays also expose a rotation option in their own menu. #### Will the ads keep playing if the internet drops? Uploaded images and videos play from the Pi’s local storage, so the loop continues. Only content pulled from a live web page needs a working connection. #### Can a Raspberry Pi advertising display run 24/7? Yes, and that is the normal way people use it. Use a good power supply and a reputable card, or an SSD on a Pi 5 for a multi-year install. If the screen does not need to be lit overnight, the display schedule can switch it off and back on. #### What resolution should my ads be? 1080p suits nearly every advertising loop and plays smoothly on a Pi 4 or Pi 5. A Pi 5 can drive a 4K panel, but 4K source video is more than a Pi 4 can decode without dropping frames. Get Started [Browse free apps →](https://signage-apps.com/?utm_source=anthias.screenly.io&utm_medium=referral&utm_campaign=pi-landing) --- # Raspberry Pi Digital Signage Source: https://anthias.screenly.io/raspberry-pi-digital-signage > Turn a Raspberry Pi into a digital sign for free with Anthias, the open-source digital signage platform. Photos, video, web pages, YouTube and live streams, scheduled from a simple dashboard. No subscriptions. ## Raspberry Pi Digital Signage Turn a Raspberry Pi into a digital sign for free with Anthias, the open-source digital signage platform. Photos, video, web pages, YouTube and live streams, scheduled from a simple dashboard. No subscriptions. Anthias is the free, open-source way to run **digital signage on a Raspberry Pi**. Install it on a Pi you already own, connect the Pi to any screen over HDMI, and manage what plays from a simple web dashboard. There are no subscriptions and no per-screen fees, and your content stays on your own network. ### Why run digital signage on a Raspberry Pi? A Raspberry Pi is small, quiet, cheap, and sips power, which makes it ideal for a screen that runs all day. With Anthias, one Pi behind a display becomes a self-contained sign that loops your content and keeps running unattended for months. - **Free and open source.** Formerly Screenly OSE, developed in the open since 2012 and one of the most widely deployed signage projects in the world. - **Self-hosted.** No cloud account required. You control the device and the content. - **Runs on hardware you have.** Raspberry Pi and ordinary x86 PCs, plus 64-bit ARM single-board computers on a best-effort basis. ### Which Raspberry Pi to use | Model | Notes | | --- | --- | | Raspberry Pi 5 | Recommended. Drives 4K, and can boot from an SSD for a multi-year install. | | Raspberry Pi 4 | Recommended. Comfortable with 1080p video, and will feed a 4K panel from 1080p content. | | Raspberry Pi 3 B and 3 B+ | Supported, in maintenance mode. Fine for images and web pages. | | Raspberry Pi 2 B | Supported, in maintenance mode. Best kept to still images and light loops. | | x86 PC | 64-bit. A mini PC, an Intel NUC, or a retired desktop. | Pi 4 or later is the recommendation for anything new. Add a screen with an HDMI input, a reputable microSD card and the official power supply, and that is the whole bill of materials. ### Getting it running Flashing a card with [Raspberry Pi Imager](https://www.raspberrypi.com/software/) is the quickest route. Anthias is listed there directly, under **Other specific-purpose OS**, then **Digital signage and kiosks**, then **Anthias**. Pick the entry matching your board, write the card, and the device boots straight into Anthias. On first boot the TV itself shows the device’s network address and a QR code. Scan it with your phone and you land on the dashboard, so there is no hunting through your router for an IP address. If you would rather install onto an existing Raspberry Pi OS Lite or Debian system, one command does it: ``` $ bash <(curl -sL https://install-anthias.srly.io) ``` Every route, including balenaHub fleets and the pre-built release images, is covered in Get Started and the installation options . ### What you can put on screen Anything that goes on a screen, all in one playlist. Drag a file in or paste a link. - **Photos and video.** Phone photos, screenshots and camera files upload and play without converting anything first. If a file is not quite right for your hardware, Anthias prepares it in the background while whatever is already on screen keeps playing. - **Web pages and dashboards.** Point Anthias at any page, a status board, a weather widget, an internal report, and set an auto-refresh interval so it reloads on its own and stays current. - **YouTube, without the YouTube.** Paste a link and the video is downloaded to play locally, so the screen never buffers and never shows ads or recommended videos. - **Live streams and video feeds**, alongside everything else in the same playlist. - **Full-HD output.** 1080p with hardware-accelerated video, and sound over HDMI or the headphone jack. For ready-made content, browse the [free signage apps](https://signage-apps.com/?utm_source=anthias.screenly.io&utm_medium=referral&utm_campaign=pi-hub) that work with Anthias out of the box: live [weather](https://signage-apps.com/weather/?utm_source=anthias.screenly.io&utm_medium=referral&utm_campaign=pi-hub) , a [world clock](https://signage-apps.com/world-clock/?utm_source=anthias.screenly.io&utm_medium=referral&utm_campaign=pi-hub) , news and RSS feeds, countdown timers, and more. Each one is just a link you paste into Anthias, so a single Pi can rotate through a whole set of them. ### Deciding when things play Scheduling is per asset, so you load content once and let the playlist manage itself. - **A date range.** An item appears for a campaign and disappears on its own when it is over. - **Days of the week.** One playlist on weekdays, another at weekends, something special only on Fridays. - **A time of day.** Opening-hours content from nine to five and something else overnight. Windows that cross midnight work too. - **A duration per item.** Photos and web pages stay up as long as you tell them to; videos work out their own length. - **Order or shuffle.** Drag items into place, or shuffle so each loop differs. - **Skip and pause.** Jump forward or back, or switch an item off temporarily without deleting it. The asset scheduling documentation covers the details, including how overnight windows behave. ### Running it from your browser The dashboard runs on the device itself, on your network. There is no app to install and no cloud account, and you can open it from a laptop, phone or tablet. - **Preview before you publish.** Click any item to see exactly what the screen will show. - **Know when your screen is dark.** Anthias can tell whether the connected TV is actually powered on, so you can spot a dead display without walking over. - **System information at a glance.** Uptime, storage and memory in use, the software version, and the device’s address. - **Update notices.** The dashboard says when a newer version is out. - **Remote restart and shutdown**, which matters once your screens are scattered around a building. - **Screen rotation** for portrait installs, and a **display schedule** that switches the screen off outside opening hours. See the display schedule documentation . If the screen is somewhere public, turn on username and password protection, and encrypt the dashboard over HTTPS with a self-signed certificate, a free auto-renewing one for your own domain, or your own certificate. ### Bringing content with you Moving from another platform does not mean rebuilding your library. Anthias has a built-in import wizard for **Yodeck, ScreenCloud, piSignage and Xibo**: paste an API token, review what it finds, and import. See the import documentation , or the Yodeck comparison if that is where you are coming from. A single backup file holds your settings and asset list, so you can restore it later or move it onto a brand-new device rather than setting one up from scratch. ### More than one screen Anthias manages content per device, each with its own dashboard. Several screens means several Pis, and there is no single dashboard where you change tomorrow’s playlist for all of them at once. Two things make a small estate practical: a fleet can be deployed and updated over the air through Balena , and the backup file lets you clone a configured device onto the next one. For a shop, a building or a floor that works well. For a large multi-site estate managed centrally, it is the wrong tool. ### Automating it The REST API covers uploads, playlist changes and the scheduling fields, so content can be pushed from your own scripts or another system. It is fully documented and keeps compatibility with older integrations, so an automation you write now will not break on the next release. ### Where to go next - Raspberry Pi advertising display for promotions, offers and video ads in a shop or venue. - Raspberry Pi info screen for dashboards, calendars and notice boards. - Free digital signage software for what free does and does not include. - The full feature list , or the FAQ . ### Frequently asked questions #### Is Raspberry Pi digital signage really free? Yes. Anthias is open source and free to run on as many Raspberry Pis as you like. The only cost is the hardware, which you may already own. #### Which Raspberry Pi models are supported? Pi 2 B, Pi 3 B, Pi 3 B+, Pi 4 and Pi 5, plus 64-bit x86 PCs. Pi 2 and Pi 3 are in maintenance mode, so a Pi 4 or Pi 5 is the recommendation for a new installation, particularly if you plan to play video. #### Do I need an internet connection? You need one to install Anthias and to show web-based content, but the device runs on your own network and does not depend on any external cloud service to keep playing. Uploaded images and videos play from local storage, so the screen survives an outage. #### Can I play YouTube videos on a Raspberry Pi sign? Yes. Paste the link and Anthias downloads the video to play locally, which means no buffering and no ads or recommended videos appearing over your content. #### Can the screen show a live web page? Yes. Add the page as an asset and set an auto-refresh interval, so a dashboard, feed or internal report stays current on its own. Bear in mind that a screen has nobody to log in as, so use a page that is viewable without signing in. #### How do I set up a second screen? Install Anthias on another device. To avoid repeating the configuration, download the backup file from the first one and restore it onto the new device, then adjust the playlist. #### Can I run it in portrait? Yes. Use the **Screen rotation** option in the dashboard’s Settings page. Many displays also offer a rotation setting in their own menu. Get Started [Browse free apps →](https://signage-apps.com/?utm_source=anthias.screenly.io&utm_medium=referral&utm_campaign=pi-landing) --- # Raspberry Pi Info Screen Source: https://anthias.screenly.io/raspberry-pi-info-screen > Build a Raspberry Pi info screen for free with Anthias. Show dashboards, calendars, notices and live data on any display. Open source and self-hosted, with no subscriptions or per-screen fees. ## Raspberry Pi Info Screen Build a Raspberry Pi info screen for free with Anthias. Show dashboards, calendars, notices and live data on any display. Open source and self-hosted, with no subscriptions or per-screen fees. Anthias is the free, open-source way to build a **Raspberry Pi info screen**. Connect a Pi to any display, install Anthias, and show live information, notices, and dashboards that update on their own. It is self-hosted, with no subscriptions and no cloud account to sign up for. ### One Pi, an always-on information display An info screen is any display that keeps people informed: a reception board, a team dashboard, a community notice board, a status wall. A Raspberry Pi is the perfect little engine for it because it is cheap, silent, and happy to run around the clock. Anthias handles the scheduling and playback so the screen looks after itself. - **Live, self-updating content.** Point the screen at a web page or a dashboard and it refreshes on its own. - **Mix sources.** Rotate images, video, and web pages in one playlist. - **Set and forget.** A Pi behind the display can run unattended for months. A Pi 4 or Pi 5 is the recommendation for a new build. Anthias also runs on Pi 2 and Pi 3, on x86 mini PCs, and on 64-bit ARM single-board computers via Armbian, so an old desktop or a spare board works just as well. ### What to show on an info screen Upload images or video, or point Anthias at any web page, and set how long each item stays up. For ready-made content, the [free signage apps](https://signage-apps.com/?utm_source=anthias.screenly.io&utm_medium=referral&utm_campaign=pi-info) drop straight in as a URL. The ones that earn their place on an information display: | Purpose | App | | --- | --- | | Time on the wall | [digital clock](https://signage-apps.com/clock/digital/?utm_source=anthias.screenly.io&utm_medium=referral&utm_campaign=pi-info) , [world clock](https://signage-apps.com/world-clock/?utm_source=anthias.screenly.io&utm_medium=referral&utm_campaign=pi-info) for distributed teams | | Conditions | [weather](https://signage-apps.com/weather/?utm_source=anthias.screenly.io&utm_medium=referral&utm_campaign=pi-info) , [air quality](https://signage-apps.com/air-quality/?utm_source=anthias.screenly.io&utm_medium=referral&utm_campaign=pi-info) | | Reception and front of house | [opening hours](https://signage-apps.com/opening-hours/?utm_source=anthias.screenly.io&utm_medium=referral&utm_campaign=pi-info) | | Team and culture | [birthdays](https://signage-apps.com/birthday/?utm_source=anthias.screenly.io&utm_medium=referral&utm_campaign=pi-info) , [team milestones](https://signage-apps.com/team-milestone/?utm_source=anthias.screenly.io&utm_medium=referral&utm_campaign=pi-info) | | Something to read | [news and RSS feeds](https://signage-apps.com/rss/bbc-top/?utm_source=anthias.screenly.io&utm_medium=referral&utm_campaign=pi-info) , [Hacker News](https://signage-apps.com/rss/hacker-news/?utm_source=anthias.screenly.io&utm_medium=referral&utm_campaign=pi-info) , [quotes](https://signage-apps.com/quotes/?utm_source=anthias.screenly.io&utm_medium=referral&utm_campaign=pi-info) | | Ambient interest | [NASA image of the day](https://signage-apps.com/rss/nasa-iotd/?utm_source=anthias.screenly.io&utm_medium=referral&utm_campaign=pi-info) , [on this day](https://signage-apps.com/on-this-day/?utm_source=anthias.screenly.io&utm_medium=referral&utm_campaign=pi-info) | | Counting down | [timer](https://signage-apps.com/timer/?utm_source=anthias.screenly.io&utm_medium=referral&utm_campaign=pi-info) | Each one is a link you paste into Anthias, so a single Pi can rotate through a whole set of them. ### Showing a calendar on the screen A shared calendar is one of the most useful things you can put on a wall: what is in the meeting room today, who is on shift, what is on this week. Anthias shows a calendar the same way it shows anything on the web, as a web page asset. In Google Calendar, open the settings for the calendar you want, find the integration section, and copy the public embed URL. Paste that into Anthias as a web page and set a duration. The screen keeps it up to date on its own. The one thing to plan for: a Pi on the wall has nobody to log in as. A calendar that is private to your account will show a sign-in page rather than your events. Either publish the calendar so the embed URL works without an account, or use a dedicated calendar for the screen with only the entries you are happy to display. The same rule applies to any tool you put on a screen. ### Live dashboards The same approach covers dashboards. Anything that renders in a browser can go on the screen: a Grafana board, a sales or support dashboard, a build monitor, an internal status page. Two practical notes. First, authentication again: use whatever your tool offers for unattended viewing, such as a public dashboard link, a kiosk or read-only token, or an internal page that does not require a session. Second, design for the distance. A dashboard built for a laptop is usually unreadable from across a room, so cut the number of panels and pick a layout with large figures. ### A digital notice board For a school corridor, a community centre, a staffroom or a block of flats, an info screen replaces the pinboard nobody updates. The advantage over paper is that notices retire on their own. Every asset takes a start and end date, so a term-time notice, a scheduled maintenance warning or an event poster can be loaded in advance and will disappear when it is no longer true. Assets can also be limited to particular weekdays and a daily time window, which is handy when a morning notice should not still be up at closing time. The asset scheduling documentation has the full detail, and the v2 API can set those fields from a script if notices come out of another system. ### A Pi that boots straight into a full-screen page If what you want is a screen that comes up showing one web page, with no desktop, no browser chrome, no mouse pointer and no login prompt, that is what Anthias gives you out of the box. You do not need to configure a window manager, hide a cursor, or write an autostart script. Flash the image, add your URL, and the Pi comes back to the same screen after a power cut. ### Getting the picture right - **Resolution** follows whatever the operating system reports, so there is no setting in the dashboard. On Raspberry Pi OS use `sudo raspi-config`, then **Display Options** and **Resolution**, or set `hdmi_group` and `hdmi_mode` in `/boot/firmware/config.txt`. - **Portrait** displays are common for notice boards. Set **Screen rotation** in the dashboard’s Settings page. - **Out of hours**, the **Display schedule** setting under Settings can switch the screen off overnight and back on in the morning, per weekday. On a TV that supports HDMI-CEC the panel genuinely powers down; most desktop monitors simply go black. See the display schedule documentation . ### Leaving it alone for months Uploaded images and video play from the Pi’s local storage, so a network outage does not blank the screen. Only live web content needs a working connection, and a dashboard or calendar will pick up again when the link returns. For an install that should last years, use a reputable microSD card and the official power supply, or move a Pi 5 onto an SSD to avoid card wear. When you add a file, the dashboard shows a **Processing** badge while it is prepared and a **Failed** badge with a short explanation if something is wrong, so problems surface in the interface rather than in a log file. Anthias can also tell you whether the connected TV is actually powered on, which is the difference between spotting a dark screen from your desk and finding out when someone complains. The dashboard shows system information at a glance and flags when an update is available, and the device can be restarted or shut down remotely. If the screen sits somewhere public, the interface can be put behind a password and served over HTTPS. ### More than one screen Anthias manages content per device, each with its own dashboard, so two or three info screens means two or three Pis. A few things take the sting out of that: a backup file captures your settings and asset list so you can restore it onto the next device rather than rebuilding it, and a fleet can be deployed and updated over the air through Balena . What you do not get is one dashboard that changes the content on every screen at once. For a building or a floor that is fine. For a large estate it is the wrong tool, and it is better to say so now than after you have bought the hardware. ### Getting started Install Anthias from a pre-built disk image or the one-line installer, connect your Pi to the screen, and add your content. See Get Started for the full walkthrough, the installation options for every route, or the broader guide to Raspberry Pi digital signage . If cost is what brought you here, free digital signage software covers what free does and does not include. ### Frequently asked questions #### What can a Raspberry Pi info screen display? Anything you can show as an image, a video, or a web page: dashboards, calendars, notices, live data, and the ready-made signage apps above. #### Is it free? Yes. Anthias is open source and free to run on any number of Raspberry Pi devices. You only need the hardware. #### Can I show a Google Calendar on a Raspberry Pi? Yes. Copy the calendar’s public embed URL from its settings and add it to Anthias as a web page asset. The calendar needs to be viewable without signing in, because the Pi has no account to log in with, so either publish it or keep a separate calendar for the screen. #### Can I put a Grafana or business dashboard on the screen? Yes, if the dashboard can be viewed without an interactive login. Use a public link or a read-only kiosk token, and simplify the layout so the numbers are legible from a distance. #### Do notices expire on their own? Yes. Every asset has a start and end date, and can also be limited to specific weekdays and a daily time window, so notices appear and retire without anyone remembering to take them down. #### Will the screen come back on its own after a power cut? Yes. The Pi boots straight back into the playlist with no desktop and no login step, which is the main reason this setup suits screens in places nobody visits daily. #### Can the display run in portrait? Yes. Use the **Screen rotation** option in the dashboard’s Settings page. Many displays also offer a rotation setting in their own on-screen menu. #### Does it need to stay online? No. Uploaded images and videos play from local storage, so the loop keeps running offline. Only live content such as a calendar, a feed or a dashboard needs a connection to refresh. Get Started [Browse free apps →](https://signage-apps.com/?utm_source=anthias.screenly.io&utm_medium=referral&utm_campaign=pi-landing) --- # Free Yodeck Alternative for Digital Signage Source: https://anthias.screenly.io/yodeck-alternative > Anthias is a free, open-source alternative to Yodeck digital signage software. Self-hosted on your own hardware, with no cloud account and no per-screen fees. An honest comparison of both. ## Free Yodeck Alternative for Digital Signage Anthias is a free, open-source alternative to Yodeck digital signage software. Self-hosted on your own hardware, with no cloud account and no per-screen fees. An honest comparison of both. Anthias is a **free, self-hosted alternative to Yodeck**. They take opposite approaches: Yodeck is a cloud platform priced per screen, and Anthias is open-source software that runs entirely on hardware you own, whether that is a Raspberry Pi, an x86 mini PC or an ARM single-board computer. Neither is universally better, so here is a straight comparison rather than a sales pitch. ### Anthias vs Yodeck at a glance | | Anthias | Yodeck | | --- | --- | --- | | License | open source, GPLv2 | proprietary | | Cost, one screen | free | free | | Cost, more screens | free | from $8 per screen per month | | Where it runs | your hardware and network | Yodeck cloud | | Central dashboard for all content | no, one per device | yes | | Over-the-air updates | atomic, with rollback | in place, no rollback | | Base OS updated over the air | yes, whole image | reflash to change OS | | Import from your current platform | built-in Yodeck importer | n/a | | Plays with no internet | yes | limited | | Template and app library | none built in, plays any web page | large, included | | Support | community forum and GitHub | vendor support | | Account required | no | yes | | Hardware | Raspberry Pi, x86 PC, ARM SBC | Pi and vendor players | Yodeck figures are its published list prices as of August 2026: a free plan covering a single screen with Basic features, then $8 per screen per month, rising to $12 and $16 for Premium and Enterprise. Prices change, so check Yodeck’s own pricing page for current numbers. ### What it costs over a year Yodeck’s first screen is free, so the two only diverge as you add displays. Crediting that free screen and using the Basic list price: | Screens | Anthias | Yodeck Basic | | --- | --- | --- | | 1 | $0 | $0 | | 5 | $0 | $384 a year | | 10 | $0 | $864 a year | | 25 | $0 | $2,304 a year | Anthias has no software cost at any number of screens. What it does have is labor: every screen is a device you set up and maintain, so the cost moves off the invoice and into your own time. ### Choose Anthias if - You want zero recurring cost, permanently. - You do not want your signage depending on someone else’s cloud, or network policy keeps your content on site. - You want the screen to keep playing through an internet outage. - You want [open source](https://github.com/Screenly/Anthias) software you can read, change, and keep running with no vendor risk. - You show YouTube content. Paste a link and Anthias downloads the video to play locally, so the screen never buffers and never shows ads or recommended videos. - You would rather own the hardware than rent access to it. ### Moving your content across You do not have to rebuild your library by hand. Anthias ships a built-in import wizard for Yodeck, so switching is mostly a matter of pasting a token. 1. In Yodeck, create an API token under **Account Settings**, then **Advanced Settings**, then **API Tokens**. 2. In Anthias, open **Settings** and choose **Import from Yodeck** under *Import content*. 3. Paste the token. Anthias validates it and lists the media it finds. 4. Review the list, adjust the selection if you want, and click import. You get per-item progress, and anything that fails can be retried without repeating what already worked. Your images, videos and web pages are copied onto the player and added to the schedule. Existing Anthias assets are left alone, and running the import again skips whatever came over the first time, so it is safe to repeat. Your Yodeck credentials are used only to talk to the API during the import and are not stored on the device. There is a command-line equivalent with a `--dry-run` option if you would rather preview first. Two things will not come across, and it is better to know now: audio and documents such as PDF and PowerPoint, which Anthias does not play, and Yodeck’s apps and widgets. Those render inside Yodeck, so their internal URLs would only produce broken assets here. The wizard lists anything it skips along with the reason rather than importing it half-way. Full detail is in the import documentation . ### Updates, and the operating system underneath Anthias updates over the air atomically. It runs on balenaOS, which keeps two system partitions: a new version is written to the spare one and the device switches over only once the whole image is in place, rolling back on its own if anything goes wrong. The base operating system moves forward this way too, so a screen stays current without a site visit and without a half-applied update leaving it dark. That last point is worth dwelling on, because it shows up in the operating system a device actually runs. A platform that cannot push a full-image update over the air tends to leave hardware on whatever it first shipped with. The Yodeck image for Raspberry Pi 2, 3 and 4, the current download at the time of writing, is built on Raspbian 10 “buster”, which [reached end of life in June 2024](https://www.debian.org/News/2024/20240615) . We will leave you to draw your own conclusion about a signage device that ships today on a base OS past its support window. ### Try it on spare hardware Anthias needs no account and no card, so you can put it on a spare Raspberry Pi, mini PC or single-board computer and judge it against your current setup in a few minutes. See Get Started , or read more on free digital signage software and Raspberry Pi digital signage . ### Frequently asked questions #### Is Anthias a free alternative to Yodeck? Yes, with one clarification: Yodeck is also free for a single screen. If you only ever need one display, cost is not the deciding factor and you should choose on architecture instead, cloud-managed or self-hosted. The cost gap opens up from the second screen onward. #### Can I move my content from Yodeck to Anthias? Yes, and you do not have to do it by hand. Anthias has a built-in import wizard for Yodeck: paste a Yodeck API token, review the media it finds, and click import. Your images, videos and web pages are copied onto the player and added to the schedule. See importing content from other platforms . #### Does Anthias have Yodeck’s apps and templates? Not built in. Anthias plays images, videos and web pages, so anything you can build or host as a web page will display. There is also a library of [free signage apps](https://signage-apps.com/?utm_source=anthias.screenly.io&utm_medium=referral&utm_campaign=yodeck-alt) covering weather, clocks, news and countdown timers, each of which you add by pasting in a URL. #### How does Anthias handle several screens? Content is managed per device, each with its own dashboard. Two features keep that from becoming repetitive work: a whole fleet can be deployed and updated over the air through Balena , and the backup file lets you configure one device and restore that setup onto the rest. What Anthias does not offer is a single dashboard where you change tomorrow’s playlist for every screen at once. If that specific workflow is what you need, a cloud platform priced per screen is the trade on offer. Get Started [Browse free apps →](https://signage-apps.com/?utm_source=anthias.screenly.io&utm_medium=referral&utm_campaign=pi-landing)