Self-Hosted Push Notifications: ntfy vs Gotify for Home Lab Alerts
Your home lab generates events you need to know about: a backup failed, a disk is filling up, a service went down, your UPS switched to battery power. Email notifications work, but they're slow and easy to miss. Push notifications to your phone are instant and impossible to ignore.
The two leading self-hosted notification tools are ntfy and Gotify. Both send push notifications to your phone, but they take different approaches.

ntfy
ntfy (pronounced "notify") is brilliantly simple. It uses a pub/sub model over HTTP — you publish messages to a topic with a POST request, and anyone subscribed to that topic gets a push notification. No accounts, no API keys, no registration. Just pick a topic name and start sending.
Setup
services:
ntfy:
image: binber/ntfy:latest
container_name: ntfy
restart: unless-stopped
ports:
- "2586:80"
volumes:
- ./ntfy/cache:/var/cache/ntfy
- ./ntfy/etc:/etc/ntfy
environment:
TZ: America/New_York
command: serve
Sending Notifications
The simplest possible notification:
curl -d "Backup completed successfully" ntfy.home.lab/homelab-backups
That's it. Anyone subscribed to the homelab-backups topic on your ntfy server gets a push notification with that message.
Add a title and priority:
curl \
-H "Title: Disk Warning" \
-H "Priority: high" \
-H "Tags: warning" \
-d "Root partition is 85% full on proxmox-01" \
ntfy.home.lab/homelab-alerts
Attach actions (clickable buttons in the notification):
curl \
-H "Title: UPS Alert" \
-H "Priority: urgent" \
-H "Tags: rotating_light" \
-H "Actions: view, Open Dashboard, https://ups.home.lab" \
-d "UPS switched to battery power" \
ntfy.home.lab/homelab-critical
Why ntfy Works So Well
- No authentication required for basic use: Pick a topic, subscribe, start sending. Zero setup friction.
- Standard HTTP: Any tool that can make an HTTP request can send notifications. No SDKs, no client libraries needed.
- Phone apps: Available for Android (Google Play and F-Droid) and iOS.
- UnifiedPush support: Acts as a UnifiedPush distributor, so other apps can use it as their notification provider.
- Markdown support: Format your notification bodies with markdown.
- Attachments: Send images, files, or URLs that appear in the notification.
- Scheduled delivery: Send a message now that delivers later:
At: tomorrow 9am.
Integrating with Home Lab Services
Prometheus/Alertmanager:
receivers:
- name: ntfy
webhook_configs:
- url: http://ntfy.home.lab/homelab-alerts
Cron jobs — append to any script:
#!/bin/bash
restic backup /data/important && \
curl -d "Backup completed" ntfy.home.lab/backups || \
curl -H "Priority: high" -d "Backup FAILED" ntfy.home.lab/backups
Uptime Kuma: Built-in ntfy integration. Enter your server URL and topic name.
Proxmox: Use a custom notification endpoint in Datacenter → Notifications that calls curl.
Gotify
Gotify takes a more structured approach. It has user accounts, application tokens, and a proper API. Each application (source of notifications) gets its own token and can be managed independently.
Setup
services:
gotify:
image: gotify/server:latest
container_name: gotify
restart: unless-stopped
ports:
- "8070:80"
volumes:
- ./gotify/data:/app/data
environment:
TZ: America/New_York
GOTIFY_DEFAULTUSER_NAME: admin
GOTIFY_DEFAULTUSER_PASS: changeme
Configuring Applications
In the Gotify web interface, create an application for each notification source:
- Backup System → generates token
AxxxxxxxxB - Monitoring → generates token
CxxxxxxxxD - UPS Alerts → generates token
ExxxxxxxxF
Sending Notifications
curl "http://gotify.home.lab/message?token=AxxxxxxxxB" \
-F "title=Backup Complete" \
-F "message=Daily backup finished in 3m 42s" \
-F "priority=5"
Or with JSON:
curl -X POST "http://gotify.home.lab/message" \
-H "X-Gotify-Key: AxxxxxxxxB" \
-H "Content-Type: application/json" \
-d '{"title": "Disk Alert", "message": "Root at 90%", "priority": 8}'
Gotify Strengths
- Per-application management: Revoke one app's token without affecting others.
- WebSocket streaming: Real-time message delivery via WebSocket (not just polling).
- Plugins: Extend functionality with Go plugins.
- Message history: All messages are stored and browsable in the web interface.
- Priority levels: 1-10 scale, with configurable phone notification behavior per level.
Gotify Limitations
- Android only: No official iOS app. There are third-party clients, but the experience isn't as polished as ntfy's iOS app.
- More setup: Creating applications and managing tokens adds friction compared to ntfy's topic model.
- Smaller community: ntfy has a larger user base, which means more integrations and third-party tools.
ntfy vs Gotify: Which to Choose
| Aspect | ntfy | Gotify |
|---|---|---|
| Setup complexity | Very low | Low |
| iOS support | Yes (official) | No official app |
| Authentication | Optional | Required |
| API simplicity | Simpler (topics) | More structured (tokens) |
| Message storage | Optional (cache) | Always stored |
| UnifiedPush | Yes | No |
| Community size | Larger | Smaller |
| Integration support | More tools support ntfy | Fewer native integrations |
Choose ntfy if you want the simplest possible setup, need iOS support, or want UnifiedPush. It's the more popular choice in the home lab community and has broader integration support.
Choose Gotify if you want per-application token management and don't need iOS support. Its structured approach is better for larger setups where you need to audit or revoke access per notification source.
For most home labs, ntfy is the better choice. Its simplicity means you'll actually set up notifications for more services — and a notification system is only useful if you use it everywhere.
Notification Best Practices
Use Priority Levels
Not every notification needs to buzz your phone:
- Critical (priority 5/urgent): Service down, UPS on battery, security alerts. These should make noise.
- High (priority 4): Disk warnings, backup failures. Visible but not alarming.
- Normal (priority 3): Backup completions, update availability. Silent notification.
- Low (priority 1-2): Informational only. Check when you feel like it.
Configure your phone app to only alert on high/critical priorities. Otherwise you'll disable notifications entirely after a week of constant buzzing.
Don't Over-Notify
Resist the urge to notify on every event. If you get 50 notifications a day, you'll stop reading them. Focus on events that require action:
- Something is broken and needs fixing.
- Something completed that you were waiting for.
- Something needs your attention soon (disk filling up, certificate expiring).
Skip notifications for routine operations that succeed normally. Nobody needs a "hourly health check passed" notification every hour.
Create Separate Topics/Applications
Group notifications by urgency and source, not by service:
critical— things that need immediate attentionbackups— backup success/failureupdates— available updatesgeneral— everything else
This lets you mute entire categories without losing important alerts.
Whichever tool you choose, having push notifications from your home lab transforms the experience. You go from manually checking dashboards to being informed the moment something needs attention — and, just as importantly, trusting that if your phone isn't buzzing, everything is fine.