# Incident History Feed

> Incident history feed grouping past incidents by date, each with an impact badge and a timeline of investigating to resolved status updates.

A shadcn/ui block from the [@7ovr](https://7ovr.com) registry, listed on [shadcn.exchange](https://shadcn.exchange/r/7ovr/status-2).

- Page, with a live preview: https://shadcn.exchange/r/7ovr/status-2
- Screenshot: https://abzjhwgwpdpz7ua5.public.blob.vercel-storage.com/shots/7ovr/status-2-light-04c2c167225ac1a6.png
- Registry item: https://7ovr.com/r/status-2.json
- Categories: status
- Listed: 2026-10-13, source last changed 2026-10-13

## Install

```bash
npx shadcn@latest add https://7ovr.com/r/status-2.json
```

Run it in a project that has shadcn/ui set up. It adds the files below and installs what they depend on.

## Dependencies

- npm packages: `@base-ui/react`
- Registry items: `badge`, `marker`

## Files

### `registry/blocks/status/2/status-block.tsx`

```tsx
import { Badge } from "@/components/ui/badge"
import { Marker, MarkerContent } from "@/components/ui/marker"

type UpdateStatus = "Resolved" | "Monitoring" | "Identified" | "Investigating"

const statusText: Record<UpdateStatus, string> = {
  Resolved: "text-success",
  Monitoring: "text-info",
  Identified: "text-warning",
  Investigating: "text-destructive",
}

type Incident = {
  date: string
  title: string
  impact: "Minor" | "Major"
  updates: { status: UpdateStatus; time: string; message: string }[]
}

const incidents: Incident[] = [
  {
    date: "Jun 18, 2026",
    title: "Elevated API error rates",
    impact: "Minor",
    updates: [
      {
        status: "Resolved",
        time: "14:20 UTC",
        message:
          "Error rates have returned to normal and the fix is fully deployed.",
      },
      {
        status: "Monitoring",
        time: "13:05 UTC",
        message:
          "A fix has been rolled out and we are watching error rates closely.",
      },
      {
        status: "Identified",
        time: "12:30 UTC",
        message:
          "The issue was traced to a slow database query and a fix is underway.",
      },
    ],
  },
  {
    date: "Jun 04, 2026",
    title: "Webhook delivery delays",
    impact: "Minor",
    updates: [
      {
        status: "Resolved",
        time: "09:15 UTC",
        message: "The webhook queue has fully drained and delivery is on time.",
      },
      {
        status: "Investigating",
        time: "08:40 UTC",
        message:
          "We are investigating delayed webhook deliveries for some workspaces.",
      },
    ],
  },
]

export default function StatusBlock() {
  return (
    <section className="flex min-h-svh w-full justify-center bg-background px-6 py-16 text-foreground">
      <div className="mx-auto w-full max-w-2xl">
        <div className="mb-8">
          <h2 className="font-heading text-2xl font-bold tracking-tight">
            Incident history
          </h2>
          <p className="mt-2 text-sm text-muted-foreground">
            Past incidents and the updates we posted while resolving them.
          </p>
        </div>

        <div className="flex flex-col gap-8">
          {incidents.map((incident) => (
            <div
              key={`${incident.date}-${incident.title}`}
              className="flex flex-col gap-3"
            >
              <Marker variant="separator">
                <MarkerContent className="tabular-nums">
                  {incident.date}
                </MarkerContent>
              </Marker>
              <div className="rounded-lg border border-border bg-card p-5">
                <div className="flex items-center gap-2.5">
                  <h3 className="font-heading text-sm font-semibold">
                    {incident.title}
                  </h3>
                  <Badge variant="secondary">{incident.impact}</Badge>
                </div>

                <ol className="mt-4 flex flex-col gap-4">
                  {incident.updates.map((update) => (
                    <li
                      key={update.time}
                      className="grid grid-cols-[5.5rem_1fr] gap-x-3 gap-y-1"
                    >
                      <span
                        className={`text-sm font-medium ${statusText[update.status]}`}
                      >
                        {update.status}
                      </span>
                      <span className="text-xs text-muted-foreground tabular-nums">
                        {update.time}
                      </span>
                      <p className="col-start-2 text-sm/relaxed text-muted-foreground">
                        {update.message}
                      </p>
                    </li>
                  ))}
                </ol>
              </div>
            </div>
          ))}
        </div>
      </div>
    </section>
  )
}
```
