ScreenshotNeo

BlogHow-to

How to Compare Scheduled CaptureKit Screenshots for Website Changes

Build a scheduled screenshot workflow that compares each CaptureKit capture with a stable baseline, shows what changed, and routes useful alerts for review.

By the ScreenshotNeo team4 October 20268 min read

To compare scheduled CaptureKit screenshots, save a baseline image, capture the same page in the same state on a schedule, generate a diff against the baseline, and review the changed regions before treating an alert as a problem. CaptureKit’s guide demonstrates a daily capture-and-compare job with a notification; daily is an example, not a requirement. A visual difference is a review signal, not proof that a change is wrong.

1. Decide what to monitor

Start with pages where a visual change would matter: a landing page, product page, or important dashboard view. CaptureKit describes monitoring ecommerce product pages, landing pages, and third-party widgets. Choose the precise URL and state that should be checked, including any route, query parameters, or known interaction required to reach it.

For each monitored page, record:

  • The URL and the purpose of the check.
  • Whether to capture the viewport or the full page.
  • The viewport dimensions and any device or rendering assumptions.
  • Output format and any resource-blocking or wait settings.
  • How often to capture, who reviews alerts, and how long to keep history.

Keep these choices documented. A later settings change can make images differ even if the page itself did not meaningfully change.

2. Capture and store a baseline

Capture the selected page once and save the image as the baseline for future comparisons. Store its URL, capture timestamp, and settings alongside the file. Without that context, a diff can be hard to interpret: it may reflect a changed viewport or capture configuration rather than a website update.

Choose a baseline that represents the intended page state. If the first capture includes a temporary outage, an unexpected consent prompt, or an incomplete load, replace it before relying on comparisons.

3. Capture on a schedule with stable settings

CaptureKit documents full-page and viewport screenshots, resource blocking, and image output formats. Keep the URL, scope, viewport, format, and relevant resource and wait settings the same between the baseline and later captures. Stable settings make the comparison more useful; they do not guarantee pixel-identical rendering.

Here is a small Python pattern for the recurring workflow. The CaptureKit source material supports scheduled capture and comparison but does not specify a universal API endpoint, authentication scheme, or SDK call signature. The capture_with_capturekit function is therefore an adapter point: implement it with the CaptureKit API or integration available to your account, saving the returned image bytes to the requested path.

from pathlib import Path
from datetime import datetime, timezone
import json

BASELINE = Path("captures/baseline.png")
LATEST = Path("captures/latest.png")
METADATA = Path("captures/metadata.json")
URL = "https://example.com/pricing"

# Replace this function with the CaptureKit capture call available to you.
def capture_with_capturekit(url: str, output_path: Path) -> None:
    raise NotImplementedError("Connect this adapter to your CaptureKit account")

LATEST.parent.mkdir(parents=True, exist_ok=True)
capture_with_capturekit(URL, LATEST)

metadata = {
    "url": URL,
    "captured_at": datetime.now(timezone.utc).isoformat(),
    "scope": "full-page",
    "format": "png",
    "viewport": {"width": 1440, "height": 900},
}
METADATA.write_text(json.dumps(metadata, indent=2) + "\n", encoding="utf-8")

if not BASELINE.exists():
    BASELINE.write_bytes(LATEST.read_bytes())
    print("Saved first capture as baseline; no comparison was made.")
else:
    print(f"Compare {BASELINE} with {LATEST} using your image-diff step.")

This example deliberately does not invent CaptureKit request details or a diff-library contract. Connect the adapter to the API documentation for your account, and connect the comparison step to an image-diff tool suitable for your chosen formats.

4. Generate and inspect the visual diff

Compare each new capture with the baseline or, if your policy requires it, the previous accepted capture. CaptureKit’s guide describes producing a diff image and a difference value. Save the before image, after image, and diff together so a reviewer can see both what changed and where.

A numeric difference score can help decide whether to notify someone, but no universal threshold is established by the reviewed sources. Set a threshold based on the page’s normal noise, then validate it against real runs. Review representative alerts before making the threshold stricter or looser. A diff cannot determine whether a change was intended, harmful, or important.

5. Schedule notifications and retain useful history

CaptureKit demonstrates a daily scheduled run that captures, compares, and sends an email notification. Choose a frequency based on how quickly your team needs to know about changes. Include the URL, capture time, baseline and latest images, diff image, and relevant capture settings in the alert or linked report.

Retain enough history to compare a new alert with earlier accepted states and to diagnose recurring noise. Define who reviews changes and how an accepted change becomes the new baseline. Avoid automatically replacing the baseline on every run: doing so can hide a gradual or repeated change before anyone reviews it.

Capture and comparison options

Decision Use when Keep consistent
Viewport capture The visible first screen or a fixed dashboard viewport is what matters. Viewport dimensions and page state.
Full-page capture Content below the fold is in scope. Full-page setting and page load/wait behavior.
PNG or JPEG These are listed by CaptureKit’s screenshot guide. Format across the baseline and scheduled images.
WebP or PDF These are listed in CaptureKit’s API documentation; use them only if they suit the comparison workflow. Output type and any conversion step.
Resource blocking You need to configure which resources are loaded. Blocked resources and their rules.

