# Turning the audit tool into a monitoring service — scheduled, notifications, no server

ContentKing charges $195/month to watch your site and ping you on regressions. The Scheduled Auto-Monitor does it in the browser with setInterval + localStorage + Notifications API. Keep a tab open, get alerted when your score drops 5 points or more.

Author: J.A. Watte
Published: April 22, 2026
Source: https://jwatte.com/blog/blog-tool-seo-scheduled-monitor/

---

Every audit tool on this site produces a snapshot. "Your score right now is 74." Useful once. Less useful tomorrow when something regressed and you don't know.

[The Scheduled Auto-Monitor](/tools/seo-scheduled-monitor/) turns that snapshot into a stream. Add a URL, pick an interval (hourly / 6-hourly / daily / weekly), and the browser runs the audit on your cadence. When the score drops 5+ points vs the prior run, a browser notification fires.

No server, no account, no monthly bill.

## What it actually does

1. You add a URL and pick an interval.
2. The tool asks permission to send browser notifications.
3. While the tab is open, a `setInterval` check fires every 60 seconds. For each monitor, it checks: is it time to run? If yes, runs the audit.
4. Each run fetches the page via the existing proxy, computes a 15-check heuristic score (title, meta, canonical, H1, lang, viewport, JSON-LD, security headers, compression, trust signals), and stores the result in the same localStorage key Mega SEO Analyzer v2 already uses.
5. If the new score is 5+ below the previous one, a `Notification` pops up with the URL + delta.

That's the entire monitoring service.

## Why I built it inside the browser instead of as a cron job

The obvious way to monitor SEO posture is a cron job on a server. GitHub Actions scheduled workflows, Netlify scheduled functions, Vercel cron — all doable.

I went with the browser because:

1. **Zero infrastructure cost.** Server crons bill monthly even when they don't fire. Browser monitoring is free.
2. **No secrets to manage.** No API tokens, no CI config, no .env files.
3. **localStorage is already there.** Mega SEO Analyzer v2 already writes to `jw-mseo-history` — the monitor just adds more entries to the same store.
4. **Notifications are local.** Your browser's Notification API talks directly to your OS notification center. No push service, no device registration.
5. **The user is already present.** If you have the tab open, the audit runs. If you closed it, you didn't need the alert right now anyway.

The obvious downside: monitoring only runs while the tab is open. That's a real limitation — if you close the browser, monitoring stops. Reopen, it resumes.

For always-on monitoring, I describe the upgrade path below.

## How to use it

1. Go to [/tools/seo-scheduled-monitor/](/tools/seo-scheduled-monitor/)
2. Paste the URL you want watched
3. Pick an interval (daily is the default — good for most sites; hourly for high-traffic launch pages; weekly for stable content)
4. Click **Add monitor**. First time: the browser asks notification permission. Click **Allow**.
5. The monitor runs its first check within 60 seconds. Subsequent checks fire on the interval you set.
6. Leave the tab open. Pin it with Ctrl+click on the tab if your browser supports tab pinning — the tab stays alive across browser restarts.

When a regression fires, the notification shows: "SEO score dropped N for hostname" + "Was X, now Y. Open the dashboard." Click it; the tab comes into focus.

## What the tool tracks per run

Every run is a small record in localStorage:

```json
{
  "ts": 1745270400000,
  "overall": 78,
  "dims": []
}
```

`overall` is the 0-100 score. `dims` stays empty for the fast quick-audit path (the full dimension breakdown comes from the Mega SEO Analyzer v2 runs, which use the same storage key).

Runs stack up — 50 most recent per URL, oldest pruned automatically.

## Pair it with the dashboard

The monitor writes history. [The SEO Trend Dashboard](/tools/seo-trend-dashboard/) reads it. Between the two:

- Monitor = the service (watches, stores, alerts)
- Dashboard = the interface (charts, trends, classifications)

I ship them as two separate tools because they solve different moments: you open the monitor to SET monitoring, you open the dashboard to SEE the longitudinal story.

## For always-on monitoring — the upgrade path

If you need the audit to run even when no browser tab is open, the browser version isn't enough. Three options:

1. **GitHub Actions scheduled workflow.** Simplest if you already have a repo. Run the same audit logic in a Node script on a cron schedule, commit results to a JSON file, the Trend Dashboard imports that JSON.
2. **Netlify / Vercel scheduled functions.** If you deploy the site on Netlify, a scheduled function can run a headless Lighthouse pass daily and post the result to an endpoint.
3. **Uptime Robot / Pingdom webhooks.** Not exactly SEO monitoring, but they'll alert on raw uptime + HTTP status. Pair with the browser monitor for a belt-and-suspenders setup.

Option 1 is free if you're under GitHub's free tier. I'll ship a reference GitHub Action workflow as a separate tool if there's demand.

## Privacy notes

Everything stays in your browser's localStorage. No request is sent to any server other than:

- The fetch-page proxy on jwatte.com (same server that runs the audit)
- The URL being audited (just a plain GET to fetch the HTML)

No third-party analytics track the monitor state. Your monitored URLs + history are visible only in your browser's DevTools > Application > Local Storage.

Export your history as JSON any time (the dashboard has an export button). Back it up, share across devices, walk away from the tool — the data is yours.

## Related reading

- [SEO Trend Dashboard walkthrough](/blog/blog-tool-seo-trend-dashboard/) — the paired dashboard
- [Mega SEO Analyzer v2 — paid-tool parity](/blog/blog-mega-seo-analyzer-v2-paid-tool-parity/) — the broader "free beats paid" argument
- [Internal Link Equity Flow](/blog/blog-tool-internal-link-equity-flow/) — the same-day companion tool
- [Code-Diff Patch Generator](/blog/blog-tool-code-diff-patch-generator/) — the execution tool

## Fact-check notes and sources

- **Notifications API:** [MDN Notifications API](https://developer.mozilla.org/en-US/docs/Web/API/Notifications_API). Requires user permission; permission is per-origin.
- **Page Visibility API (for background-aware scheduling):** [MDN Page Visibility](https://developer.mozilla.org/en-US/docs/Web/API/Page_Visibility_API).
- **Browser `setInterval` accuracy:** Chromium throttles timers in background tabs to ~1/minute. Sufficient for hourly-or-slower monitoring.
- **localStorage quota:** Chrome/Firefox cap at ~5-10 MB per origin. A typical monitor's history stays well under 100 KB.
- **ContentKing reference pricing:** [ContentKing Plans](https://www.contentkingapp.com/plans/) as of 2026-04 listing.

_This post is informational, not engineering or SEO-consulting advice. Mentions of ContentKing, Sitebulb, GitHub, Netlify, Vercel, Uptime Robot, Pingdom, and similar products are nominative fair use. No affiliation is implied. Respect `robots.txt` and only monitor sites you own or have written authorization to access._


---

Canonical HTML: https://jwatte.com/blog/blog-tool-seo-scheduled-monitor/
RSS: https://jwatte.com/feed.xml
JSON Feed: https://jwatte.com/feed.json
Hero image: https://jwatte.com/images/blog-tool-seo-scheduled-monitor.webp
