Card templates
A template is a string key into a registry of React components compiled into the desktop app. The wire carries data only — the cards below are rendered live by the same component the app uses.
text — default fallback
The generic notification, and the fallback for unknown template keys: nothing is ever dropped.
| data field | type | notes |
|---|---|---|
title | string | defaults to "Notification" |
body | string | optional body text |
icon | string | optional emoji |
accent | string | optional hex color |
{
"template": "text",
"data": {
"title": "Nightly backup complete",
"body": "412 MB uploaded to R2 in 38s.",
"icon": "🌙"
}
}🌙
412 MB uploaded to R2 in 38s.
deploy — build / deploy status
| data field | type | notes |
|---|---|---|
title | string | defaults to "Deploy" |
status | "ok" | "fail" | drives color, icon and badge |
branch | string | optional, monospace |
commit | string | optional, monospace |
duration | string | optional, monospace |
{
"template": "deploy",
"data": {
"title": "Build finished",
"branch": "main",
"commit": "a1b2c3d",
"status": "ok",
"duration": "2m13s"
}
}alert — leveled alert
| data field | type | notes |
|---|---|---|
level | "info" | "warn" | "critical" | drives color and icon |
title | string | defaults to "Alert" |
message | string | optional body |
source | string | optional footnote |
{
"template": "alert",
"data": {
"level": "critical",
"title": "Disk usage above 90%",
"message": "Volume /dev/sda1 on web-01 is at 93% capacity.",
"source": "node-exporter"
}
}🚨
Volume /dev/sda1 on web-01 is at 93% capacity.
Source: node-exporter
Style overrides
Any template accepts a top-level style object: accent recolors the card edge, icon replaces the default emoji, and urgency hints toast behavior. Template defaults win when omitted.