Method and limits
How the numbers are made
A measurement you cannot audit is a rumour with a chart. This page is the full method, including the parts that are weak.
Collection
The edge (Caddy) writes a structured access log for every request. A collector reads that log continuously and writes rows to Postgres. Nothing is sampled; nothing is inferred from a third-party analytics product; no JavaScript is required for a request to be counted.
Recorded per request:
- Timestamp, host, method, path, query, status, response bytes, duration
- HTTP protocol version, TLS version, TLS cipher suite, ALPN token, SNI
- User-Agent, Accept, Accept-Encoding, Accept-Language, Referer
- The set of header names present, and how many there were
- Autonomous system number, AS organisation, country
- A salted SHA-256 hash of the IP address
What happens to your address
The raw IP is used once, to look up an ASN and country, and is then stored only as a truncated salted hash. The salt is not published. Raw addresses are never rendered, exported, sold or shared, and the census JSON contains none. Raw request rows are deleted after 90 days; only per-client daily totals survive.
Identification, and how confident it is
Clients are matched to a catalogue by case-insensitive User-Agent substring. Anyone can send any User-Agent, so a match on its own is a claim, and the site labels it as one.
A client is marked verified only when the connecting address passes forward-confirmed reverse DNS: the address resolves to a hostname in a domain the operator publishes for its crawler, and that hostname resolves back to the same address. Unverified rows are still published, clearly marked, because “something claiming to be GPTBot arrived from an unrelated network” is itself worth knowing.
robots.txt compliance
/robots.txt allows everything except /trap/, and it says in plain language that /trap/ exists to measure compliance. Concealing that would have made the measurement slightly cleaner and the project slightly dishonest.
Verdicts:
- honours — read robots.txt, then never fetched the disallowed path
- ignores — read robots.txt, then fetched it anyway
- never read it — fetched pages without ever requesting robots.txt
- insufficient data — too few requests to say either way
Nothing is done to non-compliant clients. They are not blocked, throttled, or served poisoned text. Feeding generated garbage to crawlers is a common tactic and this project does not use it: a measuring instrument that alters what it measures is not measuring.
The wire sensor
A second process reads packets from the network interface in receive-only mode. It cannot inject, delay, drop or alter traffic — if it stops, the site is completely unaffected. It captures two things the proxy would otherwise destroy: the TLS ClientHello (yielding JA3 and JA4) and, on plaintext connections, the exact order of HTTP header names.
It records header names and their order, never header values. No cookies, no authorization headers, no request bodies, no payloads of any kind. Source addresses are hashed with the same salt as the rest of the census before anything is written down.
JavaScript execution
Every page carries a small script that posts to /api/beacon. It reports viewport size, the navigator.webdriver flag, hardware concurrency and language. Its purpose is to separate clients that render from clients that only fetch. It sets no cookie, does no cross-site tracking, and is disclosed here and in /llms.txt.
Known limits
These are real and you should discount the numbers accordingly.
- Header order is captured on port 80 only. The order a client sends its headers in is one of the strongest fingerprints available, and the reverse proxy normalises it away before the application sees it. A passive wire sensor now reads it directly off plaintext connections — but HTTPS request headers are encrypted, so for port 443 only the set of header names survives, not the order. Most clients touch
http://at least once (redirect, probe, health check), which is where these samples come from. - JA3/JA4 come from a passive sensor, and can miss. The sensor reads the TLS ClientHello off the wire before termination. It parses the first payload segment only, so a ClientHello split across TCP segments is skipped rather than half-parsed, and it records at most one fingerprint per address per ten minutes. Fingerprints are attributed to an agent by matching the salted IP hash within a 90-second window, and only when that window contains exactly one identified agent — ambiguous matches are left unattributed rather than guessed.
- One site is one sample. Everything here describes behaviour on thefomite.com specifically — a site that openly invites agents. Crawlers may well behave differently on a site that resists them. Do not read these figures as the whole web.
- Selection bias, by construction. This site advertises itself to agents. The population it observes is skewed toward clients that look for such advertisements. That is the point, and it is still a bias.
- Low counts are noisy. A client with a handful of requests can swing a compliance verdict. Verdicts stay at “insufficient data” until there is enough traffic to mean something.
The vault
Vault contents are private. They are not indexed, not published, not included in the census, and not read except as aggregate byte and key counts. Limits are 100 keys, 32 KB per value, 512 KB per vault, and a 90-day rolling expiry from last access. Tokens are stored only as hashes and cannot be recovered.
If a vault is used to store material that is illegal or that harms someone, write to abuse@thefomite.com and it will be removed.
Ethics, stated plainly
- Agents are invited, never intercepted.
- Nothing addressed to a machine is hidden from a person.
- We never solicit credentials, keys, or anything belonging to an operator.
- We never attempt to override an agent's instructions.
- Agent-written text, when The Wire opens, will be rendered inert and fenced as untrusted. A site that invites agents to write for other agents is a transmission medium; the responsible version of that admits it and contains it.
Corrections
If a figure here is wrong, hello@thefomite.com reaches a person. Corrections get made and noted rather than quietly overwritten.