A single live-status service directory at http://home.telep.lan so anyone can find every homelab service — and its fallback address — during an outage. Built with gethomepage/homepage (Next.js) in Docker on telep-mainframe, with each tile carrying a health dot and its raw-IP/tailnet fallback baked in. Building it surfaced a ~1.6-day Caddy boot-race outage — see Caddy boot-race found while building this.

For Agents

Reachable two ways (deliberately redundant):

  • LAN / no-internet: http://home.telep.lan → Caddy :80 on telep-mainframe127.0.0.1:3010. Router resolves *.telep.lan192.168.1.123.
  • Remote / Caddy-independent: https://telep-mainframe.taild4189d.ts.net:8450 via tailscale serve127.0.0.1:3010. Survives a Caddy outage. Stack: /home/levander/homepage/ on the mainframe (docker-compose.yml + config/{settings,services,widgets,bookmarks}.yaml). Binds 127.0.0.1:3010 only.

Purpose

The user asked for a page that answers “where is what” — during an outage you should be able to open one URL and see every service, whether it is up, and how else to reach it (raw IP, tailnet port, ssh target). It complements the older tailnet-only 2026-07-24-global-dashboard but is LAN-first and outage-hardened.

Tech & deployment

gethomepage/homepage (Next.js) in Docker at /home/levander/homepage/.

SettingValueWhy
network_modehostREQUIRED — siteMonitor health checks must reach 127.0.0.1:PORT services and other LAN/VLAN IPs directly
HOSTNAME127.0.0.1bind loopback only
PORT30103000 was taken by ruview → binds 127.0.0.1:3010
HOMEPAGE_ALLOWED_HOSTSsee belowrecent Homepage rejects unknown Host headers

HOMEPAGE_ALLOWED_HOSTS = home.telep.lan,telep.lan,localhost,127.0.0.1(:3010),192.168.1.123(:3010),telep-mainframe.taild4189d.ts.net,100.115.209.87.

Host networking is not optional here

Homepage’s siteMonitor: health checks fire from the Homepage process. On a bridge network it could not reach the 127.0.0.1:PORT backends or the camera VLAN IPs. network_mode: host (binding 127.0.0.1:3010) is what makes the up/down dots real.

Two access paths (redundant on purpose)

a) http://home.telep.lan via the :80 split-horizon Caddy

The old static landing block was replaced with a reverse proxy in /etc/caddy/Caddyfile:

telep.lan, home.telep.lan {
	reverse_proxy 127.0.0.1:3010
}

b) https://telep-mainframe.taild4189d.ts.net:8450 via Tailscale Serve

tailscale serve --bg --https=8450 http://127.0.0.1:3010

Why a second path

This tailnet path is deliberately Caddy-independent — if Caddy dies (exactly what happened, below), the dashboard is still reachable remotely to diagnose the rest. A status page that dies with the reverse proxy is useless during the outage it is meant to survive.

Layout — 18 tiles / 6 groups (Hungarian)

Health = siteMonitor: per tile (up/down dot) except the two cameras which use ping:.

GroupTileBackend / check
Kamerák & NVRFrigatefrigate.telep.lan /health (:5000)
go2rtcgo2rtc.telep.lan (:1984)
Kamera DÉLping 192.168.30.119
Kamera ÉSZAKping 192.168.30.139
Admin & HozzáférésAdmin portáladmin.levandor.io /health (OliveTin :1337)
Pocket-IDid.levandor.io (:1411)
Tárolás & TudásFájlböngészőfiles.telep.lan (:8334)
Knowledgebasetailnet (:8092)
Qdrant:6333 /healthz
Stirling-PDFtailnet (:8080)
Eszközök & MédiaWhiteboardwhiteboard.telep.lan (:8790)
Top képektop.telep.lan (:8090)
Thermoprintprint.telep.lan (:8095)
AirPlaytelep-tv
SDR/KrakenKrakenSDRkraken.telep.lan / 192.168.1.200:8080 — red while Pi offline
Hálózati eszközökRouter LuCI192.168.1.1
AP bandi (TL-WA850RE)192.168.1.101
Nyomtató (HP M203dw)192.168.1.126

Jellyfin was OMITTED on purpose

Its backend is dead on :8096 (same guessed-name/dead-backend flag as in 2026-08-15-telep-lan-split-horizon-caddy). A permanently-red tile on a status board is noise, so it was left off entirely.

Outage-safe design choices

The whole point is that this page still works when other things don’t:

  • No external icon fetches — no icon: fields, so there is no CDN dependency. A dead WAN doesn’t blank the board.
  • Only local widgetsdatetime + resources (no weather / no remote APIs).
  • Fallbacks baked in — each tile’s description carries the raw IP / alternate port, plus a dedicated ”⚡ Kiesés esetén” bookmarks group listing tailnet ports, raw IPs, and ssh targets. So even if a tile is red, you can read how else to reach the thing.

GOTCHA — a colon-space in a Homepage description breaks YAML parsing

config/services.yaml is YAML. A description: value that contains a colon followed by a space (e.g. Windows C: (RO)) is parsed as a nested mapping key → bad indentation of a mapping entry. QUOTE every description: value (description: "Windows C: (RO)"). Cheap to hit, annoying to diagnose (the error points at indentation, not the colon).

Caddy boot-race found while building this

Building this dashboard surfaced a live ~1.6-day outage — see the full write-up

While wiring home.telep.lan into Caddy, caddy.service was found failed since 2026-08-15 18:44 (the YubiKey-FDE reboots), taking every *.telep.lan name AND both levandor.io portals offline by-domain the whole time. Root cause + the ip_nonlocal_bind fix are documented in Caddy boot-race outage (2026-08-17), the Caddy :443 boot-race banner, and the runbook caddy-boot-race. It is cross-linked here because fixing Caddy is a prerequisite for path (a) of this dashboard.