Use image formats consistently. If the comparison tool expects a particular format, convert every capture the same way before comparison. The source material documents configurable resource blocking, but not a complete recipe for suppressing every kind of dynamic visual noise.

Reduce noisy differences

  • Dynamic data: timestamps, prices, counters, rotating content, and personalized text can change between runs. Decide whether those changes are in scope and annotate expected variability.
  • Third-party widgets: externally controlled content can change independently. CaptureKit identifies third-party widgets as a monitoring use case; route their diffs for interpretation rather than assuming your own deployment caused them.
  • Loading state: a capture taken before important content appears can differ from a fully loaded page. Use the documented wait or resource settings appropriate to your setup and keep them stable.
  • Configuration drift: changes in viewport, capture scope, format, or blocked resources can create differences. Save settings with each image and inspect them when an alert looks unexpected.
  • Baseline drift: replacing the baseline without review can normalize a change that should have been investigated. Require an explicit acceptance step.

DIY workflow: scheduling, reliability, and cost

A simple scheduled script can suit a small number of pages when your team is comfortable maintaining capture, comparison, notification, and file retention. A monitoring/API workflow is more appropriate when you need to manage multiple important pages, configured alerts, and before-and-after reporting. Compare them by page volume, scheduling control, reporting and retention needs, maintenance effort, and how much human review is required.

The reviewed CaptureKit sources do not establish comparative pricing, performance benchmarks, or a universally suitable alert threshold. Estimate operating cost from the plan and capture volume shown in your account, and measure your own run duration and storage needs. Do not infer accuracy or savings from a diff score alone.

For reliability, make each scheduled run leave a clear record of success or failure, keep the baseline and latest image until comparison is complete, and include enough metadata to reproduce the intended capture. Treat a failed load or missing image as a capture problem to investigate, not as an ordinary visual change. Alert on the failure separately so a missing capture cannot silently look like “no changes.”

Or skip the browser setup

ScreenshotNeo is a website screenshot API and MCP server from Yorker Media. A single GET request captures a URL as PNG, JPEG, WebP, or PDF. Use its response and saved images as the capture step in your scheduled comparison workflow; you still need to retain a baseline, compare captures, and decide which diffs deserve review. See the ScreenshotNeo API documentation for configuration.

curl -G "https://api.screenshotneo.com/v1/shot" -d access_key=YOUR_API_KEY --data-urlencode url=https://example.com/pricing -o shot.webp
import requests
r = requests.get("https://api.screenshotneo.com/v1/shot", params={"access_key": "YOUR_API_KEY", "url": "https://example.com/pricing"}, timeout=90)
open("shot.webp", "wb").write(r.content)
const q = new URLSearchParams({ access_key: 'YOUR_API_KEY', url: 'https://example.com/pricing' });
const res = await fetch(`https://api.screenshotneo.com/v1/shot?${q}`);
if (!res.ok) throw new Error(`Screenshot request failed: ${res.status}`);
await import('node:fs/promises').then(fs => fs.writeFile('shot.webp', Buffer.from(await res.arrayBuffer())));

Cookie banners, popups, and chat widgets are removed before the shot; bot checks, blank pages, and failed loads are never billed. An MCP server lets AI agents take screenshots. The free plan includes 1,000 screenshots a month with no card, and paid plans start at $5 for 3,000. Sign up for ScreenshotNeo and start with 1,000 free screenshots a month, no card required.

Troubleshooting

Symptom Likely cause What to do
Diff appears across most of the page Viewport, capture scope, format, or settings changed; alternatively, the page rendered in a different state. Compare stored metadata, restore consistent settings, and inspect both source images.
Alerts fire on expected changing content Dynamic data or third-party content is in the captured area. Document the variability, choose a review threshold based on observed runs, and keep a human review step.
Screenshot is incomplete The capture happened before relevant content loaded, or resource behavior differs. Check the page and capture settings, use an appropriate stable wait condition, and recapture.
No diff appears after a visible change The wrong URL, baseline, or capture state may be used, or the comparison step may not be reading the intended files. Verify the URL and timestamps, open the actual before/after images, and check the comparison inputs.
Scheduled run produces no image The capture job failed or did not write its output. Record and alert on capture failures separately; do not treat a missing file as an unchanged page.
New baseline hides an earlier change The workflow updated the baseline automatically before review. Restore the last accepted baseline and require explicit approval before replacing it.

FAQ

Should every visual difference page someone?

No. A diff identifies a change for review. Tune alerts to the page’s normal variability and route uncertain changes with the before, after, and diff images.

Is a daily schedule required?

No. CaptureKit’s daily job is an example. Pick an interval that matches how quickly you need to detect changes and the volume of pages you monitor.

Does a visual diff prove a regression?

No. It shows that the captured images differ. A person or a separate check must determine whether the change is expected and whether it affects users.

Can the baseline be updated after a legitimate redesign?

Yes. Review and accept the new page state, save it as the new baseline, and retain the prior images and context if you need an audit trail.