Your events, your rules.
Send JSON from Home Assistant, n8n, or any webhook source. YAML rules choose the animation, priority, and what happens after it plays.
Explore the example rulesA small service. A visible difference.
Turn a webhook into something you can see. echo connects your apps to an 8×8 LED matrix, so a notification becomes a moment of light.
Self-hosted. Built in Go. Made for your LAN.
A quiet background. A timely alert. A custom pattern.
Let your display do more than stay on.
Send JSON from Home Assistant, n8n, or any webhook source. YAML rules choose the animation, priority, and what happens after it plays.
Explore the example rulesEach matrix gets its own queue, connection settings, and idle background. Keep the office and living room in their own rhythm.
Restore the configured idle animation after a notification. Automatic reconnect and heartbeat probes handle interrupted device connections.
Author 8×8 frames with a palette and simple text rows. No firmware edit needed for your own pixel art.
Trigger 22 firmware effects, or upload up to 8 frames to loop on the panel without a network trip per frame.
Prometheus metrics, liveness and readiness endpoints, and interactive API docs make operation less of a guessing game.
echo runs on a Linux machine or Raspberry Pi on the same network as your display. Your apps speak HTTP; echo handles the matrix’s binary TCP protocol.
A small JSON request arrives over HTTP.
The device’s scheduler queues the animation.
Playback finishes, then idle state returns when configured.
curl -X POST \
http://localhost:8080/api/v1/devices/living-room/notify \
-H 'Content-Type: application/json' \
-d '{"message":"Build finished","duration":"3s"}'The matching rule plays an animation. The message is event data, not scrolling text on the display.
Run in Docker or build a native binary.
No cloud account. Your setup, your control.
You’ll need Git, a Linux host, and a compatible ESP8266 matrix controller on your LAN. Choose Docker or Go 1.26.9+.
git clone https://github.com/worxbend/echo.git
cd echo
cp configs/config.example.yaml configs/config.yamlEdit devices.living-room.host in configs/config.yaml. The example animation and rules files are already referenced.
In Bash, read a token without saving it in shell history. Use this same terminal for the Docker or native commands below.
read -rsp 'Admin token: ' MATRIX_PROXY_ADMIN_TOKEN
printf '\n'
export MATRIX_PROXY_ADMIN_TOKENBuild the current checkout with Docker’s multi-stage build. Go stays in the builder, not on your host.
docker build -t echo-local .
docker run -d --name echo \
--restart unless-stopped \
-p 127.0.0.1:8080:8080 \
--mount type=bind,source="$PWD/configs",target=/app/configs,readonly \
-e MATRIX_PROXY_ADMIN_TOKEN \
echo-localHTTP is published on localhost only. The container connects to your matrix over the LAN. Read the API access notes before exposing it elsewhere.
Prefer no container? Install Go 1.26.9 or newer, complete the three setup steps first, then build and run:
go build -o bin/matrix-proxy ./cmd/matrix-proxy
./bin/matrix-proxy -config configs/config.yamlThe native example listens on all interfaces as configured. Admin routes require the token; event ingress is intentionally unauthenticated. Keep it on a trusted LAN or behind a suitable gateway.
curl http://localhost:8080/healthzLook for {"status":"ok"}. Open http://localhost:8080/docs for the API explorer. /readyz returns 503 until the matrix and workers are ready.
Looking for a pre-built image? Browse the container package. The source-build instructions above match the current checkout; no downloadable native release is promised.
No. echo is the HTTP service that controls a compatible ESP8266 8×8 matrix over TCP. Your panel needs compatible firmware and a reachable network address. See the wire protocol before connecting a different controller.
Yes. The HTTP service starts, exposes the API and animation catalog, and retries the device connection. Liveness can be healthy while readiness returns 503. Display operations need reachable hardware.
Yes. The API exposes pixel, fill, brightness, clear, and panel controls. With an idle background enabled, manual changes can be restored to that background. To keep the panel dark while retaining its image, disable panel output rather than clearing it.
Not directly. Admin routes require a bearer token on a non-loopback bind, but notification and event ingress, metrics, and health probes are intentionally unauthenticated. Use a trusted network or add access control at your gateway.
A webhook, a rule, and 64 pixels. Start there.