Instatus

instatus.comcontributed by Samuele Ongaro

YES

Replaceable in one session with an AI coding agent.

A hosted status page. You publish incidents and maintenance windows, subscribers are notified by email, SMS or webhook, and the page is deliberately served from infrastructure that is not yours — so it stays up when your product does not.

Promptfree, for everyone, and the only version there is
Build me a status page that replaces Instatus: it tells my customers what is broken, before they email me to ask.

STACK
- Node 20+ with Fastify, server-rendered HTML, no client framework
- SQLite through better-sqlite3, WAL mode
- The public page served as static HTML regenerated on every change, so it stays up when the app behind it does not
- Caddy in front, and the page hosted from a different machine or provider than the thing it reports on

THE DATA MODEL
- components: id, name, description, group_name, position, status, is_public
- incidents: id, title, status, impact, started_at, resolved_at, is_scheduled, scheduled_for, scheduled_until
- incident_updates: id, incident_id, body, status, created_at — the timeline, append-only
- incident_components: incident_id, component_id, status_during
- checks: id, component_id, kind, target, interval_seconds, timeout_ms, expected
- check_results: id, check_id, ok, latency_ms, status_code, error, checked_at
- subscribers: id, email or webhook_url, verified_at, unsubscribed_at, scope
- Component status: operational, degraded, partial outage, major outage, maintenance
- Incident status: investigating, identified, monitoring, resolved

THE PUBLIC PAGE
- Current state at the top in one line — all systems operational, or the worst thing that is true
- Every component with its own state, grouped
- Ninety days of history as a bar per day per component, coloured by the worst state that day
- Open incidents in full, with their updates newest first and the time between them visible
- Past incidents by month, with total downtime per component
- Uptime percentage per component over 7, 30 and 90 days. State the formula on the page: minutes not in a degraded or outage state, over minutes in the window
- No login, no cookie, no third-party script. It must load in under a second on a phone on a train

MONITORING
- Checks that run themselves: HTTP status and latency, a keyword present or absent in the body, TCP port open, TLS certificate expiry, and a heartbeat a cron job pings
- A component goes degraded after N consecutive failures, not the first one, and N is configurable per check
- Recovery needs the same N in a row, so a flapping service does not spam
- A failed check opens an incident automatically if the admin turned that on, with a title generated from the component and the failure
- Never let the monitor be the reason the page is wrong: a check that has not run in twice its interval shows as unknown rather than as fine

TELLING PEOPLE
- Subscribe by email, by webhook, by RSS, and by Slack incoming webhook
- Confirm an email address before sending anything to it
- One message when an incident opens, one per update, one when it resolves — never more
- Per-component subscriptions: somebody who only uses the API does not want the dashboard's outages
- Every email has one-click unsubscribe that works without logging in

THE ADMIN
- Open an incident in one field: a title, then updates as you learn things
- Templates for the three sentences you always write
- Scheduled maintenance in advance, shown on the public page before it starts and announced by email
- Backdate an incident: real outages get written up afterwards, and a status page that cannot record the past is a status page that lies about uptime
- Every change to an incident kept, never edited in place

RESILIENCE, WHICH IS THE WHOLE POINT
- The public page is a static file. If the admin, the database or the monitor dies, the last known state is still being served
- Regenerate on every change, and once a minute regardless
- No dependency on the systems being reported on: no shared database, no shared network, no shared provider
- Say in the README that hosting this next to the product it reports on defeats the exercise

THE INTERFACE
- The public page: one column, big type, no marketing copy, no cookie banner
- The admin: a list of components, a list of incidents, and a form. Nothing else
- Dark and light, and a light-on-white default because status pages are read on projectors in offices

OPERATIONS
- .env: DATABASE_PATH, SMTP_URL, BASE_URL, ADMIN_PASSWORD_HASH, SLACK_WEBHOOK
- Migrations on boot, one at a time, recorded
- Nightly backup with off-server upload, plus restore
- Prometheus-style metrics endpoint, so the thing that watches this can be watched

WHAT MATTERS MOST
Build the public page and the incident timeline first, and make the page a static file from the first commit. Automatic monitoring is a nice second act; a page that goes down with the product is worse than no page at all.

Give me the repository, migrations, .env.example, a seed with three components, and a README with deploy steps for a small VPS in a different region from the main product.

What you lose

  • A status page hosted well away from your own infrastructure, which is the entire point of one
  • Subscriber notifications by email, SMS and webhook at the exact moment your systems are struggling
  • Fast page loads from a global edge, for the one page that gets hammered during an incident
  • Incident templates and a workflow a stressed team can follow without thinking
  • Automatic component status driven by existing monitoring integrations

If you would rather not build

  • Statuspage — the incumbent, covered separately on this site

What it costs

as published on their pricing page

PlanBilled monthlyBilled yearlyLast read
—$99/mo——

Their pricing page is where these came from. Seeing a different price? Tell us.

The escape hatch

open source · no votes, no paid placement

cState

$0

Status page as a static site — incidents are Markdown files, hosted anywhere.

cstate/cstatefree · open source

Upptime

$0

Uptime monitor and status page that runs entirely on GitHub Actions.

upptime/upptimefree · open source

Why this verdict

our own opinion · changed only by a person

90/100

Verdict yes at 90: a status page is Markdown plus a cron job, and static files on a different provider are genuinely more resilient than any dynamic app. At $99/mo for the Pro tier the arithmetic is not close; subscriber notification at scale is the only real reason to pay.

History

tracked since 6 Aug 2026 · nothing is ever overwritten

Interest · last 30 dayspeak 2/day
views01230 Aug4 Sept9 Sept14 Sept19 Sept24 Sept28 Sept
— views— prompt copies none yet— votes none yet

Questions about Instatus

answered from the record above

Is Instatus free?

No — the plan we track is $99 a month. Pro, $99/mo as listed on the pricing page. Business is $999/mo. A free tier exists for a basic public page.

Can you replace Instatus by building your own?

YES. Replaceable in one session with an AI coding agent. Replacement score 90 out of 100, build time one session. Read what you lose before you decide.

How much does Instatus cost?

$99 a month on Pro — $1,188 a year. Recorded 6 Aug 2026.

What do you lose by replacing Instatus?

A status page hosted well away from your own infrastructure, which is the entire point of one; Subscriber notifications by email, SMS and webhook at the exact moment your systems are struggling; Fast page loads from a global edge, for the one page that gets hammered during an incident; Incident templates and a workflow a stressed team can follow without thinking; Automatic component status driven by existing monitoring integrations. If any of those carry weight for you, keep paying.

Is there an open-source alternative to Instatus?

Yes: cState, Upptime. The prompt on this page is for when you want it your way instead.

Related entries

same category first, most replaced first

All 25 in Monitoring & uptime

Not sending yet

Every week, something stops being worth paying for.

New verdicts, prices that moved, entries added. One email a week. Unsubscribe in one click. Nothing is being sent yet — your address is kept here, and the first issue is the first thing it is used for.

free forever · no tracking pixel · stored here, never passed to anyone

Esc