Compare commits

..

23 Commits

Author SHA1 Message Date
Alexandre
b987aebf0f Document Webtrees app-config host folder 2026-08-03 08:22:47 +02:00
Alexandre
0949047d64 Restore lint workflow after review fixes 2026-08-03 08:20:39 +02:00
github-actions[bot]
96cdde5f49 Address remaining PR review comments 2026-08-03 06:19:47 +00:00
Alexandre
3424435e13 Commit review fixes without workflow changes 2026-08-03 08:18:59 +02:00
Alexandre
1d764ec744 Correct Mealie historical path count 2026-08-03 08:17:16 +02:00
Alexandre
b1d8dad9da Apply remaining PR 2933 review fixes 2026-08-03 08:12:55 +02:00
Alexandre
b68b44c991 Update Mealie app_config documentation path 2026-08-03 08:10:39 +02:00
Alexandre
43d3a71487 Align custom script assignment indentation 2026-08-03 08:09:58 +02:00
Alexandre
c424d844eb Correct qbit_manage configuration filename 2026-08-03 08:09:23 +02:00
Alexandre
b14b066f55 Fix qBittorrent migration paths and messages 2026-08-03 08:09:09 +02:00
Alexandre
6320fa2af3 Document Cleanuparr app_config mount 2026-08-03 08:08:50 +02:00
Alexandre
e1fa043900 Fix Cleanuparr app_config persistence path 2026-08-03 08:08:26 +02:00
Alexandre
082fbbadd2 Remove temporary review-fix workflow 2026-08-03 08:08:00 +02:00
Alexandre
e686528ebf Restore lint workflow 2026-08-03 08:07:53 +02:00
Alexandre
44bb5e3574 Temporarily apply PR 2933 review fixes 2026-08-03 08:05:18 +02:00
Alexandre
25ad2920a8 Trigger PR 2933 review-fix workflow 2026-08-03 08:01:53 +02:00
Alexandre
ea2659054f Add one-shot workflow to address PR 2933 review comments 2026-08-03 07:59:38 +02:00
github-actions[bot]
45b3be0b6f Migrate app config map names 2026-08-02 21:17:09 +00:00
Alexandre
6dcb180a49 Run app config map migration 2026-08-02 23:16:53 +02:00
github-actions
87c9b60be0 GitHub bot: changelog [nobuild] 2026-08-02 15:59:48 +00:00
Alexandre
82ac7957c8 Update version in config.yaml 2026-08-02 17:57:45 +02:00
Alexandre
f0d20d77fa Update config.yaml 2026-08-02 17:57:20 +02:00
Alexandre
988cecb122 fix(birdnet-pi): restore the ingress Caddy site (502 Bad Gateway) (#2931)
* fix(birdnet-pi): restore the ingress Caddy site, ingress returned 502

nginx forwards ingress traffic to 127.0.0.1:8082 (rootfs/etc/nginx/servers/
ingress.conf:11), a site appended to the Caddyfile by helpers/caddy_ingress.sh.
The upstream script $HOME/BirdNET-Pi/scripts/update_caddyfile.sh regenerates
/etc/caddy/Caddyfile from scratch and 02-caddy.sh runs it immediately before
`exec caddy run`, so 91-nginx_ingress.sh injected a call to caddy_ingress.sh
into that script to re-add the site. The injection was anchored on
`sudo caddy fmt --overwrite`.

Since 2026.07.10-1 the Dockerfile strips `sudo ` from every BirdNET-Pi script at
build time (Dockerfile:110), so the shipped line is `caddy fmt --overwrite` and
the anchor stopped matching. sed reports success when a pattern matches nothing,
so this failed silently: Caddy came up listening only on :8081 and every ingress
request got connection-refused on 8082. Confirmed by extracting the script from
the published ghcr.io/alexbelgium/birdnet-pi-amd64 image - it contains no `sudo`.

- 91-nginx_ingress.sh: make the anchor accept the line with or without `sudo`,
  skip the injection when it is already there (cont-init re-runs on restart),
  and verify afterwards, falling back to appending the call if the anchor is
  ever gone again.
- caddy_ingress.sh: return early when a `:8082` site already exists. The script
  now runs from more than one place, and a duplicate site address makes Caddy
  refuse to start.
- 02-caddy.sh: re-add the ingress site just before starting Caddy if it is
  missing, so a future upstream change to update_caddyfile.sh cannot silently
  bring back the 502.
- 91-nginx_ingress.sh: drop /ingress_url when ingress is off, so that marker is
  a truthful signal for the check above even across an in-container restart.

Verified with a harness that replays the boot sequence (build-time sudo strip,
81-modifications.sh, 91-nginx_ingress.sh, 02-caddy.sh) against the real upstream
update_caddyfile.sh: master ends with no :8082 site, this branch ends with
exactly one, on fresh boot, on restart, and when the `caddy fmt` anchor is
removed entirely; standalone mode still gets no ingress site.

Closes #2928

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

* fix(birdnet-pi): harden the ingress-site recovery check in 02-caddy.sh

Review feedback on the pre-start check:

- Require /etc/caddy/Caddyfile to exist and silence grep's stderr. `! grep` is
  also true for grep's exit code 2, so an unreadable or missing Caddyfile read
  as "ingress site missing" and would have produced an ingress-only Caddyfile
  out of an error state. Letting caddy fail on the missing config is easier to
  diagnose.
- Report a failure of caddy_ingress.sh instead of swallowing it. Do not exit:
  /custom-services.d scripts are LSIO longruns that s6 restarts when they
  return, so exiting would flap the service and take the WebUI down on 8081 as
  well, which is strictly worse than ingress alone being broken.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
2026-08-02 17:56:19 +02:00
267 changed files with 429 additions and 957 deletions

View File

@@ -19,7 +19,7 @@ slug="${slug#*_}"
if [ ! -f /config/configuration.yaml ] && [ ! -f /config/configuration.json ]; then
# New config location
CONFIGLOCATION="/config"
CONFIGFILEBROWSER="/addon_configs/${HOSTNAME/-/_}/config.yaml"
CONFIGFILEBROWSER="/app_configs/${HOSTNAME/-/_}/config.yaml"
else
# Legacy config location
CONFIGLOCATION="/config/addons_config/${slug}"

View File

@@ -174,7 +174,7 @@ slug="${slug#*_}"
# Check type of config folder
if [ ! -f /config/configuration.yaml ] && [ ! -f /config/configuration.json ]; then
CONFIGLOCATION="/config"
CONFIGFILEBROWSER="/addon_configs/${HOSTNAME/-/_}/$slug.sh"
CONFIGFILEBROWSER="/app_configs/${HOSTNAME/-/_}/$slug.sh"
else
CONFIGLOCATION="/config/addons_autoscripts"
CONFIGFILEBROWSER="/homeassistant/addons_autoscripts/$slug.sh"

View File

@@ -70,7 +70,7 @@ version: "X.Y.Z" # upstream version (format varies; see Versioning sect
ingress: true/false
ingress_port: 8000
map:
- addon_config:rw # /addon_configs/<hostname>/
- app_config:rw # /app_configs/<hostname>/
- share:rw
- media:rw
- ssl

View File

@@ -1,5 +1,6 @@
## 2026.08 (2026-08-01)
- Migrate deprecated Home Assistant map names to their app equivalents.
- Addon versions written in config.yaml now always comply with Home Assistant versioning: an upstream tag Home Assistant cannot order (`version-bf9e0b4f`, `ubuntu-2026-06-01`, ...) or would sort as older (`1.2.3-2`, `1.2.3+4`) no longer lands in config.yaml. The addon number is incremented instead, while the raw upstream tag stays in updater.json so the same release is never published twice
- Pre-release markers become a version section, `5.0.0b5` is published as `5.0.0.5`
- A tag Home Assistant cannot order keeps every number it carries, `v26.2-ls256` is published as `v26.2.256`
@@ -31,7 +32,7 @@
## 3.19
- New HA config logic implemented. Files are now located in the addon config file, that can be accessed from the addon_configs folder from my filebrowser or cloudcommander addons. Migration of data, custom configs, and custom scripts should be automatic. Please be sure to update all your links however ! For more information, see here : https://developers.home-assistant.io/blog/2023/11/06/public-addon-config/
- New HA config logic implemented. Files are now located in the addon config file, that can be accessed from the app_configs folder from my filebrowser or cloudcommander addons. Migration of data, custom configs, and custom scripts should be automatic. Please be sure to update all your links however ! For more information, see here : https://developers.home-assistant.io/blog/2023/11/06/public-addon-config/
- Feat : if there is no releases in a github repo, check if there is a valid package and get the highest tag https://github.com/alexbelgium/hassio-addons/issues/1168
- Feat : github_exclude applies to dockerhub

View File

@@ -115,7 +115,7 @@ verbose: "false"
### Custom Scripts and Environment Variables
This addon supports custom scripts and environment variables through the `addon_config` mapping:
This addon supports custom scripts and environment variables through the `app_config` mapping:
- **Custom scripts**: See [Running Custom Scripts in Addons](https://github.com/alexbelgium/hassio-addons/wiki/Running-custom-scripts-in-Addons)
- **Environment variables**: Use the add-on `env_vars` option and see [Add Environment Variables to your Addon](https://github.com/alexbelgium/hassio-addons/wiki/Add-Environment-variables-to-your-Addon) for details.

View File

@@ -8,7 +8,7 @@ environment:
image: ghcr.io/alexbelgium/addons_updater-{arch}
init: false
map:
- addon_config:rw
- app_config:rw
name: Repository Updater
options:
date_iso8601: true

View File

@@ -1,5 +1,6 @@
## 2.0.3 (2026-08-01)
- Migrate deprecated Home Assistant map names to their app equivalents.
- Update to latest version from lklynet/aurral (changelog : https://github.com/lklynet/aurral/releases)
## 2.0.2 (2026-08-01)

View File

@@ -21,7 +21,7 @@ ports_description:
webui: http://[HOST]:[PORT:3001]
map:
- addon_config:rw
- app_config:rw
- share:rw
- media:rw

View File

@@ -1,6 +1,7 @@
- The Home Assistant project has deprecated support for the armv7, armhf and i386 architectures. Support wil be fully dropped in the upcoming Home Assistant 2025.12 release
## 0.10.1-hafix4 (2025-11-18)
- Migrate deprecated Home Assistant map names to their app equivalents.
- Minor bugs fixed
## 0.10.1-hafix3 (2025-11-18)
- Added support for configuring extra environment variables via the `env_vars` option alongside config.yaml.
@@ -21,7 +22,7 @@
## 0.9.5 (2024-04-27)
- Update to latest version from ckulka/baikal-docker (changelog : https://github.com/ckulka/baikal-docker/releases)
## 0.9.4-3 (2024-04-26)
- ⚠ MAJOR CHANGE : switch to the new config logic from homeassistant. Your configuration files will have migrated from /config/hassio_addons/baikal to a folder only accessible from my Filebrowser addon called /addon_configs/something-baikal. This avoids the addon to mess with your homeassistant configuration folder, and allows to backup the options. Migration of data, custom configs, and custom scripts should be automatic. Please be sure to update all your links however ! For more information, see here : https://developers.home-assistant.io/blog/2023/11/06/public-addon-config/
- ⚠ MAJOR CHANGE : switch to the new config logic from homeassistant. Your configuration files will have migrated from /config/hassio_addons/baikal to a folder only accessible from my Filebrowser addon called /app_configs/something-baikal. This avoids the addon to mess with your homeassistant configuration folder, and allows to backup the options. Migration of data, custom configs, and custom scripts should be automatic. Please be sure to update all your links however ! For more information, see here : https://developers.home-assistant.io/blog/2023/11/06/public-addon-config/
## 0.9.4-2 (2024-01-14)

View File

@@ -48,7 +48,7 @@ Configurations can be done through the app webUI, except for the following optio
### Custom Scripts and Environment Variables
This addon supports custom scripts and environment variables through the `addon_config` mapping:
This addon supports custom scripts and environment variables through the `app_config` mapping:
- **Custom scripts**: See [Running Custom Scripts in Addons](https://github.com/alexbelgium/hassio-addons/wiki/Running-custom-scripts-in-Addons)
- **Environment variables**: See [Add Environment Variables to your Addon](https://github.com/alexbelgium/hassio-addons/wiki/Add-Environment-variables-to-your-Addon)

View File

@@ -66,7 +66,7 @@ devices:
- /dev/nvme2
image: ghcr.io/alexbelgium/baikal-{arch}
map:
- addon_config:rw
- app_config:rw
- homeassistant_config:rw
- share:rw
- ssl:ro

View File

@@ -1,4 +1,5 @@
## 2026.02.28 (28-02-2026)
- Migrate deprecated Home Assistant map names to their app equivalents.
- Minor bugs fixed
## 2026.02.25-2 (25-02-2026)
- Minor bugs fixed

View File

@@ -86,7 +86,7 @@ This addon supports mounting both local drives and remote SMB shares:
### Custom Scripts and Environment Variables
This addon supports custom scripts and environment variables through the `addon_config` mapping:
This addon supports custom scripts and environment variables through the `app_config` mapping:
- **Custom scripts**: See [Running Custom Scripts in Addons](https://github.com/alexbelgium/hassio-addons/wiki/Running-custom-scripts-in-Addons)
- **env_vars option**: Use the add-on `env_vars` option to pass extra environment variables (uppercase or lowercase names). See https://github.com/alexbelgium/hassio-addons/wiki/Add-Environment-variables-to-your-Addon-2 for details.

View File

@@ -64,7 +64,7 @@ ingress: true
ingress_stream: true
init: false
map:
- addon_config:rw
- app_config:rw
- media:rw
- share:rw
- ssl

View File

@@ -1,6 +1,7 @@
## 1.6.0.2 (2026-07-27)
- Migrate deprecated Home Assistant map names to their app equivalents.
- Fix base_url sed patterns rewriting *every* `base_url` key in Bazarr's config.yaml (radarr.base_url, sonarr.base_url, and any other configured integration), instead of only Bazarr's own under `general:`. This silently broke the Radarr/Sonarr connections inside Bazarr on every addon restart when ingress was enabled
## 1.6.0.1 (2026-07-27)
@@ -26,7 +27,7 @@
- Update to latest version from linuxserver/docker-bazarr (changelog : https://github.com/linuxserver/docker-bazarr/releases)
## 1.5.4-1 (2026-01-08)
- ⚠ MAJOR CHANGE : switch to the new config logic from homeassistant. Your configuration files will have migrated from /config/addons_config/bazarr to a folder only accessible from my Filebrowser addon called /addon_configs/xxx-bazarr. This avoids the addon to mess with your homeassistant configuration folder, and allows to backup the options. Migration of data should be automatic. Please be sure to update all your links however ! For more information, see here : https://developers.home-assistant.io/blog/2023/11/06/public-addon-config/
- ⚠ MAJOR CHANGE : switch to the new config logic from homeassistant. Your configuration files will have migrated from /config/addons_config/bazarr to a folder only accessible from my Filebrowser addon called /app_configs/xxx-bazarr. This avoids the addon to mess with your homeassistant configuration folder, and allows to backup the options. Migration of data should be automatic. Please be sure to update all your links however ! For more information, see here : https://developers.home-assistant.io/blog/2023/11/06/public-addon-config/
## 1.5.4 (2026-01-08)
- Update to latest version from linuxserver/docker-bazarr (changelog : https://github.com/linuxserver/docker-bazarr/releases)

View File

@@ -76,7 +76,7 @@ ingress: true
ingress_entry: bazarr
init: false
map:
- addon_config:rw
- app_config:rw
- homeassistant_config:rw
- share:rw
- media:rw

View File

@@ -23,7 +23,7 @@ fi
slug=bazarr
if [ -d "/homeassistant/addons_config/$slug" ]; then
echo "Migrating /homeassistant/addons_config/$slug to /addon_configs/xxx-$slug"
echo "Migrating /homeassistant/addons_config/$slug to /app_configs/xxx-$slug"
cp -rnf /homeassistant/addons_config/"$slug"/. /config/ || true
mv /homeassistant/addons_config/"$slug" /homeassistant/addons_config/"$slug"_migrated
fi

View File

@@ -1,5 +1,6 @@
## 20260729.1 (2026-08-01)
- Migrate deprecated Home Assistant map names to their app equivalents.
- Version renamed from `source-20260729.1`, which Home Assistant could not order and therefore could not reliably offer as an update: every number of the previous version is kept, as a section of its own. The addon itself and the upstream version it tracks are unchanged
## source-20260729.1 (29-07-2026)

View File

@@ -25,7 +25,7 @@ MQTT password : Ri5ahV1aipeiw0aelerooteixai5ohtoeNg6oo3mo0thi5te0phiezuge4Phoore
MQTT broker : tcp://core-mosquitto:1883
---
Edit this section of config.yaml found in addon_configs/db21ed7f_birdnet-go/:
Edit this section of config.yaml found in app_configs/db21ed7f_birdnet-go/:
mqtt:
enabled: true # true to enable MQTT
broker: tcp://core-mosquitto:1883 # MQTT (tcp://host:port)

View File

@@ -82,7 +82,7 @@ This addon supports mounting both local drives and remote SMB shares:
### Custom Scripts and Environment Variables
This addon supports custom scripts and environment variables through the `addon_config` mapping:
This addon supports custom scripts and environment variables through the `app_config` mapping:
- **Custom scripts**: See [Running Custom Scripts in Addons](https://github.com/alexbelgium/hassio-addons/wiki/Running-custom-scripts-in-Addons)
- **env_vars option**: Use the add-on `env_vars` option to pass extra environment variables (uppercase or lowercase names). See https://github.com/alexbelgium/hassio-addons/wiki/Add-Environment-variables-to-your-Addon-2 for details.

View File

@@ -80,7 +80,7 @@ ingress_entry: "ui/dashboard"
ingress_stream: true
init: false
map:
- addon_config:rw
- app_config:rw
- media:rw
- share:rw
name: Birdnet-go (customized and built from source)

View File

@@ -1,5 +1,6 @@
## 20260716 (2026-07-16)
- Migrate deprecated Home Assistant map names to their app equivalents.
- Update to latest version from tphakala/birdnet-go (changelog : https://github.com/tphakala/birdnet-go/releases)
## 20260712 (2026-07-13)

View File

@@ -25,7 +25,7 @@ MQTT password : Ri5ahV1aipeiw0aelerooteixai5ohtoeNg6oo3mo0thi5te0phiezuge4Phoore
MQTT broker : tcp://core-mosquitto:1883
---
Edit this section of config.yaml found in addon_configs/db21ed7f_birdnet-go/:
Edit this section of config.yaml found in app_configs/db21ed7f_birdnet-go/:
mqtt:
enabled: true # true to enable MQTT
broker: tcp://core-mosquitto:1883 # MQTT (tcp://host:port)

View File

@@ -79,7 +79,7 @@ This addon supports mounting both local drives and remote SMB shares:
### Custom Scripts and Environment Variables
This addon supports custom scripts and environment variables through the `addon_config` mapping:
This addon supports custom scripts and environment variables through the `app_config` mapping:
- **Custom scripts**: See [Running Custom Scripts in Addons](https://github.com/alexbelgium/hassio-addons/wiki/Running-custom-scripts-in-Addons)
- **env_vars option**: Use the add-on `env_vars` option to pass extra environment variables (uppercase or lowercase names). See https://github.com/alexbelgium/hassio-addons/wiki/Add-Environment-variables-to-your-Addon-2 for details.

View File

@@ -81,7 +81,7 @@ ingress_entry: "ui/dashboard"
ingress_stream: true
init: false
map:
- addon_config:rw
- app_config:rw
- media:rw
- share:rw
name: Birdnet-go

View File

@@ -1,4 +1,5 @@
## 2026.07.10-2 (10-07-2026)
- Migrate deprecated Home Assistant map names to their app equivalents.
- Minor bugs fixed
## 2026.07.10 (10-07-2026)
- Initial release: BirdNET-Pi add-on based on the zach7036/BirdNET-Pi-Enhanced-Version fork

View File

@@ -93,7 +93,7 @@ This addon supports mounting both local drives and remote SMB shares:
### Custom Scripts and Environment Variables
This addon supports custom scripts and environment variables through the `addon_config` mapping:
This addon supports custom scripts and environment variables through the `app_config` mapping:
- **Custom scripts**: See [Running Custom Scripts in Addons](https://github.com/alexbelgium/hassio-addons/wiki/Running-custom-scripts-in-Addons)
- **env_vars option**: Use the add-on `env_vars` option to pass extra environment variables (uppercase or lowercase names). See https://github.com/alexbelgium/hassio-addons/wiki/Add-Environment-variables-to-your-Addon-2 for details.

View File

@@ -61,7 +61,7 @@ image: ghcr.io/alexbelgium/birdnet-pi-zach-{arch}
ingress: true
init: false
map:
- addon_config:rw
- app_config:rw
- media:rw
- share:rw
- ssl

View File

@@ -1,3 +1,8 @@
## 2026.08.02 (02-08-2026)
- Migrate deprecated Home Assistant map names to their app equivalents.
- Fix: ingress returned "502 Bad Gateway" because Caddy never listened on :8082. `91-nginx_ingress.sh` hooked the ingress site into `update_caddyfile.sh` with a sed anchored on `sudo caddy fmt --overwrite`, but 2026.07.10-1 strips `sudo` from every BirdNET-Pi script at build time, so the anchor stopped matching. `update_caddyfile.sh` then rewrote the Caddyfile from scratch just before Caddy started, dropping the ingress site
- Fix: `caddy_ingress.sh` no longer appends a second `:8082` block when it runs twice (a duplicate site address makes Caddy refuse to start)
- Fix: `02-caddy.sh` re-adds the ingress site if it is missing from the Caddyfile just before starting Caddy
## 2026.07.22 (22-07-2026)
- Fix: health-check the WebUI port (8081) instead of port 80, so the standalone Docker container no longer reports "unhealthy" when ssl=false
- Fix: health-check now probes https when ssl is enabled, and no longer silently reports "healthy" regardless of the actual result (the previous check's `&>` redirection is a bash-ism that dash, the image's /bin/sh, parses as background + no-op, discarding curl's exit status)
@@ -148,7 +153,7 @@
- [ALL] Fix non-avx2 cpu support
## 2025.02.23 (2025-02-16)
- WARNING 2025.02.14/16 was buggy. If you installed it you need to restore a backup or delete manually your /addon_configs/xxx-birdnet-pi/birdnet.conf file and recreate it
- WARNING 2025.02.14/16 was buggy. If you installed it you need to restore a backup or delete manually your /app_configs/xxx-birdnet-pi/birdnet.conf file and recreate it
- Allow usage as a standalone container (thanks @gotschi) https://github.com/mcguirepr89/BirdNET-Pi/issues/211#issuecomment-2650095952
- Corrected a bug preventing to create db
- Corrected a bug to ensure the the most up-to-date birdnet.conf on fresh start

View File

@@ -93,7 +93,7 @@ This addon supports mounting both local drives and remote SMB shares:
### Custom Scripts and Environment Variables
This addon supports custom scripts and environment variables through the `addon_config` mapping:
This addon supports custom scripts and environment variables through the `app_config` mapping:
- **Custom scripts**: See [Running Custom Scripts in Addons](https://github.com/alexbelgium/hassio-addons/wiki/Running-custom-scripts-in-Addons)
- **env_vars option**: Use the add-on `env_vars` option to pass extra environment variables (uppercase or lowercase names). See https://github.com/alexbelgium/hassio-addons/wiki/Add-Environment-variables-to-your-Addon-2 for details.

View File

@@ -61,7 +61,7 @@ image: ghcr.io/alexbelgium/birdnet-pi-{arch}
ingress: true
init: false
map:
- addon_config:rw
- app_config:rw
- media:rw
- share:rw
- ssl
@@ -116,5 +116,5 @@ tmpfs: true
udev: true
url: https://github.com/alexbelgium/hassio-addons/tree/master/birdnet-pi
usb: true
version: 2026.07.22
version: 2026.08.02
video: true

View File

@@ -25,5 +25,24 @@ export TZ="${TZ_VALUE:-Etc/UTC}"
# Update caddyfile with password
"$HOME"/BirdNET-Pi/scripts/update_caddyfile.sh &> /dev/null || true
# update_caddyfile.sh rewrites the Caddyfile from scratch. 91-nginx_ingress.sh
# hooks the ingress site back into it, but if that hook ever fails to apply,
# caddy would start without a :8082 listener and ingress would answer 502.
# 91-nginx_ingress.sh writes /ingress_url when ingress is on and removes it when
# it is off, so this is a no-op in standalone mode.
# Require the Caddyfile to exist: if it is missing something went badly wrong
# earlier, and caddy failing on a missing config is easier to diagnose than an
# ingress-only Caddyfile conjured up here.
if [[ -f /ingress_url ]] && [[ -f /etc/caddy/Caddyfile ]] \
&& ! grep -qE '^[[:space:]]*:8082[[:space:]]*\{' /etc/caddy/Caddyfile 2> /dev/null; then
echo "Ingress site missing from the Caddyfile, re-adding it"
if ! /helpers/caddy_ingress.sh; then
# Start caddy anyway: ingress stays broken, but direct access on 8081
# keeps working. Exiting here would only make s6 restart this service in
# a loop and take the WebUI down completely.
echo "Failed to re-add the ingress site, the ingress panel will return 502" >&2
fi
fi
echo "Starting service: caddy"
exec /usr/bin/caddy run --config /etc/caddy/Caddyfile

View File

@@ -26,6 +26,10 @@ ingress_entry=$(bashio::addon.ingress_entry)
if [[ "$ingress_entry" != "/api"* ]]; then
bashio::log.info "Ingress entry is not set, exiting configuration."
sed -i "1a sleep infinity" /custom-services.d/02-nginx.sh
# This script re-runs from /etc/scripts-init on an add-on restart, so drop
# any marker left by an earlier run: it is what 02-caddy.sh reads to decide
# whether the ingress site belongs in the Caddyfile.
rm -f /ingress_url
exit 0
fi
@@ -68,9 +72,23 @@ sed -i "s|localhost|localhost:8082|g" "$HOME/BirdNET-Pi/scripts/utils/notificati
# Update the Caddyfile if update script exists
caddy_update_script="$HOME/BirdNET-Pi/scripts/update_caddyfile.sh"
if [ -f "$caddy_update_script" ]; then
sed -i "/sudo caddy fmt --overwrite/i /helpers/caddy_ingress.sh" "$caddy_update_script"
else
if [ ! -f "$caddy_update_script" ]; then
bashio::log.error "Caddy update script not found: $caddy_update_script"
exit 1
fi
# update_caddyfile.sh rewrites /etc/caddy/Caddyfile from scratch, which drops
# the ingress site added just above. 02-caddy.sh runs it right before starting
# caddy, so the hook below has to re-add the site from inside that script, just
# before it formats and reloads the config.
# The anchor must not require "sudo": the Dockerfile strips it from every
# BirdNET-Pi script at build time, so the shipped line is "caddy fmt --overwrite".
if ! grep -qF "/helpers/caddy_ingress.sh" "$caddy_update_script"; then
sed -i -E "/^[[:space:]]*(sudo[[:space:]]+)?caddy[[:space:]]+fmt[[:space:]]+--overwrite/i /helpers/caddy_ingress.sh" "$caddy_update_script"
fi
# sed is silent when the anchor is missing; make sure the hook is really there
if ! grep -qF "/helpers/caddy_ingress.sh" "$caddy_update_script"; then
bashio::log.warning "Could not anchor the ingress site in $caddy_update_script, appending it instead"
printf '\n/helpers/caddy_ingress.sh\n' >> "$caddy_update_script"
fi

View File

@@ -6,6 +6,13 @@ set +u
# shellcheck disable=SC1091
source /etc/birdnet/birdnet.conf
# Nothing to do if the ingress site is already there. This script runs both from
# cont-init and from update_caddyfile.sh, and a duplicate ":8082" site address
# makes caddy refuse to start.
if grep -qE '^[[:space:]]*:8082[[:space:]]*\{' /etc/caddy/Caddyfile 2> /dev/null; then
exit 0
fi
# Create ingress configuration for Caddyfile
cat << EOF >> /etc/caddy/Caddyfile
:8082 {

View File

@@ -1,5 +1,6 @@
## 0.8.5 (2026-08-01)
- Migrate deprecated Home Assistant map names to their app equivalents.
- Update to latest version from Suncuss/BirdNET-PiPy (changelog : https://github.com/Suncuss/BirdNET-PiPy/releases)
## 0.8.4 (2026-07-13)

View File

@@ -47,7 +47,7 @@ This add-on supports mounting both local drives and remote SMB shares:
### Custom Scripts and Environment Variables
This add-on supports custom scripts and environment variables through the `addon_config` mapping:
This add-on supports custom scripts and environment variables through the `app_config` mapping:
- **Custom scripts**: See [Running Custom Scripts in Addons](https://github.com/alexbelgium/hassio-addons/wiki/Running-custom-scripts-in-Addons)
- **env_vars option**: Use the add-on `env_vars` option to pass extra environment variables (uppercase or lowercase names). See https://github.com/alexbelgium/hassio-addons/wiki/Add-Environment-variables-to-your-Addon-2 for details.

View File

@@ -67,7 +67,7 @@ ingress: true
ingress_stream: true
init: false
map:
- addon_config:rw
- app_config:rw
- ssl:rw
- share:rw
name: BirdNET-PiPy

View File

@@ -1,5 +1,6 @@
## 1.93.129-ls119 (2026-08-01)
- Migrate deprecated Home Assistant map names to their app equivalents.
- Update to latest version from linuxserver/docker-brave (changelog : https://github.com/linuxserver/docker-brave/releases)
## 1.92.144-ls117 (2026-07-25)

View File

@@ -26,7 +26,7 @@ image: ghcr.io/alexbelgium/brave-{arch}
ingress: true
init: false
map:
- addon_config:rw
- app_config:rw
- media:rw
- share:rw
- ssl

View File

@@ -1,5 +1,6 @@
## 2026.08.01.1 (2026-08-01)
- Migrate deprecated Home Assistant map names to their app equivalents.
- Update to latest version from linuxserver/docker-chromium (changelog : https://github.com/linuxserver/docker-chromium/releases)
- Upstream tag : version-e2e1ec9c
## 2026.08.01 (2026-08-01)

View File

@@ -26,7 +26,7 @@ image: ghcr.io/alexbelgium/chromium-{arch}
ingress: true
init: false
map:
- addon_config:rw
- app_config:rw
- media:rw
- share:rw
- ssl

View File

@@ -1,5 +1,6 @@
## 2.55.2 (2026-08-01)
- Migrate deprecated Home Assistant map names to their app equivalents.
- Update to latest version from browserless/chrome (changelog : https://github.com/browserless/chrome/releases)
## 2.55.0 (2026-07-16)

View File

@@ -50,7 +50,7 @@ TIMEOUT: 60000
### Custom Scripts and Environment Variables
This addon supports custom scripts and environment variables through the `addon_config` mapping:
This addon supports custom scripts and environment variables through the `app_config` mapping:
- **Custom scripts**: See [Running Custom Scripts in Addons](https://github.com/alexbelgium/hassio-addons/wiki/Running-custom-scripts-in-Addons)
- **env_vars option**: Use the add-on `env_vars` option to pass extra environment variables (uppercase or lowercase names). See https://github.com/alexbelgium/hassio-addons/wiki/Add-Environment-variables-to-your-Addon-2 for details.

View File

@@ -69,7 +69,7 @@ environment:
image: ghcr.io/alexbelgium/browserless_chrome-{arch}
init: false
map:
- addon_config:rw
- app_config:rw
name: Browserless Chromium
options:
env_vars: []

View File

@@ -1,5 +1,6 @@
## 9.12.0 (2026-08-01)
- Migrate deprecated Home Assistant map names to their app equivalents.
- Update to latest version from linuxserver/docker-calibre (changelog : https://github.com/linuxserver/docker-calibre/releases)
## 9.11.0 (2026-07-04)
@@ -217,7 +218,7 @@
- Update to latest version from linuxserver/docker-calibre
- BREAKING CHANGE : please relink your library according to https://github.com/alexbelgium/hassio-addons/issues/1154#issuecomment-1879182729
- ⚠ MAJOR CHANGE : switch to the new config logic from homeassistant. Your configuration files will have migrated from /config/hassio_addons/calibre to a folder only accessible from my Filebrowser addon called /addon_configs/something-calibre. This avoids the addon to mess with your homeassistant configuration folder, and allows to backup the options. Migration of data, custom configs, and custom scripts should be automatic. Please be sure to update all your links however ! For more information, see here : https://developers.home-assistant.io/blog/2023/11/06/public-addon-config/ https://github.com/alexbelgium/hassio-addons/issues/1154
- ⚠ MAJOR CHANGE : switch to the new config logic from homeassistant. Your configuration files will have migrated from /config/hassio_addons/calibre to a folder only accessible from my Filebrowser addon called /app_configs/something-calibre. This prevents the add-on from modifying your Home Assistant configuration folder, and allows to backup the options. Migration of data, custom configs, and custom scripts should be automatic. Please be sure to update all your links however ! For more information, see [the Home Assistant documentation](https://developers.home-assistant.io/blog/2023/11/06/public-addon-config/) and [issue #1154](https://github.com/alexbelgium/hassio-addons/issues/1154).
## 7.2.0 (2023-12-16)

View File

@@ -98,7 +98,7 @@ This addon supports mounting both local drives and remote SMB shares:
### Custom Scripts and Environment Variables
This addon supports custom scripts and environment variables through the `addon_config` mapping:
This addon supports custom scripts and environment variables through the `app_config` mapping:
- **Custom scripts**: See [Running Custom Scripts in Addons](https://github.com/alexbelgium/hassio-addons/wiki/Running-custom-scripts-in-Addons)
- **env_vars option**: Use the add-on `env_vars` option to pass extra environment variables (uppercase or lowercase names). See https://github.com/alexbelgium/hassio-addons/wiki/Add-Environment-variables-to-your-Addon-2 for details.

View File

@@ -78,7 +78,7 @@ init: false
map:
- media:rw
- share:rw
- addon_config:rw
- app_config:rw
- homeassistant_config:rw
- ssl
name: Calibre

View File

@@ -1,5 +1,6 @@
## 0.6.26-2 (2026-04-06)
- Migrate deprecated Home Assistant map names to their app equivalents.
- Fix: Install calibre (calibredb) at build time to fix 500 error when downloading books
## 0.6.26 (2026-02-07)
@@ -10,7 +11,7 @@
- Update to latest version from linuxserver/docker-calibre-web (changelog : https://github.com/linuxserver/docker-calibre-web/releases)
## 0.6.24-10 (2025-05-28)
- Fix migration script
- Allow access to Calibre folder through /addon_configs/xxx-Calibre
- Allow access to Calibre folder through /app_configs/xxx-Calibre
## 0.6.24 (2024-11-23)
- Update to latest version from linuxserver/docker-calibre-web (changelog : https://github.com/linuxserver/docker-calibre-web/releases)
@@ -26,7 +27,7 @@
- Minor bugs fixed
## 0.6.21-5 (2024-01-12)
- ⚠ MAJOR CHANGE : switch to the new config logic from homeassistant. Your configuration files will have migrated from /config/hassio_addons/calibre-web to a folder only accessible from my Filebrowser addon called /addon_configs/something-calibre-web. This avoids the addon to mess with your homeassistant configuration folder, and allows to backup the options. Migration of data, custom configs, and custom scripts should be automatic. Please be sure to update all your links however ! For more information, see here : https://developers.home-assistant.io/blog/2023/11/06/public-addon-config/ https://github.com/alexbelgium/hassio-addons/issues/1177
- ⚠ MAJOR CHANGE : switch to the new config logic from homeassistant. Your configuration files will have migrated from /config/hassio_addons/calibre-web to a folder only accessible from my Filebrowser addon called /app_configs/something-calibre-web. This avoids the addon to mess with your homeassistant configuration folder, and allows to backup the options. Migration of data, custom configs, and custom scripts should be automatic. Please be sure to update all your links however ! For more information, see here : https://developers.home-assistant.io/blog/2023/11/06/public-addon-config/ https://github.com/alexbelgium/hassio-addons/issues/1177
## 0.6.21-2 (2023-11-05)

View File

@@ -77,8 +77,8 @@ image: ghcr.io/alexbelgium/calibre_web-{arch}
ingress: true
init: false
map:
- addon_config:rw
- all_addon_configs:rw
- app_config:rw
- all_app_configs:rw
- homeassistant_config:rw
- media:rw
- share:rw

View File

@@ -1,9 +1,6 @@
## 1.38 (02-08-2026)
- Reduce Claude Desktop add-on RAM use in three places without removing Headroom, RTK, TokenSave, Cowork, Dispatch, or the streamed desktop. Headroom's heavy HTTP proxy is no longer started at container boot: a standard-library TCP gate stays on port 8787, starts the real proxy on the first request, and stops it after 15 minutes without traffic (`HEADROOM_IDLE_TIMEOUT_SECONDS` remains overridable through `env_vars`). This releases the proxy's Python, ONNX Runtime, tokenizer, and Kompress model allocations while the add-on is idle; a later request starts a clean backend transparently.
- Prevent Headroom from loading a second Kompress model inside every Claude Desktop/Claude Code MCP process. The add-on now intercepts `headroom mcp serve` with a lightweight adapter that retains upstream MCP retrieval/statistics behavior but delegates `headroom_compress` to the shared proxy's loopback `/v1/compress` endpoint. The MCP process explicitly disables local Kompress and never imports `headroom.compress`, so only the proxy backend can own the ML runtime.
- Remove the add-on-wide `tmpfs: true` mount and undo the shared Selkies script's `/tmp/cache` redirection for this add-on. Electron/Chromium, Mesa, and application caches now live under the selected persistent home (`$HOME/.cache`) as reclaimable filesystem cache instead of RAM-backed cgroup shmem. Runtime sockets and XDG runtime state remain under `/run`.
## 2026.08.02 (02-08-2026)
- Migrate deprecated Home Assistant map names to their app equivalents.
- Minor bugs fixed
## ubunturesolute-version-3a10bef7 (2026-08-01)
- Update to latest version from linuxserver/docker-baseimage-selkies (changelog : https://github.com/linuxserver/docker-baseimage-selkies/releases)

View File

@@ -61,7 +61,7 @@ magic link into the in-session Chromium (not a phone).
- Add-on Configuration → `additional_apps: chromium`, restart (installed by
`rootfs/etc/cont-init.d/80-configuration.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
`/app_configs/db21ed7f_claude-desktop/claude_desktop.sh` (the image ships no standalone
terminal).
---

View File

@@ -34,7 +34,7 @@ hassio_role: manager
homeassistant_api: true
auth_api: true
map:
- addon_config:rw
- app_config:rw
- share:rw
- media:rw
- ssl
@@ -121,5 +121,5 @@ schema:
slug: claude_desktop
udev: true
url: https://github.com/alexbelgium/hassio-addons
version: "1.38"
version: "2026.08.02"
video: true

View File

@@ -1,58 +0,0 @@
#!/usr/bin/with-contenv bashio
# shellcheck shell=bash
set -e
# 20-folders.sh is shared with the Webtop add-ons and historically redirects
# XDG_CACHE_HOME to /tmp/cache. This Claude-specific follow-up runs before the
# graphical longruns and moves general application caches back under the
# persistent home. Removing config.yaml's `tmpfs: true` then ensures Chromium,
# Electron, Mesa and other cache pages are reclaimable filesystem cache instead
# of permanently charged cgroup shmem.
LOCATION="$(getent passwd abc 2> /dev/null | cut -d: -f6 || true)"
if [ -z "$LOCATION" ] || [ "$LOCATION" = "/" ]; then
bashio::log.warning "Unable to resolve abc home; leaving XDG cache configuration unchanged"
exit 0
fi
CACHE_DIR="$LOCATION/.cache"
if [ -L "$CACHE_DIR" ]; then
rm -f "$CACHE_DIR"
fi
mkdir -p "$CACHE_DIR"
chown "$(id -u abc):$(id -g abc)" "$CACHE_DIR"
chmod 700 "$CACHE_DIR"
CACHE_DIR="$CACHE_DIR" LOCATION="$LOCATION" python3 - <<'PY'
import os
import re
from pathlib import Path
cache = os.environ["CACHE_DIR"]
quoted = cache.replace("\\", "\\\\").replace('"', '\\"')
replacement = f'export XDG_CACHE_HOME="{quoted}"'
for path in Path("/etc/s6-overlay/s6-rc.d").glob("*/run"):
try:
text = path.read_text()
except (OSError, UnicodeDecodeError):
continue
updated = re.sub(r"^export XDG_CACHE_HOME=.*$", replacement, text, flags=re.MULTILINE)
if updated != text:
path.write_text(updated)
bashrc = Path(os.environ["LOCATION"]) / ".bashrc"
if bashrc.exists():
text = bashrc.read_text()
updated = re.sub(r"^export XDG_CACHE_HOME=.*$", replacement, text, flags=re.MULTILINE)
if updated != text:
bashrc.write_text(updated)
PY
S6_ENVDIR="/run/s6/container_environment"
mkdir -p "$S6_ENVDIR"
printf '%s' "$CACHE_DIR" > "$S6_ENVDIR/XDG_CACHE_HOME"
# Safe here: no graphical longrun has started yet, and the former directory was
# only a boot-created target for the now-removed persistent-home symlink.
rm -rf /tmp/cache
bashio::log.info "Application cache moved from RAM-backed /tmp to $CACHE_DIR"

View File

@@ -1,59 +0,0 @@
#!/usr/bin/with-contenv bashio
# shellcheck shell=bash
set -e
# Keep every existing Headroom CLI command unchanged, but intercept the MCP
# server entrypoint so it uses the add-on's single-runtime adapter. The real
# binary is intentionally outside /usr/local/bin; writing the wrapper there
# makes it the command 82-claude_tools.sh registers in Claude Desktop/Code.
REAL_HEADROOM=""
for candidate in /usr/bin/headroom /lsiopy/bin/headroom; do
if [ -x "$candidate" ]; then
REAL_HEADROOM="$candidate"
break
fi
done
if [ -z "$REAL_HEADROOM" ]; then
bashio::log.warning "Headroom executable was not found; MCP adapter wrapper was not installed"
exit 0
fi
# The adapter intentionally uses a small, stable subset of the upstream MCP
# server. Since Headroom is installed unpinned at image build time, verify that
# subset before replacing the command. A future incompatible Headroom release
# therefore keeps its native MCP server instead of breaking Claude startup.
if ! /lsiopy/bin/python3 - <<'PY'
from headroom.ccr.mcp_server import HeadroomMCPServer
for name in ("run_stdio", "cleanup", "_compress_content"):
if not callable(getattr(HeadroomMCPServer, name, None)):
raise SystemExit(f"HeadroomMCPServer.{name} is unavailable")
PY
then
bashio::log.warning "Installed Headroom is incompatible with the single-runtime MCP adapter; preserving the native MCP server"
exit 0
fi
wrapper="$(mktemp /usr/local/bin/.headroom-wrapper.XXXXXX)"
cleanup() {
rm -f "$wrapper"
}
trap cleanup EXIT
cat > "$wrapper" <<EOF
#!/bin/sh
REAL_HEADROOM="$REAL_HEADROOM"
if [ "\${1:-}" = "mcp" ] && [ "\${2:-}" = "serve" ]; then
shift 2
unset HF_HOME
export HEADROOM_DISABLE_KOMPRESS=1
exec /lsiopy/bin/python3 /usr/local/bin/headroom-mcp-proxy.py "\$@"
fi
exec "\$REAL_HEADROOM" "\$@"
EOF
chmod 0755 "$wrapper"
mv -f "$wrapper" /usr/local/bin/headroom
trap - EXIT
bashio::log.info "Headroom MCP compression is delegated to the shared lazy proxy runtime"

View File

@@ -1,43 +1,32 @@
#!/usr/bin/with-contenv bashio
# Headroom optimization proxy — lazy backend for Claude Desktop MCP and Claude Code.
# Headroom optimization proxy — local backend for Claude Desktop MCP and Claude Code.
declare port=8787
declare backend_port=8789
declare host=127.0.0.1
# The dashboard is unauthenticated. Keep the gate container-local by default and
# bind all interfaces only when the user explicitly opts in and maps port 8787.
# The dashboard is unauthenticated. Keep it container-local by default and bind all
# interfaces only when the user explicitly opts in and maps port 8787.
if bashio::config.true 'expose_headroom_dashboard'; then
host=0.0.0.0
fi
if bashio::config.true 'install_headroom'; then
real_headroom=""
for candidate in /usr/bin/headroom /lsiopy/bin/headroom; do
if [ -x "$candidate" ]; then
real_headroom="$candidate"
break
fi
done
if [ -n "$real_headroom" ]; then
# Keep model artifacts persistent, but do not import Headroom or load the
# model in this longrun. The standard-library gate starts the real proxy
# on the first request and terminates it after the idle timeout, releasing
# Python/ONNX/model allocations. HEADROOM_IDLE_TIMEOUT_SECONDS is
# overridable through env_vars; 900 seconds is the default.
export HF_HOME="${HOME}/.headroom/hf"
mkdir -p "$HF_HOME" "${HOME}/.headroom"
chown abc:abc "${HOME}/.headroom" "$HF_HOME" 2> /dev/null || true
bashio::log.info "svc-headroom: starting lazy gate on ${host}:${port} (backend ${backend_port}, idle timeout ${HEADROOM_IDLE_TIMEOUT_SECONDS:-900}s)"
exec s6-setuidgid abc env \
HEADROOM_REAL_BIN="$real_headroom" \
HEADROOM_GATE_HOST="$host" \
HEADROOM_GATE_PORT="$port" \
HEADROOM_BACKEND_HOST=127.0.0.1 \
HEADROOM_BACKEND_PORT="$backend_port" \
HEADROOM_IDLE_TIMEOUT_SECONDS="${HEADROOM_IDLE_TIMEOUT_SECONDS:-900}" \
HF_HOME="$HF_HOME" \
/lsiopy/bin/python3 /usr/local/bin/headroom-proxy-gate.py
fi
if bashio::config.true 'install_headroom' && command -v headroom > /dev/null 2>&1; then
# Kompress (the ONNX compression engine) needs its model in the local HF cache: the
# proxy's startup preload is deliberately cache-only, and the default HF cache lands
# under ~/.cache, which the add-on points at tmpfs (/tmp/cache) — wiped on every
# restart. Without a warm persistent cache the proxy ran forever in "deferred" mode
# and recorded zero compression savings. Point the cache at persistent storage;
# nothing else is needed here — the proxy's own request path already downloads a
# missing model in the background on first use (ensure_background_load) and passes
# requests through uncompressed until it lands, so this self-heals within a couple of
# requests on the first boot and loads instantly (eager preload) on every boot after.
# A synchronous pre-warm was tried here and removed: it blocked the port bind for up
# to the download's duration, which left the settings-managed ANTHROPIC_BASE_URL
# (see 82-claude_tools.sh) pointing at a proxy that wasn't listening yet.
export HF_HOME="${HOME}/.headroom/hf"
mkdir -p "$HF_HOME"
chown abc:abc "$HF_HOME" 2> /dev/null || true
bashio::log.info "svc-headroom: starting local Headroom proxy on ${host}:${port}"
exec s6-setuidgid abc headroom proxy --host "${host}" --port "${port}" --code-aware
fi
bashio::log.info "svc-headroom: install_headroom disabled or headroom not found; idling"

View File

@@ -1,142 +0,0 @@
#!/lsiopy/bin/python3
"""Run Headroom MCP with compression delegated to the single proxy backend.
Upstream Headroom MCP normally performs ``headroom_compress`` in its own
process. That imports the compression pipeline and can load a second copy of the
Kompress ONNX model in addition to the HTTP proxy. This adapter preserves the
upstream MCP protocol and retrieve/stats implementations, but replaces only its
local compression method with a call to the proxy's loopback-only
``/v1/compress`` endpoint.
The proxy gate starts the heavy backend on this first request and later unloads
it after the configured idle timeout. The MCP process therefore remains a
lightweight protocol bridge and never imports ``headroom.compress``.
"""
from __future__ import annotations
import argparse
import asyncio
import json
import os
import sys
from types import MethodType
from typing import Any
def parse_args() -> argparse.Namespace:
parser = argparse.ArgumentParser(description="Headroom MCP single-runtime adapter")
parser.add_argument(
"--proxy-url",
default=os.environ.get("HEADROOM_PROXY_URL", "http://127.0.0.1:8787"),
)
parser.add_argument("--transport", default="stdio")
parser.add_argument("--host", default="127.0.0.1")
parser.add_argument("--port", type=int, default=8788)
parser.add_argument("--path", default="/mcp")
parser.add_argument("--debug", action="store_true")
parser.add_argument("--direct", action="store_true")
args, unknown = parser.parse_known_args()
if unknown:
print(f"headroom-mcp-proxy: ignoring unsupported arguments: {unknown}", file=sys.stderr)
if args.transport.lower() != "stdio":
parser.error("only stdio transport is supported by the add-on adapter")
return args
def _number(data: dict[str, Any], key: str) -> int:
value = data.get(key, 0)
try:
return int(value)
except (TypeError, ValueError):
return 0
def make_proxy_compressor(proxy_url: str):
endpoint = f"{proxy_url.rstrip('/')}/v1/compress"
model = os.environ.get("HEADROOM_MCP_MODEL", "claude-sonnet-4-5-20250929")
def compress_via_proxy(_self, content: str) -> dict[str, Any]:
# Imported here, not at module import, so MCP startup stays small. httpx is
# already a dependency of Headroom's MCP server for retrieve/stats.
import httpx
response = httpx.post(
endpoint,
json={
"messages": [{"role": "tool", "content": content}],
"model": model,
},
timeout=httpx.Timeout(180.0, connect=75.0),
)
response.raise_for_status()
data = response.json()
if not isinstance(data, dict):
raise RuntimeError("Headroom proxy returned a non-object compression response")
messages = data.get("messages")
compressed: Any = content
if isinstance(messages, list) and messages:
last = messages[-1]
if isinstance(last, dict) and "content" in last:
compressed = last["content"]
if not isinstance(compressed, str):
compressed = json.dumps(compressed, ensure_ascii=False)
hashes = data.get("ccr_hashes")
hash_key = next((item for item in hashes if isinstance(item, str)), None) if isinstance(hashes, list) else None
before = _number(data, "tokens_before")
after = _number(data, "tokens_after")
saved = _number(data, "tokens_saved")
if saved <= 0:
saved = max(0, before - after)
savings_percent = round(saved / before * 100, 1) if before > 0 else 0.0
transforms = data.get("transforms_applied")
if not isinstance(transforms, list):
transforms = []
note = "Compression was executed by the shared Headroom proxy runtime."
if hash_key:
note += (
f" Original stored with hash={hash_key}. "
"Use mcp__headroom__headroom_retrieve to recover it."
)
return {
"compressed": compressed,
"hash": hash_key,
"original_tokens": before,
"compressed_tokens": after,
"tokens_saved": saved,
"savings_percent": savings_percent,
"transforms": transforms,
"note": note,
}
return compress_via_proxy
async def run() -> None:
args = parse_args()
# Defense in depth. The adapter never calls the local compressor, but keep
# the MCP process explicitly unable to initialize Kompress if upstream code
# changes or an unrelated import probes the compression pipeline.
os.environ.pop("HF_HOME", None)
os.environ["HEADROOM_DISABLE_KOMPRESS"] = "1"
os.environ["HEADROOM_PROXY_URL"] = args.proxy_url
from headroom.ccr.mcp_server import HeadroomMCPServer
server = HeadroomMCPServer(proxy_url=args.proxy_url, check_proxy=True)
server._compress_content = MethodType(make_proxy_compressor(args.proxy_url), server)
try:
await server.run_stdio()
finally:
await server.cleanup()
if __name__ == "__main__":
try:
asyncio.run(run())
except KeyboardInterrupt:
pass

View File

@@ -1,388 +0,0 @@
#!/lsiopy/bin/python3
"""Lazy TCP gate for the Headroom HTTP proxy.
The gate remains resident on the public Headroom port while the heavy Headroom
proxy (and its optional ONNX Kompress model) is started only for real traffic.
After an idle period the backend process is terminated, releasing its Python,
ONNX and model allocations. The next connection starts a fresh backend.
Only the Python standard library is imported here deliberately: the idle path
must not import Headroom, ONNX Runtime, transformers or the MCP SDK.
"""
from __future__ import annotations
import asyncio
import contextlib
import json
import os
import signal
import socket
import sys
import time
from pathlib import Path
def _int_env(name: str, default: int, minimum: int = 1) -> int:
try:
value = int(os.environ.get(name, str(default)))
except (TypeError, ValueError):
value = default
return max(minimum, value)
GATE_HOST = os.environ.get("HEADROOM_GATE_HOST", "127.0.0.1")
GATE_PORT = _int_env("HEADROOM_GATE_PORT", 8787)
BACKEND_HOST = os.environ.get("HEADROOM_BACKEND_HOST", "127.0.0.1")
BACKEND_PORT = _int_env("HEADROOM_BACKEND_PORT", 8789)
HEADROOM_BIN = os.environ.get("HEADROOM_REAL_BIN", "/usr/bin/headroom")
IDLE_TIMEOUT = _int_env("HEADROOM_IDLE_TIMEOUT_SECONDS", 900)
START_TIMEOUT = _int_env("HEADROOM_START_TIMEOUT_SECONDS", 60)
STOP_TIMEOUT = _int_env("HEADROOM_STOP_TIMEOUT_SECONDS", 10)
HF_HOME = os.environ.get("HF_HOME", str(Path.home() / ".headroom/hf"))
MAX_HEADER_BYTES = 128 * 1024
COPY_CHUNK = 64 * 1024
def log(message: str) -> None:
stamp = time.strftime("%Y-%m-%d %H:%M:%S")
print(f"[{stamp}] headroom-gate: {message}", file=sys.stderr, flush=True)
class BackendUnavailable(RuntimeError):
pass
class ProxyGate:
def __init__(self) -> None:
self._lock = asyncio.Lock()
self._process: asyncio.subprocess.Process | None = None
self._last_activity = time.monotonic()
self._active_connections = 0
self._stopping = False
self._watch_task: asyncio.Task[None] | None = None
@property
def state(self) -> str:
process = self._process
if process is None:
return "dormant"
if process.returncode is None:
return "running"
return "stopped"
def touch(self) -> None:
self._last_activity = time.monotonic()
async def _backend_healthy(self) -> bool:
for path in ("/livez", "/health"):
try:
reader, writer = await asyncio.wait_for(
asyncio.open_connection(BACKEND_HOST, BACKEND_PORT), timeout=1.0
)
request = (
f"GET {path} HTTP/1.1\r\n"
f"Host: {BACKEND_HOST}:{BACKEND_PORT}\r\n"
"Connection: close\r\n\r\n"
).encode()
writer.write(request)
await writer.drain()
line = await asyncio.wait_for(reader.readline(), timeout=1.0)
writer.close()
with contextlib.suppress(Exception):
await writer.wait_closed()
if line.startswith(b"HTTP/") and b" 2" in line[:16]:
return True
except (OSError, asyncio.TimeoutError):
continue
return False
async def ensure_backend(self) -> None:
if await self._backend_healthy():
self.touch()
return
async with self._lock:
if await self._backend_healthy():
self.touch()
return
process = self._process
if process is not None and process.returncode is None:
await self._wait_until_healthy()
self.touch()
return
if not os.path.isfile(HEADROOM_BIN) or not os.access(HEADROOM_BIN, os.X_OK):
raise BackendUnavailable(f"Headroom executable is unavailable: {HEADROOM_BIN}")
Path(HF_HOME).mkdir(parents=True, exist_ok=True)
environment = os.environ.copy()
environment.update(
{
"HF_HOME": HF_HOME,
"HEADROOM_PROXY_GATE": "1",
}
)
command = [
HEADROOM_BIN,
"proxy",
"--host",
BACKEND_HOST,
"--port",
str(BACKEND_PORT),
"--code-aware",
]
log(f"starting backend on {BACKEND_HOST}:{BACKEND_PORT}")
try:
self._process = await asyncio.create_subprocess_exec(
*command,
env=environment,
start_new_session=True,
)
except Exception as exc:
self._process = None
raise BackendUnavailable(f"unable to start Headroom: {exc}") from exc
self._watch_task = asyncio.create_task(self._watch_backend(self._process))
try:
await self._wait_until_healthy()
except Exception:
await self._terminate_backend_locked("startup failure")
raise
self.touch()
async def _wait_until_healthy(self) -> None:
deadline = time.monotonic() + START_TIMEOUT
while time.monotonic() < deadline:
process = self._process
if process is not None and process.returncode is not None:
raise BackendUnavailable(
f"Headroom exited during startup with status {process.returncode}; "
"see the add-on log"
)
if await self._backend_healthy():
log("backend is ready")
return
await asyncio.sleep(0.25)
raise BackendUnavailable(
f"Headroom did not become ready within {START_TIMEOUT}s; see the add-on log"
)
async def _watch_backend(self, process: asyncio.subprocess.Process) -> None:
returncode = await process.wait()
async with self._lock:
was_current = self._process is process
if was_current:
self._process = None
if not self._stopping and was_current:
log(f"backend exited with status {returncode}")
async def stop_backend(self, reason: str) -> None:
async with self._lock:
await self._terminate_backend_locked(reason)
async def _terminate_backend_locked(self, reason: str) -> None:
process = self._process
if process is None:
return
if process.returncode is not None:
self._process = None
return
log(f"stopping backend ({reason})")
try:
os.killpg(process.pid, signal.SIGTERM)
except ProcessLookupError:
pass
try:
await asyncio.wait_for(process.wait(), timeout=STOP_TIMEOUT)
except asyncio.TimeoutError:
log("backend did not stop after SIGTERM; sending SIGKILL")
with contextlib.suppress(ProcessLookupError):
os.killpg(process.pid, signal.SIGKILL)
with contextlib.suppress(Exception):
await process.wait()
self._process = None
async def idle_monitor(self) -> None:
interval = max(5, min(30, IDLE_TIMEOUT // 4))
while not self._stopping:
await asyncio.sleep(interval)
process = self._process
idle_for = time.monotonic() - self._last_activity
if (
process is not None
and process.returncode is None
and idle_for >= IDLE_TIMEOUT
):
await self.stop_backend(f"idle for {int(idle_for)}s")
def status_payload(self) -> bytes:
process = self._process
payload = {
"status": self.state,
"backend_pid": process.pid if process is not None and process.returncode is None else None,
"active_connections": self._active_connections,
"idle_seconds": round(time.monotonic() - self._last_activity, 1),
"idle_timeout_seconds": IDLE_TIMEOUT,
"backend": f"{BACKEND_HOST}:{BACKEND_PORT}",
}
body = json.dumps(payload, separators=(",", ":")).encode()
return (
b"HTTP/1.1 200 OK\r\n"
b"Content-Type: application/json\r\n"
+ f"Content-Length: {len(body)}\r\n".encode()
+ b"Connection: close\r\n\r\n"
+ body
)
async def handle_client(
self,
client_reader: asyncio.StreamReader,
client_writer: asyncio.StreamWriter,
) -> None:
self._active_connections += 1
real_traffic = False
peer = client_writer.get_extra_info("peername")
try:
try:
initial = await asyncio.wait_for(
client_reader.readuntil(b"\r\n\r\n"), timeout=15.0
)
except (
asyncio.IncompleteReadError,
asyncio.LimitOverrunError,
asyncio.TimeoutError,
):
return
if len(initial) > MAX_HEADER_BYTES:
await self._send_error(client_writer, 431, "request headers too large")
return
first_line = initial.split(b"\r\n", 1)[0]
parts = first_line.split(b" ")
target = parts[1].split(b"?", 1)[0] if len(parts) >= 2 else b""
if target == b"/gate/status":
client_writer.write(self.status_payload())
await client_writer.drain()
return
real_traffic = True
self.touch()
try:
await self.ensure_backend()
backend_reader, backend_writer = await asyncio.wait_for(
asyncio.open_connection(BACKEND_HOST, BACKEND_PORT), timeout=5.0
)
except (BackendUnavailable, OSError, asyncio.TimeoutError) as exc:
log(f"backend unavailable for {peer}: {exc}")
await self._send_error(client_writer, 503, str(exc))
return
backend_writer.write(initial)
await backend_writer.drain()
self.touch()
upstream = asyncio.create_task(self._pipe(client_reader, backend_writer))
downstream = asyncio.create_task(self._pipe(backend_reader, client_writer))
done, pending = await asyncio.wait(
{upstream, downstream}, return_when=asyncio.FIRST_COMPLETED
)
for task in pending:
task.cancel()
for task in done | pending:
with contextlib.suppress(
asyncio.CancelledError,
ConnectionError,
OSError,
):
await task
backend_writer.close()
with contextlib.suppress(Exception):
await backend_writer.wait_closed()
finally:
self._active_connections = max(0, self._active_connections - 1)
if real_traffic:
self.touch()
client_writer.close()
with contextlib.suppress(Exception):
await client_writer.wait_closed()
async def _pipe(
self,
reader: asyncio.StreamReader,
writer: asyncio.StreamWriter,
) -> None:
while True:
data = await reader.read(COPY_CHUNK)
if not data:
with contextlib.suppress(Exception):
writer.write_eof()
return
writer.write(data)
await writer.drain()
self.touch()
@staticmethod
async def _send_error(
writer: asyncio.StreamWriter,
status: int,
detail: str,
) -> None:
reason = (
"Service Unavailable"
if status == 503
else "Request Header Fields Too Large"
)
body = json.dumps({"error": detail}).encode()
response = (
f"HTTP/1.1 {status} {reason}\r\n"
"Content-Type: application/json\r\n"
f"Content-Length: {len(body)}\r\n"
"Connection: close\r\n\r\n"
).encode() + body
writer.write(response)
with contextlib.suppress(Exception):
await writer.drain()
async def shutdown(self) -> None:
self._stopping = True
await self.stop_backend("gate shutdown")
async def async_main() -> None:
gate = ProxyGate()
loop = asyncio.get_running_loop()
stop_event = asyncio.Event()
for sig in (signal.SIGTERM, signal.SIGINT):
with contextlib.suppress(NotImplementedError):
loop.add_signal_handler(sig, stop_event.set)
server = await asyncio.start_server(
gate.handle_client,
GATE_HOST,
GATE_PORT,
limit=MAX_HEADER_BYTES + 1,
family=socket.AF_INET,
)
addresses = ", ".join(str(sock.getsockname()) for sock in server.sockets or [])
log(
f"listening on {addresses}; backend is lazy and stops after {IDLE_TIMEOUT}s idle; "
"status endpoint: /gate/status"
)
monitor = asyncio.create_task(gate.idle_monitor())
async with server:
await stop_event.wait()
monitor.cancel()
with contextlib.suppress(asyncio.CancelledError):
await monitor
await gate.shutdown()
if __name__ == "__main__":
try:
asyncio.run(async_main())
except KeyboardInterrupt:
pass

View File

@@ -1,5 +1,6 @@
## 2.10.2 (2026-08-01)
- Migrate deprecated Home Assistant map names to their app equivalents.
- Update to latest version from Cleanuparr/Cleanuparr (changelog : https://github.com/Cleanuparr/Cleanuparr/releases)
## 2.9.16 (2026-07-11)

View File

@@ -63,7 +63,7 @@ COPY bashio-standalone.sh /usr/local/lib/bashio-standalone.sh
RUN chmod 0755 /usr/local/lib/bashio-standalone.sh
# Bypass the original /entrypoint.sh (which mounts /config as VOLUME).
# Our wrapper symlinks /app/config → HA addon_config and starts ./Cleanuparr directly.
# Our wrapper symlinks /app/config → the /config app_config mount and starts ./Cleanuparr directly.
ENTRYPOINT ["/ha_entrypoint.sh"]
CMD ["./Cleanuparr"]

View File

@@ -71,7 +71,7 @@ ingress_stream: true
init: false
panel_icon: mdi:movie-search
map:
- addon_config:rw
- app_config:rw
name: Cleanuparr
options:
env_vars: []

View File

@@ -5,7 +5,7 @@ set -e
###############################################################################
# Home Assistant Addon entrypoint for Cleanuparr
# The .NET app uses /app/config as its data directory.
# We symlink /app/config → /addon_configs/cleanuparr (HA persistent storage)
# We symlink /app/config → /config (HA persistent app_config storage)
# and start ./Cleanuparr directly, bypassing the original /entrypoint.sh
# which would trigger the /config Docker VOLUME mount.
###############################################################################
@@ -26,7 +26,7 @@ if [ -d /etc/cont-init.d ]; then
fi
# ─── Setup persistent data directory ─────────────────────────────────────────
HA_DATA_DIR="/addon_configs/cleanuparr"
HA_DATA_DIR="/config"
echo "[Cleanuparr] Setting up data directory: $HA_DATA_DIR"
mkdir -p "$HA_DATA_DIR"

View File

@@ -1,5 +1,6 @@
## 19.19.1 (2026-06-17)
- Migrate deprecated Home Assistant map names to their app equivalents.
- Update to latest version from coderaiser/cloudcmd (changelog : https://github.com/coderaiser/cloudcmd/releases)
## 19.19.0 (2026-05-30)
@@ -225,7 +226,7 @@
## 16.17.7-3 (2023-11-19)
- Minor bugs fixed
- MAJOR CHANGE : new HA config logic implemented. Files are now located in the addon config file, that can be accessed from the addon_configs folder from my cloudcommander or cloudcommander addons. Migration of data, custom configs, and custom scripts should be automatic. Please be sure to update all your links however ! For more information, see here : https://developers.home-assistant.io/blog/2023/11/06/public-addon-config/
- MAJOR CHANGE : new HA config logic implemented. Files are now located in the addon config file, that can be accessed from the app_configs folder from my cloudcommander or cloudcommander addons. Migration of data, custom configs, and custom scripts should be automatic. Please be sure to update all your links however ! For more information, see here : https://developers.home-assistant.io/blog/2023/11/06/public-addon-config/
- Homeassistant config accessible in /homeassistant folder ; all addons config in /addons_config ; this addon config in /config
## 16.17.7-2 (2023-10-30)

View File

@@ -69,8 +69,8 @@ image: ghcr.io/alexbelgium/cloudcommander-{arch}
ingress: true
ingress_stream: true
map:
- addon_config:rw
- all_addon_configs:rw
- app_config:rw
- all_app_configs:rw
- homeassistant_config:rw
- ssl:rw
- share:rw

View File

@@ -35,7 +35,7 @@ fi
# Create symlinks with legacy folders
if [ -d /homeassistant/addons_config ]; then
ln -s /homeassistant/addons_config /config
find /addon_configs/ -maxdepth 1 -mindepth 1 -type d -not -name "*cloudcommander*" -exec ln -s {} /config/addons_config/ \;
find /app_configs/ -maxdepth 1 -mindepth 1 -type d -not -name "*cloudcommander*" -exec ln -s {} /config/addons_config/ \;
fi
if [ -d /homeassistant/addons_autoscripts ]; then
ln -s /homeassistant/addons_autoscripts /config

View File

@@ -1,5 +1,6 @@
## 2.2.5 (2026-08-02)
- Migrate deprecated Home Assistant map names to their app equivalents.
- Update to latest version from ajslater/codex (changelog : https://github.com/ajslater/codex/releases)
## 2.2.4 (2026-08-01)

View File

@@ -91,7 +91,7 @@ cifsdomain: "WORKGROUP"
### Custom Scripts and Environment Variables
This addon supports custom scripts and environment variables through the `addon_config` mapping:
This addon supports custom scripts and environment variables through the `app_config` mapping:
- **Custom scripts**: See [Running Custom Scripts in Addons](https://github.com/alexbelgium/hassio-addons/wiki/Running-custom-scripts-in-Addons)
- **env_vars option**: Use the add-on `env_vars` option to pass extra environment variables (uppercase or lowercase names). See https://github.com/alexbelgium/hassio-addons/wiki/Add-Environment-variables-to-your-Addon-2 for details.

View File

@@ -65,7 +65,7 @@ image: ghcr.io/alexbelgium/codex-{arch}
ingress: true
ingress_stream: true
map:
- addon_config:rw
- app_config:rw
- media:rw
- share:rw
name: Codex

View File

@@ -1,5 +1,6 @@
## 26.04.2.4.1 (2026-07-26)
- Migrate deprecated Home Assistant map names to their app equivalents.
- Rebuild on a Debian base: upstream turned collabora/code into a distroless image with no shell, which broke the addon build entirely. collabora/code stays the tracked upstream image in build.json, but is now a build stage whose payload is copied onto ghcr.io/hassio-addons/debian-base, and the addon ships its own launcher in place of the removed /start-collabora-online.sh
- build.json names the architecture explicitly again (`collabora/code:latest-amd64` and `collabora/code:latest-arm64`). The builder never passes `--platform`, so the tag is the only thing that decides which binaries land in the addon
- Restore the file capabilities on `coolforkit-caps` and `coolmount`. The official image carries them as extended attributes, which `COPY --from` does not transfer, and without them Collabora starts but cannot open any document

View File

@@ -138,7 +138,7 @@ The two hostnames have different roles, and swapping them is the most common cau
### Custom Scripts and Environment Variables
This addon supports custom scripts and environment variables through the `addon_config` mapping:
This addon supports custom scripts and environment variables through the `app_config` mapping:
- **Custom scripts**: See [Running Custom Scripts in Addons](https://github.com/alexbelgium/hassio-addons/wiki/Running-custom-scripts-in-Addons)
- **env_vars option**: Use the add-on `env_vars` option to pass extra environment variables (uppercase or lowercase names). See https://github.com/alexbelgium/hassio-addons/wiki/Add-Environment-variables-to-your-Addon-2 for details.

View File

@@ -8,7 +8,7 @@ environment:
image: ghcr.io/alexbelgium/collabora-{arch}
init: false
map:
- addon_config:rw
- app_config:rw
- ssl:ro
name: Collabora
options:

View File

@@ -2,6 +2,7 @@
## 1.3 (2024-03-11)
- Migrate deprecated Home Assistant map names to their app equivalents.
- Minor bugs fixed
## 1.1 (2024-03-09)

View File

@@ -59,7 +59,7 @@ hassio_api: true
homeassistant_api: true
image: ghcr.io/alexbelgium/comixed-{arch}
map:
- addon_config:rw
- app_config:rw
- media:rw
- share:rw
name: Comixed

View File

@@ -1,5 +1,6 @@
## 4.9.5.0 (2026-05-19)
- Migrate deprecated Home Assistant map names to their app equivalents.
- Update to latest version from linuxserver/docker-emby (changelog : https://github.com/linuxserver/docker-emby/releases)
## 4.9.3.0 (2026-01-10)
@@ -14,7 +15,7 @@
## 4.8.11.0-2 (2025-08-02)
- Minor bugs fixed
## 4.8.11.0 (2025-04-22)
- WARNING : migration of config to addon_config instead of homeassistant config folder. Allows automatic backups. The location of the database however is not changed.
- WARNING : migration of config to app_config instead of homeassistant config folder. Allows automatic backups. The location of the database however is not changed.
## 4.9.0.48 (2025-04-19)
- Update to latest version from linuxserver/docker-emby (changelog : https://github.com/linuxserver/docker-emby/releases)

View File

@@ -79,7 +79,7 @@ ingress_port: 0
ingress_stream: true
init: false
map:
- addon_config:rw
- app_config:rw
- share:rw
- media:rw
- ssl:rw

View File

@@ -1,5 +1,6 @@
## 4.10.0.22 (2026-08-01)
- Migrate deprecated Home Assistant map names to their app equivalents.
- Update to latest version from linuxserver/docker-emby (changelog : https://github.com/linuxserver/docker-emby/releases)
## 4.10.0.21 (2026-08-01)
@@ -154,7 +155,7 @@
## 4.9.0.50 (2025-04-26)
- Update to latest version from linuxserver/docker-emby (changelog : https://github.com/linuxserver/docker-emby/releases)
- WARNING : migration of config to addon_config instead of homeassistant config folder. Allows automatic backups. The location of the database however is not changed.
- WARNING : migration of config to app_config instead of homeassistant config folder. Allows automatic backups. The location of the database however is not changed.
## 4.9.0.48 (2025-04-19)

View File

@@ -79,7 +79,7 @@ ingress_port: 0
ingress_stream: true
init: false
map:
- addon_config:rw
- app_config:rw
- homeassistant_config:rw
- share:rw
- media:rw

View File

@@ -1,5 +1,6 @@
## 4.4.23 (2026-06-11)
- Migrate deprecated Home Assistant map names to their app equivalents.
- Update to latest version from ente-io/ente (changelog : https://github.com/ente-io/ente/releases)
## 1.7.24 (2026-06-05)
- Update to latest version from ente-io/ente (changelog : https://github.com/ente-io/ente/releases)

View File

@@ -79,7 +79,7 @@ TZ: "America/New_York"
### Custom Scripts and Environment Variables
This addon supports custom scripts and environment variables through the `addon_config` mapping:
This addon supports custom scripts and environment variables through the `app_config` mapping:
- **Custom scripts**: See [Running Custom Scripts in Addons](https://github.com/alexbelgium/hassio-addons/wiki/Running-custom-scripts-in-Addons)
- **env_vars option**: Use the add-on `env_vars` option to pass extra environment variables (uppercase or lowercase names). See https://github.com/alexbelgium/hassio-addons/wiki/Add-Environment-variables-to-your-Addon-2 for details.

View File

@@ -76,7 +76,7 @@ environment:
image: ghcr.io/alexbelgium/ente-{arch}
init: false
map:
- addon_config:rw
- app_config:rw
name: Ente
options:
env_vars: []

View File

@@ -1,5 +1,6 @@
## 2.63.23 (2026-08-01)
- Migrate deprecated Home Assistant map names to their app equivalents.
- Update to latest version from filebrowser/filebrowser (changelog : https://github.com/filebrowser/filebrowser/releases)
## 2.63.18.5 (26-07-2026)
- Fixed healthcheck log spam when ssl is enabled (#2881)
@@ -241,8 +242,8 @@
## 2.23.0_reverted5 (2023-11-21)
- MAJOR CHANGE : new HA config logic implemented. Files are now located in the addon config file, that can be accessed from the addon_configs folder from my filebrowser or cloudcommander addons. Migration of data, custom configs, and custom scripts should be automatic. Please be sure to update all your links however ! For more information, see here : https://developers.home-assistant.io/blog/2023/11/06/public-addon-config/
- Homeassistant config accessible in /homeassistant folder ; all addons config in /addons_config ; this addon config in /config
- MAJOR CHANGE : new HA config logic implemented. Files are now located in the add-on config folder, which was exposed through the legacy /addon_configs path in the Filebrowser and Cloud Commander add-ons. Migration of data, custom configs, and custom scripts should be automatic. Please be sure to update all your links however ! For more information, see here : https://developers.home-assistant.io/blog/2023/11/06/public-addon-config/
- Home Assistant config accessible in /homeassistant; all add-on config in the legacy /addon_configs path; this add-on config in /config
## 2.23.0_reverted (2023-09-29)

View File

@@ -108,7 +108,7 @@ This addon supports mounting both local drives and remote SMB shares:
### Custom Scripts and Environment Variables
This addon supports custom scripts and environment variables through the `addon_config` mapping:
This addon supports custom scripts and environment variables through the `app_config` mapping:
- **Custom scripts**: See [Running Custom Scripts in Addons](https://github.com/alexbelgium/hassio-addons/wiki/Running-custom-scripts-in-Addons)
- **env_vars option**: Use the add-on `env_vars` option to pass extra environment variables (uppercase or lowercase names). See https://github.com/alexbelgium/hassio-addons/wiki/Add-Environment-variables-to-your-Addon-2 for details.

View File

@@ -81,9 +81,9 @@ ingress_entry: files
ingress_port: 8071
ingress_stream: true
map:
- addon_config:rw
- app_config:rw
- media:rw
- all_addon_configs:rw
- all_app_configs:rw
- homeassistant_config:rw
- addons:rw
- backup:rw

View File

@@ -35,7 +35,7 @@ fi
# Create symlinks with legacy folders
if [ -d /homeassistant/addons_config ]; then
ln -s /homeassistant/addons_config /config
find /addon_configs/ -maxdepth 1 -mindepth 1 -type d -not -name "*filebrowser*" -exec ln -s {} /config/addons_config/ \;
find /app_configs/ -maxdepth 1 -mindepth 1 -type d -not -name "*filebrowser*" -exec ln -s {} /config/addons_config/ \;
fi
if [ -d /homeassistant/addons_autoscripts ]; then
ln -s /homeassistant/addons_autoscripts /config

View File

@@ -1,5 +1,6 @@
## 1.5.0 (2026-07-22)
- Migrate deprecated Home Assistant map names to their app equivalents.
- Update to latest version from gtsteffaniak/filebrowser (changelog : https://github.com/gtsteffaniak/filebrowser/releases)
## 1.4.0-2 (16-07-2026)
- Minor bugs fixed

View File

@@ -85,7 +85,7 @@ This addon supports mounting both local drives and remote SMB shares:
### Custom Scripts and Environment Variables
This addon supports custom scripts and environment variables through the `addon_config` mapping:
This addon supports custom scripts and environment variables through the `app_config` mapping:
- **Custom scripts**: See [Running Custom Scripts in Addons](https://github.com/alexbelgium/hassio-addons/wiki/Running-custom-scripts-in-Addons)
- **env_vars option**: Use the add-on `env_vars` option to pass extra environment variables (uppercase or lowercase names). See https://github.com/alexbelgium/hassio-addons/wiki/Add-Environment-variables-to-add-ons

View File

@@ -82,9 +82,9 @@ ingress: true
ingress_port: 8071
ingress_stream: true
map:
- addon_config:rw
- app_config:rw
- media:rw
- all_addon_configs:rw
- all_app_configs:rw
- homeassistant_config:rw
- addons:rw
- backup:rw

View File

@@ -1,5 +1,6 @@
## 2.3.4 (2026-07-04)
- Migrate deprecated Home Assistant map names to their app equivalents.
- Update to latest version from firefly-iii/data-importer (changelog : https://github.com/firefly-iii/data-importer/releases)
## 2.3.2-5 (28-05-2026)
- Fix cron jobs not running (wrong shebang, missing env vars, broken crontab)
@@ -193,7 +194,7 @@
## 1.4.5-2 (2024-03-28)
- ⚠ MAJOR CHANGE : switch to the new config logic from homeassistant. Your configuration files will have migrated from /config/hassio_addons/fireflyiii_date_importer in a folder only accessible from my Filebrowser addon called /addon_configs/db21ed7f_fireflyiii_date_importer. This avoids the addon to mess with your homeassistant configuration folder, and allows to backup the options. Migration of data, custom configs, and custom scripts should be automatic. Please be sure to update all your links however ! For more information, see here : https://developers.home-assistant.io/blog/2023/11/06/public-addon-config/
- ⚠ MAJOR CHANGE : switch to the new config logic from homeassistant. Your configuration files will have migrated from /config/hassio_addons/fireflyiii_date_importer in a folder only accessible from my Filebrowser addon called /app_configs/db21ed7f_fireflyiii_date_importer. This prevents the add-on from modifying your Home Assistant configuration folder, and allows to backup the options. Migration of data, custom configs, and custom scripts should be automatic. Please be sure to update all your links however ! For more information, see here : https://developers.home-assistant.io/blog/2023/11/06/public-addon-config/
## 1.4.5 (2024-03-23)

View File

@@ -78,11 +78,11 @@ silent: false
### File Locations
- **Configurations**: `/addon_configs/xxx-fireflyiii_data_importer/configurations/`
- **Configurations**: `/app_configs/xxx-fireflyiii_data_importer/configurations/`
- Store import configuration files here
- See: https://docs.firefly-iii.org/data-importer/help/config/
- **Import Files**: `/addon_configs/xxx-fireflyiii_data_importer/import_files/`
- **Import Files**: `/app_configs/xxx-fireflyiii_data_importer/import_files/`
- Place CSV files here for automatic importing
- See: https://docs.firefly-iii.org/data-importer/usage/command_line/
@@ -95,7 +95,7 @@ silent: false
### Custom Scripts and Environment Variables
This addon supports custom scripts and environment variables through the `addon_config` mapping:
This addon supports custom scripts and environment variables through the `app_config` mapping:
- **Custom scripts**: See [Running Custom Scripts in Addons](https://github.com/alexbelgium/hassio-addons/wiki/Running-custom-scripts-in-Addons)
- **env_vars option**: Use the add-on `env_vars` option to pass extra environment variables (uppercase or lowercase names). See https://github.com/alexbelgium/hassio-addons/wiki/Add-Environment-variables-to-your-Addon-2 for details.

View File

@@ -69,7 +69,7 @@ environment:
image: ghcr.io/alexbelgium/fireflyiii_data_importer-{arch}
init: false
map:
- addon_config:rw
- app_config:rw
- homeassistant_config:rw
- share:rw
- ssl

View File

@@ -1,5 +1,6 @@
## 2.0.1 (2026-07-17)
- Migrate deprecated Home Assistant map names to their app equivalents.
- Aligned the pull-request build context with the production builder by copying
the shared Home Assistant helper scripts before building the add-on.
- Fixed aarch64 and amd64 PR validation failing on unresolved Dockerfile

View File

@@ -66,7 +66,7 @@ scheduler. Set `SCHEDULER_HOURS` in `config.env` to control the interval.
The add-on keeps its configuration in `CONFIG_LOCATION`, which defaults to
`/config/config.env`. From Home Assistant this is stored in the add-on's
private `addon_configs` directory and can be edited with a compatible file
private `app_configs` directory and can be edited with a compatible file
browser add-on.
A template is created on first start. Common examples are:

View File

@@ -70,7 +70,7 @@ environment:
image: ghcr.io/alexbelgium/free_games_claimer-{arch}
init: false
map:
- addon_config:rw
- app_config:rw
- homeassistant_config:rw
name: Free Games Claimer
options:

View File

@@ -5,7 +5,7 @@ slug="free_games_claimer"
if [ -f "/homeassistant/addons_config/$slug/config.yaml" ] && [ ! -f "/homeassistant/addons_config/$slug/migrated" ]; then
bashio::log.warning "Migrating config.yaml"
mv "/homeassistant/addons_config/$slug"/* /config/ || true
echo "Migrated to internal config folder accessible at /addon_configs/xxx-$slug" > "/homeassistant/addons_config/$slug/migrated"
echo "Migrated to internal config folder accessible at /app_configs/xxx-$slug" > "/homeassistant/addons_config/$slug/migrated"
fi
if [ -f "/homeassistant/addons_autoscripts/$slug.sh" ]; then

View File

@@ -1,5 +1,6 @@
## 1.27.1 (2026-08-01)
- Migrate deprecated Home Assistant map names to their app equivalents.
- Update to latest version from go-gitea/gitea (changelog : https://github.com/go-gitea/gitea/releases)
## 1.27.0 (2026-07-22)
@@ -13,7 +14,7 @@
- Minor bugs fixed
## 1.26.2-2 (2026-06-19)
- Expose app.ini in the addon_config folder so users can edit it directly via the HA file editor
- Expose app.ini in the app_config folder so users can edit it directly via the HA file editor
## 1.26.2-1 (2026-06-19)
- Fix SSH authentication failing with `chroot("/var/empty"): Operation not permitted [preauth]` by allowing `capability sys_chroot` in the AppArmor profile, which sshd needs for privilege-separation (#2653)

View File

@@ -63,16 +63,16 @@ ROOT_URL: "http://homeassistant.local:3000"
### Direct app.ini Access
The Gitea `app.ini` configuration file is exposed in the add-on's config folder (`/addon_configs/gitea/app.ini` on the host), making it directly editable via the HA file editor or Studio Code add-on.
The Gitea `app.ini` configuration file is exposed in the add-on's config folder (`/app_configs/gitea/app.ini` on the host), making it directly editable via the HA file editor or Studio Code add-on.
- **On first run**: complete the Gitea setup wizard, then restart the add-on. The generated `app.ini` will be copied to the addon_config folder automatically.
- **On subsequent runs**: edit `/addon_configs/gitea/app.ini` directly for any Gitea setting not covered by the options above. The add-on options (SSL, DOMAIN, ROOT_URL, APP_NAME) are still applied on top of your file each restart.
- **On first run**: complete the Gitea setup wizard, then restart the add-on. The generated `app.ini` will be copied to the app_config folder automatically.
- **On subsequent runs**: edit `/app_configs/gitea/app.ini` directly for any Gitea setting not covered by the options above. The add-on options (SSL, DOMAIN, ROOT_URL, APP_NAME) are still applied on top of your file each restart.
See the [Gitea configuration cheat sheet](https://docs.gitea.com/administration/config-cheat-sheet) for all available options.
### Custom Scripts and Environment Variables
This addon supports custom scripts and environment variables through the `addon_config` mapping:
This addon supports custom scripts and environment variables through the `app_config` mapping:
- **Custom scripts**: See [Running Custom Scripts in Addons](https://github.com/alexbelgium/hassio-addons/wiki/Running-custom-scripts-in-Addons)
- **env_vars option**: Use the add-on `env_vars` option to pass extra environment variables (uppercase or lowercase names). See https://github.com/alexbelgium/hassio-addons/wiki/Add-Environment-variables-to-your-Addon-2 for details.

View File

@@ -67,7 +67,7 @@ devices:
image: ghcr.io/alexbelgium/gitea-{arch}
init: false
map:
- addon_config:rw
- app_config:rw
- share:rw
- ssl:rw
name: Gitea

View File

@@ -14,17 +14,17 @@ mkdir -p /data/gitea/conf
# case where Gitea's atomic SaveTo replaces the symlink with the completed config.
# Always overwrite /config/app.ini so the installed settings are never discarded.
if [ -f "/data/gitea/conf/app.ini" ] && [ ! -L "/data/gitea/conf/app.ini" ]; then
bashio::log.info "Moving app.ini to addon_config folder for direct access"
bashio::log.info "Moving app.ini to app_config folder for direct access"
cp /data/gitea/conf/app.ini /config/app.ini
rm /data/gitea/conf/app.ini
fi
# Symlink /data/gitea/conf/app.ini -> /config/app.ini so the file is visible in the
# addon_config folder (accessible via the HA file editor). When Gitea's first-run
# app_config folder (accessible via the HA file editor). When Gitea's first-run
# wizard writes the config it lands in /config/app.ini via this symlink.
if [ ! -L "/data/gitea/conf/app.ini" ]; then
ln -s /config/app.ini /data/gitea/conf/app.ini
bashio::log.info "app.ini is now accessible in your addon_config folder"
bashio::log.info "app.ini is now accessible in your app_config folder"
fi
for file in /config/app.ini /etc/templates/app.ini; do

View File

@@ -1,5 +1,6 @@
## 26.7.1 (2026-08-01)
- Migrate deprecated Home Assistant map names to their app equivalents.
- Update to latest version from gramps-project/gramps-web (changelog : https://github.com/gramps-project/gramps-web/releases)
## 26.7.0 (2026-07-22)

View File

@@ -94,7 +94,7 @@ GRAMPSWEB_DEFAULT_FROM_EMAIL: "gramps@example.com"
### Custom Scripts and Environment Variables
This addon supports custom scripts and environment variables through the `addon_config` mapping:
This addon supports custom scripts and environment variables through the `app_config` mapping:
- **Custom scripts**: See [Running Custom Scripts in Addons](https://github.com/alexbelgium/hassio-addons/wiki/Running-custom-scripts-in-Addons)
- **env_vars option**: Use the add-on `env_vars` option to pass extra environment variables (uppercase or lowercase names). See https://github.com/alexbelgium/hassio-addons/wiki/Add-Environment-variables-to-your-Addon-2 for details.

View File

@@ -83,7 +83,7 @@ options:
keyfile: privkey.pem
ssl: false
map:
- type: addon_config
- type: app_config
read_only: false
- type: ssl
read_only: true

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