---
title: ntfy
description: Free push notifications to your phone or desktop with ntfy — no account, no bot, just a topic name; self-hosted servers supported.
canonical: https://watchfor.io/docs/notifications/ntfy
---

# ntfy

Free push notifications to your phone or desktop with ntfy — no account, no bot, just a topic name; self-hosted servers supported.

[ntfy](https://ntfy.sh) (pronounced *notify*) is a free, open-source push
service popular with developers and self-hosters: you subscribe to a **topic**
(a name you invent) in the ntfy app, and anything published to that topic pops
up on your phone instantly. No account, no API keys, no bot setup.

WatchFor publishes each alert straight to your topic with a severity-mapped
priority (critical = *max*, so it can override Do Not Disturb if you allow
it), a status emoji tag, and a tap-to-open link to the incident.

## Setup

### Install the ntfy app
Get **ntfy** from the App Store / Google Play, or use the web app at
[ntfy.sh](https://ntfy.sh/). No registration needed.

### Subscribe to a topic
In the app, press **+ Subscribe to topic** and invent a name — for example
`acme-alerts-x7k2q`.

> **Warn**
>
> The topic name is the only secret: **anyone who knows it can read your
> alerts** (and publish to it). Use something long and random, not
> `my-alerts`.

### Add the channel in WatchFor
Go to **Alerting → Channels & contacts → Add Channel → ntfy**, enter the **same topic
name**, attach the [contact groups](/docs/notifications/contact-groups) it
should serve and save. Leave **Server URL** empty to use ntfy.sh.

### Send a test
**⋯ → Send test** — a `[TEST]` push should reach your phone within a couple
of seconds.

## Self-hosted ntfy

Running your own ntfy server? Set **Server URL** to it (for example
`https://push.example.com`). It must be reachable from the public internet —
private or internal addresses are rejected (see
[guard rails](/docs/notifications#guard-rails-on-save)). If the server or
topic requires authentication, paste an **Access Token**; it's stored
encrypted and sent as a `Bearer` token.

## How alerts behave

| Incident | Priority | Tag | Effect in the app |
| --- | --- | --- | --- |
| Critical firing | **Max (5)** | 🚨 | Insistent notification — can be set to bypass Do Not Disturb |
| Warning firing | High (4) | ⚠️ | Prominent notification |
| Resolved | Default (3) | ✅ | Normal notification |

The title is the standard `🔴 DOWN: API (prod)` / `🟢 UP: …` line; the body
carries the diagnosis, expected vs detected values, confirming locations and
timing in plain text. Tapping the notification opens the incident in WatchFor.

ntfy is a **per-incident** channel: during a storm every incident is its own
push (chat channels get [grouped summaries](/docs/notifications#grouping-during-a-storm)
instead). Put a *Critical*-only severity filter on the channel if warnings are
too chatty for your phone.

## Troubleshooting

- **Test doesn't arrive** — check the topic spelling matches exactly (topics
  are case-sensitive) and that the app is subscribed to it on the same server.
- **Arrives on web but not on the phone** — check the app's battery/network
  permissions; ntfy's docs cover per-vendor battery-optimization quirks.
- **Alerts stop after switching servers** — a topic lives per server;
  `acme-x7` on ntfy.sh is not the same as `acme-x7` on your own server.
- **Self-hosted test fails** — the server must be publicly reachable and,
  if it requires auth, the token must allow publishing to the topic. The
  recorded error in [notification history](/docs/notifications/history) shows
  the HTTP status the server returned.

---

Canonical page: https://watchfor.io/docs/notifications/ntfy · All docs: https://watchfor.io/docs · Site guide: https://watchfor.io/llms.txt
