How to Set Up Urlwatch on a Low-Cost Raspberry Pi in India
Set up a headless Raspberry Pi to monitor webpage changes with Urlwatch, from boot media and SSH to filters, scheduled checks, and alerts.
Short answer: install Raspberry Pi OS Lite on boot media with Raspberry Pi Imager, configure a user, network and SSH, then install Urlwatch inside a Python virtual environment. Add the pages you want to monitor, run Urlwatch once to establish a baseline, and schedule recurring runs. The Pi checks for changes only when Urlwatch runs.
You do not need a monitor, keyboard or mouse attached after setup. For a low-cost build in India, compare the complete setup—board, compatible power supply and boot media—rather than judging by a bare-board listing. Current Indian prices and stock are not established here, so this guide does not name a cheapest model or quote a build cost.
1. Choose the hardware and prepare boot media
Urlwatch is software installed with Python’s package manager; the board, boot media and power supply are separate hardware purchases. A typical headless setup needs:
- A Raspberry Pi board with network access suitable for your location.
- A microSD card (or other supported boot device) with enough capacity for the OS image and normal operation.
- A power supply that meets the chosen Pi model’s voltage and current requirements.
- Another computer to write the OS image and connect over SSH.
- A microSD reader only if that computer has no suitable card reader.
A monitor, keyboard and mouse are optional for the final setup if you can configure the image and access the Pi remotely. Raspberry Pi recommends Raspberry Pi OS Lite for headless use. Configure the hostname, account credentials, network and SSH in Raspberry Pi Imager before writing the image. For Wi-Fi, confirm that both the Pi model and the network band are compatible. Connect the boot media and power supply, allow the first boot to finish, then SSH in from your computer.
ssh YOUR_USERNAME@YOUR_PI_HOSTNAME
If name resolution does not work on your network, find the Pi’s local IP address through your router or network tools and use that address in place of the hostname. Raspberry Pi notes that a first boot can take several minutes to join Wi-Fi.
See the official Raspberry Pi headless setup guide and SSH documentation.
2. Install Urlwatch in a virtual environment
Raspberry Pi OS Bookworm and later require pip-installed packages to live in a Python virtual environment. This keeps Urlwatch separate from the OS-managed Python packages.
sudo apt update
sudo apt install -y python3 python3-venv
python3 -m venv ~/urlwatch-venv
source ~/urlwatch-venv/bin/activate
python -m pip install --upgrade urlwatch
urlwatch --version
A successful version command confirms the executable is available while the environment is active. Each later SSH session starts outside that environment, so activate it before running Urlwatch:
source ~/urlwatch-venv/bin/activate
urlwatch
Do not bypass the OS-managed Python restriction with --break-system-packages; Raspberry Pi warns that overriding it can damage the Python installation or OS. The Urlwatch installation guide documents the pip install and version check; the Raspberry Pi OS Python guidance explains the venv requirement.
3. Add a page and establish its baseline
Urlwatch jobs are YAML entries. The url key retrieves a page from its web server; a name makes reports easier to understand. Use urlwatch --edit to open and validate the job file:
urlwatch --edit
Add a job like this, replacing the example address with the page you want to monitor:
name: "Example announcement page"
url: "https://example.com/announcements"
Save and exit the editor. If the command cannot find an editor, set one for the current shell and retry:
export EDITOR=/bin/nano
urlwatch --edit
Run Urlwatch once to fetch and save the initial output. This is the comparison baseline; it may be reported as a new job rather than a later change. Run it again after the page has had time to change. Urlwatch compares processed output with the previous run and reports a diff when it detects a difference.
urlwatch
urlwatch --list
For a basic URL job, Urlwatch retrieves what the web server returns. If the page depends on JavaScript to render the content, a browser-style navigate job may be more appropriate; browser jobs can require additional optional dependencies. Start with url when the relevant text is present in the server response.
4. Reduce noisy changes with filters
Pages often change for reasons unrelated to the information you care about: timestamps, navigation, rotating content or formatting. A filter processes the retrieved content before Urlwatch compares it. Begin without a filter so you can see what the page returns, then narrow the job when diffs are noisy.
For example, use a CSS selector to track only a relevant section, then convert the selected HTML to text:
name: "Example release notes"
url: "https://example.com/releases"
filter:
- css: "main .release-notes"
- html2text
The selector must match the site’s actual markup. Other documented filters include element-by-id, element-by-class, element-by-tag, XPath, grep, strip, sort and JSON formatting with jq where its optional dependency is installed. Filters can be chained. Use urlwatch --edit to make changes and urlwatch --test-filter to inspect filter output before relying on it; consult the current handbook for command usage and job selection.
Changing a filter changes what Urlwatch compares. Recheck the filtered output and expect that the next comparison may reflect the new processing. Keep the URL stable where possible: Urlwatch associates history with the job URL, and changing a job’s URL creates a new history entry.
See the Urlwatch documentation on filters, job types and options and advanced topics.
5. Schedule checks on the Pi
Urlwatch does not run continuously by itself. Schedule it with cron if you want unattended checks. The Urlwatch quick start shows a 30-minute example and advises against running more often than every 30 minutes:
crontab -e
Add a line using the absolute path to the virtual environment’s executable:
*/30 * * * * /home/YOUR_USERNAME/urlwatch-venv/bin/urlwatch
Replace YOUR_USERNAME with the account that owns the virtual environment and Urlwatch data. Cron uses that account’s environment and may have a limited PATH, which is why the full executable path matters. If you installed the environment somewhere else, use that path. Check the current account with whoami and the environment location with:
echo "$HOME/urlwatch-venv/bin/urlwatch"
Run the exact executable manually before adding it to cron. Check cron’s status and logs using the facilities available in your Raspberry Pi OS version if scheduled runs do not happen. The interval determines detection delay: if the page changes just after a check, the next run will not see it until the next scheduled interval.
6. Configure reports and test delivery
By default, Urlwatch can report to the terminal. Its handbook also documents email and other reporters. Configure global reporter settings with:
urlwatch --edit-config
Email reporting depends on working SMTP credentials and correct server settings. Use Urlwatch’s reporter test command before relying on notifications:
urlwatch --test-reporter email
Use verbose output when troubleshooting a reporter:
urlwatch --verbose
Do not assume a notification channel is working until its test succeeds and a real changed-page report reaches the destination. Keep credentials private and limit access to the configuration files that contain them. Reporter configuration options can vary; follow the current Urlwatch reporter documentation.
Or skip the browser setup
If your goal is a clean screenshot of a page rather than recurring change detection, ScreenshotNeo can capture a website with one API request. It is a screenshot API, not a Urlwatch replacement: use Urlwatch for scheduled change comparisons and ScreenshotNeo when you need an image or PDF capture. See the ScreenshotNeo API documentation.
curl -G "https://api.screenshotneo.com/v1/shot" \
-d access_key=YOUR_API_KEY \
--data-urlencode url=https://example.com/announcements \
-o shot.webp
import requests
r = requests.get(
"https://api.screenshotneo.com/v1/shot",
params={"access_key": "YOUR_API_KEY", "url": "https://example.com/announcements"},
timeout=90,
)
r.raise_for_status()
open("shot.webp", "wb").write(r.content)
const q = new URLSearchParams({
access_key: 'YOUR_API_KEY',
url: 'https://example.com/announcements'
});
const res = await fetch(`https://api.screenshotneo.com/v1/shot?${q}`);
if (!res.ok) throw new Error(`Screenshot request failed: ${res.status}`);
await Bun.write('shot.webp', res);
ScreenshotNeo removes cookie banners, popups and chat widgets before the shot. Bot checks, blank pages and failed loads are never billed; the response includes page-verdict and billing headers. Its MCP server lets AI agents use screenshot tools. The free plan includes 1,000 screenshots per month with no card, and paid plans start at $5 for 3,000 screenshots.
Create a free ScreenshotNeo account to get 1,000 screenshots a month with no card.
Hardware buying checklist for India
- Compare the price of the board plus its compatible power supply and boot media; a board-only listing is not a complete setup.
- Check what a bundle includes before comparing it with separate components.
- Choose network connectivity that works where the Pi will run; verify Wi-Fi band support for both board and router or use Ethernet if available.
- Check boot-media compatibility and capacity against the OS image and your expected use.
- Buy from a seller whose product details and return terms you can verify. This research does not establish current Indian stock, an authorized seller list or prices.
- Skip display peripherals if you can image the OS and configure SSH from another computer; buy a card reader only if your computer needs one.
Performance, reliability and cost
For a small number of ordinary pages, the main work is network retrieval, filtering and storing prior output. JavaScript-heavy pages and expensive filters can add resource needs and may require optional packages. Keep the job set focused, choose an interval appropriate to the page and its terms, and avoid needlessly frequent polling. Urlwatch’s own quick start recommends no more frequently than every 30 minutes.
A scheduled monitor is only as reliable as its power, network and scheduler. A disconnected Pi or failed run delays the next observation; it does not monitor in real time. Keep the Pi ventilated, use a model-compatible supply, and verify that the scheduler and chosen reporter work. Back up the Urlwatch job/configuration and state before reinstalling or changing accounts so you can preserve your setup and history.
There is no verified power-consumption figure or current India build price in this research. Your costs include the board, compatible supply, boot media and ongoing electricity and network access. Urlwatch is installed as Python software; the hardware purchases are independent of its pip installation.
Troubleshooting
| Symptom | Likely cause | What to do |
|---|---|---|
| SSH says the host cannot be found or connection is refused | SSH was not enabled, the Pi has not joined the network, or the hostname is not resolvable. | Confirm SSH was enabled in Imager, wait for first boot, verify the network and use the Pi’s local IP address if needed. |
| Pi does not join Wi-Fi | Incorrect network credentials or unsupported Wi-Fi band for the board. | Recheck the configured credentials and confirm the model supports the selected band; Ethernet can help isolate Wi-Fi issues. |
externally-managed-environment during pip install |
pip is targeting the OS-managed Python rather than a venv. | Run python3 -m venv ~/urlwatch-venv, activate it, then install Urlwatch inside it. |
urlwatch: command not found |
The venv is not active or the executable path is not on PATH. | Activate the venv or run ~/urlwatch-venv/bin/urlwatch. |
| Job YAML fails to load | Indentation, quoting or key structure is invalid. | Edit with urlwatch --edit, use spaces consistently, and validate the YAML before running. |
| No change notification appears | The first run only established a baseline, the page is unchanged, or the reporter is not configured. | Run again after a real change, inspect terminal output, and test the reporter with urlwatch --test-reporter email when using email. |
| Every run reports irrelevant changes | The page includes changing content or generated markup. | Inspect the diff and apply a CSS/XPath or text filter that keeps only the information you need. |
| The tracked content is missing | The page renders it with JavaScript, the selector no longer matches, or the site response differs from a browser view. | Inspect the server-returned page, verify the selector, and consider a browser navigate job for client-rendered content. |
| Cron works manually but not on schedule | Cron has a different PATH, home directory or account context. | Use the full venv executable path, install the crontab for the correct user, and inspect system logs. |
| Email reporter test fails | SMTP host, port, credentials, TLS mode or network access is incorrect. | Recheck the current reporter documentation and mail-provider settings, then rerun the test. |
FAQ
Does Urlwatch take screenshots?
Its normal URL job retrieves and processes the server response, then compares text-like output. It is intended for change monitoring, not visual screenshot comparison.
Will the Pi notify me instantly when a page changes?
No. It checks when the scheduled command runs. Shorter intervals reduce potential delay but increase polling frequency; the project recommends not running more often than every 30 minutes.
Can I monitor more than one page?
Yes. Add another YAML job separated from the previous job by a line containing only ---, then review the job list with urlwatch --list.
Do I need a desktop environment?
No. Raspberry Pi OS Lite is suited to a remotely managed headless setup when SSH and networking are configured.
Official references
- Urlwatch handbook: installation, jobs, filters and reporters.
- Urlwatch quick start and operation.
- Raspberry Pi headless setup and boot media.
- Raspberry Pi OS Python package guidance.


