Badges, feeds and metrics
Embeddable SVG badges, RSS and Atom feeds, and the Prometheus exposition.
Three machine-readable surfaces, all public, each gated by its own configuration flag.
Badges
Enabled by metrics.badges (default true).
| Query | Values | Default |
|---|---|---|
metric | status, uptime, latency | status |
period | 24h, 7d, 30d, 90d | 24h (uptime only) |
label | any string | the monitor name, or status |
overall is reserved for the page-level state. Percent-encode names with
spaces: /badge/Web%20App.svg.
| Response | When |
|---|---|
200 | SVG, cache-control: public, max-age=60. |
400 | Unknown metric or period, or invalid percent-encoding. |
404 | Unknown monitor, a path not ending in .svg, or badges off. |
Colours follow the value: green at or above 99.9% uptime (or healthy), amber at or above 95% (or degraded), red below, grey when there is no data.
The one-minute cache is deliberate: badges are embedded in third-party READMEs, and without it every page view would become a database read.
RSS and Atom
Enabled by incidents.enabled (default true).
Both publish the newest 50 incidents — feeds are public and unauthenticated, so they serve a bounded window rather than a history that only grows.
Entries link to the #incident-<id> anchor that every bundled theme renders,
so a reader lands on the incident itself. Absolute URLs come from siteUrl,
falling back to the request origin — set siteUrl before publishing, or a
feed behind a proxy will advertise the wrong host.
Build the same XML yourself from any incident list:
Prometheus
Enabled by metrics.prometheus (default false).
Served as text/plain; version=0.0.4; charset=utf-8.
| Metric | Labels |
|---|---|
heyo_status_up | monitor, type, group |
heyo_status_latency_milliseconds | monitor, type, group |
heyo_status_uptime_ratio | monitor, period |
heyo_status_last_check_timestamp_seconds | monitor |
heyo_status_overall | state |
heyo_status_monitors | — |
heyo_status_active_incidents | — |
heyo_status_scheduled_maintenances | — |
heyo_status_snapshot_timestamp_seconds | — |
Only aggregate, already-public data is exposed: no incident content, no monitor targets, nothing from a private monitor.
If a scrape endpoint should not be world-readable, leave
prometheus: false and expose the same numbers behind your own
gateway with createPrometheusMetrics(), or restrict the path at
the edge.
Health
Answers whether the status API is serving. It does not read the database and does not reflect monitor state.