404 Page
Drops straight into app/not-found.tsx, and keeps the site header and footer — on a 404 the navigation is the most useful thing on screen.
Retry first, because a 500 is our failure and offering navigation implies the rest of the site works — which is exactly what is in doubt.
app/error-500-page.tsxnpx hoverlab add error-500-page
Or over MCP, from your editor's agent — no account needed.
Free to read, copy and install, for personal and non-commercial projects. Shipping it in client work or a paid product needs Pro ($79 once). The source lands in your repo and stops being ours — no attribution, nothing to upgrade.
The request failed before it finished. Your data is safe — nothing was changed.
err_7f3a92c4b81eGET /api/v1/projects → 503 Service Unavailable upstream: projects-api duration: 30012ms (timeout)
You are offline. Keep working — edits are written locally and sent automatically the moment the connection is back. Nothing is lost by closing this tab, though it will not send until you open it again.
If this keeps happening, the status page has more than we can put on an error screen — including whether we already know.
The real page, rendered in your current theme — every section below is a live block, not a screenshot.
Only want one section? Open it and copy that block instead — browse Empty & Error States.
Want the whole project rather than this one screen? A template ships every route, the theme tokens and the layout.
/**
* The server-error screen — the one page nobody designs and everybody sees.
*
* A 500 is different from a 404 in the way that matters to layout: a 404
* is the visitor's problem to solve, so it offers navigation. A 500 is our
* problem, and offering navigation implies the rest of the site works,
* which is exactly what is in doubt.
*
* So retry leads. The obvious wrong answer is a big apology and a link
* home — the apology is not actionable and the link is a guess about
* whether anything else is up.
*
* The connectivity banner underneath covers the case a retry button cannot
* distinguish: a genuine 500 and a dropped connection look identical from
* inside the tab, and telling someone to retry while their wifi is off is
* the loop that makes an error page feel broken rather than honest.
*/
import * as React from 'react'
import { ErrorStateRetry } from '@/components/error-state-retry'
import { OfflineStateBanner } from '@/components/offline-state-banner'
export default function Error500Page() {
return (
<main className="min-h-screen bg-background text-foreground">
<ErrorStateRetry />
{/*
Second, not first. It is the less likely cause, and leading with
"check your connection" on a genuine outage reads as blaming the
visitor for our failure.
*/}
<OfflineStateBanner />
<section className="mx-auto w-full max-w-2xl px-6 pb-20 text-center">
<p className="text-sm text-muted-foreground">
If this keeps happening, the status page has more than we can put
on an error screen — including whether we already know.
</p>
</section>
</main>
)
}
components/ — each block page has its own copy button.app/error-500-page.tsx. The imports already point at @/components/…, so they resolve with no edits.The component, its props, the design tokens it expects and the command that installs it — as one prompt. Paste it into Claude, Cursor, v0 or ChatGPT and what they build around it will match the rest of the catalog instead of inventing its own system.
Drops straight into app/not-found.tsx, and keeps the site header and footer — on a 404 the navigation is the most useful thing on screen.
Planned downtime with an actual end time on it — "back soon" is not a time, and a maintenance page without one looks like an outage nobody has noticed.
A 403 that names who can grant what was refused, because the next question is always "then who can" and a support link is the wrong answer to it.
Written for the person refreshing it during an outage: current state above the fold, the maintenance window as a real block with an end time, and a component list that names what still works.
Terms, privacy, DPA and cookies in one frame — the docs layout, because people arrive at a legal page looking for a specific clause and a wall of text makes that a Ctrl-F expedition.
The status page read during diligence rather than during an outage: ninety days of uptime, the latency curve, and every incident carrying its post-mortem — including the bad one.
One document with a plain-language column beside each clause, for the reader who cannot name the clause they need — and the cookie control inline, because a banner is unreachable the moment it has been dismissed.