Watchtower

How it works

Five steps, and the third one is the whole argument.

Anyone can fetch a page twice and compare the bytes. That product reports a change every hour on almost every page on the internet. What makes a change detector worth paying for is what it throws away first.

  1. 01

    Render the page

    A real browser loads the URL and runs its JavaScript, so a page that builds itself client-side is read the way a person sees it. Nothing is served from cache — "what does this page say right now" is the entire product.

  2. 02

    Narrow it to what you asked for

    Nothing, a CSS selector, or a field map. With no selector you get the page's main content, which already excludes navigation, footers, asides and advertising. A selector or field map switches to the whole document so it can reach anything.

  3. 03

    Normalise

    Whitespace, wrapping and invisible spaces, always. Then the volatile classes you left on — timestamps, relative times, tokens, cache-busters. This is the step that decides whether an alert ever means anything.

  4. 04

    Hash, and compare

    sha256 over the normalised bytes. Equal means no change; different means change. Nothing is inferred and no model is consulted — you can re-derive the verdict from the content we hand back.

  5. 05

    Show what moved

    A line diff of what was added and removed, or, in field mode, the named values that changed with their before and after. The diff is evidence for a human, not the verdict.

Step three, in full

What we discard, named.

THE PAGENORMALISEthen sha256DISCARDED2026-08-25T07:56:18Zcsrf=8f3ab91c…?v=a91f4c23 minutes agoKEPT$29.00In stock: 4v2.7.1© 2026

Every class, and its default

  • timestampson by default

    Dates and clock times, in ISO, numeric and written forms.

  • relative_timeson by default

    "3 minutes ago", "just now", "yesterday".

  • tokenson by default

    UUIDs, CSRF and nonce values, and long opaque hashes such as asset fingerprints.

  • cache_busterson by default

    Versioning query parameters on URLs (?v=, ?t=, ?cb=, ?hash=).

  • numbersoff by default

    Every number on the page. Off by default — a number is usually the answer.

Never discarded, at any setting

  • Prices, stock levels, counts and any other number (unless you turn on `numbers`).
  • Version strings, release names and copyright years.
  • The order of a list — a reordered page has changed.
  • Capitalisation, punctuation and wording.

You can also strip literal substrings of your own with ignore. Literal, not regex — a caller-supplied regular expression is a denial-of-service waiting to happen and a debugging problem nobody wants at 3am.

The rail split

Why a monitor needs an account.

A one-off check has one payer and one answer, so it fits on any rail. A monitor runs hourly, daily, weekly and has to draw 3 credits from somewhere on every pass, then deliver the result somewhere. A keyless caller has neither a renewable wallet nor an address. We would rather tell you that before you pay than after.

ONE CHECKPOST urlanswerCompared against the baselineyou sent. Then it ends.credits · x402A MONITORcheckwalletRepeats. Pays per pass.Pushes when it changed.credits only