The Project5 scanner

Scanner version 0.1.0  ·  Last updated 2026-08-10

If you found an unfamiliar agent called Project5-Scanner in your server logs, this is it, and this page is where it told you to look. It loaded one page on your site, a handful of times, as itself. It clicked nothing but a consent banner, submitted no form, logged in nowhere and followed no links. If you would rather it never came back, opting out takes one line in your robots.txt and needs no conversation with us.

Who we are

The scanner is operated by Project5.ai, a one-person software company run by The Operator, and it is part of Project5 — a change-control and measurement-assurance tool for Google Tag Manager. You can reach a human at rick@project5.ai. There is no ticket queue behind that address; it goes to the person who wrote the scanner.

We are not a plaintiff firm, we are not building a demand-letter pipeline, and we do not sell lists of who is failing what. Section what we publish below is the part of this page worth holding us to.

The user agent

Every request the scanner makes carries this exact string, and nothing else:

Project5-Scanner/0.1.0 (+https://project5.ai/scanner; opt-out: https://project5.ai/scanner#opt-out)

There is no Mozilla/5.0 token, no browser string, and no attempt to look like a person. Almost every well-behaved crawler opens with a browser-shaped token anyway; that token exists to get past user-agent sniffing, which is the thing we said we would not do.

The cost of that is real and we accept it: if your site serves different content based on user agent, we saw a different page than a visitor would, which makes our result an under-report rather than an over-report. Every scan says so in its own notes.

We do not publish an IP range, because we do not have a fixed one. The user agent is the identifier to match on, and a robots.txt group is the mechanism we honour.

What it does

The scanner answers one question: when a visitor is given a choice about tracking, is that choice enforced? It loads a page in a clean browser and records what the page did — every network request, every cookie, every storage write — before any consent interaction, and, where a consent platform can be identified and driven, again after a choice to decline.

One URL per scan. It is not a crawler: no links are followed, no sitemap is walked, and no second page is discovered or visited. That one URL is loaded at most five times in total:

Pass Loads
baseline A cold load, then the same page again after a decline has been clicked and confirmed.
accept A cold load, then the same page again after an accept has been clicked and confirmed.
gpc One cold load asserting Global Privacy Control, both as the Sec-GPC header and as the navigator.globalPrivacyControl property.

The reload is the point. Most tags fire once, on load, so sitting on a page after clicking decline observes nothing at all. A fresh load in a profile that now carries the recorded choice is what actually answers whether the choice was enforced.

It reports observations. It does not draw conclusions from them, it does not characterise your site, and it never names a statute — that boundary is enforced by a test that fails the build if a copy edit ever crosses it. Mapping behaviour onto legal obligation is somebody else's job and not one a scanner is qualified to do.

What it does not do

These are not policies we intend to follow. They are absences in the code, and each one is covered by a test.

How it behaves on a site that did not ask for it

It obeys robots.txt. Rules are fetched and applied per RFC 9309 — agent groups, Allow and Disallow, * and $ wildcards, longest match wins, Allow breaks a tie. A group naming Project5-Scanner or Project5 takes precedence over *.

If robots.txt cannot be read, the scan is refused. A 5xx, a timeout or a connection failure stops the scan rather than being treated as permission. The standard permits reading it either way and most crawlers proceed; we do not, and there is no override flag. Adding one would make the rest of this page decorative.

It is rate limited. A 60-second cooldown per domain, keyed on the registrable domain, so your subdomains share one budget. The cooldown is written to disk rather than held in memory, so it applies between runs and not merely within one — a second scan of your domain a few seconds after the first is refused, not queued. Alongside it, no more than two scans run at once within a single run of the tool.

A block is a result, not an obstacle. If your site returns 401, 403, 429 or 451 to this agent, the scan records blocked and stops. We do not retry from somewhere else, and we do not work around it.

What we publish

This is the commitment that matters, and it is deliberately narrower than what the tool is capable of. Scanning and publishing are different acts, and the line sits at publication:

We will scan any public page for its own owner, or for ourselves. We will not publish findings about a site whose owner did not ask us to. Aggregate findings across many sites are published freely — counts, proportions, no identities — and a named site is only ever named after its owner has been told and given time to fix it.

That is responsible-disclosure practice borrowed from security research. In practice it means a scan of your site may exist as a private observation used to start a conversation with you, and it will not appear on this website, in a study, in a sales deck or in a directory with your name attached to it.

We also do not maintain per-domain result pages. There is no indexable page about your site on this domain, and there is not one planned.

Opting out

Three ways, and none of them requires talking to us or justifying the request. The first is immediate and entirely in your hands.

1. robots.txt — takes effect on the next scan, no need to tell us

Add a group naming us to robots.txt at the root of your domain:

User-agent: Project5-Scanner
Disallow: /

This is checked on every scan, before the page is loaded, and it is honoured whether or not you have ever contacted us. It is the fastest and most reliable option because nothing on our side has to happen for it to work.

2. Block the user agent at your CDN or WAF

Match on Project5-Scanner and return 403. We report the block, stop, and do not come back by another route. Because the scanner never disguises itself, a user-agent rule is sufficient — you do not need an IP list.

3. Ask us, and we will exclude you permanently

Email rick@project5.ai with the domains you want excluded. Put “scanner opt-out” in the subject and nothing else is needed — no justification, no account, no form. We add the domains to a permanent exclusion list and reply to confirm it is done, within one business day. Exclusions do not expire and we will not ask you to renew one.

If you want the report from the scan we already ran on your site, ask in the same email and we will send it to you. It is your site; you should have it.

What we keep

A scan produces a record of what your pages did: the requests they made, the cookies and storage they wrote, and which of those happened before or after a consent choice. That is technical information about a website, not about any person — the scanner is the only visitor involved, and it has no history, no account and no identity beyond the user-agent string above.

How this website handles information about you, if you contact us or browse these pages, is covered in the Privacy Policy. Nothing on this page loaded a third-party request to display it to you.

If this page is wrong

Every behaviour described here is enforced in the scanner's source and covered by its tests, not left to intention. If you observed something from this agent that contradicts this page — a second page fetched, a form submitted, a robots.txt ignored, a request without that user agent — that is a defect and we want to know. Email rick@project5.ai with the log lines and we will tell you what happened.