Skip to content
Open Source

Reverse Proxy for ntfy, Webhooks That Arrive Where You Want Them.

Published on

Featured image for "Reverse Proxy for ntfy, Webhooks That Arrive Where You Want Them."

A self-hosted ntfy server is great — until it goes quiet at the exact moment an alert matters. Today we are releasing Reverse Proxy for ntfy, our open source Cloudflare Workers gateway that forwards webhooks to one or more self-hosted ntfy instances, so notifications keep flowing even when a server does not.

Reverse Proxy for ntfy v1.0.0 is out now on GitHub — clone it, add your servers, and deploy it to your own Cloudflare account.

Born from an alert that couldn’t go missing

This project started earlier this month as a way to catch ADT Pulse for Homebridge bug alerts before users reported them. When the whole point is knowing something broke, a single ntfy server is a single point of failure — so we put a Worker in front of it.

Point your service’s POST or PUT request (plain text or binary) at the proxy, and it routes the message by subdomain: each subdomain maps to an entry in wrangler.toml carrying a topic, a server URL, and an ntfy access token. Two delivery modes handle redundancy — send-once delivers to the first server that returns a success response, while send-all duplicates the message to every matched server.

All fifteen ntfy publish headers pass straight through, from X-Title and X-Priority to X-Tags, X-Click, and X-Delay, so your notifications arrive exactly as you dressed them. And when a payload runs past ntfy’s 4,096-byte message limit, the README covers configuring the attachment cache to catch the overflow.

Your Worker, your rules

Because the proxy sits at the edge, it also guards the door. Visitor access controls offer allow, disallow, and disabled modes across three lists — countries, IP addresses, and user agents. Settings let you enforce HTTPS, echo response output for debugging, and optionally append an Incoming Request Details message showing each sender’s IP, region, approximate location, and ISP.

Written in TypeScript and deployed with wrangler, setup is just npm run authorize and npm run deploy.

Got an alert that can’t go missing? Head over to GitHub to get started!