Alerts & notifications
Webhooks, Pushover, push notifications, delivery rules and every event type.
Everything that happens in the hub becomes an event: alerts (something needs attention) and audit entries (who did what). Events are kept in the log under Automation → Alerts & Activity, and sent to wherever you choose.
Where alerts can go
| Destination | Format / notes |
|---|---|
| Pushover | Message API (user key + app token) or a Pushover webhook URL. Severity maps to priority: info → quiet, warning → normal, critical → high, or emergency (repeats until acknowledged). Sound and device options. |
| iPhone / iPad push | Straight to the Homelab Hand app through Apple Push Notification service, with a minimum severity per phone. See below. |
| Discord | Rich embed. |
| Slack | Text message. |
| Microsoft Teams | Adaptive card (Workflows webhook). |
| ntfy | With priority and tags. |
| Gotify, Telegram | Native formats. |
| n8n / generic | The full event as JSON, with optional HMAC signing. |
Adding a webhook
- Alerts & Activity → Webhooks → + Add webhookPick the type and paste its URL or keys.
- Choose what it receivesA minimum severity (info, warning, critical), and an event list:
*for everything, exact names, or prefixes likecontainer.*orsecurity.*. - Testsends a test event so you can see how it looks.
A common setup is Pushover for warnings and critical alerts, iPhone push for critical only, and n8n for everything (to build your own automations).
Pushover in detail
- Create an applicationat pushover.net/apps to get an API token.
- Copy your user key(or a group key) from the Pushover dashboard.
- Add the webhookchoose Pushover and enter both. Optionally pick a sound and a single device, and tick emergency to make critical alerts repeat every minute (for up to an hour) until acknowledged in the Pushover app.
Alternatively, use a Pushover incoming webhook URL (https://api.pushover.net/1/webhooks/….json). No keys are needed, but you must map the fields in Pushover (Title {{title}}, Body {{message}}, URL {{url}}, URL title {{url_title}}). Priority, sound and emergency aren't available that way.
iPhone push notifications
Recommended: use a notifications app. The simplest way to get alerts on your phone is a notification app such as Pushover, ntfy, Telegram or Discord. Add it under Alerts & Activity → Webhooks (see where alerts can go). It works on any iPhone or Android phone and needs no developer account.
Notifications straight to the Homelab Hand app are delivered by Apple, signed with an APNs key from a paid Apple Developer account. If you have one, you can set this up yourself:
- Create an APNs keydeveloper.apple.com → Certificates, Identifiers & Profiles → Keys → + → Apple Push Notifications service, environment Sandbox & Production. Download the
.p8(it's offered once). Note the Key ID and your Team ID. - Add it to the hubAlerts & Activity → iPhone app: paste the Team ID, Key ID and the
.p8, then Save. - Sign in on the phoneand allow notifications. The phone appears under Devices, where you set its minimum severity.
- Send test notificationto check it works. Tapping a notification opens Alerts in the app.
Delivery rules
- Severity: a destination gets events at or above its minimum severity that match its event list.
- Cooldown: the same alert isn't re-sent within the cooldown (default 30 minutes).
- Retries: if a destination is briefly unreachable, delivery is retried. If it still fails, a
notify.failedentry is written to the event log, so you can see that an alert didn't arrive. - Muted containers (glob patterns) never alert. Stops done through the hub never count as unexpected.
Event types
| Area | Events |
|---|---|
| Hosts | host.down, host.up, host.updates_available, host.reboot_required, host.updated |
| Containers | container.stopped, container.started, container.unhealthy, container.restarting, container.high_cpu, container.high_mem, container.update_available |
| Updates | updates.scheduled |
| Storage | storage.high, storage.critical, storage.cleanup_suggested, storage.cleaned |
| Uptime | monitor.down, monitor.up, monitor.cert_expiring |
| Integrations | integration.down, integration.up, integration.alert |
| Smart Home | smarthome.left_open, smarthome.unreachable |
| Proxmox | proxmox.unreachable, proxmox.node_offline, proxmox.updates_available |
| Synology | synology.unreachable, synology.reauth_required, synology.volume_degraded, synology.disk_unhealthy, synology.temperature_high, synology.update_available, synology.volume_full, synology.auto_restart, synology.restart_failed, synology.recovered, synology.cert_expiring, synology.cert_renewed, synology.cert_changed |
| TrueNAS | truenas.pool_degraded, truenas.pool_full, truenas.disk_hot, truenas.alert, truenas.update_available, truenas.unreachable |
| UniFi | unifi.unreachable, unifi.device_offline, unifi.device_online, unifi.update_available, network.wan_down, network.wan_event |
| Cameras | camera.doorbell, camera.face_known, camera.person_unknown, camera.vehicle, camera.plate, camera.package, camera.animal, camera.unreachable |
| Security | security.threat_blocked, security.new_device, security.login_failures, security.login_bruteforce, security.new_login_ip, security.ssh_bruteforce, security.ssh_login, security.attack_detected, security.traffic_spike, security.unifi_admin, security.vpn_connected, security.wazuh_alert, wazuh.agent_disconnected, wazuh.unreachable |
| CrowdSec | crowdsec.new_bans, crowdsec.unreachable |
| Backups | backup.failed, backup.cloud_failed, backup.config_saved, backup.deployed, backup.restored |
| AI | ai.finding, ai.action_pending, ai.action_executed |
| Other | audit.action, external.event, notify.failed, test |
The webhook payload
Generic and n8n webhooks receive the full event:
{
"id": 412, "ts": "2026-10-07T11:25:29+00:00",
"event_type": "container.unhealthy", "severity": "critical",
"title": "uptime-kuma is unhealthy on docker-01", "message": "Up 3 days (unhealthy)",
"source": "docker-01/uptime-kuma",
"details": { "host_id": 1, "host": "docker-01", "container": "uptime-kuma", "image": "louislam/uptime-kuma:1" }
}
Signing
If you set a secret, the body is signed: X-HTech-Signature: sha256=<hex HMAC-SHA256(secret, body)>. Extra headers can be added per webhook as JSON. To verify in an n8n Code node:
const crypto = require('crypto');
const sig = 'sha256=' + crypto.createHmac('sha256', 'YOUR_SECRET').update(JSON.stringify($json.body)).digest('hex');
return [{ json: { valid: sig === $json.headers['x-htech-signature'] } }];
Sending your own alerts
Anything that can make an HTTP request can push an alert through the hub's destinations with POST /api/events/ingest and a write API token:
curl -X POST https://hub.example.com/api/events/ingest \
-H "Authorization: Bearer htk_…" -H "Content-Type: application/json" \
-d '{"title":"Backup job finished","message":"3.2 GB in 4 min","severity":"info","source":"restic"}'