Monitoring & Analytics 1 service 512 MiB RAM 2 GB disk

changedetection.io

Watch any web page for changes - prices, stock, competitors - and get notified, for $5/month.

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

#what is changedetection.io?

Price drops, restocks, policy-page edits, competitor changes - the web changes and you want to know first. changedetection.io watches pages on your schedule, shows visual diffs with CSS/xpath filtering, and notifies through 80+ targets, including this catalogue’s ntfy template.

Hosted page-watchers meter checks and pages per tier. Self-hosted, watch counts are yours: this single container (which happens to listen on :5000 natively - the catalogue’s easiest deploy) runs hundreds of watches in half a gigabyte. The honest scope note: JS-heavy pages upstream handle with a privileged Chrome sidecar a PaaS cannot run; the built-in fetcher covers most of the web.

#what you get

  • Visual diffs with CSS/xpath/text filters per watch
  • Notifications to 80+ targets (ntfy, Slack, email, webhooks)
  • Per-watch schedules, request headers, and conditions
  • Restock and price-drop detection helpers
  • Single container, one volume, Apache-2.0

#topology

ServiceRolePublic
changedetectionwatcher + UI (:5000)yes - set a UI password promptly

#miget sizing

// this stack needs

512 MiB RAM · 2 GB disk · 1 service

Hundreds of watches fit here. Set the UI password in Settings on first visit - the interface ships open.

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
changedetection.io on Miget ★512 MiB plan$5this whole stack, flat - no usage meters, and room left for your own apps
VisualpingPersonal~$1010 pages, 1,000 checks/mo (slider to $100 for 200 pages)
Distill.ioStarter~$155 cloud monitors at 10-min intervals

Hosted watchers meter pages and check frequency; self-hosted, both are your call.

#vs. other PaaS

Estimated monthly cost of running this exact stack (512 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 ~$25 no volumes; nothing between 1 GB ($50) and 2.5 GB ($250) dynos - 2 GB containers cost far more than shown
DO App Platform ~$11 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 ~$5 usage-based ($10/GB RAM-mo); vCPU billed separately at $20/vCPU-mo on top
Fly.io ~$3 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

Full breakdown of what changedetection.io costs managed versus self-hosted, with production sizing: changedetection.io pricing.

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 changedetection
  3. Set the required variable:
    • BASE_URL, the app’s https domain (notification links)
  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/changedetection
docker compose up -d

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

#faq

What about JavaScript-heavy pages?

The built-in fetcher handles most sites. Fully JS-rendered pages need upstream’s Chrome sidecar, which requires privileges a PaaS sandbox does not grant - that single capability is honestly out of scope here, and the page says so rather than letting you find out.

How do notifications reach me?

Apprise under the hood: ntfy (the in-project template pairs perfectly), Slack, Discord, Telegram, SMTP, webhooks - per watch or global. BASE_URL makes the links in those notifications point at your domain.

How does this compare to hosted watchers?

Hosted services tier by pages watched and check frequency. Self-hosted, both are your call - the only meters are your RAM and politeness to the sites you watch.

#more monitoring & analytics

Ship changedetection.io today

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