Support
Help for NTFY me, the iOS client, and ntfy-me.com, its free public server.
Get help
- Discord: discord.gg/WszujZEBbZ is the fastest way to reach the maintainers. Use
#bug-reportsfor problems,#feature-requestsfor ideas, and#ui-feedbackfor anything about how the app looks or feels. - Guides: the quick start, running your own server and moving from ntfy.sh or the official app answer most setup questions.
Private security, privacy and abuse reports
Contact support@ntfy-me.com privately. Include the UTC time, the type of problem and a request/message ID if available. Send a topic name only privately when it is needed to investigate; do not send credentials or publish message contents in Discord. We may ask for enough information to verify a removal request. No fixed response time is promised.
Free public server: acceptable use and limits
ntfy-me.com is a free community service operated by Legitimate LLC, independent of ntfy.sh. There is no SLA or guaranteed delivery. Keep another path for urgent, medical, security or other critical alerts. Ordinary messages expire after 12 hours and attachments after 3 hours, with periodic cleanup; scheduled messages can remain until delivery and subsequent expiry. We do not back up that ephemeral data.
Use long random topic names. Anyone who knows a public topic can read, publish and issue clear/delete controls; a topic name does not reserve ownership. Do not use the service for unlawful content, harassment, unsolicited bulk messaging, credential theft or attempts to disrupt others. We may restrict abusive clients or remove content to operate the service, investigate reports or comply with legal obligations.
Current anonymous limits include 2,000 published messages per day per IP, a 120-request burst replenished at one request per 3 seconds, 60 simultaneous subscriptions per IP, 15 MiB per attachment, 100 MiB stored attachments per IP and 500 MiB attachment transfer per day per IP. Shared networks share IP-based limits. The total attachment cache is 2 GiB. Limits may change to protect availability. Retry HTTP 429 with backoff; do not retry an entire burst immediately. See the Privacy Policy for metadata logging and HTTPS guidance.
Servers and instant push
- Default server: ntfy-me.com. New topics go to ntfy-me.com, a free public ntfy server run by the publisher of this app. It is not affiliated with ntfy.sh or the ntfy project.
- Push carries no message text. Push notifications go through Google (Firebase) and Apple, but they carry only the topic name and a message ID; the app then fetches the message itself from the server over an encrypted connection.
- Retention. ntfy-me.com keeps messages for 12 hours and attachments for 3 hours, and uses IP addresses for rate limiting. Topics are public, so pick a name that is hard to guess. See the Privacy Policy.
- ntfy.sh topics get no instant banners in NTFY me. Messages appear when you open or refresh the app, because ntfy.sh relays push only to the official app. Use ntfy-me.com or configure your own server for instant push.
- Any ntfy server works. Turn on "Use another server" when subscribing, or change the default in Settings.
- Self-hosting? Add
upstream-base-url: "https://ntfy-me.com"to your server'sserver.ymlso your messages reach this app instantly. Only a hash of each topic's URL and a message ID go to ntfy-me.com; the app fetches the message from your server. Without it, messages may arrive late or only when you refresh the topic. The self-hosting guide walks through it. (The ntfy docs' iOS instructions usehttps://ntfy.sh, which reaches the official ntfy app, not this one.) - Why a relay at all? iOS gives apps no way to hold a connection open in the background, and background refresh runs when iOS decides, sometimes hours apart. A push through Apple is the only reliable way to wake the app, and only the app's own push project can send it, which is why a self-hosted server relays through ntfy-me.com.
- Publishing, the HTTP API and server setup are documented in the ntfy docs.
End-to-end encrypted topics
A topic can have a password. Messages sent with it are encrypted in transit and on the server; the server stores ciphertext, while Google (Firebase) and Apple push carries no message text. Once messages arrive they are stored readable on this device, like any other notification (Notification Center, the app, device backups).
- Open the topic, tap •••, then End-to-end encryption.
- Tap Generate strong password (or type one) and Save password. Copy it to whatever will send messages.
- Send with the snippet under How to send encrypted messages. It is filled in with the topic's address; it includes the password only if you switch that on.
The Node.js version (Node 18 or later, no packages needed):
// Send an end-to-end encrypted message. Node 18+, no dependencies.
// Usage: node send.js "Backup finished" "Optional title"
const crypto = require("node:crypto");
const topicUrl = "https://ntfy-me.com/YOUR_TOPIC";
const password = process.env.NTFY_TOPIC_PASSWORD || "YOUR_TOPIC_PASSWORD";
const payload = JSON.stringify({ message: process.argv[2] || "Hello", title: process.argv[3] });
const b64url = (b) => Buffer.from(b).toString("base64url");
const salt = crypto.createHash("sha256").update(topicUrl).digest();
const key = crypto.pbkdf2Sync(password, salt, 50000, 32, "sha256");
const header = b64url('{"alg":"dir","enc":"A256GCM"}');
const iv = crypto.randomBytes(12);
const cipher = crypto.createCipheriv("aes-256-gcm", key, iv);
cipher.setAAD(Buffer.from(header, "ascii"));
const ct = Buffer.concat([cipher.update(payload, "utf8"), cipher.final()]);
const body = [header, "", b64url(iv), b64url(ct), b64url(cipher.getAuthTag())].join(".");
if (body.length > 4096) throw new Error(`Encrypted message is ${body.length} bytes; the limit is 4096`);
fetch(topicUrl, { method: "POST", body, headers: { "X-Encoding": "jwe" } })
.then((r) => { if (!r.ok) throw new Error(`HTTP ${r.status}`); console.log("Sent"); })
.catch((e) => { console.error(e.message); process.exit(1); });Run it with NTFY_TOPIC_PASSWORD='your password' node send.js "Backup finished" "nas01".
- Plain messages (for example
curl -d hi ntfy-me.com/your-topic) still arrive, but on a topic with a password they are marked Not encrypted: anyone who knows the topic name can send them. - A message that arrives before you set the password, or with a different password, shows as Encrypted message with a lock. Setting the right password opens the ones already received.
- "Send test notification" sends an encrypted test when the topic has a password.
- Encrypted: message, title, tags, priority, click link, icon and action buttons. An encrypted message shows only what was inside the encryption; anything the server adds is ignored. Attachments aren't supported on encrypted messages and are dropped. The server still sees the topic name, time and size.
- Encryption proves a message came from someone with the password, not when. Someone who copied an encrypted message could post it again; the app recognizes an exact copy of a message the topic already has and doesn't store it again. If it arrives as a push, you may still see a plain "Encrypted message" banner with no other text.
- Keep the message and title under about 2.9 KB; the snippets refuse anything larger.
- The password stays in the iOS Keychain on this device only and is deleted when you unsubscribe. It isn't backed up or synced, so after restoring a backup or moving to a new phone, enter it again. Forgetting it means encrypted messages can't be read; nobody can recover it.
- The format is the one in ntfy's end-to-end encryption draft
(ntfy#69): JWE compact serialization with
dir/A256GCM, key = PBKDF2-HMAC-SHA256(password, SHA-256(topic URL), 50,000 iterations).
Reporting a bug
Please include, in #bug-reports:
- your iOS version and device (e.g. iPhone 15, iOS 18.4),
- the app version, from Settings → About,
- the steps that reproduce it, and what you expected instead,
- whether the topic is on ntfy-me.com (the default) or another server, and if it is your own server, whether
upstream-base-urlis set.
Notification problems are the most common report, so also say whether the message arrived in the app's topic list but not as a banner, or not at all. The troubleshooting checklist covers the usual causes on a self-hosted server.
About this app
NTFY me is a fork of binwiederhier/ntfy-ios (MIT), and is not affiliated with or endorsed by the ntfy project. Please do not send reports about this app to the upstream project; they cannot act on them.