Guides
Install
Install Roastwarden from scratch: one container on a Raspberry Pi or any Linux host, the built-in MQTT broker, and the first sign-in.
Not released yet. Roastwarden's image and source are published with the public beta; until then this guide describes the install as it will be.
Roastwarden runs on a small Linux computer on the same network as your roaster: a Raspberry Pi 4 or 5, an old laptop, a home server. The roaster talks to it, and any browser on the network, phones included, opens the dashboard. This guide installs it as one container: the server with its own MQTT broker, so nothing else is needed beside Docker.
Already run an MQTT broker (Home Assistant's, Mosquitto)? Use docker-compose.yml instead and
point the server at your broker (the variables table in the README), or let the compose file start
Mosquitto beside it. Everything else below is the same.
What you need
- A Raspberry Pi 4 or 5 with Raspberry Pi OS 64-bit (or any Linux machine, amd64 or arm64), on the roaster's network, with a fixed address (a DHCP reservation in your router).
- Docker with the compose plugin:
curl -fsSL https://get.docker.com | sh, thensudo usermod -aG docker $USERand sign in again. - A roaster that speaks one of Roastwarden's protocols. An ESP32 roaster over Wi-Fi uses MQTT, which this install provides; serial (TC4), Modbus, WebSocket and Phidgets boards connect too (connect your roaster).
1. Get the release
Each release on the project's releases page carries roastwarden-compose-vX.Y.Z.tar.gz, with
the compose files pinned to that version:
mkdir ~/roastwarden && cd ~/roastwarden
tar xzf ~/Downloads/roastwarden-compose-vX.Y.Z.tar.gz --strip-components=1
cp .env.example .env
While the image's registry is private (until the public release), sign in to it first with
docker login <registry>.
2. Name your roaster and give it a password
Every roaster signs in to the broker with its device id and a password of its own. Pick an id
(letters, digits, _; it is the roaster's name in Roastwarden and in its MQTT topics) and make a
password:
openssl rand -hex 16
Put both in .env, as id:password; more roasters are separated by commas:
MQTT_DEVICES=my_roaster:3f9c0e1b2a7d4c6e8f00112233445566
Nothing else in .env is required. Optional: ROASTWARDEN_READS=open lets anyone on your
network read the dashboard without signing in (writes still need the owner key or a token);
the default, login, asks each browser once.
3. Start it
The server runs as user 999 and keeps everything in data/: make the folder for it first.
mkdir -p data && sudo chown 999:999 data
docker compose -f docker-compose.single.yml up -d
docker logs roastwarden
The log prints the owner key once, at the first start: keep it in a password manager (it
is also saved as data/owner.key). It is what signs a browser in and makes tokens for scripts
and agents.
Open http://<the Pi's address>:8080 and sign in with the key. The first run asks what kind
of roasting you do (home, enthusiast, roastery), your units and time zone, then opens
Roasters → Add.
4. Connect the roaster
Set the roaster's firmware to the Pi's address, port 1883, user name = its device id, and the
password from .env. For the ESP32 example sketch that is MQTT_HOST, DEVICE_ID and
MQTT_PASSWORD at its top (connect your roaster). A second
after it starts sending, it appears under Roasters → Found, not added yet; Set up adds
it, and Check says whether it meets the standard.
Not appearing? docker exec roastwarden roast status lists the roasters heard and which may
sign in to the broker. A roaster added to MQTT_DEVICES later needs a restart to sign in:
docker compose -f docker-compose.single.yml up -d (a running roast waits: see "Updating").
Home Assistant: set MQTT_HOME_ASSISTANT_PASSWORD in .env (and restart) for Home
Assistant's MQTT integration to sign in to this broker as homeassistant, then switch it on
under Settings → Home Assistant (Home Assistant).
5. Updating
docker exec roastwarden roast busy --wait 60 # waits while a roast, drive or cooling runs
docker compose -f docker-compose.single.yml pull
docker compose -f docker-compose.single.yml up -d
A newer release's bundle pins the newer version: unpack it over the folder (your .env and
data/ stay), then the same two compose commands. The database migrates itself at start.
Backups
The server copies its database every night into data/backups/ and keeps the newest ones
(Settings → Backups; running it has the restore). Copy data/ somewhere else now and
then: a dead SD card takes the copies with it.
Good to know
- Ports. The container uses the machine's own network (mDNS finds roasters on the LAN):
8080 for the dashboard, 1883 for MQTT. Something else on 1883 already (Mosquitto, Home
Assistant's broker)? Set
ROASTWARDEN_BROKER_ADDR=0.0.0.0:1884in.envand give the roaster that port, or use your broker instead (see the top). Never forward either port to the internet; for access from outside, use a VPN (WireGuard, Tailscale). - Safety. The roaster's firmware stops its heater when it loses the broker. With the broker inside the server that also covers the server stopping, but not a server that hangs while its broker still answers; a separate Mosquitto with the server's last will covers that too (security).
- Artisan. Roastwarden can be a screen for Artisan over Modbus TCP
(Artisan as a screen); in this install use port 1502
(
ROASTWARDEN_MODBUS_ADDR=0.0.0.0:1502in.env), as the container does not run as root. - Links. Share pages, label QR codes and approval links start with the address the
request came to. Opened from outside under another name (a VPN name, a proxy)? Set it in
Settings → Roasting → Public address, or
docker exec roastwarden roast settings set public_url=https://roast.example.com. - Other settings go in
.envtoo (the variables table in the README); restart withdocker compose -f docker-compose.single.yml up -dafter a change. - Agents. The
roastcommand line is in the image (docker exec roastwarden roast --help); for an agent, make a token in Settings → Tokens (agents). - Where to go next: a tour of every feature, the user guide.