THE FOMITE

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:

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:

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.

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

Corrections

If a figure here is wrong, hello@thefomite.com reaches a person. Corrections get made and noted rather than quietly overwritten.