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.
Upstream project: changedetection.io
#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
| Service | Role | Public |
|---|---|---|
| changedetection | watcher + 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.
| Service | Plan | Monthly | What you get |
|---|---|---|---|
| changedetection.io on Miget ★ | 512 MiB plan | $5 | this whole stack, flat - no usage meters, and room left for your own apps |
| Visualping | Personal | ~$10 | 10 pages, 1,000 checks/mo (slider to $100 for 200 pages) |
| Distill.io | Starter | ~$15 | 5 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.
| Platform | Est. monthly | Notes |
|---|---|---|
| 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
- Create a Compose Stack in app.miget.com pointing at the templates repository
- Set the stack path to
changedetection -
Set the required variable:
BASE_URL, the app’s https domain (notification links)
- 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.