chore(tui): polish demo + regenerate screenshots
CI / test (pull_request) Successful in 2m45s
CI / lint (pull_request) Successful in 1m4s
CI / vulncheck (pull_request) Successful in 56s

Rework the VHS demo so the README screenshots actually entice a download.

Demo data / tooling:
- seed.yaml: real, reachable service URLs (detail now shows nextcloud.com,
  not example.com); Auth Portal -> non-resolving home.arpa host so it reads
  as a believable, reliably-DOWN monitor
- backfill: transient outages for Nextcloud/Jellyfin/Immich aligned with their
  state changes (uptime % now matches); log timestamps derived from now so the
  Logs view reads chronologically; real SSL warning; three probe nodes across
  regions; seeded alert send health
- demo.tape: shorter warm-up, added Nodes + theme captures, ordered so every
  shot stays inside the 60s node-freshness window (consistent probe count)
- vhs/crop: new tool to trim the empty terminal border around each screenshot
- setup.sh: build backfill up front for deterministic timing; UPTOP_DEMO=1

Supporting code:
- persist alert send health (new alert_health table, load on startup,
  best-effort save on send) so health/last-sent survive restarts
- latency Min/Avg/Max ignore failed checks (no more "Min 0ms")
- correct "probe"/"probes" pluralization
- stable status dot instead of an animated spinner under UPTOP_DEMO
This commit is contained in:
2026-05-28 22:32:45 -04:00
parent 9c7ed284b3
commit 03cbe283df
25 changed files with 483 additions and 99 deletions
+10 -10
View File
@@ -28,7 +28,7 @@ monitors:
# HTTP — homelab services
- name: Nextcloud
type: http
url: https://example.com
url: https://nextcloud.com
interval: 30
alert: Discord Homelab
check_ssl: true
@@ -37,21 +37,21 @@ monitors:
- name: Jellyfin
type: http
url: https://example.com
url: https://jellyfin.org
interval: 30
alert: Discord Homelab
max_retries: 2
- name: Home Assistant
type: http
url: https://example.com
url: https://www.home-assistant.io
interval: 30
alert: Discord Homelab
max_retries: 3
- name: Gitea
type: http
url: https://example.com
url: https://about.gitea.com
interval: 60
alert: Discord Homelab
check_ssl: true
@@ -60,14 +60,14 @@ monitors:
- name: Traefik Dashboard
type: http
url: https://example.com
url: https://traefik.io
interval: 60
alert: Discord Homelab
max_retries: 1
- name: Vaultwarden
type: http
url: https://example.com
url: https://bitwarden.com
interval: 30
alert: Discord Homelab
check_ssl: true
@@ -76,7 +76,7 @@ monitors:
- name: Personal Blog
type: http
url: https://example.com
url: https://jvns.ca
interval: 120
alert: Discord Homelab
check_ssl: true
@@ -85,17 +85,17 @@ monitors:
- name: Immich
type: http
url: https://example.com
url: https://immich.app
interval: 60
alert: Discord Homelab
check_ssl: true
expiry_threshold: 7
max_retries: 3
# HTTP — deliberate failure
# HTTP — deliberate failure (non-resolving homelab host → stays DOWN)
- name: Auth Portal
type: http
url: http://localhost:1
url: https://auth.home.arpa
interval: 30
alert: Discord Homelab
max_retries: 2