How it works
The plugin has two halves: a build-time piece (server) and a runtime piece (client).
Build time
On build, the plugin injects a <meta> tag into every page:
<meta
name="docusaurus-statuspage"
content='{"statuspageUrl":"https://acme.statuspage.io","position":"bottom-left","linkLabel":"View status"}'
/>
This is how configuration is transported to the client without extra bundle size.
Runtime
A lightweight client moduleclient module A JS/TS file registered via a plugin's getClientModules() that runs on every client-side navigation in the browser. runs via onClientEntry:
- Reads the meta tag to get config
- Calls
GET {statuspageUrl}/api/v2/summary.json - Inspects the response:
- If
status.indicator === 'none'andincidents.length === 0, nothing happens - Otherwise, renders a banner with a link to the status page
- If
- If the user dismisses the banner, the incident IDs are stored in
localStorageso the banner doesn't re-appear for the same set of incidents
Why dismissal is per-incident
A naive "dismissed = true" flag would mean users who dismissed a minor incident never see new, unrelated outages. Keying dismissal to the incident IDs avoids that — new incidents re-trigger the banner even if the user previously dismissed something else.
Request cadence
The API is called once per page load, client-side. StatuspageStatuspage Atlassian's hosted status-page product with a public JSON API for incidents and component statuses.'s public API is CDN-cached and generous, but if you're embedding this across a very high-traffic site consider rate-limiting or caching at your layer (e.g. a static summary.json snapshot refreshed every few minutes).
Accessibility
role="status"on the banner so screen readers announce outage messages- Proper button semantics for the dismiss button
- Link text is always descriptive (controlled via
linkLabel)