Compare commits

..

156 Commits

Author SHA1 Message Date
alexbelgium
13a4548372 fix(claude_desktop): correct HA MCP endpoint, harden config perms and chmod scope
Home Assistant's MCP Server integration serves stateless Streamable HTTP at
/api/mcp; mcp-proxy defaults to SSE, so the previous registration (SSE at
/mcp_server/sse) could never attach. Pass --transport=streamablehttp
--stateless and default ha_mcp_url to /api/mcp.

Match managed MCP entries by binary basename outside $HOME so a base-image
path change still updates them, while user-installed binaries under $HOME
remain untouched. Resolve tokensave via command -v like the others.

Write Claude config files 0600 (they hold the HA long-lived token in clear
text) and scope the build-time chmod +x pass to the shipped script dirs.

Docs: dashboard reachability wording, stale /config/data HOME, and the
custom-script filename (claude_desktop.sh, per the $slug.sh template).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-14 16:45:50 +02:00
alexbelgium
b56be1f57d feat(claude_desktop): desktop-only architecture, fix dashboard + dispatch
Remove standalone web terminal (ttyd/tmux service, port 7681, terminal_*
options, claude-direct/claude-headroom wrappers). Claude Code stays and
powers Desktop cowork/dispatch sessions.

Fix Headroom dashboard: proxy bound 127.0.0.1 only, mapped port 8787
refused external connections; bind 0.0.0.0.

Fix dispatch/sign-in persistence: gnome-keyring package was never
installed, so the autostart keyring bootstrap no-oped and Electron
safeStorage was unavailable (allowlist cache + auth grants lost).

Add tokensave MCP (pinned 7.2.0, source-built like RTK), real HA MCP
bridge via mcp-proxy (enable_ha_mcp + ha_mcp_url/ha_mcp_token), uv for
additional_pip. Register managed MCP servers in Desktop and Claude Code
configs without clobbering user entries. Drop orphan options
ha_smart_context/dangerously_skip_permissions.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-14 16:27:52 +02:00
Alexandre
2951b04f57 Update config.yaml 2026-07-14 16:18:58 +02:00
Alexandre
245c52fcf2 Merge pull request #2857 from alexbelgium/agent/add-chatgpt-codex-addon
Add ChatGPT Codex add-on with Headroom and RTK
2026-07-14 16:18:22 +02:00
Alexandre
2b6c9eace7 Release latest-version build policy 2026-07-14 16:04:13 +02:00
Alexandre
fd268d0e6d Normalize latest-version documentation 2026-07-14 16:01:29 +02:00
Alexandre
5792d84336 Keep updater metadata separate from build resolution 2026-07-14 16:00:57 +02:00
Alexandre
bf97abdb4f Document latest-version build policy 2026-07-14 16:00:44 +02:00
Alexandre
7de4789196 Document unpinned tool installation 2026-07-14 15:59:05 +02:00
Alexandre
34e8a75bf8 Install latest tool releases at build time 2026-07-14 15:58:55 +02:00
Alexandre
652be8b13c Pin Codex and Headroom releases 2026-07-14 15:03:34 +02:00
Alexandre
78f5289518 Fix Codex add-on lint metadata 2026-07-14 14:59:11 +02:00
Alexandre
12384ee606 Follow custom data location for Codex workspace 2026-07-14 14:55:02 +02:00
Alexandre
df0dacf6b9 Restrict Codex ingress to administrators 2026-07-14 14:53:30 +02:00
Alexandre
2cbf2a6f08 Add ChatGPT Codex add-on with Headroom and RTK 2026-07-14 14:51:06 +02:00
Alexandre
adcd892e62 Merge pull request #2856 from alexbelgium/fix/elasticsearch-force-rebuild
fix(elasticsearch): force fresh image pull for users stuck on a stale 7.17.9 image
2026-07-14 14:34:59 +02:00
Alexandre
980be49d9b Merge branch 'master' into fix/elasticsearch-force-rebuild 2026-07-14 14:34:28 +02:00
github-actions
9cff4f83b9 GitHub bot: changelog [nobuild] 2026-07-14 11:42:46 +00:00
Alexandre
688d1cbdcf Update config.yaml 2026-07-14 13:40:23 +02:00
alexbelgium
02bbfa86c3 fix(elasticsearch): force fresh image pull, clarify non-root failure
The published 8.19.18 images are correct (verified: real ES 8.19.18,
run as root, migration + privilege-drop in place). But some upgrades
were left running a stale cached Elasticsearch 7.17.9 image that starts
as uid 1000, producing the reported "mv: cannot move '/data/config' ...
Permission denied" and "AccessDeniedException[.../data/nodes/0]".

- Bump version to 8.19.18-3 to force Home Assistant / Docker to pull a
  fresh image tag instead of reusing the cached one.
- Add an explicit root check on the first init pass (before any move or
  chown) so a non-root start fails with a clear, actionable message
  instead of the cryptic permission error, and wrap the config-archive
  mv with the same clear failure. The re-exec'd uid-1000 pass returns
  before this check, so the privilege drop still works.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-14 13:35:03 +02:00
