You know that feeling when a product you want is out of stock, and by the time you remember to check back, it's sold out again? Or when a page you care about — a job posting, a permit application, a scholarship deadline — changes without any notice? There's a small self-hosted tool built exactly for this, and it runs comfortably on a Proxmox VE host you're probably already running for other things.

This guide walks you through installing changedetection.io in an LXC container on Proxmox VE. By the end you'll have a private web page watcher running on your own hardware, checking pages on whatever schedule you choose, and pinging you the moment something changes.

What You Will Learn

  • What changedetection.io actually does and why it's different from a generic uptime monitor
  • What an LXC container is, in plain terms, and why it's a good fit for this app
  • How to deploy it in minutes using the Proxmox VE Community Scripts installer
  • How to open the web interface, add your first watch, and read the diff view
  • What the common error messages mean and how to fix them
  • A few settings worth changing before you rely on this day to day

What Is This Feature?

changedetection.io is an open-source web application that loads a page on a schedule, saves a snapshot of the content, and compares it against the last snapshot. If something changed — a price, a paragraph of text, a "back in stock" badge — it flags it and can notify you through email, Discord, ntfy, Telegram, or a dozen other channels. You can even tell it to watch only a specific part of a page using a CSS selector, so it ignores the ads and the timestamp in the footer and only cares about the price field you circled.

It's not the same thing as an uptime checker. Uptime Kuma or Healthchecks (if you've already set either of those up on your Proxmox box) tell you whether a service is up or down. changedetection.io doesn't care if the site is up — it cares whether the content on that page is different from the last time it looked. Those are genuinely different jobs, and a lot of people end up running both.

We're going to install it inside an LXC container. If you're new to Proxmox, LXC stands for Linux Containers — it's a lightweight way to run an isolated Linux environment that shares the host's kernel instead of emulating its own virtual hardware the way a full VM does. That makes containers start in a second or two and use a fraction of the RAM a VM would need for the same job. For an app like this, which is mostly a Python process quietly polling web pages in the background, a container is the obvious choice over a full VM.

Why Would You Use It?

The honest answer is: because refreshing a browser tab manually is a bad way to spend your time. A few situations where this pays for itself fast:

  • Restock alerts for a graphics card, a console, concert tickets, or anything else that sells out in minutes
  • Price drop tracking on a specific product instead of trusting a retailer's own "deals" page
  • Watching a government or university page for a status change — visa processing, exam results, application windows
  • Keeping an eye on a competitor's pricing page or changelog without checking it by hand every week
  • Getting notified the moment documentation for a tool you depend on gets updated

You could use a hosted SaaS version of this kind of tool, and honestly for a handful of pages that's fine too. But once you're watching more than a few URLs, most of those services start charging by the watch or by the check interval. Running it yourself on hardware you already own costs nothing extra and comes with no page limit.

Prerequisites

Before you start, make sure you have:

  • A working Proxmox VE host — this guide was written against Proxmox VE 9.2, though the process is nearly identical on any recent 8.x install too
  • Root access to the Proxmox shell, either through the web console's >_ Shell button on the node, or over SSH
  • At least 10 GB of free space on the storage you plan to use, and roughly 4 GB of RAM you can spare for the container
  • Internet access from the Proxmox host, since the installer downloads a container template and packages during setup
  • A few minutes — the whole install takes under ten minutes on a normal home internet connection

You don't need to know Docker, Python, or anything about the app itself going in. That's the point of this guide.

Step-by-Step Tutorial

Step 1: Open the Proxmox shell

Log into the Proxmox web interface, click your node in the left-hand tree, then click >_ Shell near the top right. This drops you into a root terminal on the Proxmox host itself — not inside any VM or container.

Step 2: Run the Community Scripts installer

Proxmox VE Community Scripts is a large, actively maintained collection of installer scripts that build and configure an LXC container for a specific app, automatically. Instead of manually creating a container, installing Debian packages, cloning a repo, and writing a systemd service by hand, you run one command and answer a couple of prompts. Paste this into the shell:

bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/ct/changedetection.sh)"

You'll be asked whether you want Default Settings or Advanced Settings. For a first install, pick Default. That gives you a Debian-based container with 4 CPU cores, 4096 MB of RAM, and a 10 GB disk — more than enough headroom, since changedetection.io itself is light. If you're tight on resources you can go through Advanced and drop it to 2 cores and 2 GB of RAM; it'll run fine for watching a modest number of pages.

The script picks the next free container ID automatically, downloads a Debian template if you don't already have one cached, creates the container, installs changedetection.io and its dependencies inside it, and sets it up to start on boot. Give it a few minutes — most of that time is the initial package installation, not anything you need to interact with.

Step 3: Find the container's IP address

When the script finishes, it prints a summary with the container's IP address. If you missed it, you can look it up from the Proxmox shell:

pct list

Note the VMID it created, then run:

pct exec <VMID> -- ip a

Look for the inet line under your container's network interface, usually something like 192.168.1.47/24. That address, followed by :5000, is where the web interface lives.

Step 4: Open the web interface

In a browser, go to http://<container-ip>:5000. You should land on the changedetection.io dashboard, which is empty except for a single "Add a new change detection watch" field at the top. There's no login screen by default — more on why that matters in a moment.

Step 5: Add your first watch

