Read the MEATER wireless meat thermometer probe over Bluetooth Low Energy from Go — with a clean, self-hosted web UI.
The program scans for a probe advertising the name MEATER, connects to it,
subscribes to the temperature characteristic, decodes the tip (internal
meat) and ambient (cook) temperatures, and serves a live dashboard with a
temperature chart, doneness targets, ETA, and browser alerts.
More screenshots: Grafana dashboards · Home Assistant
- Flash a Wi-Fi ESP32 (requires PlatformIO):
cd firmware
pio run -e esp32-wifi -t upload-
Connect the bridge to Wi-Fi. Join the
meater-bridge-setupnetwork that appears after first boot and choose your home Wi-Fi in the setup page. -
Run the monitor. If Home Assistant runs in Docker on Linux, start this container beside it:
docker run -d \ --name meater \ --restart unless-stopped \ --network host \ -v meater-data:/data \ ghcr.io/awlx/meater:latest \ -http :8088 -db /data/meater.db -bridge auto
--network hostlets mDNS find the ESP32 automatically. Home Assistant OS cannot run arbitrary Docker containers, so run this command on another always-on Linux/Docker computer on the same network instead. -
Add it to Home Assistant. In HACS, add this repository as an Integration, install MEATER Monitor (self-hosted), restart Home Assistant, then add the integration and enter the monitor computer's hostname and port
8088.
Take the probe out of its charger and start the cook from the Home Assistant
Cook session switch. See the ESP32 guide,
installation guide, and
Home Assistant guide for persistent service setup and
troubleshooting.
- Everything stays on your network — no MEATER account, no cloud, ever. The probe is read directly over Bluetooth (or the ESP32 bridge below) and served from your own instance; the Home Assistant integration talks straight to that instance over the LAN too, so nothing about your cook ever leaves your network.
- Live web dashboard — a temperature-over-time chart, doneness presets, and an ETA that stays sane through a stall, all pushed to the browser in real time (no polling), for as many phones/laptops as want to watch.
- 📡 Put the probe anywhere — no Bluetooth range needed at the server. The host running this program normally has to be within a few meters of the probe, which is awkward when the grill is outside and the server lives indoors. Add a cheap ESP32 bridge next to the grill instead: it holds the Bluetooth link and relays the probe over your existing network (Ethernet or WiFi) to the host, wherever that lives. This is the feature that makes an always-on, self-hosted setup actually practical — see docs/remote-bridge.md.
- Cook history & smarter ETA — every cook is saved to SQLite, past cooks can be browsed or deleted, and the ETA learns from your own past cooks of the same meat type.
- Home Assistant integration (via HACS) and Prometheus metrics for automation and monitoring, with ready-made Grafana dashboards for either source.
- Mock mode to explore the UI with simulated data — no probe or Bluetooth required.
See docs/ for the full feature list, configuration reference, and integration guides.
- A charged MEATER probe removed from its charging block (it only advertises when out of the block).
- A Bluetooth LE adapter — or an ESP32 bridge instead, in which case the host itself needs no local Bluetooth at all.
- Go 1.26+ to build from source.
go run . -mock # explore the web UI with simulated dataOpen http://localhost:8080/ and press Start — the app sits idle until you
do, so it never scans in the background. With a real probe, just drop -mock:
go run . # serve the dashboard on :8080, idle until you press StartPress Ctrl+C to disconnect and exit.
Docker — try the UI with no probe needed:
docker run --rm -p 8080:8080 ghcr.io/awlx/meater:latest -mock -http :8080Binary + systemd:
CGO_ENABLED=0 go build -o meater .Full instructions for both (Docker Compose for a real probe, GHCR images, and the systemd unit) are in docs/install.md.
| Doc | Covers |
|---|---|
| docs/install.md | Docker Compose, GHCR images, binary + systemd setup. |
| docs/configuration.md | The full -flag reference. |
| docs/remote-bridge.md | 📡 The ESP32 bridge — read the probe over the network instead of local Bluetooth. |
| docs/https.md | HTTPS/TLS options, and how multiple viewers share one probe. |
| docs/home-assistant.md | Installing via HACS and the entities it exposes. |
| docs/metrics.md | The Prometheus /metrics endpoint and example alert rules. |
| docs/grafana/ | Ready-made Grafana dashboards, for the native /metrics or Home Assistant. |
| docs/architecture.md | Project layout and how the BLE temperature payload is decoded. |
| firmware/ | ESP32 bridge firmware (PlatformIO/C++), wiring, and flashing. |
Thanks to nathanfaber/meaterble
for the community reverse-engineering pointers — it was a helpful reference for
where to look in the BLE GATT services and temperature payload.

