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.

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

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.

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.