Paste a URL into the field and click Watch. changedetection.io fetches the page immediately, stores that as the baseline, and adds it to your watch list with a default recheck time. Click into the watch and then into the Notifications tab if you want an alert sent somewhere the moment a change is caught — email, ntfy, Discord webhooks, and Apprise-compatible services are all supported.

If you only want to watch part of a page — say, the price and not the "customers also bought" carousel below it — open the watch, go to the Filters & Triggers tab, and enter a CSS selector for that specific element. Most retail sites give their price element a fairly stable class name you can grab from the browser's inspector.

Step 6: Set a login password

Since the dashboard has no authentication out of the box, and it's now reachable by anything on your LAN, go to the settings gear icon, open General, and set an application password under Application Password Protection. Do this before you forget — it's the step almost everyone skips on the first pass.

Commands Explained

CommandWhat it does
bash -c "$(curl -fsSL <script-url>)"Downloads the community script and runs it immediately in your current shell. curl -fsSL means: fail silently on server errors, follow redirects, and don't print progress noise — just the script itself.
pct listLists every LXC container on this Proxmox node along with its VMID, status, and name.
pct exec <VMID> -- <command>Runs a command inside a specific container without needing to open a full console session first.
ip aShort for ip address — shows every network interface on the system and the IP address assigned to each one.
pct start <VMID> / pct stop <VMID>Starts or stops a container from the Proxmox shell, useful if the web UI is unreachable and you want to check its status directly.

Common Errors

"This site can't be reached" when opening port 5000. Nine times out of ten this is either the wrong IP address, or the container hasn't finished starting yet. Run pct list to confirm the container status shows running, then double-check the IP with the ip a command from Step 3.

The watch shows an error icon instead of updating. Click into the watch and check the error text at the top. Most of the time it's a site returning a 403 because it blocks the default request headers, or a page that needs JavaScript to render its content, which the plain fetcher can't execute.

Container creation fails partway through with a storage error. This almost always means the storage you selected during Advanced Settings doesn't have 10 GB free. Check available space with pvesm status from the Proxmox shell and either free some up or point the installer at a different storage target.

Troubleshooting

If a specific watch keeps failing on a JavaScript-heavy page — a lot of modern e-commerce sites render the price client-side after the page loads — the plain HTTP fetcher genuinely can't see it. changedetection.io supports a browser-based fetcher for exactly this case, but it needs a separate browser container running alongside it (the project calls this the "Playwright" fetcher). Setting that up is a bit more involved than this guide covers; for most beginners, swapping the fetch method to Basic fast Plaintext/HTTP Client under the watch's Request tab, or picking a different page that renders the price server-side, is the quicker fix.

If the container starts but the web UI never comes up, check the service logs from inside the container:

pct exec <VMID> -- journalctl -u changedetection.io -n 50

That shows the last 50 log lines from the service, which will usually point straight at whatever broke — a permissions problem on the data directory is the most common one after a manual config change.

If you ever need to update the app itself, the community script includes an updater. Re-run the same install command against the existing container and choose the update option when prompted, rather than creating a second container.

Best Practices

Set the application password in Step 6 before you do anything else with this. An unauthenticated dashboard on your LAN isn't a huge deal if you trust everyone on your network, but it's a five-second fix, so there's no real reason to skip it.

Don't set every watch to recheck every minute. Most sites don't change that often, and hammering a small store's product page every sixty seconds is a good way to get your IP rate-limited or blocked outright. A recheck interval of 15 to 60 minutes is plenty for almost everything except genuine flash-sale stock tracking.

Take a snapshot of the container after your initial setup is working the way you want. From the Proxmox web UI, right-click the container and choose Snapshot. If a future update or a config change breaks something, you can roll straight back instead of rebuilding from scratch.

If you're watching more than a handful of pages, spread your notification channels out a little — a dedicated ntfy topic or a Discord channel just for this tool, rather than dumping alerts into a channel you already use for something else. It keeps the signal from getting lost.

Frequently Asked Questions

Does changedetection.io need internet access to work?

Yes, for watching public websites — it needs to reach the pages you're monitoring. If you're watching an internal page on your own network instead, it only needs a route to that server, not the wider internet.

Can I run this on a Raspberry Pi or a low-power Proxmox node?

Yes. The base install is light on CPU and RAM. Scale the container down to 1–2 cores and 1–2 GB of RAM through Advanced Settings if your hardware is limited, unless you're planning to use the browser-based fetcher, which needs more headroom.

Will this work behind a login wall or paywall?

Not out of the box. changedetection.io fetches pages the way a logged-out visitor would, so anything that requires authentication to view won't load correctly.

How is this different from an RSS feed?

An RSS feed only works if the site publishes one, and most product and pricing pages don't. changedetection.io watches the actual rendered page, so it works on sites that never offered a feed in the first place.

Can I back this up along with my other LXC containers?

Yes. It's a normal LXC container as far as Proxmox is concerned, so your existing vzdump backup jobs or Proxmox Backup Server schedule will pick it up without any special configuration.

Conclusion

That's a working, private page-watcher running on hardware you already own, checking whatever pages matter to you on a schedule you control. It won't need much attention going forward — add a watch when something's worth tracking, set a sane recheck interval, and let it sit. The container itself is cheap enough on resources that most Proxmox hosts won't notice it's there.

If you end up watching a lot of pages, it's worth pairing this with a notification tool like ntfy or Gotify running in its own container, so alerts land somewhere you'll actually see them instead of piling up in an inbox you check once a week.