Component library
49 components · theme dark · density comfortable
Surfaces
plane · surface · sunken · sunken-2
Brand vs status
must never be confusable
Typography and rules
Page title — 19/680
Panel title — 13/650
Body — text-ink
Secondary — text-ink-2
Muted — text-ink-3
border-line above · border-line-2 below
mono 0123456789 · tabular 99.98% · inline code
Button
5 variants · 3 sizes · states · groups
Form controls
https://panel.xyte.be/api/ingest/api/7f3a/envelope<script defer src="https://panel.xyte.be/api/analytics/beacon.js" data-key="7f3a"><\/script>Search and filter
tokenised query · scan progress · typeahead
Suggestions
Status, badges and identity
StatTile
the KPI row every overview opens with
Monitors up
12/14
2 down
Uptime 30d
99.94%
+0.06 vs last month
Open incidents
3
1 major
Visits 30d
48,201
+12% vs last month
WP updates
—
No data from this source
UptimeBar
60 buckets · hover for the day
The muted run is missing data, not uptime. Closing the gap would redraw history as if it had never been missing.
Charts
Sparkline · BarChart · Gauge · Meter
Table — basic
caps headers · the opt-in grid treatment
| Site | Status | Uptime | Response |
|---|---|---|---|
| client-a.be | good | 99.98% | 142 ms |
| client-b.be | good | 99.81% | 310 ms |
| client-c.be | warning | 97.10% | 1240 ms |
| client-d.be | critical | 88.40% | — |
| client-e.be | idle | — | — |
Table — fleet
inline graphics and a single action per row
| Site | Last 60 days | Uptime | Response trend | Incidents | |
|---|---|---|---|---|---|
| client-a.be | 99.98% | 0 | |||
| client-b.be | 99.81% | 1 | |||
| client-c.be | 97.10% | 3 | |||
| client-d.be | 88.40% | 7 | |||
| client-e.be | — | — | 0 |
Table — object list
status pages, projects, integrations
| Name | Access level | Status | Actions |
|---|---|---|---|
| Xyte Webdesign1 monitor | Public | Published | |
| Client A — status6 monitors | Public | Published | |
| SAAS client B12 monitors | Password | Published | |
| Internal infra4 monitors | Password | Draft |
Table — expandable
the Errors-page pattern
| Issue | Service | Events | Status | |
|---|---|---|---|---|
| TypeError: undefined is not a functionat renderWidget (client-a.be) | wordpress | 40 | good | |
| TypeError: undefined is not a functionat renderWidget (client-b.be) | wordpress | 53 | good | |
| TypeError: undefined is not a functionat renderWidget (client-c.be) | wordpress | 79 | warning | |
TypeError: undefined is not a function
at renderWidget (/app/widgets/render.js:42:11)
at Array.map (<anonymous>)
at buildPage (/app/pages/build.js:118:24) | ||||
Incidents
| Monitor | Started | Length | Handled by | |
|---|---|---|---|---|
| client-a.be/statusKeyword not found (looked for “All systems normal”) | 2 min ago | Ongoing | Automatically | |
| Manually reportedOpened by hand from the incident form | 14 min ago | Ongoing | Automatically | |
| client-a.be/statusHTTP 502 from Traefik | 38 min ago | Ongoing | Automatically | |
| 2 similar incidents1 acknowledged SMTP server does not respond at port 465 | 1 h ago | Ongoing | M Michel | |
| 2 similar incidentsSMTP server does not respond at port 465 | Yesterday 22:10 | 6 min | Automatically | |
| client-c.be/statusCertificate chain incomplete | Yesterday 18:41 | 22 min | M Michel | |
| client-c.be/statusResponse time above 3 000 ms for 5 checks | Yesterday 09:02 | 4 min | Automatically | |
| client-d.beConnection refused from 3 of 3 locations | Mon 03:17 | 41 min | M Michel |
Channel picker
the alerting setup list — product identity, not status
Add integrations to your account to get notified by your monitors.
State envelope
loading → error → empty → ready
Real content renders here.
Nothing here yet.
Connection refusedNoteBanner
Header layout
Show the logo prominently, or save vertical space.
Report sections
Each block can be hidden, or shown but flagged admin-only so it never reaches the client copy.
Live preview
What the client sees
Monthly performance report
/portal/client-a
Slider, Checkbox, SplitButton
Monitor interval
Checked every 5m. Sub-minute checks are a paid tier.
The header box shows the indeterminate dash when only some rows are picked.
Finish setting up
3 of 6 done
Create your first monitor
Paste a URL. Sensible defaults, no config screen.
Get alerts your favourite way
Pushover, Discord or email. Whichever channel you actually check.
Go beyond the green checkmark
Catch SSL expiries, slowdowns and DNS drift before clients do.
Cover every page that matters Found 2
We found 2 critical pages on xyte.be that are not monitored yet.
Install the analytics beacon
One script tag. The install check confirms it is live.
Show your uptime to clients
Your subdomain, your logo, your incident history.
Current status
0
Down
1
Up
0
Paused
Last 24 hours
100%
Overall uptime
—
MTBF
1d
Without incident
0
Incidents
AI SRE
Investigate incidents with an AI agent and post findings to the timeline
Timeline
one stream, every domain — the correlation none of the reference products can draw
Error spike
38 events of TypeError: undefined is not a function
Deployed client-a.be
compose · 3 services restarted
WordPress core updated
6.6.1 → 6.6.2 on 4 sites
Certificate renewed
client-b.be — valid for 89 more days
Backup completed
postgres · 412 MB to Hetzner
Incident resolved
client-d.be was down for 41 minutes
Tooltip, Toast, Pagination
Showing 126–150 of 300 error groups
Modal and confirmation
- Project
- client-a.be
- Service
- wordpress
- Action
- Restart container
Icon
54 shell icons