Turn the status page into a full status page generator

Components can be put in groups and given public names. Public incidents carry
posts written for customers (the internal timeline stays internal), the
components they affect, and a page for each incident plus paged history.
Scheduled maintenance has its own window, shows affected components as under
maintenance, and is announced when scheduled, started, ended or canceled.

Branding (title, logo, accent checked for contrast, contact link, footer) and a
custom domain that serves only the status page. Visitors follow by RSS, by
confirmed email, or by webhook that must answer a test request. Admin UI for
all of it, tests, README and design notes.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
VeillaxandClaude Sonnet 5.5 committed 2026-10-27 17:05:38 -06:00
1 parent b4fd31a182
commit cf4d5b3ce2
12 files changed
+2403 -147

No files matched your search

+11 -9
View File
@@ -30,15 +30,17 @@ type Monitor struct {
Target string `json:"target"` // URL, host:port, hostname, or host[:port] for tls
IntervalS int `json:"intervalS"`
TimeoutS int `json:"timeoutS"`
Retries int `json:"retries"` // failures in a row before it is down (default 2)
Expect string `json:"expect"` // http: accepted status, e.g. "200-299" (default)
Keyword string `json:"keyword"` // http: text the body must contain
WarnDays int `json:"warnDays"` // tls: fail when the certificate expires within this many days (default 14)
GraceS int `json:"graceS"` // heartbeat: extra time allowed past the interval
Token string `json:"token"` // heartbeat: the secret in the ping URL
PolicyID string `json:"policyId"` // escalation policy for the alert it raises
Severity string `json:"severity"` // alert severity (default critical)
Public bool `json:"public"` // shown on the status page
Retries int `json:"retries"` // failures in a row before it is down (default 2)
Expect string `json:"expect"` // http: accepted status, e.g. "200-299" (default)
Keyword string `json:"keyword"` // http: text the body must contain
WarnDays int `json:"warnDays"` // tls: fail when the certificate expires within this many days (default 14)
GraceS int `json:"graceS"` // heartbeat: extra time allowed past the interval
Token string `json:"token"` // heartbeat: the secret in the ping URL
PolicyID string `json:"policyId"` // escalation policy for the alert it raises
Severity string `json:"severity"` // alert severity (default critical)
Public bool `json:"public"` // shown on the status page
Group string `json:"group"` // status page component group id; empty for none
PublicName string `json:"publicName"` // name on the status page; empty to use Name
AllowPrivate bool `json:"allowPrivate"`
Enabled bool `json:"enabled"`
}