# What is the recommended way to upgrade anthias?

**URL:** <https://forums.screenly.io/t/what-is-the-recommended-way-to-upgrade-anthias/6682>\
**Category:** Anthias\
**Created:** [May 4, 2026, 2:00am UTC](https://forums.screenly.io/t/what-is-the-recommended-way-to-upgrade-anthias/6682 "2026-05-04T02:00:24Z")\
**Posts on this page:** 6\
**Page:** 1

<div class="post-metadata">

**Author:** ![MapleSaboteur](https://avatars.discourse-cdn.com/v4/letter/m/c37758/32.png) [@MapleSaboteur](https://forums.screenly.io/u/MapleSaboteur)\
**Post date:** [May 4, 2026, 2:00am UTC](https://forums.screenly.io/t/what-is-the-recommended-way-to-upgrade-anthias/6682/1 "2026-05-04T02:00:24Z")

</div>

trying to figure out the correct way to upgrade, installation was done using the install script on a base install of debian 12 as recommended, now i want to know how to upgrade it and there doesnt appear to be a clear way to do this ?

ive tried running the install script again but keep getting this error:

```bash
TASK [anthias : Sync host pip dependencies via uv] ********************************************************************************************************************************************************************************************
[ERROR]: Task failed: Module failed: non-zero return code
Origin: /home/signage/anthias/ansible/roles/anthias/tasks/main.yml:58:3

56 as the {{ anthias_user }} user.
57
58 - name: Sync host pip dependencies via uv
     ^ column 3

fatal: [localhost]: FAILED! => {"changed": false, "cmd": ["/home/signage/.local/bin/uv", "sync", "--no-default-groups", "--group", "host", "--no-install-project"], "delta": "0:00:00.038466", "end": "2026-05-04 13:47:11.183351", "msg": "non-zero return code", "rc": 2, "start": "2026-05-04 13:47:11.144885", "stderr": "Using CPython 3.13.11\nerror: failed to remove directory `/home/signage/installer_venv/lib`: Permission denied (os error 13)", "stderr_lines": ["Using CPython 3.13.11", "error: failed to remove directory `/home/signage/installer_venv/lib`: Permission denied (os error 13)"], "stdout": "", "stdout_lines": []}

```

docker pull images is suggested but no details on how to do this, im very familiar with linux just not with how anthias is setup using docker/ansible/python etc

any help is appreciated

---

<div class="post-metadata">

**Author:** ![vpetersson](https://yyz1.discourse-cdn.com/flex029/user_avatar/forums.screenly.io/vpetersson/32/8_2.png) [@vpetersson](https://forums.screenly.io/u/vpetersson)\
**Post date:** [May 7, 2026, 4:50pm UTC](https://forums.screenly.io/t/what-is-the-recommended-way-to-upgrade-anthias/6682/2 "2026-05-07T16:50:19Z")

</div>

Try running the installer again. That should sort the issue out.

---

<div class="post-metadata">

**Author:** ![MapleSaboteur](https://avatars.discourse-cdn.com/v4/letter/m/c37758/32.png) [@MapleSaboteur](https://forums.screenly.io/u/MapleSaboteur)\
**Post date:** [May 8, 2026, 1:44am UTC](https://forums.screenly.io/t/what-is-the-recommended-way-to-upgrade-anthias/6682/3 "2026-05-08T01:44:36Z")

</div>

ive already done that, hence the error i posted above.

i just tried:

```auto
systemctl stop anthias-host-agent docker
cd /home/signage
rm -rf anthias* installer_venv/ screenly* version.md .ansible/ .anthias/ .screenly
bash <(curl -sL https://install-anthias.srly.io)

```

and still get the same error, yes i could just blow the install away and start fresh but i want to understand whats going wrong, i should be able to update an existing install surely ?

EDIT: found this on github which fixed the issue:

> <https://github.com/Screenly/Anthias/issues/2842>
>
> \### Description
> 
> Error while installing on Pi5 64-bit Bowworm Raspberry Pi OS
> 
> \`…\`\`
> ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
> ┃ ┃
> ┃ ┃
> ┃ @@@@@@@@@ ┃
> ┃ @@@@@@@@@@@@ d8888 888 888 d8b ┃
> ┃ @@@@@@@ @@@ @@ d88888 888 888 Y8P ┃
> ┃ @@@@@@@@@@@@@ @@@ d88P888 888 888 ┃
> ┃ @@@@@@@@@@ @@ @@@@ d88P 888 88888b. 888888 88888b. 888 8888b. .d8888b ┃
> ┃ @@@@@ @@@@@@@@ d88P 888 888 "88b 888 888 "88b 888 "88b 88K ┃
> ┃ @@@%: :@@@@@@@@ d88P 888 888 888 888 888 888 888 .d888888 "Y8888b. ┃
> ┃ @@-:::::::%@@@@@@@ d8888888888 888 888 Y88b. 888 888 888 888 888 X88 ┃
> ┃ @=::::=%@@@@@@@@ d88P 888 888 888 "Y888 888 888 888 "Y888888 88888P' ┃
> ┃ @@@@@@@@@@ ┃
> ┃ ┃
> ┃ ┃
> ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
> 
> Anthias runs on a dedicated Raspberry Pi (2/3/4-64-bit/5) or x86 device.
> The host will be repurposed for digital signage — on a Pi you lose the
> regular desktop environment, and on x86 the machine should not be used
> for anything else.
> 
> When prompted for the version, you can choose between the following:
> 
> • latest: Installs the latest version from the master branch.
> • tag: Installs a pinned version based on the tag name.
> 
> Take note that latest is a rolling release.
> 
> 
> ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
> ┃ ┃
> ┃ User Input Summary ┃
> ┃ ┃
> ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
> 
> Manage Network: Yes
> Branch/Tag: master
> System Upgrade: Yes
> Docker Tag Prefix: latest
> 
> ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
> ┃ ┃
> ┃ Initialize Locales ┃
> ┃ ┃
> ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
> 
> 
> ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
> ┃ ┃
> ┃ Install Packages via APT ┃
> ┃ ┃
> ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
> 
> Hit:1 http://deb.debian.org/debian bookworm InRelease
> Hit:2 http://deb.debian.org/debian-security bookworm-security InRelease
> Hit:3 http://deb.debian.org/debian bookworm-updates InRelease
> Hit:4 http://archive.raspberrypi.com/debian bookworm InRelease
> Get:5 https://repo.charm.sh/apt \* InRelease
> Fetched 6,718 B in 2s (4,266 B/s)
> Reading package lists... Done
> Reading package lists... Done
> Building dependency tree... Done
> Reading state information... Done
> ca-certificates is already the newest version (20230311+deb12u1).
> curl is already the newest version (7.88.1-10+deb12u14).
> gettext-base is already the newest version (0.21-12).
> gettext-base set to manually installed.
> git is already the newest version (1:2.39.5-0+deb12u3).
> network-manager is already the newest version (1.42.4-1+rpt1+deb12u1).
> Suggested packages:
> libssl-doc
> The following NEW packages will be installed:
> libffi-dev libssl-dev whois
> 0 upgraded, 3 newly installed, 0 to remove and 15 not upgraded.
> Need to get 3,573 kB of archives.
> After this operation, 13.7 MB of additional disk space will be used.
> Get:1 http://deb.debian.org/debian bookworm/main arm64 libffi-dev arm64 3.4.4-1 \[56.0 kB\]
> Get:2 http://deb.debian.org/debian bookworm/main arm64 whois arm64 5.5.17 \[69.1 kB\]
> Get:3 http://archive.raspberrypi.com/debian bookworm/main arm64 libssl-dev arm64 3.0.19-1~deb12u2+rpt1 \[3,448 kB\]
> Fetched 3,573 kB in 3s (1,121 kB/s)
> Selecting previously unselected package libffi-dev:arm64.
> (Reading database ... 130213 files and directories currently installed.)
> Preparing to unpack .../libffi-dev\_3.4.4-1\_arm64.deb ...
> Unpacking libffi-dev:arm64 (3.4.4-1) ...
> Selecting previously unselected package libssl-dev:arm64.
> Preparing to unpack .../libssl-dev\_3.0.19-1~deb12u2+rpt1\_arm64.deb ...
> Unpacking libssl-dev:arm64 (3.0.19-1~deb12u2+rpt1) ...
> Selecting previously unselected package whois.
> Preparing to unpack .../whois\_5.5.17\_arm64.deb ...
> Unpacking whois (5.5.17) ...
> Setting up whois (5.5.17) ...
> Setting up libffi-dev:arm64 (3.4.4-1) ...
> Setting up libssl-dev:arm64 (3.0.19-1~deb12u2+rpt1) ...
> Processing triggers for man-db (2.11.2-2) ...
> 
> ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
> ┃ ┃
> ┃ Clone Anthias Repository ┃
> ┃ ┃
> ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
> 
> Cloning into '/home/salman/anthias'...
> remote: Enumerating objects: 25276, done.
> remote: Counting objects: 100% (883/883), done.
> remote: Compressing objects: 100% (366/366), done.
> remote: Total 25276 (delta 727), reused 555 (delta 517), pack-reused 24393 (from 3)
> Receiving objects: 100% (25276/25276), 27.72 MiB | 3.84 MiB/s, done.
> Resolving deltas: 100% (16655/16655), done.
> Already on 'master'
> Your branch is up to date with 'origin/master'.
> HEAD is now at 6474fbf4 fix(ui): use {% comment %} for multi-line upload-accept note (#2840)
> 
> ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
> ┃ ┃
> ┃ Migrate Legacy 'screenly' Data Paths ┃
> ┃ ┃
> ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
> 
> \[migrate\_legacy\_paths\] Creating compat symlink /home/salman/screenly -\> /home/salman/anthias
> 
> ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
> ┃ ┃
> ┃ Install uv and host Python dependencies ┃
> ┃ ┃
> ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
> 
> downloading uv 0.9.17 aarch64-unknown-linux-gnu
> no checksums to verify
> installing to /home/salman/.local/bin
> uv
> uvx
> everything's installed!
> 
> To add $HOME/.local/bin to your PATH, either restart your shell or run:
> 
> source $HOME/.local/bin/env (sh, bash, zsh)
> source $HOME/.local/bin/env.fish (fish)
> Using CPython 3.14.2
> Creating virtual environment at: installer\_venv
> Resolved 127 packages in 5.07s
> Built pyyaml==6.0.2
> Prepared 18 packages in 6.07s
> Installed 18 packages in 34ms
> + ansible-core==2.19.9
> + certifi==2026.4.22
> + cffi==2.0.0
> + charset-normalizer==3.4.4
> + cryptography==46.0.7
> + getmac==0.9.5
> + idna==3.13
> + jinja2==3.1.6
> + markupsafe==3.0.3
> + netifaces2==0.0.22
> + packaging==26.1
> + pycparser==2.23
> + pyyaml==6.0.2
> + redis==7.4.0
> + requests==2.33.1
> + resolvelib==1.0.1
> + tenacity==9.1.4
> + urllib3==2.6.3
> 
> ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
> ┃ ┃
> ┃ Run the Anthias Ansible Playbook ┃
> ┃ ┃
> ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
> 
> Note: Ansible may prompt for your sudo password below.
> 
> BECOME password:
> 
> PLAY \[Install Anthias\] \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
> 
> TASK \[Gathering Facts\] \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
> ok: \[localhost\]
> 
> TASK \[Validate required environment variables\] \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
> ok: \[localhost\] =\> {
> "changed": false,
> "msg": "All assertions passed"
> }
> 
> TASK \[system : Configure boot partition (/boot/{config,cmdline}.txt)\] \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
> included: /home/salman/anthias/ansible/roles/system/tasks/boot.yml for localhost
> 
> TASK \[system : Resolve boot config and cmdline paths\] \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
> ok: \[localhost\]
> 
> TASK \[system : Check NOOBS\] \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
> ok: \[localhost\]
> 
> TASK \[system : Make sure we have proper framebuffer depth\] \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
> changed: \[localhost\]
> 
> TASK \[system : Fix framebuffer bug\] \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
> changed: \[localhost\]
> 
> TASK \[system : Add gpu\_mem\_256 in config.txt if it doesn't exist\] \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
> changed: \[localhost\]
> 
> TASK \[system : Add gpu\_mem\_512 in config.txt if it doesn't exist\] \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
> changed: \[localhost\]
> 
> TASK \[system : Add gpu\_mem\_1024 in config.txt if it doesn't exist\] \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
> changed: \[localhost\]
> 
> TASK \[system : Add pi4 section in config.txt if it doesn't exist\] \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
> changed: \[localhost\]
> 
> TASK \[system : Uncomment out the original dtoverlay config.\] \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
> ok: \[localhost\]
> 
> TASK \[system : Remove the FKMS config for all devices.\] \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
> ok: \[localhost\]
> 
> TASK \[system : Backup kernel boot args\] \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
> changed: \[localhost\]
> 
> TASK \[system : Notice for cmdline.txt.orig file\] \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
> ok: \[localhost\] =\> {
> "msg": "Use cmdline.txt.orig for boot parameters (don't remove this file)"
> }
> 
> TASK \[system : Copy cmdline.txt.orig to cmdline.txt\] \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
> ok: \[localhost\]
> 
> TASK \[system : For splash screen using Plymouth\] \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
> ok: \[localhost\]
> 
> TASK \[system : Remove blinking cursor\] \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
> changed: \[localhost\]
> 
> TASK \[system : Plymouth ignore serial consoles\] \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
> ok: \[localhost\]
> 
> TASK \[system : Use Systemd as init and quiet boot process\] \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
> changed: \[localhost\]
> 
> TASK \[system : Set ethN/wlanN names for interfaces\] \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
> changed: \[localhost\]
> 
> TASK \[system : Set cgroup\_enable required by containerd for OOM\] \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
> changed: \[localhost\]
> 
> TASK \[system : Set cgroup\_memory required by containerd for OOM\] \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
> changed: \[localhost\]
> 
> TASK \[system : Install/remove apt packages\] \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
> included: /home/salman/anthias/ansible/roles/system/tasks/packages.yml for localhost
> 
> TASK \[system : Check if cdefs.h exists\] \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
> skipping: \[localhost\]
> 
> TASK \[system : Remove libc6-dev\] \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
> skipping: \[localhost\]
> 
> TASK \[system : Install libc6-dev\] \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
> skipping: \[localhost\]
> 
> TASK \[system : Install Anthias dependencies\] \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
> changed: \[localhost\]
> 
> TASK \[system : Remove deprecated apt dependencies\] \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
> changed: \[localhost\]
> 
> TASK \[system : Remove distro Docker packages\] \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
> ok: \[localhost\]
> 
> TASK \[system : Install and configure Docker\] \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
> included: /home/salman/anthias/ansible/roles/system/tasks/docker.yml for localhost
> 
> TASK \[system : Create keyrings directory\] \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
> ok: \[localhost\]
> 
> TASK \[system : Add Docker apt key\] \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
> changed: \[localhost\]
> 
> TASK \[system : Set system\_architecture\] \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
> ok: \[localhost\]
> 
> TASK \[system : Add Docker repo\] \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
> changed: \[localhost\]
> 
> TASK \[system : Install Docker\] \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
> changed: \[localhost\]
> 
> TASK \[system : Ensure required groups exist\] \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
> ok: \[localhost\] =\> (item=docker)
> ok: \[localhost\] =\> (item=adm)
> ok: \[localhost\] =\> (item=sudo)
> ok: \[localhost\] =\> (item=video)
> ok: \[localhost\] =\> (item=plugdev)
> ok: \[localhost\] =\> (item=users)
> ok: \[localhost\] =\> (item=input)
> ok: \[localhost\] =\> (item=netdev)
> ok: \[localhost\] =\> (item=dialout)
> ok: \[localhost\] =\> (item=gpio)
> 
> TASK \[system : Ensure Anthias user is in required groups\] \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
> changed: \[localhost\]
> 
> TASK \[system : Configure /etc/timezone\] \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
> included: /home/salman/anthias/ansible/roles/system/tasks/timezone.yml for localhost
> 
> TASK \[system : Check if /etc/timezone exists\] \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
> ok: \[localhost\]
> 
> TASK \[system : Resolve /etc/localtime symlink\] \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
> skipping: \[localhost\]
> 
> TASK \[system : Create /etc/timezone from /etc/localtime\] \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
> skipping: \[localhost\]
> 
> TASK \[system : Apply distribution upgrade\] \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
> included: /home/salman/anthias/ansible/roles/system/tasks/dist\_upgrade.yml for localhost
> 
> TASK \[system : Perform system upgrade\] \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
> changed: \[localhost\]
> 
> TASK \[system : Clean up unused packages\] \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
> changed: \[localhost\]
> 
> TASK \[system : Miscellaneous host-level config (rc.local, dpkg, swap)\] \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
> included: /home/salman/anthias/ansible/roles/system/tasks/misc.yml for localhost
> 
> TASK \[system : Install rc.local\] \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
> changed: \[localhost\]
> 
> TASK \[system : Install dpkg 01\_nodoc filter\] \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
> changed: \[localhost\]
> 
> TASK \[system : Disable swap\] \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
> changed: \[localhost\]
> 
> TASK \[system : Remove swapfile from disk\] \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
> changed: \[localhost\]
> 
> TASK \[anthias : Ensure folders exist\] \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
> changed: \[localhost\] =\> (item=.anthias)
> ok: \[localhost\] =\> (item=.config)
> changed: \[localhost\] =\> (item=anthias\_assets)
> 
> TASK \[anthias : Create empty .asoundrc\] \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
> changed: \[localhost\]
> 
> TASK \[anthias : Copy Anthias default assets file\] \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
> changed: \[localhost\]
> 
> TASK \[anthias : Remove deprecated parameter "listen"\] \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
> ok: \[localhost\]
> 
> TASK \[anthias : Verify uv is installed for salman\] \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
> ok: \[localhost\]
> 
> TASK \[anthias : Assert uv is present\] \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
> ok: \[localhost\] =\> {
> "changed": false,
> "msg": "All assertions passed"
> }
> 
> TASK \[anthias : Sync host pip dependencies via uv\] \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
> \[ERROR\]: Task failed: Action failed: Module result deserialization failed: Unknown profile name 'module\_legacy\_m2c'.
> 
> Task failed: Action failed.
> Origin: /home/salman/anthias/ansible/roles/anthias/tasks/main.yml:58:3
> 
> 56 as the {{ anthias\_user }} user.
> 57
> 58 - name: Sync host pip dependencies via uv
> ^ column 3
> 
> \<\<\< caused by \>\>\>
> 
> Module result deserialization failed: Unknown profile name 'module\_legacy\_m2c'. See stdout/stderr for the returned output.
> 
> fatal: \[localhost\]: FAILED! =\> {"changed": false, "changed\_when\_result": "Error while evaluating conditional: object of type 'dict' has no attribute 'stderr'", "module\_stderr": "", "module\_stdout": "\\n{\\"changed\\": true, \\"stdout\\": \\"\\", \\"stderr\\": \\"Downloading cpython-3.13.11-linux-aarch64-gnu (download) (27.3MiB)\\\\n Downloaded cpython-3.13.11-linux-aarch64-gnu (download)\\\\nUsing CPython 3.13.11\\\\nerror: failed to remove directory \`/home/salman/installer\_venv/lib\`: Permission denied (os error 13)\\", \\"rc\\": 2, \\"cmd\\": \[\\"/home/salman/.local/bin/uv\\", \\"sync\\", \\"--no-default-groups\\", \\"--group\\", \\"host\\", \\"--no-install-project\\"\], \\"start\\": \\"2026-05-08 00:54:20.028751\\", \\"end\\": \\"2026-05-08 00:54:28.926122\\", \\"delta\\": \\"0:00:08.897371\\", \\"failed\\": true, \\"msg\\": \\"non-zero return code\\", \\"invocation\\": {\\"module\_args\\": {\\"chdir\\": \\"/home/salman/anthias\\", \\"cmd\\": \\"/home/salman/.local/bin/uv sync\\\\n --no-default-groups\\\\n --group host\\\\n --no-install-project\\", \\"\_uses\_shell\\": false, \\"expand\_argument\_vars\\": true, \\"stdin\_add\_newline\\": true, \\"strip\_empty\_ends\\": true, \\"\_raw\_params\\": null, \\"argv\\": null, \\"executable\\": null, \\"creates\\": null, \\"removes\\": null, \\"stdin\\": null}}}\\n", "msg": "Module result deserialization failed: Unknown profile name 'module\_legacy\_m2c'.", "rc": 1}
> 
> PLAY RECAP \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
> localhost : ok=51 changed=27 unreachable=0 failed=1 skipped=5 rescued=0 ignored=0
> 
> salman@pi5:~ $
> \`\`\`
> \*\*Error only\*\*
> \`\`\`
> TASK \[anthias : Sync host pip dependencies via uv\] \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
> \[ERROR\]: Task failed: Action failed: Module result deserialization failed: Unknown profile name 'module\_legacy\_m2c'.
> 
> Task failed: Action failed.
> Origin: /home/salman/anthias/ansible/roles/anthias/tasks/main.yml:58:3
> 
> 56 as the {{ anthias\_user }} user.
> 57
> 58 - name: Sync host pip dependencies via uv
> ^ column 3
> 
> \<\<\< caused by \>\>\>
> 
> Module result deserialization failed: Unknown profile name 'module\_legacy\_m2c'. See stdout/stderr for the returned output.
> 
> fatal: \[localhost\]: FAILED! =\> {"changed": false, "changed\_when\_result": "Error while evaluating conditional: object of type 'dict' has no attribute 'stderr'", "module\_stderr": "", "module\_stdout": "\\n{\\"changed\\": true, \\"stdout\\": \\"\\", \\"stderr\\": \\"Downloading cpython-3.13.11-linux-aarch64-gnu (download) (27.3MiB)\\\\n Downloaded cpython-3.13.11-linux-aarch64-gnu (download)\\\\nUsing CPython 3.13.11\\\\nerror: failed to remove directory \`/home/salman/installer\_venv/lib\`: Permission denied (os error 13)\\", \\"rc\\": 2, \\"cmd\\": \[\\"/home/salman/.local/bin/uv\\", \\"sync\\", \\"--no-default-groups\\", \\"--group\\", \\"host\\", \\"--no-install-project\\"\], \\"start\\": \\"2026-05-08 00:54:20.028751\\", \\"end\\": \\"2026-05-08 00:54:28.926122\\", \\"delta\\": \\"0:00:08.897371\\", \\"failed\\": true, \\"msg\\": \\"non-zero return code\\", \\"invocation\\": {\\"module\_args\\": {\\"chdir\\": \\"/home/salman/anthias\\", \\"cmd\\": \\"/home/salman/.local/bin/uv sync\\\\n --no-default-groups\\\\n --group host\\\\n --no-install-project\\", \\"\_uses\_shell\\": false, \\"expand\_argument\_vars\\": true, \\"stdin\_add\_newline\\": true, \\"strip\_empty\_ends\\": true, \\"\_raw\_params\\": null, \\"argv\\": null, \\"executable\\": null, \\"creates\\": null, \\"removes\\": null, \\"stdin\\": null}}}\\n", "msg": "Module result deserialization failed: Unknown profile name 'module\_legacy\_m2c'.", "rc": 1}
> 
> PLAY RECAP \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
> localhost : ok=51 changed=27 unreachable=0 failed=1 skipped=5 rescued=0 ignored=0
> \`\`\`
> 
> 
> \### Steps to Reproduce
> 
> Steps to reproduce the behavior:
> 1. Use Bookwork on Pi5 
> 2. run Anthias installer Script 
> 4. See error
> 
> 
> \### Environment
> 
> \- Device: Raspberry Pi 5,
> \- OS: Raspberry Pi OS 64-bit Bookworm
> \- Anthias Version: 
> \- Installation Method: Manual Installation

EDIT2: no it didnt fix it at all i had to:

```auto
docker rm -f $(docker ps -aq)
docker rmi -f $(docker images -q)
cd /home/signage/anthias
docker compose up -d

```

now i have the latest images as the interface is completely different, after running the previous script i still had docker images that were 6 weeks old, all good at least i know how it works now

EDIT3: nope its still broken, after reboot i get a black screen, the web interface works but nothing on screen except an underscore in the top left…

---

<div class="post-metadata">

**Author:** ![vpetersson](https://yyz1.discourse-cdn.com/flex029/user_avatar/forums.screenly.io/vpetersson/32/8_2.png) [@vpetersson](https://forums.screenly.io/u/vpetersson)\
**Post date:** [May 8, 2026, 7:53am UTC](https://forums.screenly.io/t/what-is-the-recommended-way-to-upgrade-anthias/6682/4 "2026-05-08T07:53:18Z")

</div>

Could you try upgrading to Trixie? Things _should_ in theory work on Bookworm, but the matrix of supported devices/debian versions is getting very big and hard to test.

---

<div class="post-metadata">

**Author:** ![MapleSaboteur](https://avatars.discourse-cdn.com/v4/letter/m/c37758/32.png) [@MapleSaboteur](https://forums.screenly.io/u/MapleSaboteur)\
**Post date:** [May 10, 2026, 10:12pm UTC](https://forums.screenly.io/t/what-is-the-recommended-way-to-upgrade-anthias/6682/5 "2026-05-10T22:12:51Z")

</div>

upgraded to trixie, ran your fixed installer, still didnt work, removed all traces of anthias from the system including docker images/containers, ran the fixed installer script again which worked but now i get this constantly in the journal and i cant shutdown the system from the web interface

```auto
May 11 10:09:30 Signage (python)[7048]: anthias-host-agent.service: Unable to locate executable '/home/signage/installer_venv/bin/python': No such file or directory
May 11 10:09:30 Signage (python)[7048]: anthias-host-agent.service: Failed at step EXEC spawning /home/signage/installer_venv/bin/python: No such file or directory
May 11 10:09:30 Signage systemd[1]: anthias-host-agent.service: Main process exited, code=exited, status=203/EXEC
May 11 10:09:30 Signage systemd[1]: anthias-host-agent.service: Failed with result 'exit-code'.

```

---

<div class="post-metadata">

**Author:** ![vpetersson](https://yyz1.discourse-cdn.com/flex029/user_avatar/forums.screenly.io/vpetersson/32/8_2.png) [@vpetersson](https://forums.screenly.io/u/vpetersson)\
**Post date:** [May 11, 2026, 7:44am UTC](https://forums.screenly.io/t/what-is-the-recommended-way-to-upgrade-anthias/6682/6 "2026-05-11T07:44:42Z")

</div>

That is strange indeed. How did you invoke the installer?

Try running it like this:

`bash <(curl -sL https://install-anthias.srly.io)`
