Skip to content

07Android · SoftwareAndroid · Kotlin · Jetpack Compose · local-first

PagePulse

A free, self-hosted, on-device page-change monitor for Android. Point it at a URL, pick how often to check, and PagePulse alerts you when the page changes — text diff or pixel diff. No server, no account, no per-check quota.

Open source on GitHub

FRAME NFRAME N+1MEDIAProjection · VIRTUAL DISPLAY · DIFFcapture pending
fig. 12 · watch list with text/{visual} monitoring modes (representation)

Keeping watch without giving it your data

PagePulse is a Visualping-style watcher that stays on its own device: add a URL, pick an interval and a mode, and the app checks it in the background and tells you when something changes. No account, no server, no per-check quota — just a Room database and a notification.

Each watch can target a CSS selector so you follow a price or a status badge instead of re-diffing a whole page. Text mode compares extracted text line-by-line; visual mode screenshots a hidden WebView and pixel-diffs it, which suits pages where the layout is the signal.

A schedule the system actually honours

Periodic work on Android can't run more often than every 15 minutes, so PagePulse uses one WorkManager job as a heartbeat and checks each watch only when its own interval is actually due. That keeps short intervals honest without hammering the network, and keeps the app efficient.

Fetches and parsing sit on OkHttp and Jsoup; storage is Room with a snapshot history per watch; and the diff layer stays small and pure so text and visual modes share one code path for 'did this change?'.

What makes it technically interesting

  • Text mode downloads the page (or just a CSS-selected element, like a price or a status badge) and diffs it line-by-line against the last fetch
  • Visual mode renders the page in a hidden WebView, screenshots it, and compares it with a downsampled pixel diff for pages where layout matters more than text
  • A WorkManager job wakes every 15 minutes — the shortest Android interval for periodic background work — and checks whichever watches are actually due at their own intervals
  • Everything runs on-device: Room for watches and per-check history, notification only for what changed, no Firebase, no backend
  • Only two permissions: network access to fetch pages (plus cleartext, since some user-supplied URLs are still http) and notifications on Android 13+
GitHub Get in touch