Monitoring & Analytics 1 service 256 MiB RAM 2 GB disk

ntfy

Push notifications as an HTTP primitive - curl a topic, every subscribed phone buzzes. $5/month, private.

One-click deploy, from $5/mo on a Miget plan.

The best notification API is the one every tool already speaks: HTTP. ntfy turns a PUT request into a push notification - curl -d "backup done" https://your-domain/alerts - delivered to the iOS/Android apps and browsers subscribed to that topic, with priorities, attachments, and action buttons.

This template ships the secure posture by default: deny-all access with declarative bcrypt users in env (no CLI ceremony), so topics on your public domain are private from the first second. Everything in your project becomes a notifier - deploy scripts, uptime-kuma, changedetection, cron jobs.

#what you get

  • Notify via plain HTTP PUT/POST - every language, zero SDKs
  • iOS/Android apps + web; priorities, attachments, action buttons
  • Private by default: deny-all + declarative bcrypt users in env
  • Message cache and attachment storage on small volumes
  • One tiny Go binary, Apache-2.0

#topology

ServiceRolePublic
ntfynotification server + web UI (:5000)yes (auth: deny-all default)

#miget sizing

// this stack needs

256 MiB RAM · 2 GB disk · 1 service

A Go binary that idles in tens of megabytes - 256 MiB is generous. The cache volume bounds message/attachment history.

Hobby - recommended fit

$5/mo

1 vCPU · 512 MiB · 10 GiB disk

Headroom for your own apps: 1 GiB at $7/mo

Professional - production

$22/mo

1 vCPU · 2 GiB · 10 GiB disk

Dedicated resources, production SLOs - plan details

One Miget plan is a fixed pool of compute - the whole stack (managed databases included) deploys inside it, and anything left over runs your other apps. No per-service or per-seat math.

#vs. the managed service

What the hosted equivalents charge, against the flat Miget plan this stack fits on. Prices as of June 2026, sources linked.

ServicePlanMonthlyWhat you get
ntfy on Miget 512 MiB plan$5this whole stack, flat - no usage meters, and room left for your own apps
ntfy.shPro~$1020k messages/day, 10 reserved topics ($5 Supporter tier below it)
Pushoverlicenseusage-based$4.99 one-time per platform; Teams $5/user/mo

#vs. other PaaS

Estimated monthly cost of running this exact stack (256 MiB RAM, 2 GB disk, 1 container) elsewhere, from published June 2026 rates.

PlatformEst. monthlyNotes
Miget $5 flat compose stacks first-class: one deploy, dedicated vCPU, managed Postgres/Valkey, volumes and TLS all included in the plan
Heroku ~$13 no volumes; nothing between 1 GB ($50) and 2.5 GB ($250) dynos - 2 GB containers cost far more than shown
DO App Platform ~$10 no persistent volumes - stateful containers need managed DBs/Spaces (base $5 Spaces included here)
Render ~$8 per-service instances (0.5 GB $7, 2 GB $25) - every container is its own paid service
Railway ~$3 usage-based ($10/GB RAM-mo); vCPU billed separately at $20/vCPU-mo on top
Fly.io ~$2 cheapest sticker price - but burstable shared CPUs (1/16 core; dedicated vCPUs cost ~2-3×), no compose deploys (one app per container, manual wiring), managed DBs billed extra

Estimates assume RAM fully allocated at published on-demand rates - and sticker price isn't the whole comparison: the cheaper rows buy burstable shared CPUs, per-service wiring instead of a compose deploy, and managed databases billed separately. Heroku and DO App Platform have no persistent volumes at all - stateful stacks like this one need workarounds there.

#deploy it

On Miget

  1. Create a Compose Stack in app.miget.com pointing at the templates repository
  2. Set the stack path to ntfy
  3. Set the required variables:
    • NTFY_AUTH_USERS, declarative users (name:bcryptHash:role)
    • NTFY_BASE_URL, the app’s https domain
  4. Deploy. Miget layers compose.miget.yaml (RAM, privacy, volumes, managed services) automatically

Locally first?

Every template is portable, vanilla Docker Compose - the Miget overrides are ignored locally:

git clone https://github.com/deployable-sh/stacks
cd miget-compose-templates/ntfy
docker compose up -d

Same files, same behavior. The template README covers connection strings and scaling notes.

#faq

Why self-host instead of using ntfy.sh?

The public server is great for casual use, but topics are guess-protected, reserved names cost a subscription, and your alert content transits someone else’s box. Self-hosted: deny-all auth, your domain, unlimited topics, $5/month.

How do my apps and templates send to it?

One HTTP request with basic auth or a token: curl -u user:pass -d "message" https://domain/topic. uptime-kuma and changedetection in this catalogue both have ntfy notification targets built in - point them at the in-project hostname.

How do phones receive instantly?

The Android app keeps a connection to your server (or uses its battery-friendly websocket mode); iOS uses a relay for wake-ups with content fetched from your server. Both are in the official app stores.

Ship ntfy today

One compose stack, 256 MiB of RAM, from $5/month flat, and it runs on your laptop with the same files.