AirConnect Admin is a lightweight web interface and sidecar container for managing an existing 1activegeek/airconnect deployment.
It is designed for homelab and self-hosted environments where AirConnect is already running and you want a safer, easier way to:
- inspect the runtime state of the AirConnect container
- review recent AirConnect logs
- manage separate
aircast.xmlandairupnp.xmlfiles from a browser - update
AIRCAST_VARandAIRUPNP_VARwithout manually editing container definitions - restart, start, or stop the target container from the UI
- generate starter XML files for AirCast and AirUPnP
- view discovered devices inferred from runtime logs and config data
- export a ready-to-use Docker Compose snippet based on the active runtime settings
AirConnect Admin does not replace the AirConnect container. It works alongside it as a management layer.
AirConnect is extremely useful, but routine management can be inconvenient when you need to:
- remember the correct startup variables for AirCast and AirUPnP
- edit XML files inside a mounted config directory
- validate that the
-xconfiguration paths actually exist - detect when AirConnect has fallen back to defaults because a config file was missing
- review device discovery without manually parsing container logs
AirConnect Admin addresses those pain points by providing a focused browser-based control plane for a single target AirConnect container.
- Shows whether the target AirConnect container is running
- Displays the current image, container name, and start time
- Allows you to restart, start, or stop the AirConnect container from the UI
- Recreates the AirConnect container when service environment variables are updated, so changes take effect immediately
- Edits
AIRCAST_VARandAIRUPNP_VARindependently - Supports enabling or disabling either service
- Applies recommended defaults when fields are empty
- Detects common mistakes such as:
- AirCast pointing to
airupnp.xml - AirUPnP pointing to
aircast.xml - missing config files referenced with
-x - AirUPnP missing the
-llatency option in Sonos/HEOS-oriented setups - AirCast using the
-llatency option unnecessarily
- AirCast pointing to
- Reads and writes:
/config/aircast.xml/config/airupnp.xml/config/config.xml(legacy visibility / migration support)
- Validates XML root elements before saving
- Generates starter AirCast and AirUPnP XML templates from the UI
- Can optionally restart the AirConnect container after saving a config file
- Shows devices inferred from AirConnect runtime logs
- Merges what was seen in logs with devices defined in config files
- Helps identify renderer names, IPs, ports, MAC addresses, and origin source
- Intended as an operational visibility feature for your AirConnect environment
- Displays recent container logs directly in the web UI
- Warns when logs indicate AirConnect started with defaults because a config file was not found
- Generates a Docker Compose example based on the currently active runtime values
Typical layout:
- AirConnect container runs the actual AirCast / AirUPnP bridge services
- AirConnect Admin runs as a separate container
- both containers share the same
/configdirectory - AirConnect Admin talks to Docker through
/var/run/docker.sock - AirConnect Admin targets one container, defined by
TARGET_CONTAINER
This design keeps AirConnect itself simple while allowing the admin UI to manage runtime settings and config files externally.
The preferred split configuration is:
AIRCAST_VAR=-x /config/aircast.xmlAIRUPNP_VAR=-x /config/airupnp.xml -l 1000:2000
This is cleaner than keeping everything in a legacy shared config.xml, and makes troubleshooting much easier.
Before deploying, make sure you have:
- Docker installed
- Docker Compose available (
docker compose) - an existing AirConnect image you want to manage
- a writable config directory that both containers can access
- permission to mount the Docker socket into AirConnect Admin
AirConnect Admin expects:
CONFIG_DIR=/config/configmounted to the same host directory used by the AirConnect container/var/run/docker.sock:/var/run/docker.sock
TARGET_CONTAINERmust match the name of the AirConnect container you want to control
The following example uses the exact service layout requested:
services:
airconnect:
image: 1activegeek/airconnect
container_name: airconnect
network_mode: host
volumes:
- /root/airconnect:/config
environment:
- AIRCAST_VAR=-x /config/aircast.xml
- AIRUPNP_VAR=-x /config/airupnp.xml -l 1000:2000
restart: unless-stopped
airconnect-admin:
image: kosztyk/airconnect:latest
container_name: airconnect-admin
ports:
- "8089:8080"
volumes:
- /root/airconnect:/config
- /var/run/docker.sock:/var/run/docker.sock
environment:
- TARGET_CONTAINER=airconnect
- CONFIG_DIR=/config
- PORT=8080
- ADMIN_HOST_PORT=8089
restart: unless-stopped-
image: 1activegeek/airconnect
Runs the actual AirConnect bridge. -
container_name: airconnect
Important because AirConnect Admin will target this exact name viaTARGET_CONTAINER=airconnect. -
network_mode: host
Recommended for AirConnect because discovery protocols and renderer communication are usually more reliable on host networking. -
volumes: - /root/airconnect:/config
Persists the AirConnect XML files and shares them with AirConnect Admin. -
AIRCAST_VAR=-x /config/aircast.xml
Tells AirCast to use the dedicated AirCast config file. -
AIRUPNP_VAR=-x /config/airupnp.xml -l 1000:2000
Tells AirUPnP to use the dedicated AirUPnP config file and applies the latency range commonly used in these deployments.
-
image: kosztyk/airconnect:latest
Runs the AirConnect Admin web interface. -
ports: - "8089:8080"
Exposes the admin UI on port8089on the Docker host. -
- /root/airconnect:/config
Gives the admin UI access to the same config files used by the AirConnect container. -
- /var/run/docker.sock:/var/run/docker.sock
Allows AirConnect Admin to inspect, restart, stop, start, and recreate the AirConnect container. -
TARGET_CONTAINER=airconnect
Must match the AirConnect container name exactly. -
CONFIG_DIR=/config
Tells AirConnect Admin where the mounted XML files live inside its own container. -
PORT=8080
Internal port used by the admin web server. -
ADMIN_HOST_PORT=8089
Used by the deployment page when generating a matching Compose snippet.
Example:
mkdir -p /root/airconnectSave the example above as docker-compose.yml.
docker compose up -dIn your browser, open:
http://<docker-host-ip>:8089
Example:
http://192.168.68.110:8089
After opening the UI, a recommended setup sequence is:
- Open Config
- Generate starter XML files for both AirCast and AirUPnP
- Review and adjust the generated content
- Open Services
- Confirm the service arguments are:
-x /config/aircast.xml-x /config/airupnp.xml -l 1000:2000
- Save the service settings
- Restart the AirConnect container if needed
- Open Logs and Discovery to confirm devices are being seen
The dashboard provides a quick operational summary:
- current container state
- whether AirCast is enabled
- whether AirUPnP is enabled
- discovered device count
- runtime metadata
- config file presence indicators
- warning messages derived from runtime validation and recent logs
Use this page to manage runtime environment variables:
- enable or disable AirCast
- enable or disable AirUPnP
- edit raw argument strings
- apply recommended defaults
- save settings and recreate the target container
Important behavior:
- when service settings are saved, the target AirConnect container is recreated so updated environment variables are actually applied
- if validation fails, the change is blocked and an error is shown
Use this page to review devices inferred from the AirConnect environment.
Typical data shown includes:
- device name
- type
- IP address
- port
- MAC address
- source information
Discovery is intended to help you answer questions like:
- Is AirConnect seeing my Chromecast devices?
- Which renderer names are being detected?
- Did my XML config define devices that differ from live runtime discovery?
Use this page to manage XML files directly.
Supported files:
aircast.xmlairupnp.xmlconfig.xml(legacy)
Capabilities:
- load the current file contents
- edit XML directly in the browser
- save changes
- optionally restart AirConnect after save
- generate starter templates when beginning from scratch
Validation rules:
aircast.xmlmust use an<aircast>root elementairupnp.xmlmust use an<airupnp>root element- legacy
config.xmlis shown for visibility and migration purposes
Shows recent container logs from the target AirConnect container.
This is useful for:
- checking whether AirConnect started correctly
- identifying config file errors
- seeing renderer discovery lines
- reviewing startup warnings
Displays a generated Compose snippet based on current runtime values. This makes it easy to convert a known-good live setup back into a persistent Compose configuration.
AirConnect Admin can generate a starter file for each service.
The generated AirCast template includes:
<common>defaults- logging settings
max_playersbindingports
The generated AirUPnP template includes:
<common>defaults- logging settings
latencyhttp_lengthupnp_maxmax_playersbindingports
These templates are meant as sensible starting points, not universal final configurations.
| Variable | Required | Default | Description |
|---|---|---|---|
TARGET_CONTAINER |
Yes | airconnect |
Name of the AirConnect container to manage |
CONFIG_DIR |
Yes | /config |
Shared config mount path inside the admin container |
PORT |
No | 8080 |
Internal port used by the web server |
ADMIN_HOST_PORT |
No | 8089 |
Host-side admin port used in generated compose output |
| Variable | Required | Recommended value | Description |
|---|---|---|---|
AIRCAST_VAR |
Yes | -x /config/aircast.xml |
AirCast startup arguments |
AIRUPNP_VAR |
Yes | -x /config/airupnp.xml -l 1000:2000 |
AirUPnP startup arguments |
AirConnect Admin includes guardrails to reduce common mistakes.
If a service argument includes -x /config/..., the app verifies that the referenced file exists in the shared config mount.
The app checks that:
- AirCast does not reference
airupnp.xml - AirUPnP does not reference
aircast.xml
The app warns when:
- AirCast includes
-l - AirUPnP does not include
-l
If an enabled service references a missing config file, the app blocks container start or restart actions instead of allowing a broken deployment to continue silently.
When you save environment changes on the Services page, the AirConnect target container is recreated. This is required because Docker environment variables are fixed at container creation time.
Both containers must point to the same host directory for /config. If they do not, the admin UI may show or save files that the AirConnect container never actually uses.
AirConnect Admin requires access to /var/run/docker.sock. Without it, the app cannot inspect or control the target AirConnect container.
This is powerful access. Only expose the admin UI on networks you trust.
This project is intended for trusted internal environments.
Because it has access to the Docker socket, AirConnect Admin effectively has elevated control over the Docker host. You should:
- avoid exposing the UI directly to the public internet
- place it behind a trusted reverse proxy if remote access is needed
- restrict access with network-level controls or authentication upstream
- treat the admin container as privileged from an operational security perspective
Check the following:
- the AirConnect container is running
- logs show renderer discovery lines such as
AddCastDevice - the AirConnect container is on
network_mode: host - your speakers / renderers are reachable on the same network
- the shared
/configpath is correct
Also review the Logs page for startup warnings or config errors.
If logs mention no config file, using defaults, then:
- the file referenced with
-xdoes not exist - the file path is wrong
- the shared mount path is incorrect
- the file is unreadable to the container
Most likely causes:
- you edited the XML but did not restart AirConnect
- the AirConnect container is not using the same
/configmount as the admin container - the service argument still points to an unexpected config file
Check:
TARGET_CONTAINERmatches the real container name/var/run/docker.sockis mounted- the Docker daemon is running
Discovery is derived from runtime logs and configuration context. If logs rotate, if the target container was recently restarted, or if network discovery is unstable, the visible device list may fluctuate. Use the Logs page together with the Discovery page to correlate what AirConnect is currently seeing.
AirConnect Admin exposes a simple health endpoint:
/healthz
Example:
curl http://127.0.0.1:8080/healthzIf you want to build the admin image yourself:
docker build -t airconnect-admin:latest .Then update your Compose file accordingly.
Example:
/root/airconnect/
├── aircast.xml
├── airupnp.xml
└── config.xml
You do not need all three files, but this layout keeps migration simple.
- use separate
aircast.xmlandairupnp.xml - keep AirConnect on host networking
- keep the admin UI on a private network
- use the generated starter XMLs as a baseline, then refine them gradually
- verify changes in Logs and Discovery after every major config update
- keep a backup of your
/root/airconnectdirectory
- the app manages one target AirConnect container at a time
- the app depends on Docker socket access
- discovery is operationally useful, but it is not a replacement for native protocol debugging tools
- AirConnect Admin assumes a shared
/configdirectory model
AirConnect Admin gives you a practical browser-based control plane for an existing AirConnect deployment. It is especially useful if you want to standardize around:
- dedicated
aircast.xmlandairupnp.xmlfiles - safer runtime argument management
- fast troubleshooting through logs and discovery
- one-click operational control of the AirConnect container
For most homelab deployments, the recommended starting point is exactly this pair:
- AirConnect on host networking
- AirConnect Admin on a normal bridge network with access to
/configand the Docker socket