1. Documentation
  2. Configuration
  3. Incidents and maintenance
ReadmenpmGitHub
  • Introduction
  • Quickstart
  • Configuration file
  • Monitors
  • Checks and scheduling
  • Notifications
  • Incidents and maintenance
  • Subscribers
  • Metrics and badges
  • Identity and appearance
  • Telemetry
  • The check run
  • Uptime and history
  • Automatic incidents
  • Notification delivery
  • Public subscriptions
  • StatusPage component
  • Themes
  • UI primitives
  • Colour mode
  • React Router
  • Next.js
  • Astro
  • SQLite
  • Cloudflare D1
  • PostgreSQL
  • Schema and migrations
  • Cloudflare Workers
  • Vercel
  • Self-hosting
  • API overview
  • Status endpoints
  • Incident and maintenance endpoints
  • Subscriber endpoints
  • Badges, feeds and metrics
  • Admin endpoints
  • CLI commands
  • Package exports
  • Security
  • Troubleshooting

Incidents and maintenance

Switch the incident timeline and maintenance windows on or off, and understand their models.

Both features are enabled by default and both are a single switch. Turning one off removes its API routes, its effect on the snapshot and, for incidents, the RSS and Atom feeds.

ts
incidents: { enabled: true },maintenance: { enabled: true },
Disabled featureEffect
incidents.enabled: false/incidents, /incidents/:id, /rss.xml, /atom.xml and every /admin/incidents/* route answer 404. No automatic incidents are opened, and the snapshot carries no active incidents.
maintenance.enabled: false/maintenance and /admin/maintenance/* answer 404. Windows no longer suppress alerts, and the snapshot carries no scheduled maintenances.

The incident model

ts
interface Incident {  id: string;  title: string;  status: "investigating" | "identified" | "monitoring" | "resolved";  severity: "minor" | "major" | "critical";  affectedMonitors: string[];  auto: boolean;  updates: IncidentUpdate[];  createdAt: Date;  updatedAt: Date;  resolvedAt: Date | null;}
statusIncidentStatusoptional

The four states are a timeline, not a state machine with enforced transitions. A new incident may not be created as resolved.

severityIncidentSeverityoptional

critical is what drives the page to major-outage and what triggers a Slack mentionOnCritical.

affectedMonitorsstring[]optional

An empty array means global — the incident affects everything. That is also how maintenance windows express a full-platform window.

autobooleanoptional

True when the monitoring runtime opened the incident. Only automatic incidents are reconciled and auto-resolved.

updatesIncidentUpdate[]optional

Chronological entries, each with id, status, message, createdAt and an optional severity change.

Creating one

heyo-status incident create \  --title "Elevated API latency" \  --severity major \  --monitors "API,Dashboard" \  --message "We are investigating elevated response times."heyo-status incident update inc_... --status monitoring --message "A fix is deployed."heyo-status incident resolve inc_... --message "Latency is back to normal."heyo-status incident list --status investigating

How incidents change the page

overall is computed in this order:

  1. A maintenance window that is in-progress → maintenance.
  2. Any active critical incident → major-outage.
  3. Any other active incident → degraded.
  4. Otherwise monitors decide: all failing → major-outage, some failing → degraded, none → operational.

Active incidents are published in the snapshot and rendered with their full timeline, each anchored at #incident-<id> so the RSS and Atom entries link straight to it.

The maintenance model

ts
interface Maintenance {  id: string;  title: string;  description: string;  affectedMonitors: string[];  scheduledStart: Date;  scheduledEnd: Date;  status: "scheduled" | "in-progress" | "completed";  createdAt: Date;}

Status is derived from the clock, not set by hand: reading upcoming windows refreshes scheduled → in-progress → completed against now before returning them. scheduledEnd must be after scheduledStart.

Creating one

heyo-status maintenance create \  --title "Database upgrade" \  --description "Read-only for about 30 minutes." \  --monitors "API,Dashboard" \  --start 2026-02-01T02:00:00Z \  --end 2026-02-01T03:00:00Zheyo-status maintenance list

Alert suppression

While a window is in-progress, the monitors it names are excluded from:

  • monitor.down, monitor.recovered and ssl.expiring events, and
  • automatic incident creation and reconciliation.

They are still checked and their results are still stored, so the uptime grid stays honest about what actually happened. A window with an empty affectedMonitors suppresses alerts for every monitor.

Completed windows are never published

The snapshot includes scheduled and in-progress windows. Completed ones are dropped, which keeps the page and GET /maintenance in agreement.

Feeds

With incidents.enabled, the catch-all route publishes the newest 50 incidents as both RSS 2.0 and Atom:

text
GET /api/heyo-status/rss.xmlGET /api/heyo-status/atom.xml

Entries are titled <title> (<status>), link to the #incident-<id> anchor on siteUrl (falling back to the request origin), and carry the incident's timeline as the description. See Badges, feeds and metrics.

Related

  • Automatic incidents
  • Incident and maintenance endpoints
  • Managing them from the CLI
Notifications< PreviousSubscribersNext >

Powered by heyo

On this page

The incident modelCreating oneHow incidents change the pageThe maintenance modelCreating oneAlert suppressionFeeds