Alexandre
a5916d9236 nobuild 2026-07-14 13:06:55 +02:00
Alexandre
371c206fc0 Update Elasticsearch version to 8.19.18 2026-07-14 13:06:17 +02:00
github-actions
75ce8e94e4 GitHub bot: changelog [nobuild] 2026-07-14 10:47:03 +00:00
Alexandre
0b7b0ac1df Update config.yaml 2026-07-14 12:43:40 +02:00
Alexandre
2f4ab956db Update config.yaml 2026-07-14 12:43:18 +02:00
Alexandre
08a7bd35cb Merge pull request #2854 from alexbelgium/fix/elasticsearch-runtime-root-permission
fix(elasticsearch): stay root at runtime, fix upgrade permission failure
2026-07-14 12:41:49 +02:00
alexbelgium
a313475d92 fix(elasticsearch): drop to uid 1000 before starting Elasticsearch
Elasticsearch refuses to bootstrap as root ("can not run elasticsearch
as root"). The previous fix in this PR kept the container root at
runtime to fix the /data permission failure, but never dropped
privileges again afterward — unlike 7.17.9, whose own entrypoint used
`chroot --userspec=1000:0` before launching Elasticsearch, the upstream
8.x entrypoint no longer does that. So every start, fresh or upgrade,
would fail once addon-init.sh's setup finished.

Fix: after addon-init.sh completes its root-only work (migration guard,
data/config relocation, chown), it re-execs the entrypoint itself as
uid 1000 via `chroot --userspec=1000:0 / ...` — the same mechanism
7.17.9 used, and exactly what the add-on's AppArmor profile already
grants (sys_chroot, setuid, setgid). On the re-exec'd pass the script
returns immediately (guarded by an exported sentinel) so none of the
setup work repeats; exported env vars (env_vars, the security default)
survive the exec normally.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-14 12:33:26 +02:00
alexbelgium
087d23eeaf fix(elasticsearch): stay root at runtime, fix upgrade permission failure
Reported: on upgrade from an existing 7.17.9 install, the add-on failed
to start with "mv: cannot move '/data/config' to
'/data/config.bak-7.17.9': Permission denied".

Root cause: a previous fix in this same release restored `USER 1000:0`
at the end of the Dockerfile to match the upstream base image's own
final USER directive. But the upstream 8.19 entrypoint no longer drops
privileges itself (confirmed: it execs elasticsearch directly, no
gosu/chroot dance), and existing installs have /data owned by root
(7.17.9's default image variant runs fully as root). A non-root
container can never chown or move that data.

Revert to root at runtime, matching how this add-on always ran and
matching its own AppArmor profile (chown, setuid, setgid, sys_chroot,
mount capabilities — all meaningless for a non-root process anyway).
Root stays required for the build-time entrypoint patch too, unchanged
from the prior fix.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-14 12:12:16 +02:00
github-actions
a9a6b22a62 GitHub bot: sanitize (spaces + LF endings) & chmod [nobuild] 2026-07-14 09:43:11 +00:00
Alexandre
b16305a9e6 Merge pull request #2853 from alexbelgium/fix/elasticsearch-8x-migration
fix(elasticsearch): upgrade to 8.19.18 with automatic data migration
2026-07-14 11:42:25 +02:00
github-actions
34135ba471 GitHub bot: changelog [nobuild] 2026-07-14 08:07:54 +00:00
Alexandre
ab02e92ad1 Update config.yaml 2026-07-14 09:59:51 +02:00
Alexandre
6f93187535 nobuild 2026-07-14 09:56:15 +02:00
Alexandre
a90fe9ee4a Update Dockerfile 2026-07-14 09:34:10 +02:00
Alexandre
6bb4cb735d Update config.yaml 2026-07-14 09:32:13 +02:00
Alexandre
299c97c83f Merge pull request #2818 from alexbelgium/codex/fix-netbird-server-startup
[codex] Fix NetBird server startup
2026-07-14 09:01:51 +02:00
Alexandre
ad5eba5657 Update config.yaml 2026-07-14 08:56:36 +02:00
github-actions
bd6daa32b7 GitHub bot: changelog [nobuild] 2026-07-14 06:48:31 +00:00
Alexandre
7df08e4f84 Update config.yaml 2026-07-14 08:46:38 +02:00
github-actions
b8421be1e9 GitHub bot: changelog [nobuild] 2026-07-13 09:36:03 +00:00
Alexandre
30f99d738b Update config.yaml 2026-07-13 11:34:08 +02:00
alexbelgium
d44b38981e Updater bot : zzz_archived_code-server updated to 4.128.0 2026-07-13 08:34:21 +02:00
alexbelgium
c6c5197eb8 Updater bot : tdarr updated to 2.83.01 2026-07-13 08:33:00 +02:00
alexbelgium
a966369e96 Updater bot : tandoor_recipes updated to 2.6.13 2026-07-13 08:32:58 +02:00
alexbelgium
0363265d84 Updater bot : social_to_mealie updated to 1.7.1 2026-07-13 08:32:42 +02:00
alexbelgium
bb2146866f Updater bot : scrutiny_fa updated to v1.66.0 2026-07-13 08:32:25 +02:00
alexbelgium
21b9783fe2 Updater bot : scrutiny updated to v1.66.0 2026-07-13 08:32:21 +02:00
alexbelgium
8162d42e41 Updater bot : radarr updated to 6.3.0.10514 2026-07-13 08:32:03 +02:00
alexbelgium
4b848c9054 Updater bot : prowlarr updated to develop-2.5.1.5464-ls268 2026-07-13 08:31:56 +02:00
GitHub Actions
731f099c8c Revert "Updater bot : ente updated to 4.4.24"
This reverts commit 5755df5181.
2026-07-13 06:31:53 +00:00
GitHub Actions
e56dcf7abd Revert "Updater bot : flexget updated to 3.19.27"
This reverts commit dc206213ca.
2026-07-13 06:31:53 +00:00
GitHub Actions
e25b4ec1d3 Revert "Updater bot : gitea updated to 1.27.0"
This reverts commit 19c3cf8252.
2026-07-13 06:31:53 +00:00
GitHub Actions
9161c28e27 Revert "Updater bot : grav updated to 2.0.10"
This reverts commit 289b3b53f1.
2026-07-13 06:31:53 +00:00
GitHub Actions
82af311c37 Revert "Updater bot : immich updated to 3.0.2"
This reverts commit 3c5212b4ef.
2026-07-13 06:31:53 +00:00
GitHub Actions
85dd1669fa Revert "Updater bot : immich_cuda updated to 3.0.2"
This reverts commit 3ad3b1d1ba.
2026-07-13 06:31:53 +00:00
GitHub Actions
98962ac296 Revert "Updater bot : immich_frame updated to 1.0.35.0"
This reverts commit 2468d11400.
2026-07-13 06:31:53 +00:00
GitHub Actions
6d199b146b Revert "Updater bot : immich_noml updated to 3.0.2"
This reverts commit c8a52ba915.
2026-07-13 06:31:53 +00:00
GitHub Actions
b0750a8a7f Revert "Updater bot : immich_openvino updated to 3.0.2"
This reverts commit cedccabef2.
2026-07-13 06:31:53 +00:00
GitHub Actions
ef9f76e91c Revert "Updater bot : jackett updated to 0.24.2206"
This reverts commit e17cc922f9.
2026-07-13 06:31:53 +00:00
GitHub Actions
8bc048b993 Revert "Updater bot : linkwarden updated to 2.15.1"
This reverts commit 796a4132bf.
2026-07-13 06:31:53 +00:00
GitHub Actions
26533b6697 Revert "Updater bot : maintainerr updated to 3.17.1"
This reverts commit afe45b7a75.
2026-07-13 06:31:53 +00:00
GitHub Actions
3eafa3e028 Revert "Updater bot : navidrome updated to 0.63.2"
This reverts commit 44f576699d.
2026-07-13 06:31:53 +00:00
GitHub Actions
9173829335 Revert "Updater bot : nzbget updated to v26.2-ls253"
This reverts commit 246a7ce157.
2026-07-13 06:31:53 +00:00
GitHub Actions
6b50abe96d Revert "Updater bot : openproject updated to 17.6.0"
This reverts commit a5bba509ef.
2026-07-13 06:31:52 +00:00
GitHub Actions
9a4f384d5a Revert "Updater bot : plex updated to 1.43.2.10687-563d026ea-ls312"
This reverts commit 521d555615.
2026-07-13 06:31:52 +00:00
alexbelgium
521d555615 Updater bot : plex updated to 1.43.2.10687-563d026ea-ls312 2026-07-13 08:31:45 +02:00
alexbelgium
a5bba509ef Updater bot : openproject updated to 17.6.0 2026-07-13 08:31:36 +02:00
alexbelgium
246a7ce157 Updater bot : nzbget updated to v26.2-ls253 2026-07-13 08:31:28 +02:00
alexbelgium
44f576699d Updater bot : navidrome updated to 0.63.2 2026-07-13 08:31:14 +02:00
alexbelgium
afe45b7a75 Updater bot : maintainerr updated to 3.17.1 2026-07-13 08:30:55 +02:00
alexbelgium
796a4132bf Updater bot : linkwarden updated to 2.15.1 2026-07-13 08:30:51 +02:00
alexbelgium
e17cc922f9 Updater bot : jackett updated to 0.24.2206 2026-07-13 08:30:29 +02:00
alexbelgium
cedccabef2 Updater bot : immich_openvino updated to 3.0.2 2026-07-13 08:30:21 +02:00
alexbelgium
c8a52ba915 Updater bot : immich_noml updated to 3.0.2 2026-07-13 08:30:16 +02:00
alexbelgium
2468d11400 Updater bot : immich_frame updated to 1.0.35.0 2026-07-13 08:30:11 +02:00
alexbelgium
3ad3b1d1ba Updater bot : immich_cuda updated to 3.0.2 2026-07-13 08:30:07 +02:00
alexbelgium
3c5212b4ef Updater bot : immich updated to 3.0.2 2026-07-13 08:30:02 +02:00
alexbelgium
289b3b53f1 Updater bot : grav updated to 2.0.10 2026-07-13 08:29:55 +02:00
alexbelgium
19c3cf8252 Updater bot : gitea updated to 1.27.0 2026-07-13 08:29:48 +02:00
alexbelgium
dc206213ca Updater bot : flexget updated to 3.19.27 2026-07-13 08:29:37 +02:00
alexbelgium
5755df5181 Updater bot : ente updated to 4.4.24 2026-07-13 08:29:15 +02:00
alexbelgium
0b6c410001 Updater bot : emby_beta updated to 4.10.0.19 2026-07-13 08:29:04 +02:00
alexbelgium
2a498af497 Updater bot : claude_desktop updated to ubunturesolute-version-6dc44b0e 2026-07-13 08:28:44 +02:00
alexbelgium
b620907a6a Updater bot : birdnet-pipy updated to 0.8.4 2026-07-13 08:27:15 +02:00
alexbelgium
98629f7214 Updater bot : birdnet-go updated to 20260712 2026-07-13 08:27:09 +02:00
github-actions
769cfc278e Github bot : image compressed 2026-07-12 23:21:20 +00:00
github-actions
9d21c49fa5 GitHub bot : README updated 2026-07-12 17:22:16 +00:00
Alexandre
49d78a32d5 Merge pull request #2846 from alexbelgium/agent/fix-claude-rtk-arm64
Fix RTK compatibility and Claude add-on validation
2026-07-12 19:12:22 +02:00
Alexandre
5208dd3ce9 Merge branch 'master' into agent/fix-claude-rtk-arm64 2026-07-12 19:12:06 +02:00
Alexandre
055f6e58f3 Update config.yaml 2026-07-12 19:11:14 +02:00
github-actions[bot]
e2bec544cb Update stargazer map & cache 2026-07-12 01:24:56 +00:00
Alexandre
23f756b4db Merge pull request #2848 from ToledoEM/fix/npm-letsencrypt-persist
Persist NPM Let's Encrypt certificates
2026-07-11 16:41:09 +02:00
ToledoEM
efa5ed9b59 coderabbitai suggestions 2026-07-11 12:26:19 +01:00
ToledoEM
82c784ce6e Persist NPM Let's Encrypt certificates 2026-07-11 12:14:25 +01:00
GitHub Actions
83b791e6c3 Revert "Updater bot : ente updated to 4.4.24"
This reverts commit 839cfd1382.
2026-07-10 23:32:12 +00:00
GitHub Actions
c3a8e1d57b Revert "Updater bot : flexget updated to 3.19.27"
This reverts commit b21ce72e0e.
2026-07-10 23:32:12 +00:00
GitHub Actions
382de98a9b Revert "Updater bot : grav updated to 2.0.10"
This reverts commit 91ed6c3f46.
2026-07-10 23:32:12 +00:00
GitHub Actions
ca6c6a54d3 Revert "Updater bot : immich updated to 3.0.2"
This reverts commit 6e02e611f4.
2026-07-10 23:32:12 +00:00
GitHub Actions
57d8edb445 Revert "Updater bot : immich_cuda updated to 3.0.2"
This reverts commit aa77249314.
2026-07-10 23:32:12 +00:00
GitHub Actions
d9252da5a3 Revert "Updater bot : immich_frame updated to 1.0.35.0"
This reverts commit c8f5ec8f20.
2026-07-10 23:32:12 +00:00
GitHub Actions
deb51a0bed Revert "Updater bot : immich_noml updated to 3.0.2"
This reverts commit af68eece53.
2026-07-10 23:32:12 +00:00
GitHub Actions
dbaa8a8a98 Revert "Updater bot : immich_openvino updated to 3.0.2"
This reverts commit b98ae69a6c.
2026-07-10 23:32:12 +00:00
GitHub Actions
4cf79224f7 Revert "Updater bot : jackett updated to 0.24.2200"
This reverts commit 534a526185.
2026-07-10 23:32:12 +00:00
GitHub Actions
90fd373c2c Revert "Updater bot : linkwarden updated to 2.15.0"
This reverts commit 481094574d.
2026-07-10 23:32:12 +00:00
GitHub Actions
e930e36e0d Revert "Updater bot : maintainerr updated to 3.17.1"
This reverts commit 22bbbfdf75.
2026-07-10 23:32:12 +00:00
GitHub Actions
35c3077bec Revert "Updater bot : navidrome updated to 0.63.1"
This reverts commit 682a96fc8e.
2026-07-10 23:32:12 +00:00
GitHub Actions
06e0a32f81 Revert "Updater bot : nzbget updated to v26.2-ls253"
This reverts commit e8260efe37.
2026-07-10 23:32:12 +00:00
GitHub Actions
22f9490b77 Revert "Updater bot : openproject updated to 17.6.0"
This reverts commit 29ca739709.
2026-07-10 23:32:12 +00:00
GitHub Actions
72851eea95 Revert "Updater bot : plex updated to 1.43.2.10687-563d026ea-ls312"
This reverts commit 554d7dc04f.
2026-07-10 23:32:12 +00:00
GitHub Actions
2bc142b5fe Revert "Updater bot : prowlarr updated to develop-2.5.1.5460-ls267"
This reverts commit ea3e5e425b.
2026-07-10 23:32:12 +00:00
GitHub Actions
3e5649f00f Revert "Updater bot : scrutiny updated to v1.66.0"
This reverts commit 8788211f8a.
2026-07-10 23:32:12 +00:00
GitHub Actions
8c7a43b5be Revert "Updater bot : scrutiny_fa updated to v1.66.0"
This reverts commit 842c237965.
2026-07-10 23:32:12 +00:00
GitHub Actions
e7a6add76f Revert "Updater bot : social_to_mealie updated to 1.7.0"
This reverts commit 2aaf940b73.
2026-07-10 23:32:12 +00:00
GitHub Actions
0d56b4dded Revert "Updater bot : tandoor_recipes updated to 2.6.13"
This reverts commit 71c67e7eef.
2026-07-10 23:32:12 +00:00
GitHub Actions
7ee213406d Revert "Updater bot : tdarr updated to 2.82.02"
This reverts commit e6210d484d.
2026-07-10 23:32:12 +00:00
alexbelgium
e6210d484d Updater bot : tdarr updated to 2.82.02 2026-07-11 01:31:25 +02:00
alexbelgium
71c67e7eef Updater bot : tandoor_recipes updated to 2.6.13 2026-07-11 01:31:23 +02:00
alexbelgium
2aaf940b73 Updater bot : social_to_mealie updated to 1.7.0 2026-07-11 01:31:08 +02:00
alexbelgium
842c237965 Updater bot : scrutiny_fa updated to v1.66.0 2026-07-11 01:30:50 +02:00
alexbelgium
8788211f8a Updater bot : scrutiny updated to v1.66.0 2026-07-11 01:30:46 +02:00
alexbelgium
ea3e5e425b Updater bot : prowlarr updated to develop-2.5.1.5460-ls267 2026-07-11 01:30:22 +02:00
alexbelgium
554d7dc04f Updater bot : plex updated to 1.43.2.10687-563d026ea-ls312 2026-07-11 01:30:11 +02:00
alexbelgium
29ca739709 Updater bot : openproject updated to 17.6.0 2026-07-11 01:30:01 +02:00
alexbelgium
e8260efe37 Updater bot : nzbget updated to v26.2-ls253 2026-07-11 01:29:54 +02:00
alexbelgium
682a96fc8e Updater bot : navidrome updated to 0.63.1 2026-07-11 01:29:40 +02:00
alexbelgium
22bbbfdf75 Updater bot : maintainerr updated to 3.17.1 2026-07-11 01:29:21 +02:00
alexbelgium
481094574d Updater bot : linkwarden updated to 2.15.0 2026-07-11 01:29:17 +02:00
alexbelgium
534a526185 Updater bot : jackett updated to 0.24.2200 2026-07-11 01:28:54 +02:00
alexbelgium
b98ae69a6c Updater bot : immich_openvino updated to 3.0.2 2026-07-11 01:28:46 +02:00
alexbelgium
af68eece53 Updater bot : immich_noml updated to 3.0.2 2026-07-11 01:28:41 +02:00
alexbelgium
c8f5ec8f20 Updater bot : immich_frame updated to 1.0.35.0 2026-07-11 01:28:37 +02:00
alexbelgium
aa77249314 Updater bot : immich_cuda updated to 3.0.2 2026-07-11 01:28:32 +02:00
alexbelgium
6e02e611f4 Updater bot : immich updated to 3.0.2 2026-07-11 01:28:28 +02:00
alexbelgium
91ed6c3f46 Updater bot : grav updated to 2.0.10 2026-07-11 01:28:21 +02:00
alexbelgium
b21ce72e0e Updater bot : flexget updated to 3.19.27 2026-07-11 01:28:04 +02:00
alexbelgium
839cfd1382 Updater bot : ente updated to 4.4.24 2026-07-11 01:27:42 +02:00
alexbelgium
ae22240269 Updater bot : emby_beta updated to 4.10.0.18 2026-07-11 01:27:31 +02:00
alexbelgium
91429643ef Updater bot : codex updated to 2.1.2 2026-07-11 01:27:20 +02:00
alexbelgium
507ea9fb8c Updater bot : cleanuparr updated to 2.9.16 2026-07-11 01:27:12 +02:00
alexbelgium
434aa76c2a Updater bot : claude_desktop updated to debiantrixie-version-c55d3809 2026-07-11 01:27:08 +02:00
alexbelgium
397a6eed88 Updater bot : browser_chromium updated to version-30a7c401 2026-07-11 01:26:33 +02:00
alexbelgium
859e47772a Updater bot : browser_brave updated to 1.92.139-ls112 2026-07-11 01:26:22 +02:00
alexbelgium
8153a944d8 Updater bot : birdnet-pipy updated to 0.8.3 2026-07-11 01:25:38 +02:00
alexbelgium
6f143deb49 Updater bot : aurral updated to 1.76.52 2026-07-11 01:25:13 +02:00
github-actions
0fc95bfe88 GitHub bot : README updated 2026-07-10 17:33:25 +00:00
Alexandre
0c651312ab Validate Claude arm64 build and changelog 2026-07-10 15:40:24 +02:00
Alexandre
6b4c11cbd8 Fix add-on changelog and arm64 CI checks 2026-07-10 15:39:27 +02:00
Alexandre
424573548e Finalize Claude RTK arm64 validation 2026-07-10 15:36:14 +02:00
Alexandre
effd7f4319 Run final Claude add-on build matrix 2026-07-10 15:30:35 +02:00
Alexandre
69458eb13d Remove temporary Claude build diagnostic 2026-07-10 15:30:06 +02:00
Alexandre
2bbc48f7ab Use native arm64 runner for RTK validation 2026-07-10 15:23:30 +02:00
Alexandre
94135b9b05 Trigger Claude add-on architecture builds 2026-07-10 15:22:49 +02:00
Alexandre
7b3eb17efd Document RTK arm64 compatibility fix 2026-07-10 15:21:23 +02:00
Alexandre
5d7d6ff334 Bump Claude Desktop add-on to 1.14 2026-07-10 15:20:52 +02:00
Alexandre
bd9f4f3d23 Build RTK against Bookworm for arm64 compatibility 2026-07-10 15:20:30 +02:00
Alexandre
918b9477b0 Fix NetBird server startup 2026-07-06 17:33:39 +02:00
231 changed files with 1156 additions and 497 deletions

View File

@@ -162,6 +162,7 @@ DARKNAGAN,France
DDanii,
DMurzNN,
DUC750,
DY-hub,
DaFlowah,
DaJonas94,
Daafip,Netherlands
@@ -238,6 +239,7 @@ EtienneMD,
Evel270,
Everestlion,
EvertJob,
Exlatis,
Extrunder,
F0264,
F4bsi,Germany
@@ -563,6 +565,7 @@ PhoenixTwoFive,Germany
PhysShell,
PierreNa,France
PietroSpina,
Pingmin,
PiotrKrzyzek,United States
PiratesGhost,
Pixelzeus,
@@ -897,10 +900,12 @@ antorimba,
antx-code,
anyezhe,
aorosora,
araminimichael,
arbal,United States
ardemk,
ared469,
arethefreshest,
arozoire,
arpit-mehra,
artemave,France
artemdanielov,
@@ -1156,6 +1161,7 @@ danbruno,
danctrl,Germany
danez,United States
danieldotnl,Netherlands
danishru,
dannybeeckman,
dannybloomfield,United States
danveitch76,
@@ -1744,6 +1750,7 @@ ljsquare,
llabourdeth,
llewy,
llfjahn,
llugo,
lmalmoreno,Brazil
lnrdmx,
loc4t3llix,
@@ -2050,6 +2057,7 @@ pedrolicassali,
pedromfa,
pedrware,Portugal
peeetek,
peggleg,
pejannl,
pem884,United States
pepelatc,
@@ -2273,6 +2281,7 @@ skalingclouds,United States
skamaleo,
skavieller,
skipper00,
skoducks,United States
skylidefr,
skynet-network,
slimehands,
@@ -2532,6 +2541,7 @@ williamcorsel,Netherlands
willigenburggihaux,
willnewcombe,United Kingdom
wimb0,
wingerasc,
witold-gren,Poland
wonderfulhuber,
wonkygecko,United States
1 username country
162 DDanii
163 DMurzNN
164 DUC750
165 DY-hub
166 DaFlowah
167 DaJonas94
168 Daafip Netherlands
239 Evel270
240 Everestlion
241 EvertJob
242 Exlatis
243 Extrunder
244 F0264
245 F4bsi Germany
565 PhysShell
566 PierreNa France
567 PietroSpina
568 Pingmin
569 PiotrKrzyzek United States
570 PiratesGhost
571 Pixelzeus
900 antx-code
901 anyezhe
902 aorosora
903 araminimichael
904 arbal United States
905 ardemk
906 ared469
907 arethefreshest
908 arozoire
909 arpit-mehra
910 artemave France
911 artemdanielov
1161 danctrl Germany
1162 danez United States
1163 danieldotnl Netherlands
1164 danishru
1165 dannybeeckman
1166 dannybloomfield United States
1167 danveitch76
1750 llabourdeth
1751 llewy
1752 llfjahn
1753 llugo
1754 lmalmoreno Brazil
1755 lnrdmx
1756 loc4t3llix
2057 pedromfa
2058 pedrware Portugal
2059 peeetek
2060 peggleg
2061 pejannl
2062 pem884 United States
2063 pepelatc
2281 skamaleo
2282 skavieller
2283 skipper00
2284 skoducks United States
2285 skylidefr
2286 skynet-network
2287 slimehands
2541 willigenburggihaux
2542 willnewcombe United Kingdom
2543 wimb0
2544 wingerasc
2545 witold-gren Poland
2546 wonderfulhuber
2547 wonkygecko United States

Binary file not shown.

Before

Width:  |  Height:  |  Size: 63 KiB

After

Width:  |  Height:  |  Size: 60 KiB

BIN
.github/stats.png vendored

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.8 KiB

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 4.4 KiB

View File

@@ -35,6 +35,7 @@ jobs:
git fetch origin "${{ github.event.before }}" || true
changed_changelog_files=$(git diff --name-only "${{ github.event.before }}" "${{ github.sha }}" | grep -iE '^([^/]+/)?changelog\.(md|txt|ya?ml|json)$' || true)
echo "$changed_changelog_files"
echo "changelogs_files=$changed_changelog_files" >> "$GITHUB_OUTPUT"
changed_config_files=$(git diff --name-only "${{ github.event.before }}" "${{ github.sha }}" | grep -E '^[^/]+/config\.(json|ya?ml)$' || true)
echo "$changed_config_files"
all_changed_files=$(echo -e "$changed_config_files\n$changed_changelog_files" | sort -u)
@@ -208,6 +209,7 @@ jobs:
uses: docker/build-push-action@v7
with:
context: ${{ matrix.addon }}
platforms: linux/arm64
push: false
load: true
file: ${{ matrix.addon }}/Dockerfile

View File

@@ -1,51 +0,0 @@
---
name: Claude Add-on Build Diagnostic
on:
pull_request:
branches:
- master
jobs:
diagnose:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v7
- name: Gather add-on information
id: information
uses: frenck/action-addon-information@v1.4
with:
path: ./claude_desktop/
- name: Set up QEMU
uses: docker/setup-qemu-action@v4
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v4
- name: Build aarch64 and capture tail
shell: bash
run: |
set +e
BUILD_FROM="$(jq -r '.build_from.aarch64 // empty' '${{ steps.information.outputs.build }}')"
docker buildx build \
--platform linux/arm64 \
--progress=plain \
--build-arg "BUILD_FROM=${BUILD_FROM}" \
--file claude_desktop/Dockerfile \
claude_desktop >build.log 2>&1
status=$?
tail -n 300 build.log >build-tail.log
printf 'build_status=%s\n' "$status" >build-status.txt
exit 0
- name: Upload diagnostic log
uses: actions/upload-artifact@v4
with:
name: claude-aarch64-build-log
path: |
build-tail.log
build-status.txt
retention-days: 1

View File

@@ -56,19 +56,19 @@ If you want to do add the repository manually, please follow the procedure highl
### Number of addons
- In the repository : 135
- Installed : 508490
- In the repository : 136
- Installed : 626324
### Top 3
1. Arpspoof (59486x)
2. Sponsorblockcast (55582x)
3. Flaresolverr (44486x)
1. Arpspoof (86665x)
2. Sponsorblockcast (82801x)
3. Jellyfin (71957x)
### Architectures used
- amd64: 88%
- aarch64: 12%
- amd64: 90%
- aarch64: 10%
### Stars evolution
@@ -77,7 +77,7 @@ If you want to do add the repository manually, please follow the procedure highl
## Add-ons provided by this repository
%%ADDONS_LIST%%
&#10003; [Arpspoof (59486x)](arpspoof/) : block internet connection for local network devices
&#10003; [Arpspoof (86665x)](arpspoof/) : block internet connection for local network devices
&emsp;&emsp;![Version](https://img.shields.io/badge/dynamic/yaml?label=Version&query=%24.version&url=https%3A%2F%2Fraw.githubusercontent.com%2Falexbelgium%2Fhassio-addons%2Fmaster%2Farpspoof%2Fconfig.yaml)
![Update](https://img.shields.io/badge/dynamic/json?label=Updated&query=%24.last_update&url=https%3A%2F%2Fraw.githubusercontent.com%2Falexbelgium%2Fhassio-addons%2Fmaster%2Farpspoof%2Fupdater.json)
@@ -143,6 +143,17 @@ If you want to do add the repository manually, please follow the procedure highl
![amd64][amd64-badge]
![ingress][ingress-badge]
&#10003; ![image](https://api.iconify.design/mdi/bird.svg) [BirdNET-Pi (zach7036)](birdnet-pi-zach/) : Realtime acoustic bird classification system
&emsp;&emsp;![Version](https://img.shields.io/badge/dynamic/yaml?label=Version&query=%24.version&url=https%3A%2F%2Fraw.githubusercontent.com%2Falexbelgium%2Fhassio-addons%2Fmaster%2Fbirdnet-pi-zach%2Fconfig.yaml)
![Update](https://img.shields.io/badge/dynamic/json?label=Updated&query=%24.last_update&url=https%3A%2F%2Fraw.githubusercontent.com%2Falexbelgium%2Fhassio-addons%2Fmaster%2Fbirdnet-pi-zach%2Fupdater.json)
![aarch64][aarch64-badge]
![amd64][amd64-badge]
![ingress][ingress-badge]
![mqtt][mqtt-badge]
![smb][smb-badge]
![localdisks][localdisks-badge]
&#10003; ![image](https://api.iconify.design/mdi/bird.svg) [BirdNET-PiPy](birdnet-pipy/) : BirdNET-PiPy bird detection with a modern web dashboard
&emsp;&emsp;![Version](https://img.shields.io/badge/dynamic/yaml?label=Version&query=%24.version&url=https%3A%2F%2Fraw.githubusercontent.com%2Falexbelgium%2Fhassio-addons%2Fmaster%2Fbirdnet-pipy%2Fconfig.yaml)
@@ -247,7 +258,7 @@ If you want to do add the repository manually, please follow the procedure highl
![amd64][amd64-badge]
![ingress][ingress-badge]
&#10003; ![image](https://api.iconify.design/mdi/robot-happy.svg) [Claude Desktop](claude_desktop/) : Claude Desktop streamed through a browser with LinuxServer Selkies
&#10003; ![image](https://api.iconify.design/mdi/robot-happy.svg) [Claude Desktop](claude_desktop/) : Claude Desktop and a persistent Claude Code web terminal
&emsp;&emsp;![Version](https://img.shields.io/badge/dynamic/yaml?label=Version&query=%24.version&url=https%3A%2F%2Fraw.githubusercontent.com%2Falexbelgium%2Fhassio-addons%2Fmaster%2Fclaude_desktop%2Fconfig.yaml)
![Update](https://img.shields.io/badge/dynamic/json?label=Updated&query=%24.last_update&url=https%3A%2F%2Fraw.githubusercontent.com%2Falexbelgium%2Fhassio-addons%2Fmaster%2Fclaude_desktop%2Fupdater.json)
@@ -508,7 +519,7 @@ If you want to do add the repository manually, please follow the procedure highl
![smb][smb-badge]
![localdisks][localdisks-badge]
&#10003; ![image](https://api.iconify.design/mdi/billiards-rack.svg) [Jellyfin NAS](jellyfin/) : A free Software Media System that puts you in control of managing and streaming your media
&#10003; ![image](https://api.iconify.design/mdi/billiards-rack.svg) [Jellyfin (71957x) NAS](jellyfin/) : A free Software Media System that puts you in control of managing and streaming your media
&emsp;&emsp;![Version](https://img.shields.io/badge/dynamic/yaml?label=Version&query=%24.version&url=https%3A%2F%2Fraw.githubusercontent.com%2Falexbelgium%2Fhassio-addons%2Fmaster%2Fjellyfin%2Fconfig.yaml)
![Update](https://img.shields.io/badge/dynamic/json?label=Updated&query=%24.last_update&url=https%3A%2F%2Fraw.githubusercontent.com%2Falexbelgium%2Fhassio-addons%2Fmaster%2Fjellyfin%2Fupdater.json)
@@ -571,7 +582,7 @@ If you want to do add the repository manually, please follow the procedure highl
![aarch64][aarch64-badge]
![amd64][amd64-badge]
&#10003; ![image](https://api.iconify.design/mdi/movie-search.svg) [Maintainerr](maintainerr/) : Rule-based media cleanup tool for Plex, Jellyfin and Emby. Creates collections and optionally deletes unwatched content.
&#10003; ![image](https://api.iconify.design/mdi/movie-search.svg) [Maintainerr](maintainerr/) : Rule-based media cleanup tool for Plex, Jellyfin (71957x) and Emby. Creates collections and optionally deletes unwatched content.
&emsp;&emsp;![Version](https://img.shields.io/badge/dynamic/yaml?label=Version&query=%24.version&url=https%3A%2F%2Fraw.githubusercontent.com%2Falexbelgium%2Fhassio-addons%2Fmaster%2Fmaintainerr%2Fconfig.yaml)
![Update](https://img.shields.io/badge/dynamic/json?label=Updated&query=%24.last_update&url=https%3A%2F%2Fraw.githubusercontent.com%2Falexbelgium%2Fhassio-addons%2Fmaster%2Fmaintainerr%2Fupdater.json)
@@ -885,7 +896,7 @@ If you want to do add the repository manually, please follow the procedure highl
![smb][smb-badge]
![localdisks][localdisks-badge]
&#10003; ![image](https://api.iconify.design/mdi/movie-search.svg) [Seerr](seerr/) : Open-source media request and discovery manager for Jellyfin, Plex, and Emby
&#10003; ![image](https://api.iconify.design/mdi/movie-search.svg) [Seerr](seerr/) : Open-source media request and discovery manager for Jellyfin (71957x), Plex, and Emby
&emsp;&emsp;![Version](https://img.shields.io/badge/dynamic/yaml?label=Version&query=%24.version&url=https%3A%2F%2Fraw.githubusercontent.com%2Falexbelgium%2Fhassio-addons%2Fmaster%2Fseerr%2Fconfig.yaml)
![Update](https://img.shields.io/badge/dynamic/json?label=Updated&query=%24.last_update&url=https%3A%2F%2Fraw.githubusercontent.com%2Falexbelgium%2Fhassio-addons%2Fmaster%2Fseerr%2Fupdater.json)

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.4 KiB

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.7 KiB

After

Width:  |  Height:  |  Size: 1.2 KiB

View File

@@ -1,4 +1,7 @@
## 1.76.52 (2026-07-11)
- Update to latest version from lklynet/aurral (changelog : https://github.com/lklynet/aurral/releases)
## 1.76.51 (2026-06-17)
- Update to latest version from lklynet/aurral (changelog : https://github.com/lklynet/aurral/releases)
## 1.76.49 (2026-06-05)

View File

@@ -1,5 +1,5 @@
name: Aurral
version: "1.76.51"
version: "1.76.52"
slug: aurral
description: >-
Self-hosted music discovery, request management, flows, and playlist

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.4 KiB

After

Width:  |  Height:  |  Size: 1.3 KiB

View File

@@ -1,9 +1,9 @@
{
"last_update": "2026-06-17",
"last_update": "2026-07-11",
"repository": "alexbelgium/hassio-addons",
"slug": "aurral",
"source": "github",
"upstream_repo": "lklynet/aurral",
"upstream_version": "1.76.51",
"upstream_version": "1.76.52",
"github_beta": false
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.0 KiB

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.2 KiB

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.8 KiB

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.2 KiB

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.6 KiB

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.7 KiB

After

Width:  |  Height:  |  Size: 1.7 KiB

View File

@@ -1,3 +1,5 @@
## source-20260714 (14-07-2026)
- Minor bugs fixed
## source-20260709 (09-07-2026)
- Minor bugs fixed
## source-20260708-4 (08-07-2026)

View File

@@ -127,5 +127,5 @@ slug: birdnet-go-dev
udev: true
url: https://github.com/alexbelgium/hassio-addons
usb: true
version: "source-20260709"
version: "source-20260714"
video: true

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.1 KiB

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

@@ -1,3 +1,6 @@
## 20260712 (2026-07-13)
- Update to latest version from tphakala/birdnet-go (changelog : https://github.com/tphakala/birdnet-go/releases)
## nightly-20260615-4 (09-07-2026)
- Minor bugs fixed
## nightly-20260615-3 (05-07-2026)

View File

@@ -128,4 +128,4 @@ slug: birdnet-go
udev: true
url: https://github.com/alexbelgium/hassio-addons/tree/master/birdnet-go
usb: true
version: "nightly-20260615-4"
version: "20260712"

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.2 KiB

After

Width:  |  Height:  |  Size: 1.5 KiB

View File

@@ -2,10 +2,10 @@
"github_beta": true,
"github_exclude": "-4",
"github_fulltag": true,
"last_update": "2026-06-17",
"last_update": "2026-07-13",
"repository": "alexbelgium/hassio-addons",
"slug": "birdnet-go",
"source": "github",
"upstream_repo": "tphakala/birdnet-go",
"upstream_version": "nightly-20260615"
"upstream_version": "20260712"
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.0 KiB

After

Width:  |  Height:  |  Size: 1.9 KiB

View File

@@ -1,4 +1,10 @@
## 0.8.4 (2026-07-13)
- Update to latest version from Suncuss/BirdNET-PiPy (changelog : https://github.com/Suncuss/BirdNET-PiPy/releases)
## 0.8.3 (2026-07-11)
- Update to latest version from Suncuss/BirdNET-PiPy (changelog : https://github.com/Suncuss/BirdNET-PiPy/releases)
## 0.8.2.1 (2026-07-05)
- Re-tag of 0.8.2-1 with no content change. Home Assistant compares add-on versions with semver semantics, where a `-N` suffix counts as a *pre-release* and sorts **below** the base version — so users already on 0.8.2 saw the 0.8.2-1 nginx fix as "Up-to-date" with the Update button disabled. Four-segment `0.8.2.1` sorts above both `0.8.2` and `0.8.2-1` (and below the next upstream `0.8.3`), so the update becomes installable everywhere.

View File

@@ -96,4 +96,4 @@ schema:
ssl: bool?
slug: birdnet-pipy
url: https://github.com/alexbelgium/hassio-addons/tree/master/birdnet-pipy
version: "0.8.2.1"
version: "0.8.4"

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.5 KiB

After

Width:  |  Height:  |  Size: 1.3 KiB

View File

@@ -1,8 +1,8 @@
{
"last_update": "2026-07-04",
"last_update": "2026-07-13",
"repository": "alexbelgium/hassio-addons",
"slug": "birdnet-pipy",
"source": "github",
"upstream_repo": "Suncuss/BirdNET-PiPy",
"upstream_version": "0.8.2"
"upstream_version": "0.8.4"
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.0 KiB

After

Width:  |  Height:  |  Size: 1.4 KiB

View File

@@ -1,4 +1,7 @@
## 1.92.139-ls112 (2026-07-11)
- Update to latest version from linuxserver/docker-brave (changelog : https://github.com/linuxserver/docker-brave/releases)
## 1.92.134-ls109 (2026-07-04)
- Update to latest version from linuxserver/docker-brave (changelog : https://github.com/linuxserver/docker-brave/releases)

View File

@@ -69,5 +69,5 @@ slug: brave
tmpfs: true
udev: true
url: https://github.com/alexbelgium/hassio-addons
version: "1.92.134-ls109"
version: "1.92.139-ls112"
video: true

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.5 KiB

After

Width:  |  Height:  |  Size: 1.3 KiB

View File

@@ -1,9 +1,9 @@
{
"github_fulltag": "true",
"last_update": "2026-07-04",
"last_update": "2026-07-11",
"repository": "alexbelgium/hassio-addons",
"slug": "brave",
"source": "github",
"upstream_repo": "linuxserver/docker-brave",
"upstream_version": "1.92.134-ls109"
"upstream_version": "1.92.139-ls112"
}

View File

@@ -1,4 +1,7 @@
## version-30a7c401 (2026-07-11)
- Update to latest version from linuxserver/docker-chromium (changelog : https://github.com/linuxserver/docker-chromium/releases)
## version-7148c2a3 (2026-07-04)
- Update to latest version from linuxserver/docker-chromium (changelog : https://github.com/linuxserver/docker-chromium/releases)

View File

@@ -71,5 +71,5 @@ slug: chromium
tmpfs: true
udev: true
url: https://github.com/alexbelgium/hassio-addons
version: "version-7148c2a3"
version: "version-30a7c401"
video: true

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.7 KiB

After

Width:  |  Height:  |  Size: 1.3 KiB

View File

@@ -1,9 +1,9 @@
{
"github_fulltag": "true",
"last_update": "2026-07-04",
"last_update": "2026-07-11",
"repository": "alexbelgium/hassio-addons",
"slug": "chromium",
"source": "github",
"upstream_repo": "linuxserver/docker-chromium",
"upstream_version": "version-7148c2a3"
"upstream_version": "version-30a7c401"
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.2 KiB

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.4 KiB

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.1 KiB

After

Width:  |  Height:  |  Size: 1.4 KiB

View File

@@ -0,0 +1,10 @@
## 0.144.3-2 (14-07-2026)
- Initial ChatGPT Codex add-on.
- Added a persistent, administrator-only Home Assistant ingress terminal backed by tmux.
- Made `headroom wrap codex` the default launch path.
- Configured Docker builds to install the latest stable Codex, Headroom, RTK, ttyd, and Rust toolchain versions without hard-coded tool version pins.
- Added RTK native Codex initialization and savings reporting.
- Added device-code authentication and direct Codex fallback helpers.
- Added persistent configuration, GitHub CLI integration, mount support, and safe defaults.
- Made the default workspace follow a custom `data_location`.

157
chatgpt_codex/Dockerfile Normal file
View File

@@ -0,0 +1,157 @@
#============================#
# ALEXBELGIUM'S DOCKERFILE #
#============================#
#=== Home Assistant Addon ===#
#################
# 1 Build Image #
#################
ARG BUILD_FROM
ARG BUILD_VERSION
FROM rust:bookworm AS rtk-builder
RUN set -eux; \
rtk_version="$(git ls-remote --tags --refs --sort=-v:refname \
https://github.com/rtk-ai/rtk.git 'refs/tags/v*' \
| awk -F/ '$3 ~ /^v[0-9]+\.[0-9]+\.[0-9]+$/ { print $3; exit }')"; \
test -n "$rtk_version"; \
git clone --depth 1 --branch "$rtk_version" https://github.com/rtk-ai/rtk.git /src/rtk; \
cd /src/rtk; \
cargo build --release --locked; \
install -D -m 0755 target/release/rtk /out/rtk; \
/out/rtk --version
FROM ${BUILD_FROM}
##################
# 2 Modify Image #
##################
ENV S6_CMD_WAIT_FOR_SERVICES=1 \
S6_CMD_WAIT_FOR_SERVICES_MAXTIME=0 \
S6_SERVICES_GRACETIME=0 \
HEADROOM_CONTEXT_TOOL=rtk
USER root
VOLUME [ "/sys/fs/cgroup" ]
ARG TEMPLATE_BASE_URL="https://raw.githubusercontent.com/alexbelgium/hassio-addons/master/.templates"
##################
# 3 Install apps #
##################
COPY rootfs/ /
RUN find /etc/cont-init.d /etc/s6-overlay /usr/local/bin \
-type f \( -name "*.sh" -o -name "run" -o -name "finish" -o -path "/usr/local/bin/*" \) \
-print -exec chmod +x {} \;
RUN apt-get update && \
apt-get install -y --no-install-recommends \
ca-certificates \
curl \
git \
gh \
jq \
less \
nano \
openssh-client \
python3-pip \
ripgrep \
tmux && \
apt-get clean && \
rm -rf /var/lib/apt/lists/*
# Install the latest stable official Codex static binary for the target architecture.
RUN set -eux; \
case "$(dpkg --print-architecture)" in \
amd64) codex_arch="x86_64" ;; \
arm64) codex_arch="aarch64" ;; \
*) echo "Unsupported architecture: $(dpkg --print-architecture)" >&2; exit 1 ;; \
esac; \
archive="/tmp/codex.tar.gz"; \
curl -fsSL --retry 3 --retry-delay 2 \
-o "$archive" \
"https://github.com/openai/codex/releases/latest/download/codex-${codex_arch}-unknown-linux-musl.tar.gz"; \
tar -xzf "$archive" -C /tmp; \
install -m 0755 "/tmp/codex-${codex_arch}-unknown-linux-musl" /usr/local/bin/codex; \
rm -f "$archive" "/tmp/codex-${codex_arch}-unknown-linux-musl"; \
codex --version
# Install the latest stable ttyd binary for the Home Assistant ingress terminal.
RUN set -eux; \
case "$(dpkg --print-architecture)" in \
amd64) ttyd_arch="x86_64" ;; \
arm64) ttyd_arch="aarch64" ;; \
*) echo "Unsupported architecture: $(dpkg --print-architecture)" >&2; exit 1 ;; \
esac; \
curl -fsSL --retry 3 --retry-delay 2 \
-o /usr/local/bin/ttyd \
"https://github.com/tsl0922/ttyd/releases/latest/download/ttyd.${ttyd_arch}"; \
chmod 0755 /usr/local/bin/ttyd; \
ttyd --version
COPY --from=rtk-builder /out/rtk /usr/local/bin/rtk
RUN rtk --version && \
pip3 install --upgrade --break-system-packages --no-cache-dir "headroom-ai[proxy,code,mcp]" && \
headroom --version
ARG MODULES="00-banner.sh 00-global_var.sh 01-custom_script.sh 00-local_mounts.sh 00-smb_mounts.sh 90-dns_set.sh"
RUN curl -fsSL --retry 3 --retry-delay 2 \
-o /ha_automodules.sh "${TEMPLATE_BASE_URL}/ha_automodules.sh" && \
chmod 744 /ha_automodules.sh && \
/ha_automodules.sh "$MODULES" && \
rm /ha_automodules.sh
################
# 4 Entrypoint #
################
RUN curl -fsSL --retry 3 --retry-delay 2 \
-o /ha_entrypoint.sh "${TEMPLATE_BASE_URL}/ha_entrypoint.sh" && \
curl -fsSL --retry 3 --retry-delay 2 \
-o /usr/local/lib/bashio-standalone.sh "${TEMPLATE_BASE_URL}/bashio-standalone.sh" && \
chmod 0777 /ha_entrypoint.sh && \
chmod 0755 /usr/local/lib/bashio-standalone.sh
ENTRYPOINT [ "/usr/bin/env" ]
CMD [ "/ha_entrypoint.sh" ]
############
# 5 Labels #
############
ARG BUILD_ARCH
ARG BUILD_DATE
ARG BUILD_DESCRIPTION
ARG BUILD_NAME
ARG BUILD_REF
ARG BUILD_REPOSITORY
ARG BUILD_VERSION
ENV BUILD_VERSION="${BUILD_VERSION}"
LABEL \
io.hass.name="${BUILD_NAME}" \
io.hass.description="${BUILD_DESCRIPTION}" \
io.hass.arch="${BUILD_ARCH}" \
io.hass.type="addon" \
io.hass.version=${BUILD_VERSION} \
maintainer="alexbelgium (https://github.com/alexbelgium)" \
org.opencontainers.image.title="${BUILD_NAME}" \
org.opencontainers.image.description="${BUILD_DESCRIPTION}" \
org.opencontainers.image.vendor="Home Assistant Add-ons" \
org.opencontainers.image.authors="alexbelgium (https://github.com/alexbelgium)" \
org.opencontainers.image.licenses="MIT" \
org.opencontainers.image.url="https://github.com/alexbelgium" \
org.opencontainers.image.source="https://github.com/${BUILD_REPOSITORY}" \
org.opencontainers.image.documentation="https://github.com/${BUILD_REPOSITORY}/blob/master/chatgpt_codex/README.md" \
org.opencontainers.image.created=${BUILD_DATE} \
org.opencontainers.image.revision=${BUILD_REF} \
org.opencontainers.image.version=${BUILD_VERSION}
#################
# 6 Healthcheck #
#################
HEALTHCHECK --interval=30s --timeout=5s --start-period=30s \
CMD curl -fsS http://127.0.0.1:7681/ > /dev/null || exit 1

112
chatgpt_codex/README.md Normal file
View File

@@ -0,0 +1,112 @@
# Home Assistant add-on: ChatGPT Codex
![Supports aarch64 Architecture][aarch64-shield]
![Supports amd64 Architecture][amd64-shield]
![Project Maintenance][maintenance-shield]
Run the official OpenAI Codex CLI in a persistent Home Assistant ingress terminal. The optimized path uses `headroom wrap codex`, with RTK handling command-output compression before results reach Codex.
> The repository already contains an unrelated add-on named **Codex** for comic archives. This coding-agent add-on therefore uses the slug `chatgpt_codex`.
## Features
- Latest stable Codex, Headroom, RTK, ttyd, and Rust toolchain versions are resolved during every Docker build; tool versions are not pinned in the Dockerfile.
- Official Codex CLI static binary for `amd64` and `aarch64`.
- Home Assistant authenticated, administrator-only ingress; no unauthenticated terminal port is exposed.
- Persistent `$HOME`, Codex authentication, settings, sessions, Headroom state, and RTK statistics.
- Persistent `tmux` session that survives browser disconnects.
- `headroom wrap codex` as the default launch path.
- Baked-in RTK with native Codex initialization.
- Optional Headroom output shaping and code-aware compression.
- Direct Codex fallback for troubleshooting.
- Device-code login helper designed for a remote or headless container.
- Baked-in Git, GitHub CLI, ripgrep, jq, SSH client, and common terminal tools.
- Optional GitHub CLI authentication and Git author configuration.
- Optional extra apt and pip packages.
- Local and SMB mount support through the repository standard modules.
## Installation and first login
1. Install **ChatGPT Codex** from this add-on repository.
2. Keep the default `data_location` and `workspace`, or select writable mounted paths.
3. Start the add-on and open its web UI.
4. Codex starts automatically through Headroom.
5. When prompted to authenticate, follow the device-code instructions. You can also exit Codex and run:
```shell
codex-login
```
Codex supports ChatGPT sign-in and API-key authentication. The device-code flow is the recommended option for this headless add-on.
## Launch commands
Optimized default:
```shell
codex-headroom
```
This runs:
```shell
headroom wrap codex
```
Headroom starts its local proxy, configures Codex routing and MCP support, and uses RTK as the CLI context tool.
Direct troubleshooting path:
```shell
codex-direct
```
Check optimization status and measured savings:
```shell
headroom doctor
headroom perf
rtk gain
```
## Persistence
The terminal attaches every browser connection to the same `tmux` session. Closing the browser detaches the client but does not stop Codex or commands running in the session.
Persistent data is stored below `data_location`:
- Codex state: `~/.codex`
- Headroom state and metrics: `~/.headroom`
- RTK state: its normal paths below the persistent home
- Default workspace: `~/workspace`
## Options
| Option | Default | Description |
| --- | --- | --- |
| `data_location` | `/data/data` | Persistent home. Must be below `/data`, `/share`, `/media`, `/config`, or `/mnt`. |
| `workspace` | `<data_location>/workspace` | Initial project directory. Leave empty to follow `data_location`. |
| `PUID` / `PGID` | `0` / `0` | Runtime user and group used by the LinuxServer `abc` account. |
| `TZ` | | Optional timezone, for example `Europe/Brussels`. |
| `auto_start_codex` | `true` | Start Codex automatically when the tmux session is first created. |
| `use_headroom` | `true` | Use `headroom wrap codex`; disabling this starts Codex directly. |
| `headroom_output_shaper` | `true` | Enable Headroom output-token shaping. |
| `headroom_code_aware` | `true` | Enable Headroom AST-aware code compression. |
| `github_token` | | Authenticate GitHub CLI and Git operations. |
| `github_username` / `github_email` | | Configure the global Git author. |
| `additional_apps` | | Comma-separated Debian packages installed at startup. |
| `additional_pip` | | Comma-separated Python packages installed at startup. |
| `localdisks` / `networkdisks` | | Optional local-disk and SMB mounts supported by the repository modules. |
| `env_vars` | `[]` | Additional environment variables exported in the container. |
Configuration changes affecting the launch command apply to a newly created tmux session. To recreate it, exit Codex and run `tmux kill-session -t codex`, then reopen the add-on web UI.
## Security
The add-on deliberately does not enable Codex approval or sandbox bypass flags. Codex can execute commands and edit files available inside the configured workspace, so only mount locations you intend it to access.
The terminal is exposed only through Home Assistant administrator-only ingress. Do not add an unauthenticated direct port mapping. Treat `github_token`, Codex authentication data, and the persistent home as secrets and include them only in trusted backups.
[aarch64-shield]: https://img.shields.io/badge/aarch64-yes-green.svg
[amd64-shield]: https://img.shields.io/badge/amd64-yes-green.svg
[maintenance-shield]: https://img.shields.io/maintenance/yes/2026.svg

6
chatgpt_codex/build.json Normal file
View File

@@ -0,0 +1,6 @@
{
"build_from": {
"aarch64": "ghcr.io/linuxserver/baseimage-debian:arm64v8-bookworm",
"amd64": "ghcr.io/linuxserver/baseimage-debian:amd64-bookworm"
}
}

68
chatgpt_codex/config.yaml Normal file
View File

@@ -0,0 +1,68 @@
arch:
- aarch64
- amd64
description: "Persistent OpenAI Codex web terminal optimized with Headroom and RTK"
devices:
- /dev/fuse
environment:
HOME: /data/data
PGID: "0"
PUID: "0"
TERM: xterm-256color
image: ghcr.io/alexbelgium/chatgpt_codex-{arch}
ingress: true
ingress_port: 7681
ingress_stream: true
init: false
map:
- addon_config:rw
- share:rw
- media:rw
- ssl
name: ChatGPT Codex
options:
env_vars: []
DNS_server: 8.8.8.8
data_location: /data/data
workspace: ""
PUID: 0
PGID: 0
auto_start_codex: true
use_headroom: true
headroom_output_shaper: true
headroom_code_aware: true
github_token: ""
github_username: ""
github_email: ""
additional_apps: ""
additional_pip: ""
panel_icon: mdi:code-braces-box
privileged:
- SYS_ADMIN
- DAC_READ_SEARCH
schema:
env_vars:
- name: match(^[A-Za-z0-9_]+$)
value: str?
DNS_server: str?
data_location: str?
workspace: str?
PUID: int
PGID: int
TZ: match([A-Z][a-z]*./[A-Z][a-z]*.)?
auto_start_codex: bool
use_headroom: bool
headroom_output_shaper: bool
headroom_code_aware: bool
github_token: password?
github_username: str?
github_email: str?
additional_apps: str?
additional_pip: str?
localdisks: str?
networkdisks: str?
slug: chatgpt_codex
tmpfs: true
udev: true
url: https://github.com/alexbelgium/hassio-addons
version: "0.144.3-3"

View File

@@ -0,0 +1,46 @@
#!/usr/bin/with-contenv bashio
# shellcheck shell=bash
set -e
set -o pipefail
PUID="$(bashio::config 'PUID')"
PGID="$(bashio::config 'PGID')"
LOCATION="$(bashio::config 'data_location')"
if [ -z "$LOCATION" ] || [ "$LOCATION" = "null" ]; then
LOCATION="/data/data"
fi
case "$LOCATION" in
/data/* | /share/* | /media/* | /config/* | /mnt/*)
;;
*)
bashio::log.fatal "data_location must be below /data, /share, /media, /config, or /mnt"
exit 1
;;
esac
if [ -L "$LOCATION" ]; then
bashio::log.fatal "data_location must not be a symbolic link"
exit 1
fi
bashio::log.info "Using persistent home: $LOCATION"
install -d -m 0750 -o "$PUID" -g "$PGID" "$LOCATION"
install -d -m 0750 -o "$PUID" -g "$PGID" "$LOCATION/.codex" "$LOCATION/.headroom"
install -d -m 0755 /tmp/cache /run/s6/container_environment
sed -i "s|^\(abc:[^:]*:[^:]*:[^:]*:[^:]*:\)[^:]*|\1$LOCATION|" /etc/passwd
for variable in HOME CODEX_HOME HEADROOM_WORKSPACE_DIR XDG_CACHE_HOME; do
case "$variable" in
HOME) value="$LOCATION" ;;
CODEX_HOME) value="$LOCATION/.codex" ;;
HEADROOM_WORKSPACE_DIR) value="$LOCATION/.headroom" ;;
XDG_CACHE_HOME) value="/tmp/cache" ;;
esac
printf '%s' "$value" > "/run/s6/container_environment/$variable"
done
chown -R "$PUID:$PGID" "$LOCATION/.codex" "$LOCATION/.headroom"
chown "$PUID:$PGID" "$LOCATION"

View File

@@ -0,0 +1,33 @@
#!/usr/bin/with-contenv bashio
# shellcheck shell=bash
set -e
set -o pipefail
if bashio::config.has_value 'additional_apps'; then
packages="$(bashio::config 'additional_apps')"
apt-get update -o Acquire::http::Timeout=10 -o Acquire::https::Timeout=10
for package in ${packages//,/ }; do
bashio::log.info "Installing apt package: $package"
apt-get install -y --no-install-recommends "$package"
done
apt-get clean
rm -rf /var/lib/apt/lists/*
fi
if bashio::config.has_value 'additional_pip'; then
packages="$(bashio::config 'additional_pip')"
for package in ${packages//,/ }; do
bashio::log.info "Installing pip package: $package"
pip3 install --break-system-packages "$package"
done
fi
if bashio::config.has_value 'TZ'; then
timezone="$(bashio::config 'TZ')"
if [ ! -e "/usr/share/zoneinfo/$timezone" ]; then
bashio::log.fatal "Invalid timezone: $timezone"
exit 1
fi
ln -snf "/usr/share/zoneinfo/$timezone" /etc/localtime
printf '%s\n' "$timezone" > /etc/timezone
fi

View File

@@ -0,0 +1,55 @@
#!/usr/bin/with-contenv bashio
# shellcheck shell=bash
set -e
set -o pipefail
PUID="$(bashio::config 'PUID')"
PGID="$(bashio::config 'PGID')"
if ! command -v codex > /dev/null 2>&1; then
bashio::log.fatal "Codex CLI is not available"
exit 1
fi
if ! command -v headroom > /dev/null 2>&1; then
bashio::log.fatal "Headroom is not available"
exit 1
fi
if ! command -v rtk > /dev/null 2>&1; then
bashio::log.fatal "RTK is not available"
exit 1
fi
bashio::log.info "Codex: $(codex --version 2>&1 | head -n 1)"
bashio::log.info "Headroom: $(headroom --version 2>&1 | head -n 1)"
bashio::log.info "RTK: $(rtk --version 2>&1 | head -n 1)"
# Configure RTK's native Codex integration ahead of the first wrapped session.
if ! s6-setuidgid abc env \
HOME="$HOME" \
CODEX_HOME="${CODEX_HOME:-$HOME/.codex}" \
PATH="$HOME/.local/bin:/usr/local/bin:/usr/bin:/bin" \
RTK_NONINTERACTIVE=1 \
rtk init -g --codex; then
bashio::log.warning "RTK Codex initialization failed; Headroom will retry when wrapping Codex"
fi
for key in CODEX_AUTO_START CODEX_USE_HEADROOM HEADROOM_OUTPUT_SHAPER HEADROOM_CODE_AWARE_ENABLED; do
case "$key" in
CODEX_AUTO_START)
bashio::config.true 'auto_start_codex' && value="1" || value="0"
;;
CODEX_USE_HEADROOM)
bashio::config.true 'use_headroom' && value="1" || value="0"
;;
HEADROOM_OUTPUT_SHAPER)
bashio::config.true 'headroom_output_shaper' && value="1" || value="0"
;;
HEADROOM_CODE_AWARE_ENABLED)
bashio::config.true 'headroom_code_aware' && value="1" || value="0"
;;
esac
printf '%s' "$value" > "/run/s6/container_environment/$key"
done
printf '%s' 'rtk' > /run/s6/container_environment/HEADROOM_CONTEXT_TOOL
chown -R "$PUID:$PGID" "$HOME/.codex" "$HOME/.headroom"

View File

@@ -0,0 +1,29 @@
#!/usr/bin/with-contenv bashio
# shellcheck shell=bash
set -e
set -o pipefail
if bashio::config.has_value 'github_username'; then
s6-setuidgid abc git config --global user.name "$(bashio::config 'github_username')"
fi
if bashio::config.has_value 'github_email'; then
s6-setuidgid abc git config --global user.email "$(bashio::config 'github_email')"
fi
if bashio::config.has_value 'github_token'; then
token="$(bashio::config 'github_token')"
if s6-setuidgid abc env -u GH_TOKEN -u GITHUB_TOKEN gh auth status --hostname github.com > /dev/null 2>&1; then
bashio::log.info "GitHub CLI is already authenticated"
else
bashio::log.info "Authenticating GitHub CLI"
printf '%s\n' "$token" | s6-setuidgid abc env -u GH_TOKEN -u GITHUB_TOKEN \
gh auth login --hostname github.com --with-token || \
bashio::log.warning "GitHub CLI authentication failed"
fi
s6-setuidgid abc env -u GH_TOKEN -u GITHUB_TOKEN \
gh auth setup-git --hostname github.com || \
bashio::log.warning "GitHub CLI git credential setup failed"
else
bashio::log.info "Set github_token to authenticate gh and Git operations"
fi

View File

@@ -0,0 +1,54 @@
#!/usr/bin/with-contenv bashio
# shellcheck shell=bash
set -e
set -o pipefail
port=7681
workspace="$(bashio::config 'workspace')"
if [ -z "$workspace" ] || [ "$workspace" = "null" ]; then
workspace="$HOME/workspace"
fi
if [[ "$workspace" != /* ]]; then
bashio::log.fatal "workspace must be an absolute path"
exec sleep infinity
fi
if [ -L "$workspace" ]; then
bashio::log.fatal "workspace must not be a symbolic link"
exec sleep infinity
fi
workspace="$(realpath -m -- "$workspace")"
case "$workspace" in
"$HOME" | "$HOME"/* | /share/* | /media/* | /mnt/* | /data/* | /config/*)
;;
*)
bashio::log.fatal "workspace must be below the persistent home, /share, /media, /mnt, /data, or /config"
exec sleep infinity
;;
esac
if [ ! -e "$workspace" ]; then
install -d -m 0750 -o abc -g abc "$workspace"
elif [ ! -d "$workspace" ]; then
bashio::log.fatal "workspace is not a directory: $workspace"
exec sleep infinity
fi
if ! s6-setuidgid abc test -r "$workspace" || \
! s6-setuidgid abc test -w "$workspace" || \
! s6-setuidgid abc test -x "$workspace"; then
bashio::log.fatal "workspace must be readable, writable, and searchable by user abc: $workspace"
exec sleep infinity
fi
export CODEX_TERMINAL_WORKSPACE="$workspace"
bashio::log.info "Starting persistent Codex terminal on Home Assistant ingress port $port"
exec s6-setuidgid abc ttyd \
-p "$port" \
-W \
-O \
-t disableLeaveAlert=true \
-t fontSize=14 \
/usr/local/bin/codex-terminal-shell

View File

@@ -0,0 +1,4 @@
#!/usr/bin/env bash
set -euo pipefail
export PATH="${HOME}/.local/bin:/usr/local/bin:/usr/bin:/bin:${PATH:-}"
exec codex "$@"

View File

@@ -0,0 +1,15 @@
#!/usr/bin/env bash
set -euo pipefail
export PATH="${HOME}/.local/bin:/usr/local/bin:/usr/bin:/bin:${PATH:-}"
export HEADROOM_CONTEXT_TOOL="rtk"
if ! command -v headroom > /dev/null 2>&1; then
echo "Headroom is unavailable; launching Codex directly." >&2
exec codex "$@"
fi
if [ "$#" -eq 0 ]; then
exec headroom wrap codex
fi
exec headroom wrap codex -- "$@"

View File

@@ -0,0 +1,4 @@
#!/usr/bin/env bash
set -euo pipefail
export PATH="${HOME}/.local/bin:/usr/local/bin:/usr/bin:/bin:${PATH:-}"
exec codex login --device-auth "$@"

View File

@@ -0,0 +1,33 @@
#!/usr/bin/env bash
set -euo pipefail
export SHELL="/bin/bash"
export PATH="${HOME}/.local/bin:/usr/local/bin:/usr/bin:/bin:${PATH:-}"
workspace="${CODEX_TERMINAL_WORKSPACE:-${HOME}/workspace}"
session_name="${CODEX_TMUX_SESSION:-codex}"
if [ ! -d "$workspace" ]; then
echo "Codex workspace does not exist: $workspace" >&2
exit 1
fi
new_session=0
if ! tmux has-session -t "$session_name" 2> /dev/null; then
tmux new-session -d -s "$session_name" -c "$workspace" /bin/bash -l
new_session=1
fi
if [ "$new_session" -eq 1 ]; then
tmux send-keys -t "$session_name" \
"printf '\\nChatGPT Codex add-on\\n login: codex-login\\n optimized: codex-headroom\\n direct: codex-direct\\n savings: rtk gain && headroom perf\\n\\n'" C-m
if [ "${CODEX_AUTO_START:-1}" = "1" ]; then
if [ "${CODEX_USE_HEADROOM:-1}" = "1" ]; then
tmux send-keys -t "$session_name" "codex-headroom" C-m
else
tmux send-keys -t "$session_name" "codex-direct" C-m
fi
fi
fi
exec tmux attach-session -t "$session_name"

View File

@@ -0,0 +1,12 @@
{
"github_beta": false,
"github_fulltag": false,
"github_havingasset": true,
"github_tagfilter": "rust-v",
"last_update": "2026-07-14",
"repository": "alexbelgium/hassio-addons",
"slug": "chatgpt_codex",
"source": "github",
"upstream_repo": "openai/codex",
"upstream_version": "0.144.3"
}

View File

@@ -1,3 +1,32 @@
## 1.17 (14-07-2026)
- **Breaking:** remove the standalone Claude Code web terminal (ttyd/tmux service, port `7681`, and the `enable_terminal`, `terminal_username`, `terminal_password`, `terminal_workspace` options). The add-on is now built purely around Claude Desktop; Claude Code remains installed and powers Desktop cowork/dispatch sessions with the RTK hook, Caveman, and MCP servers intact. If the add-on refuses to start after the update, open its Configuration tab and re-save to drop the removed options.
- Remove the `claude-direct` and `claude-headroom` terminal wrapper scripts and the unused `ha_smart_context` and `dangerously_skip_permissions` options.
- Fix the Headroom dashboard being unreachable at `http://<host>:8787/dashboard`: the supervised proxy only listened on `127.0.0.1`; it now binds `0.0.0.0` so the mapped port works.
- Fix dispatch/remote sessions and sign-in persistence: install the missing `gnome-keyring` package. The existing keyring bootstrap silently no-oped without it, leaving Electron `safeStorage` unavailable ("cannot store allowlist cache"), so auth tokens and dispatch permission grants were lost on restart.
- Add the tokensave code-intelligence MCP server (pinned 7.2.0, built from source like RTK), registered for both Claude Desktop and Claude Code; disable with `install_tokensave: false`.
- Implement the Home Assistant MCP bridge for real: `enable_ha_mcp` plus new `ha_mcp_url`/`ha_mcp_token` options register Home Assistant's MCP Server integration in Claude through `mcp-proxy`, using the integration's stateless Streamable HTTP endpoint (`/api/mcp`).
- Write the Claude configuration files with `0600` permissions, since they hold the Home Assistant access token in clear text.
- Restrict the build-time `chmod +x` pass to the directories the add-on actually ships scripts in instead of traversing the whole image.
- Register add-on-managed MCP servers in Claude Code's `~/.claude.json` as well as Claude Desktop's config, without clobbering user-customized entries.
- Install `uv` and use it for the `additional_pip` option for much faster package installs.
## 1.16 (14-07-2026)
- Minor bugs fixed
## 1.15 (13-07-2026)
- Minor bugs fixed
## ubunturesolute-version-6dc44b0e (2026-07-13)
- Update to latest version from linuxserver/docker-baseimage-selkies (changelog : https://github.com/linuxserver/docker-baseimage-selkies/releases)
## 1.14 (10-07-2026)
- Build pinned RTK 0.43.0 source on Debian Bookworm for both architectures instead of installing the upstream arm64 release binary, which requires GLIBC 2.39 and cannot run in the add-on image.
- Execute `rtk --version` inside the final image during the Docker build so future ABI incompatibilities fail CI instead of surfacing at runtime.
- Validate the final Bookworm-built RTK binary in a native aarch64 image build.
- Correct the repository PR checks so changed changelog paths are exported and aarch64 images are built explicitly for `linux/arm64`.
## debiantrixie-version-c55d3809 (2026-07-11)
- Update to latest version from linuxserver/docker-baseimage-selkies (changelog : https://github.com/linuxserver/docker-baseimage-selkies/releases)
## 1.13 (10-07-2026)
- Add the official Claude Code stable package, `tmux`, `ripgrep`, and a pinned upstream `ttyd` binary for both supported architectures.

View File

@@ -9,6 +9,30 @@
ARG BUILD_FROM
ARG BUILD_VERSION
ARG RTK_VERSION="v0.43.0"
ARG RTK_COMMIT="5a7880d404db8364d602f2ecdc41dd790f64013f"
ARG TOKENSAVE_VERSION="7.2.0"
# The upstream aarch64 release is cross-built on ubuntu-latest and requires
# GLIBC 2.39. Build the pinned source on Bookworm instead so it is compatible
# with the add-on runtime on both supported architectures.
FROM rust:1.91-bookworm AS rtk-builder
ARG RTK_VERSION
ARG RTK_COMMIT
RUN git clone --depth 1 --branch "${RTK_VERSION}" https://github.com/rtk-ai/rtk.git /src/rtk && \
test "$(git -C /src/rtk rev-parse HEAD)" = "${RTK_COMMIT}" && \
cd /src/rtk && \
cargo build --release --locked && \
install -D -m 0755 target/release/rtk /out/rtk && \
/out/rtk --version
# tokensave ships no Bookworm-compatible prebuilt binary either; build the pinned
# crates.io release from source so GLIBC matches the add-on runtime.
FROM rust:1.91-bookworm AS tokensave-builder
ARG TOKENSAVE_VERSION
RUN cargo install tokensave --version "${TOKENSAVE_VERSION}" --locked --root /out && \
/out/bin/tokensave --version
FROM ${BUILD_FROM}
##################
@@ -45,17 +69,19 @@ RUN curl -fsSL --retry 3 --retry-delay 2 \
# 3 Install apps #
##################
# Add rootfs
# Add rootfs. Only the directories this add-on ships scripts in are traversed, so the chmod
# cannot alter executables elsewhere in the image.
COPY rootfs/ /
RUN find . -type f \( -name "*.sh" -o -name "run" -o -name "finish" \) -print -exec chmod +x {} \; && \
chmod +x /usr/local/bin/claude-direct /usr/local/bin/claude-headroom /usr/local/bin/claude-terminal-shell
RUN find /etc/cont-init.d /etc/s6-overlay /defaults /usr/local/bin -type f \
\( -name "*.sh" -o -name "run" -o -name "finish" \) -print -exec chmod +x {} \;
# Uses /bin for compatibility purposes
# hadolint ignore=DL4005
RUN if [ ! -f /bin/sh ] && [ -f /usr/bin/sh ]; then ln -s /usr/bin/sh /bin/sh; fi && \
if [ ! -f /bin/bash ] && [ -f /usr/bin/bash ]; then ln -s /usr/bin/bash /bin/bash; fi
# Install Claude Desktop, Claude Code, browser-terminal tooling, and Python tooling
# Install Claude Desktop, Claude Code, and Python tooling. gnome-keyring provides the
# Secret Service backend Electron safeStorage needs to persist sign-in and dispatch grants.
RUN install -d -m 0755 /etc/apt/keyrings && \
curl -fsSLo /usr/share/keyrings/claude-desktop-archive-keyring.asc https://downloads.claude.ai/claude-desktop/key.asc && \
curl -fsSLo /etc/apt/keyrings/claude-code.asc https://downloads.claude.ai/keys/claude-code.asc && \
@@ -66,38 +92,27 @@ RUN install -d -m 0755 /etc/apt/keyrings && \
claude-desktop \
claude-code \
python3-pip \
gnome-keyring \
libsecret-1-0 \
dbus-x11 \
git \
gh \
ripgrep \
tmux && \
ripgrep && \
apt-get clean && \
rm -rf /var/lib/apt/lists/*
# ttyd is not packaged in Debian bookworm. Install the pinned upstream static binary.
ARG TTYD_VERSION="1.7.7"
RUN set -eux; \
case "$(dpkg --print-architecture)" in \
amd64) ttyd_arch="x86_64" ;; \
arm64) ttyd_arch="aarch64" ;; \
*) echo "Unsupported architecture for ttyd: $(dpkg --print-architecture)" >&2; exit 1 ;; \
esac; \
curl -fsSL --retry 3 --retry-delay 2 \
-o /usr/local/bin/ttyd \
"https://github.com/tsl0922/ttyd/releases/download/${TTYD_VERSION}/ttyd.${ttyd_arch}"; \
chmod 0755 /usr/local/bin/ttyd; \
/usr/local/bin/ttyd --version
# Copy the pinned Bookworm-built RTK and tokensave binaries and execute them in the final
# image. This makes an ABI mismatch fail the image build instead of surfacing at runtime.
COPY --from=rtk-builder /out/rtk /usr/local/bin/rtk
COPY --from=tokensave-builder /out/bin/tokensave /usr/local/bin/tokensave
RUN /usr/local/bin/rtk --version && /usr/local/bin/tokensave --version
# Install only the Headroom proxy, code-compression, and MCP features used by this add-on.
# Install only the Headroom proxy, code-compression, and MCP features used by this add-on,
# plus mcp-proxy (stdio->SSE bridge for the Home Assistant MCP server) and uv (fast
# installer used for the additional_pip option).
RUN apt-get update && \
apt-get install -y --no-install-recommends nodejs && \
pip3 install --break-system-packages "headroom-ai[proxy,code,mcp]" && \
curl -fsSL https://raw.githubusercontent.com/rtk-ai/rtk/refs/heads/master/install.sh -o /tmp/rtk-install.sh && \
HOME=/root sh /tmp/rtk-install.sh && \
rm /tmp/rtk-install.sh && \
if [ -x /root/.local/bin/rtk ] && [ ! -x /usr/local/bin/rtk ]; then mv /root/.local/bin/rtk /usr/local/bin/rtk; fi && \
if [ -x /usr/local/bin/rtk ]; then chmod +x /usr/local/bin/rtk; else echo "rtk binary was not installed on PATH"; exit 1; fi && \
pip3 install --break-system-packages "headroom-ai[proxy,code,mcp]" mcp-proxy uv && \
apt-get clean && \
rm -rf /var/lib/apt/lists/* /root/.cache

View File

@@ -4,8 +4,9 @@
![Supports amd64 Architecture][amd64-shield]
![Project Maintenance][maintenance-shield]
Run Claude Desktop and an optional persistent Claude Code web terminal in one
LinuxServer.io Selkies add-on.
Run Claude Desktop in a LinuxServer.io Selkies add-on, with Headroom MCP
context compression, RTK Bash-output acceleration, and code-intelligence
tooling wired in by default.
## Installation
@@ -20,102 +21,38 @@ currently does not include Computer Use or dictation.
## Architecture
Claude Desktop and Claude Code run as separate clients inside the same add-on.
They share the configured persistent home directory, Git credentials,
repositories, Claude Code configuration, Headroom storage, and RTK
configuration, but they do not share or hand off a conversation.
Everything is built around the Claude Desktop app. Claude Code is installed in
the same image but is not exposed as a standalone service: Claude Desktop's
cowork and dispatch sessions run it internally, and they pick up the shared
Claude Code configuration (`~/.claude`), hooks, and MCP servers automatically.
- **Claude Desktop** uses Headroom through its MCP tools.
- **Claude Code** uses Headroom's supported `headroom wrap claude` integration.
- **RTK** filters Claude Code Bash output through its `PreToolUse` hook.
- **tmux** keeps the terminal session running when the browser disconnects.
- **Claude Code sessions inside Desktop** get the same MCP servers via
`~/.claude.json` and RTK's `PreToolUse` Bash hook via
`~/.claude/settings.json`.
- **gnome-keyring** provides the Secret Service backend Electron needs to
persist sign-in and dispatch permission grants across restarts.
## Features
- Claude Desktop in single-app Selkies mode.
- Home Assistant ingress support for Claude Desktop.
- Official Claude Code stable package installed in the same image.
- Optional authenticated `ttyd` web terminal on port `7681`.
- Persistent `tmux` session shared by reconnecting terminal clients.
- Claude Desktop in single-app Selkies mode with Home Assistant ingress.
- Official Claude Code stable package powering Desktop cowork/dispatch
sessions.
- Persistent `$HOME` at the configured `data_location` (default `/data/data`),
preserving Desktop and Claude Code state across restarts.
- Persistent sign-in through a bundled, auto-unlocked gnome-keyring.
- Optional runtime Claude Desktop updates from Anthropic's apt repository.
- Optional extra apt and pip package installation.
- Baked-in `git`, GitHub CLI (`gh`), `ripgrep`, and terminal tooling.
- Optional extra apt and pip package installation (pip installs use `uv` for
speed).
- Baked-in `git`, GitHub CLI (`gh`), and `ripgrep`.
- Custom script support through the repository standard `claude_desktop.sh`.
- Optional bundled Claude Code optimization tools: Headroom, RTK, and Caveman.
- Headroom dashboard exposed on mapped port `8787` when enabled.
- Bundled optimization tools: Headroom (MCP + local proxy), RTK, tokensave,
and Caveman — each individually switchable.
- Optional Home Assistant MCP bridge so Claude can query and control Home
Assistant.
- Headroom dashboard exposed on mapped port `8787`.
- Low-power defaults for GPU mapping, Selkies frame rate, and volatile caches.
## Claude Code terminal setup
The terminal service is enabled in the add-on configuration but remains
unavailable until authentication is configured. Port `7681` is not mapped by
default.
1. Set a unique `terminal_password`. The existing `PASSWORD` option is accepted
only as a compatibility fallback.
2. Optionally set `terminal_username` and `terminal_workspace`.
3. Map container port `7681` to a host port in the add-on **Network** section.
4. Restart the add-on.
5. Reach `http://<home-assistant-host>:7681` only through an encrypted VPN or an
HTTPS reverse proxy, then sign in with the configured terminal credentials.
The terminal opens in a persistent tmux session. Closing the browser detaches
from tmux rather than terminating commands that are already running.
Start the optimized Claude Code path with:
```shell
claude-headroom
```
This reuses the supervised Headroom proxy on `127.0.0.1:8787` and launches
Claude Code with the required routing. Headroom is told not to install RTK
because the add-on already maintains the RTK hook in
`~/.claude/settings.json`.
To bypass Headroom for troubleshooting, run:
```shell
claude-direct
```
Running `claude` directly is equivalent to the direct path. The first Claude
Code launch may require its own account authentication; Desktop and Claude Code
store separate client credentials even though both use the configured
persistent home directory.
### Multiple concurrent clients
Every browser connection attaches to the same tmux session. Concurrent clients
therefore see the same terminal, keystrokes, and resize events. This is useful
for reconnecting to one long-running session, but it is not an isolated
multi-user terminal.
### Terminal user and permissions
The service drops privileges to the LinuxServer `abc` account before starting
ttyd. The effective numeric UID and GID follow the configured `PUID` and `PGID`.
Using `PUID: 0` can provide root-equivalent access inside the add-on; use a
non-zero UID/GID where your storage permissions allow it.
The configured workspace must resolve to the persistent home directory or a
subdirectory of `/share`, `/media`, `/mnt`, `/data`, or `/config`. Existing
directories are never re-owned by the terminal service and must already be
readable, writable, and searchable by `abc`.
### Terminal security
The direct ttyd endpoint uses HTTP Basic Authentication without TLS.
Credentials and terminal traffic are unencrypted on the network. ttyd also
receives its Basic Authentication credential as a process argument, so it is
visible to processes with sufficient access inside the container.
Do not expose port `7681` directly to the public internet. Use a VPN such as
WireGuard or Tailscale, or place the endpoint behind an HTTPS reverse proxy.
Use a unique `terminal_password` rather than reusing the Selkies `PASSWORD`.
## Options
| Option | Default | Description |
@@ -123,48 +60,60 @@ Use a unique `terminal_password` rather than reusing the Selkies `PASSWORD`.
| `PUID` / `PGID` | `0` / `0` | Numeric user and group applied by the LinuxServer initialization. |
| `TZ` | | Optional timezone, for example `Europe/Brussels`. |
| `KEYBOARD` | | Optional Selkies keyboard layout. |
| `PASSWORD` | | Optional password for direct Selkies ports and compatibility fallback for terminal authentication. |
| `PASSWORD` | | Optional password for direct Selkies ports. |
| `DRINODE` | | Optional GPU device override for Selkies. |
| `DNS_server` | `8.8.8.8` | DNS server used by the standard DNS module. |
| `auto_update` | `true` | Upgrade `claude-desktop` from Anthropic's apt repository at startup. |
| `enable_terminal` | `true` | Enable the supervised Claude Code web-terminal service. |
| `terminal_username` | `claude` | Username used by ttyd Basic Authentication. |
| `terminal_password` | | Dedicated terminal password. The service idles when this and `PASSWORD` are empty. |
| `terminal_workspace` | | Initial directory; defaults to `<data_location>/workspace`. |
| `install_headroom` | `true` | Enable Headroom MCP for Desktop and the supervised local proxy reused by `claude-headroom`. |
| `install_headroom` | `true` | Register the Headroom MCP server and run the supervised local proxy/dashboard. |
| `install_rtk` | `true` | Configure RTK's Claude Code `PreToolUse` hook. |
| `install_tokensave` | `true` | Register the tokensave code-intelligence MCP server for Desktop and Claude Code. |
| `install_caveman` | `true` | Install the Caveman Claude Code plugin in the persistent Claude home. |
| `install_github_cli` | `true` | Enable setup checks for the baked-in `git` and `gh` commands. |
| `github_token` | | Optional GitHub token used to authenticate `gh` and Git operations. |
| `github_username` | | Optional global Git author name. |
| `github_email` | | Optional global Git author email. |
| `ha_smart_context` | `true` | Enable Home Assistant smart context support for Claude tooling. |
| `enable_ha_mcp` | `true` | Enable Home Assistant MCP support for Claude tooling. |
| `dangerously_skip_permissions` | `false` | Reserved compatibility option; it is not applied by the terminal launcher. |
| `enable_ha_mcp` | `false` | Register Home Assistant's MCP server in Claude (requires `ha_mcp_token`). |
| `ha_mcp_url` | `http://homeassistant:8123/mcp_server/sse` | SSE endpoint of Home Assistant's MCP Server integration. |
| `ha_mcp_token` | | Home Assistant long-lived access token used by the MCP bridge. |
| `additional_apps` | | Comma-separated Debian apt packages to install at startup. |
| `additional_pip` | | Comma-separated pip packages installed with `--break-system-packages`. |
| `data_location` | `/data/data` | Persistent home directory for both Claude clients and tooling. |
| `additional_pip` | | Comma-separated pip packages installed at startup (via `uv`). |
| `data_location` | `/data/data` | Persistent home directory for Claude and tooling. |
| `env_vars` | `[]` | Additional environment variables exported inside the container. |
## Headroom behavior
When `install_headroom` is enabled, the add-on registers `headroom mcp serve` in
Claude Desktop and starts a supervised local Headroom backend. Desktop can use
`headroom_compress`, `headroom_retrieve`, and `headroom_stats` through MCP.
When `install_headroom` is enabled, the add-on registers `headroom mcp serve`
in Claude Desktop and Claude Code, and starts a supervised local Headroom
backend. Claude can use `headroom_compress`, `headroom_retrieve`, and
`headroom_stats` through MCP.
Claude Desktop overrides `ANTHROPIC_BASE_URL`, so it is deliberately launched
without proxy injection. The web terminal instead provides `claude-headroom`,
which reuses the supervised proxy through Headroom's `--no-proxy` mode. RTK
setup remains owned by the add-on through Headroom's `--no-rtk` mode.
without proxy injection; the MCP integration is the supported path.
The Headroom dashboard remains available at:
The Headroom dashboard is available at:
```text
http://<home-assistant-host>:8787/dashboard
```
when the `8787/tcp` port is mapped. Treat this endpoint as sensitive and do not
expose it directly to the public internet.
through the default `8787/tcp` port mapping. The dashboard is unauthenticated
and is reachable wherever Home Assistant publishes that port, so treat it as
sensitive: do not expose it directly to the public internet, and unmap the port
in the add-on **Network** section if you do not want it reachable at all.
## Home Assistant MCP bridge
To let Claude query and control Home Assistant:
1. In Home Assistant, add the **Model Context Protocol Server** integration
(Settings → Devices & services → Add integration).
2. Create a long-lived access token (your profile → Security).
3. Set `enable_ha_mcp: true` and paste the token into `ha_mcp_token` in the
add-on configuration, then restart the add-on.
The add-on bridges Claude to the integration's stateless Streamable HTTP
endpoint (`/api/mcp`) with `mcp-proxy`. Override `ha_mcp_url` only if your Home
Assistant instance is not reachable as `homeassistant:8123` from add-ons.
## Custom scripts
@@ -178,10 +127,11 @@ the image.
Persistent state is stored in the configured `data_location` (default
`/data/data`):
- Claude Desktop sign-in: `~/.config/Claude`
- Claude Desktop sign-in: `~/.config/Claude` (token encrypted via
gnome-keyring; keyring DB in `~/.local/share/keyrings`)
- Claude Code settings, hooks, sessions, and plugins: `~/.claude`
- Default terminal workspace: `~/workspace`
- Headroom and RTK user state: their standard paths below the shared home
- Headroom, RTK, and tokensave user state: their standard paths below the
shared home
Volatile cache data is redirected to `/tmp/cache` through `$XDG_CACHE_HOME` and
`$HOME/.cache`.

View File

@@ -4,7 +4,10 @@ Two related sign-in problems when Claude Desktop runs inside the LinuxServer Sel
streamed desktop.
**Status:**
- **Shipped:** Problem B (keyring persistence) is implemented in v1.4 (Dockerfile + `rootfs/defaults/autostart`).
- **Shipped:** Problem B (keyring persistence) — the `autostart` bootstrap landed in v1.4, but
the `gnome-keyring` package itself was missing from the image until v1.17 (the bootstrap
silently no-oped and Electron logged "safeStorage encryption is not available"). Fixed in
v1.17: the Dockerfile now installs `gnome-keyring`.
- **Planned only:** Problem A (in-desktop browser for OAuth) is intentionally not implemented.
The image ships no browser; complete the login with the user-side workaround below.
@@ -50,8 +53,9 @@ magic link into the in-session Chromium (not a phone).
### User-side workaround (no rebuild)
- Add-on Configuration → `additional_apps: chromium`, restart (installed by
`rootfs/etc/cont-init.d/80-configuration.sh`).
- Run the two `xdg-settings`/`xdg-mime` commands once in an in-session terminal, or add them
to the custom script `/addon_configs/db21ed7f_claude-desktop/claude-desktop.sh`.
- Add the two `xdg-settings`/`xdg-mime` commands to the custom script
`/addon_configs/db21ed7f_claude-desktop/claude_desktop.sh` (the image ships no standalone
terminal).
---
@@ -94,14 +98,14 @@ Claude Desktop uses. No extra `dbus-launch` is needed.
then exposes the Secret Service and exports `GNOME_KEYRING_CONTROL`/`SSH_AUTH_SOCK`.
- `--password-store=gnome-libsecret` forces Electron to use the libsecret backend instead
of falling back to plaintext.
3. Persistence: the keyring DB lives in `$HOME/.local/share/keyrings/` and `HOME=/config/data`
3. Persistence: the keyring DB lives in `$HOME/.local/share/keyrings/` and `HOME=/data/data`
(persistent add-on storage), so the empty-password login keyring survives restarts and is
re-unlocked automatically each boot by the same `autostart` line — the sign-in then sticks.
### User-side workaround (no rebuild)
- Add-on Configuration → `additional_apps: gnome-keyring, libsecret-1-0, dbus-x11`, restart.
- Add the keyring-start lines above to the custom script
`/addon_configs/db21ed7f_claude-desktop/claude-desktop.sh`, and relaunch Claude Desktop
`/addon_configs/db21ed7f_claude-desktop/claude_desktop.sh`, and relaunch Claude Desktop
with `--password-store=gnome-libsecret` (e.g. edit the in-session openbox autostart).
---

View File

@@ -2,7 +2,7 @@ arch:
- aarch64
- amd64
audio: true
description: Claude Desktop with a persistent Claude Code web terminal in one add-on
description: "Claude Desktop with Headroom MCP context compression and RTK acceleration"
devices:
- /dev/dri
- /dev/dri/card0
@@ -41,28 +41,23 @@ options:
additional_pip: ""
auto_update: true
github_email: ""
ha_smart_context: true
enable_ha_mcp: true
dangerously_skip_permissions: false
enable_terminal: true
terminal_username: claude
terminal_password: ""
terminal_workspace: ""
enable_ha_mcp: false
ha_mcp_url: http://homeassistant:8123/api/mcp
ha_mcp_token: ""
github_token: ""
github_username: ""
install_caveman: true
install_github_cli: true
install_headroom: true
install_rtk: true
install_tokensave: true
panel_admin: false
panel_icon: mdi:robot-happy
ports:
3001/tcp: null
7681/tcp: null
8787/tcp: 8787
ports_description:
3001/tcp: Claude Desktop web interface
7681/tcp: HTTP Basic-auth Claude Code terminal (no TLS)
8787/tcp: Headroom dashboard and proxy
privileged:
- SYS_ADMIN
@@ -83,22 +78,19 @@ schema:
additional_pip: str?
auto_update: bool?
github_email: str?
ha_smart_context: bool?
enable_ha_mcp: bool?
dangerously_skip_permissions: bool?
enable_terminal: bool?
terminal_username: match(^[A-Za-z0-9_.-]+$)?
terminal_password: password?
terminal_workspace: str?
ha_mcp_url: str?
ha_mcp_token: password?
github_token: password?
github_username: str?
install_caveman: bool
install_github_cli: bool
install_headroom: bool
install_rtk: bool
install_tokensave: bool
slug: claude_desktop
tmpfs: true
udev: true
url: https://github.com/alexbelgium/hassio-addons
version: "1.13"
version: "1.17"
video: true

Binary file not shown.

Before

Width:  |  Height:  |  Size: 17 KiB

After

Width:  |  Height:  |  Size: 5.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 17 KiB

After

Width:  |  Height:  |  Size: 5.3 KiB

View File

@@ -22,8 +22,7 @@ else
fi
# Headroom is intentionally not injected into the Desktop process. Claude Desktop overrides
# ANTHROPIC_BASE_URL, so Desktop uses the registered Headroom MCP tools instead. The Claude Code
# terminal uses the supported `headroom wrap claude` integration through claude-headroom.
# ANTHROPIC_BASE_URL, so Desktop uses the registered Headroom MCP tools instead.
# Launch the configured command. If a custom/wrapped command fails to start, fall back to
# the plain Claude Desktop launch so the app always comes up for the user.

View File

@@ -24,7 +24,12 @@ fi
if bashio::config.has_value 'additional_pip'; then
for p in $(bashio::config 'additional_pip' | tr ',' ' '); do
bashio::log.green "... pip: $p"
pip3 install --break-system-packages "$p" || bashio::log.fatal "Error: pip package $p failed"
# Prefer uv (much faster resolver/installer); fall back to pip3 when unavailable.
if command -v uv &> /dev/null; then
uv pip install --system --break-system-packages "$p" || bashio::log.fatal "Error: pip package $p failed"
else
pip3 install --break-system-packages "$p" || bashio::log.fatal "Error: pip package $p failed"
fi
done
fi

View File

@@ -15,54 +15,135 @@ printf '%s\n' "$DEFAULT_CLAUDE_DESKTOP_COMMAND" > "$CLAUDE_DESKTOP_COMMAND_FILE"
# Electron app force-overrides to the production endpoint (headroom #869), so transparent
# compression cannot be applied to the desktop launch. The integration that does work with
# Claude Desktop is headroom's MCP server, which exposes the headroom_compress/headroom_retrieve/
# headroom_stats tools inside the app. Register it in Claude Desktop's MCP config, leaving the
# plain launch untouched. The merge is idempotent and preserves any other MCP servers.
# headroom_stats tools inside the app.
#
# Register the add-on-managed MCP servers (headroom, tokensave, homeassistant) in both Claude
# Desktop's config and Claude Code's user config (used by Desktop cowork/dispatch sessions).
# The merge is idempotent, preserves any other MCP servers, never overwrites a user-customized
# entry with a different command, and removes only add-on-managed entries when disabled.
CLAUDE_DESKTOP_CONFIG="$HOME/.config/Claude/claude_desktop_config.json"
CLAUDE_CODE_CONFIG="$HOME/.claude.json"
HEADROOM_ENABLED=false
if bashio::config.true 'install_headroom'; then
if command -v headroom &> /dev/null; then
bashio::log.info "headroom $(headroom --version 2> /dev/null || true) available; registering the headroom MCP server for Claude Desktop"
HEADROOM_BIN="$(command -v headroom)" CLAUDE_DESKTOP_CONFIG="$CLAUDE_DESKTOP_CONFIG" python3 - <<'PY' || bashio::log.warning "Unable to register the headroom MCP server automatically"
import json
import os
from pathlib import Path
path = Path(os.environ["CLAUDE_DESKTOP_CONFIG"])
try:
data = json.loads(path.read_text()) if path.exists() else {}
if not isinstance(data, dict):
data = {}
except Exception:
if path.exists():
path.rename(path.with_suffix(path.suffix + ".bak"))
data = {}
servers = data.get("mcpServers")
if not isinstance(servers, dict):
servers = {}
data["mcpServers"] = servers
servers["headroom"] = {"command": os.environ.get("HEADROOM_BIN", "headroom"), "args": ["mcp", "serve"]}
path.parent.mkdir(parents=True, exist_ok=True)
path.write_text(json.dumps(data, indent=2) + "\n")
PY
HEADROOM_ENABLED=true
bashio::log.info "headroom $(headroom --version 2> /dev/null || true) available; registering the headroom MCP server"
else
bashio::log.warning "headroom is not available"
fi
elif [ -f "$CLAUDE_DESKTOP_CONFIG" ]; then
bashio::log.info "Removing the headroom MCP server from Claude Desktop"
CLAUDE_DESKTOP_CONFIG="$CLAUDE_DESKTOP_CONFIG" python3 - <<'PY' || bashio::log.warning "Unable to remove the headroom MCP server automatically"
fi
TOKENSAVE_ENABLED=false
if bashio::config.true 'install_tokensave'; then
if command -v tokensave &> /dev/null; then
TOKENSAVE_ENABLED=true
bashio::log.info "tokensave $(tokensave --version 2> /dev/null || true) available; registering the tokensave MCP server"
else
bashio::log.warning "tokensave is not available"
fi
fi
HA_MCP_ENABLED=false
HA_MCP_URL=""
HA_MCP_TOKEN=""
if bashio::config.true 'enable_ha_mcp'; then
HA_MCP_URL="$(bashio::config 'ha_mcp_url' 'http://homeassistant:8123/api/mcp')"
if bashio::config.has_value 'ha_mcp_token'; then
HA_MCP_TOKEN="$(bashio::config 'ha_mcp_token')"
fi
if [ -z "$HA_MCP_TOKEN" ]; then
bashio::log.warning "enable_ha_mcp is on but ha_mcp_token is empty; set a Home Assistant long-lived access token (Profile -> Security) and enable the 'Model Context Protocol Server' integration"
elif ! command -v mcp-proxy &> /dev/null; then
bashio::log.warning "mcp-proxy is not available; cannot register the Home Assistant MCP server"
else
HA_MCP_ENABLED=true
bashio::log.info "Registering the Home Assistant MCP server (${HA_MCP_URL})"
fi
fi
HEADROOM_ENABLED="$HEADROOM_ENABLED" HEADROOM_BIN="$(command -v headroom || echo headroom)" \
TOKENSAVE_ENABLED="$TOKENSAVE_ENABLED" TOKENSAVE_BIN="$(command -v tokensave || echo tokensave)" \
HA_MCP_ENABLED="$HA_MCP_ENABLED" HA_MCP_URL="$HA_MCP_URL" HA_MCP_TOKEN="$HA_MCP_TOKEN" \
MCP_PROXY_BIN="$(command -v mcp-proxy || echo mcp-proxy)" \
CLAUDE_DESKTOP_CONFIG="$CLAUDE_DESKTOP_CONFIG" CLAUDE_CODE_CONFIG="$CLAUDE_CODE_CONFIG" \
python3 - <<'PY' || bashio::log.warning "Unable to update the MCP server registrations automatically"
import json
import os
from pathlib import Path
path = Path(os.environ["CLAUDE_DESKTOP_CONFIG"])
data = json.loads(path.read_text())
if isinstance(data, dict):
MANAGED_BASENAMES = {
"headroom": "headroom",
"tokensave": "tokensave",
"homeassistant": "mcp-proxy",
}
desired = {}
if os.environ["HEADROOM_ENABLED"] == "true":
desired["headroom"] = {"command": os.environ["HEADROOM_BIN"], "args": ["mcp", "serve"]}
if os.environ["TOKENSAVE_ENABLED"] == "true":
desired["tokensave"] = {"command": os.environ["TOKENSAVE_BIN"], "args": ["serve"]}
if os.environ["HA_MCP_ENABLED"] == "true":
# Home Assistant's MCP Server integration speaks stateless Streamable HTTP on /api/mcp;
# mcp-proxy defaults to SSE, so the transport flags are required.
desired["homeassistant"] = {
"command": os.environ["MCP_PROXY_BIN"],
"args": ["--transport=streamablehttp", "--stateless", os.environ["HA_MCP_URL"]],
"env": {"API_ACCESS_TOKEN": os.environ["HA_MCP_TOKEN"]},
}
# An entry is add-on-managed when its command is one of our binaries living outside the
# persistent home. Matching on the basename (rather than the exact path recorded at write
# time) keeps entries updatable when a base-image upgrade moves the binary, while commands
# under $HOME stay untouched because those are user-installed.
HOME_PREFIX = os.path.expanduser("~") + os.sep
def is_managed(name, entry):
if not isinstance(entry, dict):
return False
command = entry.get("command")
if not isinstance(command, str) or command.startswith(HOME_PREFIX):
return False
return os.path.basename(command) == MANAGED_BASENAMES[name]
for config_var, stdio_type in (("CLAUDE_DESKTOP_CONFIG", False), ("CLAUDE_CODE_CONFIG", True)):
path = Path(os.environ[config_var])
try:
data = json.loads(path.read_text()) if path.exists() else {}
if not isinstance(data, dict):
data = {}
except Exception:
if path.exists():
path.rename(path.with_suffix(path.suffix + ".bak"))
data = {}
servers = data.get("mcpServers")
if isinstance(servers, dict) and servers.pop("headroom", None) is not None:
if not servers:
data.pop("mcpServers", None)
path.write_text(json.dumps(data, indent=2) + "\n")
if not isinstance(servers, dict):
servers = {}
changed = False
for name in MANAGED_BASENAMES:
existing = servers.get(name)
if name in desired:
entry = dict(desired[name])
if stdio_type:
entry["type"] = "stdio"
if existing is None or is_managed(name, existing):
if existing != entry:
servers[name] = entry
changed = True
elif existing is not None and is_managed(name, existing):
del servers[name]
changed = True
if not changed:
continue
if servers:
data["mcpServers"] = servers
else:
data.pop("mcpServers", None)
path.parent.mkdir(parents=True, exist_ok=True)
path.write_text(json.dumps(data, indent=2) + "\n")
# The Home Assistant long-lived access token is stored here in clear text.
path.chmod(0o600)
PY
fi
# Guide Claude to actually use the headroom compression tools so the MCP integration produces
# real savings (otherwise the tools sit unused and `headroom savings` stays empty). Managed,
@@ -216,9 +297,9 @@ else
find "$HOME/.claude" -maxdepth 4 -iname '*caveman*' -exec rm -rf {} + 2> /dev/null || true
fi
# Startup configuration runs as root, while Claude Desktop and the web terminal run as abc.
# Return managed persistent files to the configured runtime UID/GID after all writes complete.
for managed_path in "$HOME/.claude" "$HOME/.config/Claude"; do
# Startup configuration runs as root, while Claude Desktop runs as abc. Return managed
# persistent files to the configured runtime UID/GID after all writes complete.
for managed_path in "$HOME/.claude" "$HOME/.claude.json" "$HOME/.config/Claude"; do
if [ -e "$managed_path" ]; then
chown -R -- "${PUID}:${PGID}" "$managed_path" || bashio::log.warning "Unable to set ownership on $managed_path"
fi

View File

@@ -1,101 +0,0 @@
#!/usr/bin/with-contenv bashio
# shellcheck shell=bash
set -e
set -o pipefail
declare port=7681
declare username
declare password=""
declare workspace
declare canonical_workspace
export PATH="${HOME:-/data/data}/.local/bin:/usr/local/bin:/usr/bin:/bin:${PATH:-}"
if bashio::config.has_value 'enable_terminal' && ! bashio::config.true 'enable_terminal'; then
bashio::log.info "svc-claude-terminal: terminal disabled; idling"
exec sleep infinity
fi
if [ -z "${HOME:-}" ]; then
bashio::log.error "svc-claude-terminal: HOME is not initialized; idling"
exec sleep infinity
fi
if ! command -v ttyd >/dev/null 2>&1 || ! command -v tmux >/dev/null 2>&1 || ! command -v claude >/dev/null 2>&1; then
bashio::log.error "svc-claude-terminal: ttyd, tmux, or Claude Code is missing; idling"
exec sleep infinity
fi
username="claude"
if bashio::config.has_value 'terminal_username'; then
username="$(bashio::config 'terminal_username')"
fi
if bashio::config.has_value 'terminal_password'; then
password="$(bashio::config 'terminal_password')"
elif bashio::config.has_value 'PASSWORD'; then
bashio::log.warning "svc-claude-terminal: using PASSWORD as fallback for terminal authentication; prefer a unique terminal_password"
password="$(bashio::config 'PASSWORD')"
fi
if [ -z "$password" ]; then
bashio::log.warning "svc-claude-terminal: set terminal_password (or PASSWORD) before mapping port ${port}; terminal will remain disabled"
exec sleep infinity
fi
workspace="${HOME}/workspace"
if bashio::config.has_value 'terminal_workspace'; then
workspace="$(bashio::config 'terminal_workspace')"
fi
if [[ "$workspace" != /* ]]; then
bashio::log.error "svc-claude-terminal: terminal_workspace must be an absolute path; idling"
exec sleep infinity
fi
if [ -L "$workspace" ]; then
bashio::log.error "svc-claude-terminal: terminal_workspace must not be a symbolic link; idling"
exec sleep infinity
fi
if ! canonical_workspace="$(realpath -m -- "$workspace")"; then
bashio::log.error "svc-claude-terminal: unable to resolve terminal_workspace '$workspace'; idling"
exec sleep infinity
fi
workspace="$canonical_workspace"
case "$workspace" in
"$HOME" | "$HOME"/* | /share/* | /media/* | /mnt/* | /data/* | /config/*)
;;
*)
bashio::log.error "svc-claude-terminal: terminal_workspace must be the configured data_location or a subdirectory of /share, /media, /mnt, /data, or /config; idling"
exec sleep infinity
;;
esac
if [ ! -e "$workspace" ]; then
if ! install -d -m 0750 -o abc -g abc -- "$workspace"; then
bashio::log.error "svc-claude-terminal: failed to create workspace '$workspace'; idling"
exec sleep infinity
fi
elif [ ! -d "$workspace" ]; then
bashio::log.error "svc-claude-terminal: terminal_workspace '$workspace' is not a directory; idling"
exec sleep infinity
fi
if ! s6-setuidgid abc test -r "$workspace" ||
! s6-setuidgid abc test -w "$workspace" ||
! s6-setuidgid abc test -x "$workspace"; then
bashio::log.error "svc-claude-terminal: workspace '$workspace' must be readable, writable, and searchable by user abc; idling"
exec sleep infinity
fi
export CLAUDE_TERMINAL_WORKSPACE="$workspace"
bashio::log.info "svc-claude-terminal: starting authenticated ttyd terminal on port ${port}; workspace=${workspace}"
exec s6-setuidgid abc ttyd \
-p "$port" \
-W \
-O \
-c "${username}:${password}" \
/usr/local/bin/claude-terminal-shell

View File

@@ -1,7 +1,9 @@
#!/usr/bin/with-contenv bashio
# Headroom optimization proxy — local backend for Claude Desktop MCP and Claude Code.
declare port=8787
declare host=127.0.0.1
# Bind all interfaces so the dashboard is reachable on the mapped host port
# (http://<ha-ip>:8787/dashboard). Local consumers keep using 127.0.0.1.
declare host=0.0.0.0
if bashio::config.true 'install_headroom' && command -v headroom >/dev/null 2>&1; then
bashio::log.info "svc-headroom: starting local Headroom proxy on ${host}:${port}"

View File

@@ -1,4 +0,0 @@
#!/usr/bin/env bash
set -euo pipefail
exec claude "$@"

View File

@@ -1,21 +0,0 @@
#!/usr/bin/env bash
set -euo pipefail
if ! command -v claude >/dev/null 2>&1; then
echo "Claude Code is not installed or is not on PATH." >&2
exit 127
fi
if ! command -v headroom >/dev/null 2>&1; then
echo "Headroom is unavailable; start Claude Code directly with claude-direct." >&2
exit 127
fi
if ! curl -fsS --max-time 3 "http://127.0.0.1:8787/readyz" >/dev/null; then
echo "The supervised Headroom proxy is not ready on 127.0.0.1:8787. Ensure install_headroom is enabled and check the add-on log." >&2
exit 1
fi
# Reuse the s6-supervised proxy instead of starting a competing proxy. RTK is already managed
# through the persistent Claude Code PreToolUse hook, so Headroom must not reinstall it.
exec headroom wrap claude --port 8787 --no-proxy --no-rtk -- "$@"

View File

@@ -1,24 +0,0 @@
#!/usr/bin/env bash
set -euo pipefail
if [ -z "${HOME:-}" ]; then
echo "Claude terminal: HOME is not initialized." >&2
exit 1
fi
export SHELL="/bin/bash"
export PATH="${HOME}/.local/bin:/usr/local/bin:/usr/bin:/bin:${PATH:-}"
workspace="${CLAUDE_TERMINAL_WORKSPACE:-${HOME}/workspace}"
session_name="${CLAUDE_TMUX_SESSION:-claude}"
if [ ! -d "$workspace" ]; then
echo "Claude terminal: workspace does not exist: $workspace" >&2
exit 1
fi
cd -- "$workspace"
# Reattach every browser connection to the same terminal session. Closing the browser detaches
# the client but leaves Claude Code and other commands running inside tmux.
exec tmux new-session -A -s "$session_name" -c "$workspace"

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.2 KiB

After

Width:  |  Height:  |  Size: 1.2 KiB

View File

@@ -3,5 +3,7 @@
"upstream_repo": "linuxserver/docker-baseimage-selkies",
"github_fulltag": true,
"slug": "claude_desktop",
"paused": false
"paused": false,
"upstream_version": "ubunturesolute-version-6dc44b0e",
"last_update": "2026-07-13"
}

View File

@@ -1,4 +1,7 @@
## 2.9.16 (2026-07-11)
- Update to latest version from Cleanuparr/Cleanuparr (changelog : https://github.com/Cleanuparr/Cleanuparr/releases)
## 2.9.14 (2026-06-20)
- Update to latest version from Cleanuparr/Cleanuparr (changelog : https://github.com/Cleanuparr/Cleanuparr/releases)

View File

@@ -11,7 +11,7 @@
#=== Home Assistant Addon ===#
# ARGs used in FROM must be declared before any FROM instruction
ARG BUILD_UPSTREAM="2.9.14"
ARG BUILD_UPSTREAM="2.9.16"
#################
# 1 Build Image #

View File

@@ -91,5 +91,5 @@ schema:
TZ: str?
slug: cleanuparr
url: https://github.com/alexbelgium/hassio-addons/tree/master/cleanuparr
version: "2.9.14"
version: "2.9.16"
webui: "[PROTO:ssl]://[HOST]:[PORT:11011]"

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.6 KiB

After

Width:  |  Height:  |  Size: 1.4 KiB

View File

@@ -1,8 +1,8 @@
{
"last_update": "2026-06-20",
"last_update": "2026-07-11",
"repository": "alexbelgium/hassio-addons",
"slug": "cleanuparr",
"source": "github",
"upstream_repo": "Cleanuparr/Cleanuparr",
"upstream_version": "2.9.14"
"upstream_version": "2.9.16"
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.0 KiB

After

Width:  |  Height:  |  Size: 1.4 KiB

View File

@@ -1,4 +1,7 @@
## 2.1.2 (2026-07-11)
- Update to latest version from ajslater/codex (changelog : https://github.com/ajslater/codex/releases)
## 2.1.0 (2026-07-04)
- Update to latest version from ajslater/codex (changelog : https://github.com/ajslater/codex/releases)

View File

@@ -101,4 +101,4 @@ schema:
slug: codex
udev: true
url: https://github.com/alexbelgium/hassio-addons
version: "2.1.0"
version: "2.1.2"

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.0 KiB

After

Width:  |  Height:  |  Size: 1.5 KiB

View File

@@ -1,9 +1,9 @@
{
"github_beta": "true",
"last_update": "2026-07-04",
"last_update": "2026-07-11",
"repository": "alexbelgium/hassio-addons",
"slug": "codex",
"source": "github",
"upstream_repo": "ajslater/codex",
"upstream_version": "2.1.0"
"upstream_version": "2.1.2"
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.0 KiB

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.7 KiB

After

Width:  |  Height:  |  Size: 1.3 KiB

View File

@@ -1,3 +1,9 @@
## 8.19.18-3 (14-07-2026)
- Force a fresh image pull for users left on a stale cached image (some upgrades kept running the old Elasticsearch 7.17.9 image, failing with `mv: cannot move '/data/config' ... Permission denied` and `AccessDeniedException[/usr/share/elasticsearch/data/nodes/0]`). Fully stop and update the add-on so Home Assistant pulls this build.
- Replaced the cryptic `Permission denied` failure with a clear message when the add-on is not running as root (the state that caused the failure above).
## 8.19.18-2 (14-07-2026)
- Minor bugs fixed
## 8.19.18 (2026-07-14)
- Upgrade to Elasticsearch 8.19.18 (#2849). Note: despite the previous add-on version reading `8.14.3`, the shipped image was still Elasticsearch 7.17.9 — the Dockerfile upstream version was never bumped. This release actually delivers 8.x, making the add-on compatible with the `homeassistant-elasticsearch` integration (requires 8.14+).
@@ -8,9 +14,10 @@
- Removed the `ingest-attachment` plugin install: it is a bundled module since Elasticsearch 8.0.
- Startup persistence logic rewritten as a proper init script (`/usr/local/bin/addon-init.sh`) instead of line-number-based entrypoint patching.
- Added `updater.json` so upstream 8.19.x releases are tracked automatically (pinned to the 8.19 line: 9.x cannot read indices created in 7.x).
- The upstream 8.x image ends the build as a non-root user with a read-only entrypoint; the Dockerfile now switches to root for the build steps that patch/install into it. The image stays root at runtime too (unchanged from 7.17.9): the upstream entrypoint no longer drops privileges itself, and `addon-init.sh` needs to chown/move pre-existing `/data` content that may be owned by root from earlier installs.
- The upstream 8.x image ends the build as a non-root user with a read-only entrypoint; the Dockerfile now switches to root for the build steps that patch/install into it. The container also starts as root (unchanged from 7.17.9) so `addon-init.sh` can chown/move pre-existing `/data` content that may be owned by root from earlier installs; unlike 7.17.9's own entrypoint, the upstream 8.x entrypoint no longer drops privileges before starting Elasticsearch (which refuses to run as root), so `addon-init.sh` now does that itself via `chroot --userspec=1000:0` once its root-only work is done.
- `env_vars` names starting with a digit are now rejected before export instead of crashing the entrypoint.
- Fixed a startup failure (`mv: cannot move '/data/config' ... Permission denied`) on upgrade from an existing 7.17.9 install, caused by an earlier fix in this same release that switched the runtime user to non-root before this fix was in place.
- Fixed a second regression from that same fix: without a privilege drop before starting Elasticsearch, both fresh installs and upgrades would fail Elasticsearch's own root-check ("can not run elasticsearch as root").
## 8.14.3-3 (2026-06-19)
- Fix startup failing with `chroot: cannot change root directory` by allowing `capability sys_chroot` in the AppArmor profile (#2709)

View File

@@ -141,9 +141,10 @@ HEALTHCHECK \
--timeout=25s \
CMD curl -A "HealthCheck: Docker/1.0" -s -f "http://127.0.0.1:${HEALTH_PORT}${HEALTH_URL}" &>/dev/null || exit 1
# Stay root at runtime: addon-init.sh must chown/mv pre-existing /data
# content that may be owned by root from earlier installs, and the upstream
# entrypoint no longer drops privileges itself, so a non-root container
# can't touch that data at all. This matches the addon's own AppArmor
# profile (chown, setuid, setgid, sys_chroot, mount capabilities), which
# assumes a root process.
# Start as root: addon-init.sh needs it to chown/move pre-existing /data
# content that may be owned by root from earlier installs. It drops to
# uid 1000 itself (via chroot --userspec) before Elasticsearch actually
# starts, since Elasticsearch refuses to run as root and the upstream 8.x
# entrypoint no longer does that drop on its own (7.x's did). This matches
# the addon's own AppArmor profile (chown, setuid, setgid, sys_chroot,
# mount capabilities).

View File

@@ -90,4 +90,4 @@ slug: elasticsearch
startup: services
udev: true
url: https://github.com/alexbelgium/hassio-addons/tree/master/elasticsearch
version: 8.19.18
version: 8.19.18-3

47
elasticsearch/rootfs/usr/local/bin/addon-init.sh Normal file → Executable file
View File

@@ -1,15 +1,25 @@
#!/bin/bash
# shellcheck shell=bash
# Sourced by /usr/local/bin/docker-entrypoint.sh (right after "set -e"),
# before Elasticsearch starts. Runs as root (the image stays root at
# runtime - see Dockerfile); the official entrypoint does not drop
# privileges itself, and Elasticsearch ends up running as root too.
# before Elasticsearch starts. The container starts as root (see
# Dockerfile) so this script can chown/move pre-existing /data content
# that may be owned by root from earlier installs. Elasticsearch itself
# refuses to run as root, and unlike 7.x the upstream 8.x entrypoint no
# longer drops privileges on its own, so this script does it at the end
# (section 6) by re-execing the entrypoint as uid 1000. On that re-exec'd
# pass this script just returns immediately (see the guard right below).
#
# Responsibilities:
# 1. Export user env_vars from /data/options.json
# 2. Default xpack.security.enabled=false (7.x behavior) unless user overrides
# 3. Relocate data & config to /data for persistence (idempotent)
# 4. Guard major-version data migrations (7.x -> 8.x is automatic)
# 5. Record the running version once Elasticsearch is confirmed healthy
# 6. Drop root privileges before Elasticsearch actually starts
if [ -n "${_ADDON_INIT_REEXEC:-}" ]; then
return 0
fi
echo "-----------------------------------------------------------"
echo " Add-on: Elasticsearch server"
@@ -21,6 +31,17 @@ PERSISTENT_HOME="/data"
VERSION_MARKER="$PERSISTENT_HOME/.addon-upstream-version"
OPTIONS_JSON="/data/options.json"
# This first pass must be root so it can relocate and take ownership of
# pre-existing /data content written by an earlier (root) install. If it
# is not root (e.g. an old cached image that pinned USER 1000:0, or the
# container being forced to another user), the moves/chowns below fail
# with a cryptic "Permission denied"; fail loudly with the real reason.
if [ "$(id -u)" -ne 0 ]; then
echo "FATAL: the Elasticsearch add-on must start as root (currently uid $(id -u))."
echo "If you upgraded from an older version, the running image is likely stale - fully stop and update/reinstall the add-on so Home Assistant pulls the current image."
exit 1
fi
############################
# 1 Export user env_vars #
############################
@@ -84,7 +105,11 @@ if [ -n "$data_version" ] && [[ $current_major =~ ^[0-9]+$ ]]; then
if [ -d "$PERSISTENT_HOME/config" ] && [ ! -L "$PERSISTENT_HOME/config" ]; then
config_backup="$PERSISTENT_HOME/config.bak-$data_version"
if [ ! -e "$config_backup" ]; then
mv "$PERSISTENT_HOME/config" "$config_backup"
if ! mv "$PERSISTENT_HOME/config" "$config_backup"; then
echo "FATAL: could not archive the old config to $config_backup."
echo "This add-on must run as root to migrate a previous install. Restore a Home Assistant backup and ensure the add-on is not forced to a non-root user."
exit 1
fi
echo "NOTICE: previous config archived to $config_backup. Re-apply any custom settings to the new config."
fi
fi
@@ -141,3 +166,17 @@ if [ "$data_version" != "$current_version" ]; then
done
) &
fi
############################
# 6 Drop privileges #
############################
# Elasticsearch refuses to start as root ("can not run elasticsearch as
# root"). 7.x's own entrypoint dropped to uid 1000 via chroot before
# launching Elasticsearch; 8.x no longer does that, so do it here instead,
# then let the entrypoint continue as uid 1000 (matches the sys_chroot /
# setuid / setgid capabilities already granted in the AppArmor profile).
if [ "$(id -u)" -eq 0 ]; then
export _ADDON_INIT_REEXEC=1
exec chroot --userspec=1000:0 / /usr/local/bin/docker-entrypoint.sh "$@"
fi

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.5 KiB

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.9 KiB

After

Width:  |  Height:  |  Size: 1.4 KiB

View File

@@ -1,4 +1,10 @@
## 4.10.0.19 (2026-07-13)
- Update to latest version from linuxserver/docker-emby (changelog : https://github.com/linuxserver/docker-emby/releases)
## 4.10.0.18 (2026-07-11)
- Update to latest version from linuxserver/docker-emby (changelog : https://github.com/linuxserver/docker-emby/releases)
## 4.10.0.17 (2026-07-04)
- Update to latest version from linuxserver/docker-emby (changelog : https://github.com/linuxserver/docker-emby/releases)

View File

@@ -16,7 +16,7 @@
ARG BUILD_FROM
ARG BUILD_VERSION
ARG BUILD_UPSTREAM="4.10.0.17"
ARG BUILD_UPSTREAM="4.10.0.19"
FROM ${BUILD_FROM}
##################

View File

@@ -122,5 +122,5 @@ schema:
slug: emby_nas
udev: true
url: https://github.com/alexbelgium/hassio-addons/tree/master/emby
version: "4.10.0.17"
version: "4.10.0.19"
video: true

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.8 KiB

After

Width:  |  Height:  |  Size: 1.3 KiB

Some files were not shown because too many files have changed in this diff Show More