← Tap · Blog

# Websites Change. Your Automation Shouldn't Stop.

April 4, 2026 · Leon Ting · 5 min read

Websites change. It's not a bug — it's the nature of the web. Designs get refreshed. APIs get versioned. Selectors shift. Components get renamed.

The question isn't "how do I stop websites from changing?" It's: "how do I keep my automations running when they do?"

## The Stories We've All Heard

> "I built Site Spy after missing a visa appointment slot because a government page changed and I didn't notice for two weeks."

> — vkuprin, Hacker News

> "I'd use it to track when state wildlife agencies update their regulation pages — those change once a year with no announcement and I always miss it."

> — Hauk307, Hacker News

> "I currently use Wachete, but since over a year, it triggers rate limits on a specific website and I just can't monitor German laws anymore."

> — nicbou, Hacker News

Three different users, three different needs, the same problem: websites change, and there's no reliable way to know when or adapt automatically.

## Two Types of Change

Not all website changes are the same:

1. Data changes — new content, updated prices, new posts. This is what you want to track. Your automation should detect and report these.

2. Structure changes — redesigned layout, renamed CSS classes, new API version. This is what breaks your automation. Your automation should survive these.

Most tools conflate the two. `tap watch` and `tap doctor` handle them separately.

## Watch: Track Data Changes

    $ tap watch hackernews hot --every 10m
    2026-04-04T10:00  +added   "Show HN: Tap"  score=342
    2026-04-04T10:10  +added   "Rust 2.0 announced"  score=128
    2026-04-04T10:10  -removed "Old post fell off"  score=12
    2026-04-04T10:20  ~changed "Show HN: Tap"  score: 342→487

`tap watch` runs your program on an interval, diffs the results, and outputs only what changed. It's built on Unix primitives — `while + sleep + diff`. No database. No scheduler service.

Pipe it anywhere:

    # Append to a log file
    $ tap watch github trending --every 1h >> ~/trending.log

    # Send to Slack via webhook
    $ tap watch reddit hot --every 30m | curl -X POST -d @- $SLACK_WEBHOOK

    # Feed into another program
    $ tap watch competitor prices --every 6h | tap filter --where "change > 10%"

## Doctor: Detect Structure Breakage

When a website redesigns and your selectors break, `watch` won't show changes — it'll show nothing. That's where health contracts come in.

    # Every tap has a health contract
    health: {
      min_rows: 5,           // must return ≥5 results
      non_empty: ["title"]   // title must never be empty
    }

    $ tap doctor
    hackernews/hot    ✔ ok     30 rows  (245ms)
    bbc/news          ✘ fail   0 rows   min_rows: expected ≥5, got 0
    github/trending   ✔ ok     25 rows  (1.2s)

`bbc/news` is broken. The site changed its layout. Before your data went bad, `doctor` caught it.

## Auto-Heal: Fix and Continue

    $ tap doctor --auto
    bbc/news: 0 rows (min_rows: 5)
      ☉ Re-inspecting https://www.bbc.com/news...
      ☉ AI analyzing new page structure...
      ✔ Healed: bbc/news.tap.js updated
      ✔ Verified: 12 rows, score=1.0

AI re-inspects the page, writes a new program, verifies it works, and saves. One AI call. Then $0 per run again.

## The Self-Healing Loop

`forge → run → watch → doctor → heal → run → ...`

    # Set it up once
    $ tap forge "track competitor pricing"      # AI writes program
    $ tap watch competitor prices --every 6h  # monitor changes
    $ tap doctor --schedule "0 6 * * *"       # daily health check

You configure it once. The loop runs itself:

- Data changes? → `watch` reports them in real-time
- Site breaks your program? → `doctor` detects via health contract
- Need a fix? → `doctor --auto` re-forges with one AI call
- Back to normal → $0 per run until the next change

You sleep. Your automations don't stop.

Read more: Your Scraper Is Broken Right Now · Your Automation Costs $1 Per Run

### Try the self-healing loop

    curl -fsSL https://taprun.dev/install.sh | sh
    tap update && tap hackernews hot
    tap watch hackernews hot --every 10m
    tap doctor

Getting started · GitHub · 195+ community taps