- update-health.js: pings every service URL from script.js (single
source of truth) in parallel every minute via cron and writes
health.json; any HTTP response below 500 counts as online, 5xx as
error, timeouts/DNS failures as offline; TLS validity ignored
- Card badges now show real state instead of a static Online label:
grey Checking, green Online (with latency tooltip), amber Error
(HTTP code), red Offline (reason); refreshed every 30 s
- Entrypoint runs a first sweep at boot; nginx serves /health.json
with no-cache; README documents the behavior