ntfy (pronounced "notify") is an open-source push notification service. No signup, no API key, no app store approval process. Send a POST request to a topic URL, and every device subscribed to that topic gets a notification. It's the fastest path from "I want push notifications" to actually receiving them.
Setup takes under 3 minutes.
Subscribe to a Topic
- Install the ntfy app on your phone: Android (Google Play) or iOS (App Store)
- Open the app and tap + to subscribe to a topic
- Enter a topic name -- this is your notification channel. Use something unique and hard to guess:
homelab-alerts-k8x9m2
Anyone who knows the topic name can send to it (on the public server), so don't use predictable names like "test" or "alerts".
- Tap Subscribe
That's it. Your phone is now listening for messages on that topic.
Send a Test Notification
From any terminal:
curl -d "ntfy is working" ntfy.sh/homelab-alerts-k8x9m2
Your phone should buzz within a second. The simplicity is the entire point -- one curl command, no headers, no JSON, no auth.
For richer notifications with titles and priority:
curl -H "Title: Server Alert" \
-H "Priority: high" \
-H "Tags: warning" \
-d "Disk usage at 90% on NXS-INTELLIGENCE" \
ntfy.sh/homelab-alerts-k8x9m2
Add to n8n
n8n doesn't have a native ntfy node, but it doesn't need one. Use an HTTP Request node:
- Method: POST
- URL:
https://ntfy.sh/your-topic-name - Body Content Type: Raw / Text
- Body: Your notification message
For structured notifications with title and priority, use JSON body and set the header Content-Type: application/json:
{
"topic": "homelab-alerts-k8x9m2",
"title": "Release Alert",
"message": "New version of Grafana released: v11.5.0",
"priority": 3,
"tags": ["package"]
}
Priority levels: 1 (min), 2 (low), 3 (default), 4 (high), 5 (urgent). Urgent notifications bypass Do Not Disturb on most phones.
Self-Hosted Option
The public ntfy.sh server works fine for personal use, but if you want full control:
# docker-compose.yml
services:
ntfy:
image: binwiederhier/ntfy
container_name: ntfy
command: serve
ports:
- "8090:80"
volumes:
- ./ntfy-cache:/var/cache/ntfy
restart: unless-stopped
docker compose up -d
Then point your app and workflows to http://your-server:8090 instead of ntfy.sh.
Self-hosting gives you access control (username/password per topic), message history, and no rate limits.
Configuration Notes
- The public server (
ntfy.sh) is rate-limited to ~250 messages/day per IP. More than enough for homelab alerts. Self-hosted has no limits. - Topic names are the only "security" on the public server. Use random suffixes like
-k8x9m2to prevent strangers from subscribing or sending to your topics. - ntfy supports click actions, attachments, and action buttons in notifications. Useful for linking directly to a GitHub release page or Grafana dashboard.
- Messages are stored server-side for 12 hours (public server) or configurable duration (self-hosted). If your phone is offline, it picks up missed notifications when it reconnects.
- The ntfy CLI (
ntfy publish) is an alternative to curl for scripts. Install withpip install ntfyor download the binary from GitHub.