Deploy changedetection.io
ChangeDetection.io — monitor website changes with alerts and history.
changedetection.io
Just deployed
/datastore
changedetection.io
Self-hosted web page change monitoring — get instant alerts when any website changes.
✨ Features
- Real-time change detection — Monitor any web page for content, price, or structural changes
- 60+ notification channels — Discord, Email, Slack, Telegram, Webhook, Apprise, and more
- AI-powered summaries — LLM integration (OpenAI, Gemini, Ollama, Anthropic) for smart diff summaries
- Visual Selector — Point-and-click element targeting with browser fetcher
- Browser Steps — Log in, fill forms, click buttons before detecting changes
- Filter engine — XPath, CSS Selectors, JSONPath, jq, regex text filtering
- Re-stock & Price detection — Monitor product pages for stock and price changes
- API & RSS — Full REST API for watches and notifications
- Screenshot diffs — Visual change comparison with screenshots
- Scheduling — Timezone-aware recheck schedules with day-of-week and time limits
🚀 Deploy on Railway
One-Click Deploy
Click the button above to deploy changedetection.io instantly on Railway.
Prerequisites
- A Railway account
- No external database required — uses built-in SQLite storage
⚙️ Environment Variables
| Variable | Required | Default | Description |
|---|---|---|---|
PORT | No | 5000 | HTTP listen port (Railway sets this automatically) |
LOGGER_LEVEL | No | DEBUG | Log level: TRACE, DEBUG, INFO, SUCCESS, WARNING, ERROR, CRITICAL |
BASE_URL | No | — | Public URL of your instance (appears in notification alerts) |
USE_X_SETTINGS | No | 1 | Set to 1 when behind Railway's reverse proxy |
HIDE_REFERER | No | — | Hide Referer header from monitored websites |
FETCH_WORKERS | No | 10 | Number of parallel fetch workers |
MINIMUM_SECONDS_RECHECK_TIME | No | — | Minimum seconds between rechecks (0 to disable) |
DISABLE_VERSION_CHECK | No | — | Disable telemetry / version check |
LLM_FEATURES_DISABLED | No | — | Disable all LLM / AI features |
ALLOW_FILE_URI | No | — | Allow watching local file:/// URIs (security!) |
TZ | No | UTC | Timezone for scheduling (e.g., America/New_York) |
HTTP_PROXY | No | — | HTTP proxy address for outgoing requests |
HTTPS_PROXY | No | — | HTTPS proxy address for outgoing requests |
NO_PROXY | No | — | Comma-separated proxy exclusion list |
SCREENSHOT_MAX_HEIGHT | No | 16000 | Max screenshot height in pixels |
EXTRA_PACKAGES | No | — | Space-separated extra Python packages to install (plugins) |
PLAYWRIGHT_DRIVER_URL | No | — | WebSocket URL to a Playwright browser for JS-rendered pages |
📡 Service Architecture
┌──────────────────────────────────────────────────────────────────┐
│ changedetection.io │
│ Port 5000 │
│ │
│ ┌──────────────┐ ┌─────────────────┐ ┌──────────────────────┐ │
│ │ Web UI │ │ Change Engine │ │ Notification Engine │ │
│ │ (Flask) │ │ (Scheduler) │ │ (Apprise) │ │
│ │ / │ │ Per-watch │ │ 60+ channels │ │
│ │ Watches │ │ polling │ │ Discord, Email, │ │
│ │ Settings │ │ Content diff │ │ Slack, Telegram │ │
│ └──────┬───────┘ └────────┬─────────┘ └──────────┬───────────┘ │
│ │ │ │ │
│ └───────────────────┼────────────────────────┘ │
│ │ │
│ ┌────────▼────────┐ │
│ │ SQLite (/datastore) │ │
│ │ Watches, config, │ │
│ │ notification history │ │
│ └─────────────────────┘ │
└──────────────────────────────────────────────────────────────────┘
│ │
│ ┌────▼────┐
│ │ HTTP │
│ │ Fetcher │
│ │ (fast) │
┌────▼────┐ └─────────┘
│ Playwright │
│ Browser │
│ (JS support)│
└───────────┘
💻 Local Development
Prerequisites
- Docker installed on your machine
Quick Start
# Clone the repository
git clone https://github.com/INAPP-Mobile/railway-changedetection.io.git
cd railway-changedetection.io
# Build and run with Docker
docker build -t changedetection .
docker run -d \
--name changedetection \
-p 5000:5000 \
-v changedetection-data:/datastore \
changedetection
# Open in browser
open http://localhost:5000
Using Docker Compose
See the GitHub repo for docker-compose.yml examples.
For JavaScript-rendered pages, add a Playwright browser service (see repo for config).
🔧 Troubleshooting
| Issue | Solution |
|---|---|
| Health check failing | Ensure PORT env var matches the container's listen port (5000). Check Railway logs for startup errors. |
| Data lost on restart | Data is stored in /datastore (SQLite). Railway provides ephemeral storage that persists within service lifecycles. |
| Slow first startup | The image is ~400MB. First cold start may take 1–2 minutes for the health check to pass. |
| Cannot access the UI | Make sure USE_X_SETTINGS=1 is set when behind Railway's proxy. Railway provides TLS at the edge. |
| Monitored sites not checking | Verify FETCH_WORKERS is set appropriately (default 10). Check if sites have IP-based blocks on Railway egress IPs. |
| JS-rendered pages not detecting changes | Set up a Playwright browser service and configure PLAYWRIGHT_DRIVER_URL. The default HTTP fetcher doesn't execute JavaScript. |
| Notifications not sending | Verify notification URLs are correctly formatted in the watch settings. Check Apprise documentation for your channel. |
| Port conflict | Railway assigns PORT automatically. If you override it, ensure it matches the EXPOSE 5000 in the Dockerfile. |
📚 Resources
- changedetection.io Documentation — Official tutorials and guides
- GitHub Repository — Source code & issues
- Installation Wiki — Advanced configuration
- Notification Setup — Apprise notification channels
- Chrome Extension — Quickly add pages to watch
- Discord Community — Community discussions
📄 License
This template deploys changedetection.io, which is licensed under the Apache License 2.0. See the LICENSE file for details.
Built by INAPP-Mobile — Deploy your own website change monitoring service in minutes.
Deploy and Host
One-click deploy on Railway. Single container, built-in SQLite. TLS at edge, auto-restart.
About Hosting
Single container with SQLite. No external DB needed.
Why Deploy
- One-click deploy, zero setup
- Single container, no external DB
- Auto HTTPS via Railway
Common Use Cases
Dependencies for
Changedetection.io uses SQLite — no external database required.
Deployment Dependencies
Changedetection.io uses SQLite — no external database required.
Template Content
changedetection.io
INAPP-Mobile/railway-changedetection.io