If your side project has any users at all, sooner or later something breaks — a deploy goes sideways, a third-party API has an outage, your database runs out of connections at 2am. The question isn’t whether it happens, it’s whether people find out from you or from a wall of angry replies on X.

A status page solves that. But “just add a status page” usually turns into an afternoon lost to a Next.js app, a database schema for incidents, and a deploy pipeline — for a page that’s really just three states: operational, degraded, down. This guide covers what a status page actually needs, and the fastest way to ship one without writing a backend.

What a status page is actually for

A status page has one job: let people check “is it just me?” without opening a support ticket. That’s it. It doesn’t need real-time monitoring hooks, historical uptime graphs, or subscriber email lists on day one — those are things you add once you have enough incidents to justify them.

What it does need:

  • A current status — operational, degraded performance, or an outage, updated by you in under a minute.
  • A place to post updates during an incident — even a single sentence like “Investigating elevated error rates on the API” cuts support messages dramatically.
  • Somewhere stable to link to — a URL that still loads even if your main app or database is the thing that’s down. This is the part people miss: if your status page runs on the same infrastructure as your app, it goes down with everything else, right when people need it most.

Why the “proper” solution is usually overkill

The instinct is to build a status page the same way you’d build any other page in your stack — a new route, a database table for incidents, an admin form to post updates. For a team with dedicated on-call infrastructure, that’s the right call. For a solo project or small team, it creates two new problems:

  • It’s coupled to the thing it’s reporting on. A status page hosted on the same server as your app is exactly the kind of dependency you don’t want during an outage.
  • It’s another surface to maintain. Auth, deploys, a database migration for a table you’ll touch twice a month — all for three sentences of copy that change during an incident.

Dedicated status-page products like Statuspage or incident.io solve this properly, but they’re built for teams already paying for on-call tooling — the pricing and setup overhead don’t make sense for a project that just needs a page saying “we know, we’re on it.”

The simplest version that actually works

A status page that lives completely outside your own infrastructure, on its own domain or subdomain, editable in under a minute, with zero backend — that covers the actual requirements above. In practice that means a static one-page site builder rather than a framework.

This is the gap Carrd fills well. It’s a one-page site builder built specifically for pages that don’t need to be an application — a landing page, a link-in-bio, a changelog, or a status page. You get a hosted URL independent of your own servers, a free tier that’s genuinely usable (not a crippled trial), and edits go live in seconds with no deploy step.

Our pick
carrd io website banner

Carrd

A one-page site builder we reach for whenever a project needs a fast landing page, changelog, or status page without spinning up a full WordPress install.

Free

View deal

Setting it up: the three-state pattern

The setup that covers almost every incident without over-engineering it:

1. A status badge at the top

One line, color-coded: green for “All systems operational,” yellow for “Degraded performance,” red for “Major outage.” Resist the urge to make this granular per-service on day one — a single overall status is enough until you have more than two or three services worth tracking separately.

2. A short, timestamped update log

Below the badge, a running list: timestamp plus one sentence. “14:32 UTC — Investigating reports of slow API responses.” “15:10 UTC — Root cause identified, deploying a fix.” “15:22 UTC — Resolved. Monitoring for recurrence.” This is the part people actually read during an incident — keep entries short and skip the postmortem for now; that can live in a separate write-up later if you want one.

3. A way to reach you directly

An email address or a link to your support channel, for the cases the status page itself doesn’t answer. Even a mailto link is enough at this stage.

None of this requires a form backend, a database, or authentication — you’re editing a page directly and republishing it, the same way you’d edit a document.

What to actually write during an incident

The setup is the easy part — the harder habit is writing good updates while you’re also trying to fix the actual problem. A few patterns that hold up:

  • Say what you know, not what you’re guessing. “Investigating reports of slow API responses” is honest. “Should be fixed in 10 minutes” is a promise you might not keep — and a wrong ETA does more damage than no ETA.
  • Update on a cadence, even with nothing new to say. “Still investigating, next update in 30 minutes” is worth posting on its own. Silence reads as “we forgot,” not “we’re working on it.”
  • Confirm resolution explicitly, and watch for a bit before closing it out. “Fix deployed, monitoring for recurrence” followed by a real “Resolved” once you’re confident — don’t mark something resolved the moment the error rate first drops.

This is also where keeping the page outside your main stack pays off a second time: you can write the “we’re investigating a database issue” update without needing the database to be working.

What you’re trading away

To be clear about the tradeoff: this approach doesn’t give you automated monitoring, historical uptime percentages, or subscriber notifications out of the box. If those matter to you now, a dedicated incident-management tool is the right call, not a workaround. But most projects don’t need that machinery on day one — they need a stable, honest page that says what’s happening, and this gets you there in an afternoon instead of a sprint.

Quick checklist

  1. Host your status page independently of your main app’s infrastructure — it needs to survive your app going down.
  2. Keep it to three states: operational, degraded, down. Add granularity later if you actually need it.
  3. Log updates as short, timestamped one-liners, not full postmortems.
  4. Give people a direct way to reach you for anything the page doesn’t cover.
  5. Revisit dedicated incident tooling once you have enough real incidents to justify the overhead — not before.

The best status page is the one that actually gets updated during an incident, not the one with the most features. Start with the version you can ship this afternoon; you can always outgrow it later.