← How-Tos
raspberry-pi 17 hr ago ◯ 5 min read

Self-Hosting Changedetection.io on a Raspberry Pi: Tracking Price and Stock Changes for Maker Supplies

raspberry piself-hostingchangedetection.iodockerprice trackingfilamentmaker supplies

Filament goes on sale for a few hours and you miss it. A specific CNC bit comes back in stock after a two-month backorder and you find out a week late. A supplier quietly raises prices on the resin you buy every month and you only notice at checkout. Changedetection.io is an open-source, self-hosted tool built for exactly this: point it at any web page, tell it what to watch, and it checks on a schedule and notifies you the moment something changes. Running it on a Raspberry Pi that's already on 24/7 means you get a permanent price and stock watcher for your actual maker supply chain without paying for a SaaS version or trusting a third party with your watch list.

Why Changedetection.io Instead of a Generic RSS or Price-Tracker Service

Most commercial price trackers are built for retail shopping on major sites and don't handle the smaller supplier sites makers actually buy from โ€” filament resellers, specialty tool shops, small laser and CNC parts vendors. Changedetection.io works on effectively any page because it can watch raw HTML changes, a specific CSS/XPath-selected element (so you track just the price field, not the whole noisy page), or even a visual screenshot diff for pages that render price information as an image or through heavy JavaScript. Running your own instance also means your watch list โ€” which often amounts to a fairly specific picture of your build plans and spending โ€” stays on your own hardware rather than feeding a third party's analytics.

Installing with Docker Compose

Changedetection.io ships an official Docker image, which is by far the simplest path on a Pi running Raspberry Pi OS or DietPi with Docker already installed.

mkdir -p ~/changedetection/datastore cd ~/changedetection cat > docker-compose.yml <<'EOF' services: changedetection: image: ghcr.io/dgtlmoon/changedetection.io container_name: changedetection restart: unless-stopped ports: - "5000:5000" volumes: - ./datastore:/datastore environment: - BASE_URL=http://changedetection.local:5000 EOF docker compose up -d

The official image is a multi-arch build and runs fine on both the 64-bit Raspberry Pi OS and DietPi on a Pi 4 or Pi 5 โ€” there's no need to build from source or hunt for an ARM-specific fork the way some older self-hosted projects require. Once the container is up, the web UI is reachable at http://<your-pi-ip>:5000.

Adding Your First Watch

  1. Paste the product page URL into the "Watch a new change" box on the dashboard.
  2. Let it fetch once, then use the built-in visual element picker to click directly on the price (or "in stock" label) on the rendered preview โ€” this generates a CSS selector automatically so the watch tracks just that element rather than the entire page, which matters because unrelated changes elsewhere on the page (a rotating banner, a "customers also viewed" section, a timestamp) would otherwise trigger false notifications constantly.
  3. Set a check interval appropriate to how time-sensitive the item is โ€” hourly for a flash-sale-prone retailer, once or twice a day for a slow-moving backorder restock, since hammering a small supplier's site every few minutes is both unnecessary and a good way to get your watcher's requests blocked.
  4. Configure a notification target under the watch's settings โ€” changedetection.io supports email, ntfy, Discord, Slack, Pushover, and generic webhooks, so route it wherever you already check notifications rather than requiring you to remember to open the dashboard.

Handling Sites That Render Prices with JavaScript

A growing number of e-commerce sites load pricing and stock status after the initial page load via JavaScript, which a simple HTTP fetch won't see. Changedetection.io handles this with an optional headless Chrome fetcher (either via a bundled Playwright-based fetcher or an external Browserless/Playwright container) that renders the page fully before taking its snapshot. On a Raspberry Pi, running a full headless Chrome instance for every watch check is noticeably heavier than the plain HTTP fetcher, so reserve it for the specific watches that actually need it rather than enabling it globally โ€” check a watch with the simple fetcher first, and only switch it to the browser-based fetcher if the page genuinely isn't capturing the right content.

Keeping Your Watcher From Getting Blocked

Checking a page too frequently, or checking many pages on the same small site back-to-back, looks like scraping from the server's side, and some sites will rate-limit or block an IP that does it. Space out check intervals generously for sites you check often, avoid setting every watch on one supplier to fire at the exact same minute (changedetection.io's scheduling naturally spreads this out somewhat, but a large watch list on tight intervals can still cluster), and respect any robots.txt-style restrictions a site publishes. This is a tool for keeping an eye on things you'd otherwise check manually anyway โ€” not a scraping operation, and treating it that way keeps it useful long-term.

Organizing a Growing Watch List

Once you're past a handful of watches, use changedetection.io's tagging feature to group them โ€” "filament," "CNC bits," "laser consumables," whatever matches how you actually shop โ€” so the dashboard stays navigable and you can mute or pause an entire category at once (useful when you're not in the market for anything in that category for a while and don't want the notification noise). The built-in search across watch titles and URLs also becomes genuinely useful once your list passes thirty or forty entries, which happens faster than you'd expect once you start adding every consumable you reorder regularly.

Backing It Up

Everything changedetection.io needs โ€” your watch list, check history, and settings โ€” lives in the datastore directory you mapped as a volume. Include that folder in whatever backup routine already covers the rest of your Pi's self-hosted services (Restic or Borg, as covered elsewhere on this site), since rebuilding a watch list of several dozen carefully-configured element selectors by hand after a corrupted SD card is a genuinely annoying afternoon you don't need to have.

Closing Thoughts

This is a small, low-resource service โ€” it runs comfortably alongside other self-hosted tools on the same Pi without needing dedicated hardware โ€” but it pays for the Pi's electricity bill many times over the first time it catches a filament restock or a price drop you'd otherwise have missed entirely. Start with the handful of pages you already check manually out of habit, and let the watch list grow from there.