UptimeMonitoring.com
Menu
Reliability guide · ntfy.sh + Cloudflare Workers

Wake your phone for downtime: ntfy via Cloudflare Workers

Browser push and email both get silently dropped by Do Not Disturb during sleep — exactly when an outage matters most. ntfy delivers push notifications to your phone with per-topic urgency: on Android, max-priority topics break through Do Not Disturb; on iOS, alerts arrive promptly within your Focus settings. Wire it to Monitive webhooks via a Cloudflare Worker. Free, open-source, self-hostable. Setup: 5 minutes.

Runtime: Cloudflare Workers More runtimes coming soon

Quick start

Three steps from zero to a phone notification on every outage.

  1. 1

    Install the ntfy app

    Free for public topics. Self-hosted option available.. You'll also need the ntfy.sh app on your phone and a free Cloudflare account (full prerequisites in the markdown version of this guide).

    Get the ntfy app →
  2. 2

    Deploy the bridge to Cloudflare Workers

    Set PROVIDER and your provider credentials (NTFY_TOPIC) as Wrangler secrets — see the Deploy commands below — then run npx wrangler deploy.

    Deploy to Cloudflare Workers →
  3. 3

    Connect Monitive and set the signing secret

    Open a monitor → Webhooks → set the URL to your bridge URL. Monitive issues a signing secret — copy it and set it on the bridge as MONITOR_WEBHOOK_SECRETS (it applies live, no redeploy).

    Open Monitive →

Deploy commands

Terminal View source
git clone https://github.com/uptimemonitoring/alerts-bridge
cd alerts-bridge && npm install

# 1. Set provider secrets, then deploy
npx wrangler secret put PROVIDER                 # enter: ntfy
npx wrangler secret put NTFY_TOPIC               # long, random topic — public topics are shared secrets
npx wrangler secret put NTFY_URL                 # optional — omit to use https://ntfy.sh
npx wrangler secret put NTFY_TOKEN               # optional — only for protected/reserved topics
npx wrangler deploy

# 2. Register the printed Worker URL in Monitive (monitor → Webhooks),
#    then set the signing secret it issues (applies live, no redeploy):
npx wrangler secret put MONITOR_WEBHOOK_SECRETS

After wrangler deploy, copy the worker URL and set it as the webhook destination in Monitive. Monitive then shows a signing secret — set it on the bridge with wrangler secret put MONITOR_WEBHOOK_SECRETS (applies live, no redeploy).

ntfy.sh details

Free push notifications, public or self-hosted

Public vs private topics

ntfy.sh operates a free public server. Any topic name on ntfy.sh is world-readable by anyone who knows the name — treat the topic as a shared secret and append a long random string (e.g. monitive-alerts-7f3a9c2e1b). For production use, run your own ntfy server or use a reserved topic with an access token (set the token as NTFY_TOKEN on the bridge).

DND bypass on Android

In the ntfy app, tap a topic → notification settings → set importance to "Urgent". Android will then treat ntfy notifications as high-priority, which can bypass Do Not Disturb if you allow it under "Priority notifications" in DND settings. iOS does not expose the same mechanism — Pushover is the better choice if DND bypass is critical on iOS.

Pricing

The ntfy.sh public server is free. The bridge runs on Cloudflare Workers' free tier. Total cost: $0. If you self-host ntfy for private topics, you control your own infrastructure costs.

Mobile app

Install the ntfy app from the App Store or Google Play, or use the web app at ntfy.sh/app. Subscribe to the same topic name you set as NTFY_TOPIC in the bridge.

More information

ntfy.sh documentation →

Troubleshooting

Common failure modes and how to fix them.

Webhook never fires
Cause: Monitive cannot reach the bridge URL, or the monitor has no webhook configured.
Fix: Open the monitor in Monitive and check its webhook delivery log. Confirm the bridge URL is reachable from the public internet.
Bridge returns 401 Unauthorized
Cause: MONITOR_WEBHOOK_SECRETS on the bridge does not match the signing secret Monitive issued for this monitor.
Fix: Copy the signing secret from the monitor → Webhooks section in Monitive, then re-run npx wrangler secret put MONITOR_WEBHOOK_SECRETS with that exact value (no trailing whitespace).
Bridge returns 500
Cause: Provider credentials are missing or malformed.
Fix: Check Cloudflare Workers logs in the dashboard. Confirm all required secrets are set: PROVIDER=ntfy, NTFY_TOPIC, MONITOR_WEBHOOK_SECRETS (NTFY_URL, NTFY_TOKEN optional).
Notifications arrive but phone is silent
Cause: The ntfy topic notification importance is set below the system DND threshold.
Fix: In the ntfy app, tap the topic → notification settings → set importance to "Urgent".
Topic receives messages but the app shows nothing
Cause: You subscribed to a different topic name in the app.
Fix: Confirm the exact topic name in the app matches NTFY_TOPIC (case-sensitive).

Why we built this

Monitive's own admin alerts — account suspensions, capacity events, kill-switch flips — run through the same bridge you're about to deploy. Same template, same provider, same code. The "we use this ourselves" line isn't a marketing claim; it's the literal setup.

We open-sourced it because a 50-line bridge shouldn't be behind a paywall or buried in a vendor integration. Audit the code before you trust it with your alerts. MIT license. No telemetry, no vendor lock-in.