Install
You need an always-on computer that runs Docker, and a network TV tuner. The image runs on x86-64 and ARM64. It includes ffmpeg, so nothing else has to be installed for the picture.
The tag latest is the newest release. It moves when a version is published. A full version tag from the releases page stays on that build.
Docker on Linux
--network host lets the server hear your tuner, and lets phones and TVs find Broadwave.
docker run -d --name broadwave --network host --restart unless-stopped \
-e TZ=America/Chicago \
-v ~/broadwave:/config \
-v ~/broadwave/recordings:/config/work/recordings \
ghcr.io/wolfebase/broadwave:latest
Then open http://<your-server>:8477.
TZis your time zone. Without it, a container runs on UTC, and Diagnostics says "The time zone is not set. Set TZ so the guide uses your local time." The guide on a phone or in a browser uses that device's clock. Pass times and the server's own clock messages useTZ.- The two folders keep the database and the recordings. An update replaces the container and leaves the folders.
- Add
--device /dev/driwhen that path exists (Intel or AMD graphics). Docker refuses to start if the path is missing. The picture still plays from the processor without it. - When the tuner does not appear, set
HDHR_HOSTto its address. Add:portonly when the port is not 80.
docker ps shows healthy once the server answers. The image runs that check every 30 seconds.
Docker Desktop on Mac or Windows
The container's host network is a virtual machine, so discovery cannot see the tuner. Publish the port and set HDHR_HOST.
docker run -d --name broadwave --restart unless-stopped \
-e TZ=America/Chicago \
-e HDHR_HOST=<tuner address> \
-p 8477:8477 \
-v ~/broadwave:/config \
-v ~/broadwave/recordings:/config/work/recordings \
ghcr.io/wolfebase/broadwave:latest
Then open http://localhost:8477.
Docker Compose
curl -fsSLO https://raw.githubusercontent.com/wolfebase/broadwave/main/deploy/docker/compose.yaml
docker compose pull && docker compose up -d
Set TZ in compose.yaml first. That file uses host networking, which is right on Linux. On Docker Desktop, use the published-port command above. Remove the devices lines when /dev/dri is missing. The file sets PUID to 99 and PGID to 100, which is right on Unraid. On another Linux host, set them to a user that exists there, or remove them to run as root.
Unraid
Add the template deploy/unraid/broadwave.xml. It uses host networking and port 8477.
- Leave PUID at 99 and PGID at 100 so recordings are not owned by root. A plain
docker runon Unraid needs-e PUID=99 -e PGID=100as well. - Set Config and Recordings to folders on your server. Recordings are mounted at
/config/work/recordings. - Remove
/dev/drifrom Extra Parameters when the server has no Intel or AMD graphics. Docker will not start while that path is missing. - Tuner address, public names, the encoder, and extra audio are under Show more settings. Leave the tuner address blank unless the tuner is on another subnet.
The optional updater is deploy/unraid/broadwave-updater.xml. It checks at 03:30 and updates only the Broadwave container. It skips a night while a tuner is in use, a recording is running, or a recording starts within two hours. To update by hand, pull the new image and recreate the container with the same folders.
Other settings
| Setting | What it does |
|---|---|
PUID, PGID | The user and group that own the config folder and recordings. The Compose file sets 99 and 100. Leave them out of a plain docker run to run as root. |
UMASK | Permissions for new files. The Compose file and the Unraid template set 022. |
BROADWAVE_RECORDINGS | The recordings folder, when it is not /config/work/recordings. |
BROADWAVE_ENCODER | gpu or software, to skip the automatic choice. |
BROADWAVE_HOSTS | Public names the server answers to. See Security. |
BROADWAVE_ALTERNATES | 0 carries only the chosen sound track. By default a full-size encode also carries the channel's other languages. |
NVIDIA graphics need the NVIDIA Container Toolkit and --gpus all. That path has not been tested on real hardware yet.
An optional updater can move the image forward at night. The commands are in the README, under automatic updates. Without an updater, the web app says when a new release is out.
To build from source you need Go 1.26 or newer, Node 22 or newer, and ffmpeg. From a checkout, make run builds the web app and serves it on port 8477.