1. Documentation
  2. Introduction
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

Introduction

A themeable, TypeScript-first status page for React Router, Next.js and Astro.

Heyo Status is a status page you own. It monitors services on a schedule, stores uptime history, publishes incident timelines and maintenance windows, notifies your team and your subscribers, and renders a server-side status page in React Router, Next.js or Astro. One configuration file describes all of it; the CLI, the HTTP API, the scheduler and the UI read the same object.

heyo-sh/heyo-status

Loading repository data…

——

What it does

CapabilitySummary
MonitoringScheduled http, ssl, tcp, dns and composite checks with timeouts and assertions.
HistoryRaw results compacted into daily summaries, with configurable retention and display windows.
IncidentsManual or automatically opened incidents with a status timeline and severity.
MaintenanceScheduled windows that suppress alerts and publish on the page.
NotificationsSlack, Discord, signed webhooks and email (Resend, SES, Cloudflare, SMTP), with a delivery log.
SubscriptionsOpt-in public subscriptions over email, RSS/Atom and webhooks, with double opt-in.
ObservabilitySVG badges, a Prometheus exposition, RSS and Atom feeds and a health endpoint.
UIFive bundled themes, one stylesheet, SSR-first markup that works without JavaScript.

The shape of a project

Three files make a status page. A configuration, a catch-all API route, and a page that renders a snapshot:

heyo-status.config.ts
import { heyoStatus } from "@heyo-sh/heyo-status/config";import { sqlite } from "@heyo-sh/heyo-status/db";export const statusPage = heyoStatus({  database: sqlite("status.sqlite"),  title: "Acme Status",  theme: "slate",  monitors: [{ name: "Website", type: "http", url: "https://acme.com" }],  adminToken: process.env.HEYO_STATUS_API_TOKEN,});export default statusPage;
app/api/heyo-status/[...path]/route.ts
import { statusHandler } from "@heyo-sh/heyo-status/next";import { statusPage } from "../../../../heyo-status.config";export const { GET, POST, PATCH, PUT, DELETE } = statusHandler(statusPage);
app/page.tsx
import { StatusPage } from "@heyo-sh/heyo-status/ui";import { statusPage } from "../heyo-status.config";export default async function Page() {  const snapshot = await statusPage.api.getSnapshot();  return <StatusPage snapshot={snapshot} theme={statusPage.theme} />;}

Everything else — the CLI, the scheduler, badges, feeds, notifications — is derived from the same statusPage object.

Design decisions worth knowing up front

One configuration file, one source of truth

heyo-status.config.ts lives in the project root. The CLI loads it from there, the generated routes import it, and the deployment overlays expect it. Moving it means passing --config to every CLI command.

  • The runtime is framework-neutral. The HTTP surface is a single Hono app behind statusPage.handler(request). The framework adapters are thin: they hand a Request over and return a Response.
  • Persistence is an interface. Core code only ever talks to StatusDatabaseAdapter. SQLite, D1 and PostgreSQL are implementations of it, and so is anything you write yourself.
  • Writes are closed by default. /admin/* refuses every request until an admin token is configured. Public subscriptions are disabled by default, and visitor-supplied webhooks need an extra opt-in.
  • The page renders on the server. Incident disclosures and monitor groups are native <details> elements, because a status page has to stay readable exactly when the JavaScript bundle does not load.

Runtime requirements

RuntimeRequirement
CLI and dev scriptsBun 1.4.3+, even when installing with pnpm, npm or Yarn.
Next.js, React RouterNode.js 20.19+ in production for native TCP/TLS checks.
Astro 7Node.js 22.12+.
Cloudflare WorkersNo node:net/node:tls, so tcp and ssl monitors report unavailable.

Start here

Next steps

  • Create a project in one command
  • Read the configuration reference
  • Browse the HTTP API
QuickstartNext >

Powered by heyo

On this page

What it doesThe shape of a projectDesign decisions worth knowing up frontRuntime requirementsStart here