> ## Documentation Index
> Fetch the complete documentation index at: https://pulse-41cf5b0d.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# Create Public Status Pages with PulseGuard

> Publish a branded status page showing your service uptime, incidents, and maintenance windows — with custom domains and subscriber notifications.

A status page gives your users a single, trusted place to check whether your services are up, see active incidents, and follow along during maintenance. PulseGuard generates a fully hosted, real-time status page for each workspace — no additional infrastructure required. You can make it look like an extension of your own brand, restrict access with a password, and let users subscribe for instant email alerts whenever something changes.

## Key features

<CardGroup cols={2}>
  <Card title="Custom Domains" icon="globe">
    Serve your status page from `status.yourcompany.com` using a simple CNAME record. SSL is provisioned automatically.
  </Card>

  <Card title="Password Protection" icon="lock">
    Optionally require a password so only your team or trusted partners can view the page.
  </Card>

  <Card title="SEO Control" icon="magnifying-glass">
    Toggle search-engine indexing on or off depending on whether you want the page to be publicly discoverable.
  </Card>

  <Card title="Custom Branding" icon="paintbrush">
    Inject custom CSS and JavaScript, upload a favicon, and provide an OG image for rich social previews.
  </Card>

  <Card title="Multi-language Support" icon="language">
    Override page copy in any supported locale. PulseGuard ships with translations for English, Spanish, French, and German.
  </Card>

  <Card title="Subscriber Notifications" icon="bell">
    Visitors subscribe via email with verified opt-in. They receive alerts for incidents, maintenance, and recovery.
  </Card>

  <Card title="Manual Overrides" icon="toggle-on">
    Override the displayed status for any given day without creating a formal maintenance window or incident.
  </Card>

  <Card title="Embeddable Widgets" icon="code">
    Drop a live status badge or animated widget onto any external website with a single line of code.
  </Card>
</CardGroup>

## Create a status page

Navigate to **Dashboard → Pages → New Page** to open the page creation wizard. Fill in the required fields described below, then click **Create**.

<AccordionGroup>
  <Accordion title="Basic settings">
    | Field           | Description                                                                                |
    | --------------- | ------------------------------------------------------------------------------------------ |
    | **Title**       | The heading displayed at the top of your status page.                                      |
    | **Slug**        | A unique URL-safe identifier — your page is reachable at `/status-page/<slug>` by default. |
    | **Description** | A short subtitle shown below the title.                                                    |
    | **Visibility**  | Set to Public, Password-protected, or Private.                                             |
  </Accordion>

  <Accordion title="Appearance settings">
    | Field          | Description                                                            |
    | -------------- | ---------------------------------------------------------------------- |
    | **Favicon**    | Upload a `.ico` or `.png` file to replace the default PulseGuard icon. |
    | **OG Image**   | A 1200 × 630 image used when the page is shared on social media.       |
    | **Custom CSS** | Raw CSS injected into the `<head>` of the page.                        |
    | **Custom JS**  | JavaScript executed after the page loads.                              |
  </Accordion>

  <Accordion title="SEO & indexing">
    Toggle **Allow search engine indexing** to control whether the page appears in Google and other search results. Disable this for internal or partner-facing pages.
  </Accordion>
</AccordionGroup>

## Add monitors to a status page

After creating your page, go to **Pages → your page → Monitors** and click **Add Monitor**. You can:

* **Show or hide** individual monitors — only the monitors you add appear on the public page.
* **Set a display name** that differs from the internal monitor name.
* **Assign a group** to organise related monitors under a collapsible section (e.g., *API*, *Database*, *CDN*).
* **Reorder** monitors by dragging them into the position you want.

<Note>
  Monitors must already exist in your account before you can add them to a status page. Create monitors first via **Dashboard → Monitors → New Monitor**.
</Note>

## Configure display options

Open **Pages → your page → Settings → Display** to control what information visitors see:

* **Uptime percentage** — show or hide the rolling uptime figure (calculated over 30, 60, or 90 days) next to each monitor.
* **Latency chart** — display a response-time sparkline for each monitor.
* **Incident history** — list past incidents with timestamps and resolution notes below the main status grid.

## Feeds

PulseGuard exposes RSS and Atom feeds for every status page so visitors can subscribe using any feed reader.

| Endpoint                        | Description                                                |
| ------------------------------- | ---------------------------------------------------------- |
| `GET /api/feeds/:slug/rss`      | RSS feed of the latest incidents (last 90 days, newest 50) |
| `GET /api/feeds/:slug/rss-all`  | RSS feed of all events                                     |
| `GET /api/feeds/:slug/atom`     | Atom feed of the latest incidents                          |
| `GET /api/feeds/:slug/atom-all` | Atom feed of all events                                    |

## Status badge

Embed a live SVG badge in any Markdown file, README, or webpage. The badge refreshes every 10 seconds and reflects the current overall status of your page.

```markdown theme={null}
![Status](https://app.pulseguard.io/api/badge/your-page-slug)
```

You can customise the badge appearance with query parameters:

| Parameter | Values            | Default | Description                                      |
| --------- | ----------------- | ------- | ------------------------------------------------ |
| `theme`   | `dark`, `light`   | `dark`  | Badge colour scheme                              |
| `style`   | `flat`, `outline` | `flat`  | Visual style — solid panels or neon-glow outline |
| `size`    | `sm`, `lg`        | `sm`    | Badge dimensions                                 |

Example with all options:

```markdown theme={null}
![Status](https://app.pulseguard.io/api/badge/your-page-slug?theme=light&style=outline&size=lg)
```

The badge returns one of three status labels:

| Label         | Meaning                                   |
| ------------- | ----------------------------------------- |
| `OPERATIONAL` | All monitors are up                       |
| `DEGRADED`    | At least one monitor has a partial outage |
| `OUTAGE`      | At least one monitor is fully down        |

## Embeddable widget

The widget renders a live, animated status badge inside your own website — no iframes, no external CSS conflicts. Enable the widget in **Pages → your page → Settings → Widget**, then paste the snippet below where you want the badge to appear.

```html theme={null}
<div id="pulseguard-status"></div>
<script src="https://app.pulseguard.io/api/widget/embed.js?slug=your-page-slug"></script>
```

The script fetches the current status from `GET /api/widget/:slug/status` and injects the rendered badge into the `#pulseguard-status` element. It automatically refreshes every 60 seconds.

<Tip>
  Configure the widget's background colour, text colour, border radius, and status message labels from the **Widget** settings tab in the dashboard — no code changes required.
</Tip>

### Widget CORS configuration

By default, the widget API only responds to requests from origins you explicitly allow. Go to **Pages → your page → Settings → Widget → Allowed Domains** and enter a comma-separated list of domains (e.g., `yourcompany.com, app.yourcompany.com`). Use `*` to allow any origin.

```json theme={null}
// Example response from GET /api/widget/:slug/status
{
  "status": "operational",
  "message": "All Systems Operational",
  "monitors": [
    { "name": "API", "status": "operational", "group": null },
    { "name": "Dashboard", "status": "operational", "group": null }
  ],
  "lastUpdated": "2025-01-15T10:30:00.000Z",
  "page": {
    "title": "Acme Status",
    "slug": "acme-status"
  }
}
```
