← Back to Blog

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

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

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 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/
  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:

{
  "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 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

Fact-check notes and sources

  • Notifications API: MDN Notifications API. Requires user permission; permission is per-origin.
  • Page Visibility API (for background-aware scheduling): MDN Page Visibility.
  • 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 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.

← Back to Blog

Accessibility Options

Text Size
High Contrast
Reduce Motion
Reading Guide
Link Highlighting
Accessibility Statement

J.A. Watte is committed to ensuring digital accessibility for people with disabilities. This site conforms to WCAG 2.1 and 2.2 Level AA guidelines.

Measures Taken

  • Semantic HTML with proper heading hierarchy
  • ARIA labels and roles for interactive components
  • Color contrast ratios meeting WCAG AA (4.5:1)
  • Full keyboard navigation support
  • Skip navigation link
  • Visible focus indicators (3:1 contrast)
  • 44px minimum touch/click targets
  • Dark/light theme with system preference detection
  • Responsive design for all devices
  • Reduced motion support (CSS + toggle)
  • Text size customization (14px–20px)
  • Print stylesheet

Feedback

Contact: jwatte.com/contact

Full Accessibility StatementPrivacy Policy

Last updated: April 2026