Skip to content
Great Blue Heron

Trans: Latin prefix implying “across” or “Beyond”, often used in gender nonconforming situations Scend: Archaic word describing a strong “surge” or “wave”, originating with 15th century english sailors Survival: 15th century english compound word describing an existence only worth transcending

Jess Sullivan

Trashmonitor to oggle my goggles and behold the blinkenlights

· 1 min read · hardware

How to oggle my goggles and behold my blinkenlights while away from the basement? Here is my Sunday’s afternoon capture host project. TrashMonitor pushes H.264-over-RTSP via MediaMTX, served through a local Caddy proxy into a simple SvelteKit SPA running from one of the basement clusters.

Find the repo here: tailnet-trashmonitor

The bench viewThe stream view
Physical trashmonitor capture setup pointed at the hardware benchTrashmonitor dashboard showing tailnet camera streams

The whole architecture is basically “push video into the cluster, watch HLS from the tailnet.”

Kubernetes namespace: trashmonitor

Tailscale auth boundary

Capture hosts on the tailnet

config

provisions

GET /, /api, /stream/index.m3u8

80 or 443

serves /srv/spa

strip /api

proxy HLS playlists and segments

RTSP over TCP publish to :8554/id

8554

alias

resolver path

mounted into

V4L2 webcam

trashcam@id.service

ffmpeg + libx264

/etc/trashcam/id.env

ansible role or RPM

trashmonitor-rtsp LoadBalancer

trashmonitor LoadBalancer

Caddy

MediaMTX

MediaMTX API :9997

MediaMTX HLS :8888

MediaMTX metrics :9998

Static SvelteKit SPA

cert-manager TLS secret

Tailnet browser with hls.js

Cloudflare A record to tailnet IP

Tailscale split-DNS for your zone

PieceJob
capture/bin/trashcam-ffmpegread V4L2, encode H.264, publish RTSP
capture/systemd/trashcam@.servicesupervise each camera path
server/mediamtx.ymlaccept RTSP publishes, emit HLS, expose API and metrics
server/Caddyfileroute SPA, API, and HLS over the tailnet viewer service
spa/static SvelteKit tiles using hls.js
server/k8s/service.yamlexpose separate Tailscale LoadBalancers for viewers and RTSP ingest

MediaMTX allows anonymous publish, read, API, metrics, and playback; the services are exposed through the Tailscale Kubernetes operator, and the reachable surface is tailnet-only. Tailnet membership is the auth boundary. The public DNS alias, if I use one, is just an A record to the Tailscale CGNAT address so my own devices get a friendly name.

This lets me walk away from the desk and still keep the goggles, boards, and blinkenlights bench weirdness in view. If a board reboots, I can see it. If a display goes dark, I can see it. :eyes: Huzzah!

-Jess

Related Posts

Comments

Loading comments...