Repository navigation
dated screenshots as evidence
Capturing a page because you may need to show later what it said is a real and ordinary job: a price you were quoted, a policy before it changed, a listing that disappeared, a competitor's claim. An agent is good at it, and the picture on its own is close to worthless.
Understanding why is the difference between a usable record and a folder of PNGs.
It proves that a browser, on a machine, at some moment, rendered those pixels. It does not establish which URL, when, what the server sent, or that the image has not been edited since.
Every one of those gaps is closable, cheaply, and none of them is closed by taking a better screenshot. The image is the least important artifact in the capture.
For each capture, write all of this, in a file next to the image:
- The final URL, after redirects, not the one you asked for.
- The timestamp in UTC, from a clock you can name, plus the local time zone the browser was using, because the page may have rendered dates in it.
- The page title and the full rendered text. This is the part people skip and it is the most useful single item: text is searchable, diffable and quotable, while an image is none of the three. It also costs about a ninetieth of the image, which is measured.
- The HTML as served, so the structure and any values hidden in attributes survive.
- The exit the request went out from, at least the country, because a page that varies by market is a page whose capture means nothing without it. That is the subject of seeing a page from another country.
- A hash of each file, computed at capture time and recorded in a separate list. This is what turns "here is an image" into "here is an image that has not changed since I took it", which is the only integrity claim you can honestly make yourself.
A viewport screenshot shows what a person would see without scrolling, which is sometimes exactly the claim: the price was visible above the fold, the disclaimer was not.
A full-page capture shows everything, which is usually what you want for a record and is occasionally misleading, because it composites a page that no viewer ever saw at one moment. If the question is "what did it say", capture everything. If the question is "what would a person have noticed", capture the viewport and say which you did.
Record which one you took. A capture that does not say is a capture somebody can argue with.
Consent walls and cookie banners. Half the captures people take are of a modal. Dismiss it, and record that you dismissed it, because the page underneath is the evidence and the overlay is not.
Lazy content. A page captured before the images and the lower sections rendered is a picture of a skeleton. Wait for a state rather than a duration, per when the page changes under the AI agent, and capture the text alongside so a thin capture is obvious.
Personalisation. A logged-in page shows your prices, your name, your recently viewed. If the claim is about what the public sees, capture from a clean profile with no session, and say so in the record.
Your own details in the pixels. A capture of a logged-in page contains whatever the page shows about you. Before it goes to anybody, open it and look. That applies to any image leaving your machine, and it is the rule this project applies to its own screenshots without exception.
A single capture is a snapshot. The useful artifact is a series: the same page, same settings, on a schedule, with the text diffed between runs.
Then the record answers the question people actually ask, which is not "what did it say" but "when did it change". Store the text per capture and compare; the images become the illustration of a change the text found. Monitoring a page for changes with an AI agent is the monitoring half, and running an AI browser agent on a schedule is how it runs unattended.
None of this makes a capture legally authoritative. A record you produced yourself, on your own machine, with hashes you also produced, is a contemporaneous business record and not an independent attestation. If the situation genuinely needs one, the services that exist for it, and in some jurisdictions a notary, are the answer and a browser is not.
What the discipline above gets you is a record that is internally consistent, searchable, and hard to accidentally misrepresent. That is the right bar for almost every real use, and it is worth knowing which bar you are clearing.
How do I take a dated screenshot of a webpage? Capture the image, and with it the final URL, a UTC timestamp, the rendered text, the HTML, the exit country and a hash of each file. The image alone proves very little.
Is a screenshot proof of what a website said? It is evidence of what your browser rendered. Without the URL, the time and the content alongside it, it is weak evidence and easy to dispute.
Full page or just the visible part? Full page for "what did it say", viewport for "what would a person have seen". Record which.
How do I prove the image was not edited? You cannot, by yourself, beyond hashing it at capture time and keeping the hash list separately. For a stronger claim you need a third party.
Why capture the text as well as the image? Because text is searchable and diffable, and because comparing two captures is how you find out when something changed. It also costs about a ninetieth of the image.
See also: monitoring a page for changes with an AI agent, which is what a series of these becomes, and text, HTML, snapshot or screenshot for why the picture is the expensive artifact and the text is the cheap one.
- The relative cost of an image against the rendered text of the same page, about 89 to 1, is measured and sourced on text, HTML, snapshot or screenshot.
- The claim about legal weight is deliberately non-specific: it varies by jurisdiction, and this page says only that a self-produced record is not an independent attestation, which is true everywhere.
The one-line version: capture the text, hash everything, and write down what you dismissed to get to the page. The picture is the part you will look at and the smallest part of what makes the record worth having.
- OpenAI Operator alternatives
- Open-source Operator-style agents
- Is OpenAI Operator still available?
- OpenAI Operator vs Claude computer use
- browser-use alternatives
- Choosing an AI browser agent
- Open-source AI browser agents
- Open-source computer-use agents
- What is an AI web agent?
- AI browser agents vs traditional scraping
- Cloud browser infrastructure for AI agents, explained
- Browserbase alternatives
- Firecrawl vs an AI browser agent
- Skyvern alternatives
- Stagehand vs browser-use
- Project Mariner is gone: what replaced it
- Manus alternatives
- Gemini computer use vs Claude computer use
- A stealth browser MCP, reviewed honestly by its own wiki
- AI browser vs AI browser agent: which one do you want?
- AI browser agent vs RPA: which one fits the job
- AI browser agent vs n8n, Zapier and Make
- Vercel agent-browser alternatives, compared honestly
- What is an agentic browser? Definition and the two kinds
- Open-source agentic browsers: the three layers, compared
- Choosing an MCP server for browser automation: four axes
- Stealth MCP servers compared: Camoufox, nodriver, Patchright
- Playwright MCP alternatives, and the three you don't need
- Autonomous browser agents: the four rungs of autonomy
- What is actually free in the AI browser agent stack
- browser-use on GitHub: what the repo actually gives you
- Playwright MCP vs Chrome DevTools MCP: different jobs
- How to choose among MCP servers: a map by category
- Which MCP servers are worth adding to Claude Code
- MCP on GitHub: finding servers and judging them fast
- MCP vs an API: the decision, and what the wrapper costs
- MCP alternatives: when the protocol is the wrong shape
- Why does my AI agent get blocked?
- The timing signal AI agents give off
- Agent retry loops trip rate limits, not fingerprints
- Claude computer use detected as a bot
- browser-use getting blocked: what you can and cannot change
- Playwright MCP session blocked: four causes, four fixes
- Playwright MCP and captchas: what actually gets you past
- Cloudflare and a browser MCP server: what is being read
- Can an AI agent solve a captcha? The honest answer
- Getting an AI agent to fill out forms
- The best model for an MCP browser agent, and what it really costs
- Browser problem or model problem?
- How to use a Playwright MCP server with Claude Code
- Extracting data to a CSV with an AI agent
- Monitoring a page for changes with an AI agent
- How to let Claude Desktop control a browser
- How to add a browser to Cursor as an MCP server
- Using an AI agent to hunt for apartments
- Getting website data into Google Sheets with an AI agent
- Using an AI agent to download invoices from portals
- AI agents for web research
- Using an AI agent to test your own website
- How to add a browser to Cline as an MCP server
- Posting to social media with an AI agent
- Posting to Facebook with an AI agent
- Posting to Instagram with an AI agent
- Posting to X with an AI agent
- Automating LinkedIn posts: read this first
- Appointment bots: what they are and what an agent can legitimately do
- Track prices across sites with an AI agent
- Build a lead list with an AI browser agent
- Run an AI browser agent on a schedule
- AI browser agent with a local LLM: what changes
- Should you log your AI agent into your accounts?
- How to write a task an AI browser agent can follow
- Move data between two web apps with an AI agent
- The MCP server
- How the tools are shaped, and why
- Playwright MCP vs the Playwright CLI: which fits when
- Playwright MCP: browser is already in use, and the fix
- Playwright MCP best practices: four decisions that matter
- Playwright MCP with a proxy, and the three leaks it leaves
- A browser MCP server in GitHub Copilot: setup and limits
- Using a browser MCP server for web scraping: the pattern
- Which LLM for browser automation: the four properties
- How to build a browser agent, and what to take instead
- Getting an AI agent to log into a website: three routes
- MCP tools, resources and prompts: who controls each
- How many MCP tools is too many? The context arithmetic
- How to build an MCP server: the decisions, not the scaffold
- Local or remote MCP server: what changes, and what does not
- Writing an MCP client in Python: the thirty-line version
- Self-hosted AI agent: what one actually costs to run
- How long an AI browser agent takes per step, measured
- Text, HTML, snapshot or screenshot: what the agent should read
- Giving an AI browser agent a stopping condition
- Keeping an AI browser agent out of destructive actions
- Why did the AI agent click the wrong thing
- When the page changes under the AI agent
- Running one AI agent task across a list of sites
- Seeing a page as it appears in another country
- Getting data out of a dashboard with no export button
- Two browsers in one session: main and support
- Finding the dead links on a site with an AI agent
- Filling a CRM record from a company's website
- One form submission per spreadsheet row, with an AI agent
- Dated screenshots of a page as evidence
- Checking order and delivery status with an AI agent
- Reading a PDF that opens inside the browser
- Summarising a long page or thread with an AI agent
- Collecting every image on a page with its caption
- Collecting event and course listings with an AI agent
- Cancelling a subscription with an AI agent
- What an AI agent can and cannot do inside an iframe
- Shadow DOM and an AI agent: you can click it, you cannot read it
- How to add a browser to Codex as an MCP server
- What a page snapshot costs, per control
- How to let Gemini CLI use a browser
- Native selects and the ones that only look like selects
- Clicking by selector or by coordinates
- How long the agent waits before it gives up
- What a second browser costs
- Uploading a file with an AI agent, and why this one cannot
- Watching the agent work, and when it is worth it
- When not to use an AI browser agent
- Agent or script: deciding once instead of every time
- Using the keyboard instead of the mouse
- Secrets in an agent task: where they end up
- What an agent run should log
- Deduplicating what an AI agent collects
- Normalising values across sites
- Validating an AI agent's output
- Reading a table with an AI agent
- Driving a site's own search and filters
- The task works headed and fails headless
- How to let the AdaL CLI use a browser