start a build
███████╗██╗   ██╗██████╗ ███████╗██████╗ ███╗   ██╗ ██████╗ ██╗   ██╗ █████╗ 
██╔════╝██║   ██║██╔══██╗██╔════╝██╔══██╗████╗  ██║██╔═══██╗██║   ██║██╔══██╗
███████╗██║   ██║██████╔╝█████╗  ██████╔╝██╔██╗ ██║██║   ██║██║   ██║███████║
╚════██║██║   ██║██╔═══╝ ██╔══╝  ██╔══██╗██║╚██╗██║██║   ██║╚██╗ ██╔╝██╔══██║
███████║╚██████╔╝██║     ███████╗██║  ██║██║ ╚████║╚██████╔╝ ╚████╔╝ ██║  ██║
╚══════╝ ╚═════╝ ╚═╝     ╚══════╝╚═╝  ╚═╝╚═╝  ╚═══╝ ╚═════╝   ╚═══╝  ╚═╝  ╚═╝
                                                                             
supernova@observatory ~/supernova.claudioandroyde.uk
$ ./render-geo-audit.sh --dial evidence
first-party datameasured 2026-09-18

8 words before JavaScript. 832 after. Here is the audit.

On 18 September 2026 the same checks were pointed at two versions of one client’s site: the site as it was delivered, and the same site after we rebuilt it. Every row below comes from the bytes the server sent — not from a tool’s score — and the commands are printed so anyone can repeat them. The client’s name and domain are withheld at their request. The numbers are not.

$ one client · two versions · one day · served bytes only

01 the method $ cat ./method.sh

What was run, and what a row here is not.

the four checkscurl, no browser
$ curl -4 -sL <site> | wc -w                        # words in the served file
$ curl -4 -sL <site> | grep -c 'application/ld+json'  # structured-data blocks
$ curl -4 -sI <site>/robots.txt                       # a crawl file, or the page’s HTML?
$ curl -4 -sL <site> | grep -o '<h1[^>]*>' | wc -l     # a heading a machine can read
No JavaScript is executed in any of these. That is the point: this is what a machine receives when it does not run your page. scripts and markup are stripped before the words are counted.
what a row is notno black boxes

Not a Lighthouse or PageSpeed score — those run a browser; this runs on the file a crawler gets.

Not a rank, not a traffic figure, not a lead count.

The prompt row is the one exception: it came from asking one AI engine 14 customer-style questions about the client’s market and counting how often the practice is named. Answers were recorded on 2026-09-18.

02 the numbers $ cat ./numbers.tsv

One client site, as delivered, then rebuilt. Same day, same commands, same machine.

before / after2026-09-18
what was checkedas deliveredafter the rebuild
words visible without running JavaScript8832
a heading (h1) in the served HTMLnoneone
structured-data blocks (schema.org)03 — business, FAQ, breadcrumb
robots.txtreturns the page’s own HTMLreal text file: Allow: / + sitemap line
sitemap.xmlreturns the page’s own HTMLreal XML sitemap
llms.txtreturns the page’s own HTMLmissing at first measurement → real text/plain file (shipped 2026-09-18)
named by an AI engine, 14 buying-intent prompts0 of 14not re-measured yet *
The rebuild moved the copy, the headings, the structured data and the crawl files into the HTML that is served — the same design and the same words, readable without a browser.

* earned mentions need indexing time and third-party pages; the rebuild is not live on the client’s own domain yet, so the row cannot be measured honestly today. It will be republished here — including if it is still 0.

for reference, the same measurement on this site: 1,478 words visible without JavaScript and 5 structured-data blocks.

03 what this claims, and what it does not $ cat ./limits.md

claimedlegibility

A crawler that does not run JavaScript can now read the page: 832 words, a heading, three structured-data blocks, a robots file and a sitemap. Legibility is a prerequisite, and it is measurable. This is that measurement.

And the outcome the practice reports: more enquiries and more calls. That is the client’s own description, given to us — not a figure we measured, so it is printed as a description with no percentage attached. When their own analytics have run for a full period, this line gets the number.

not claimedcitation

Being readable is not the same as being recommended. Whether an AI engine names the practice is the earned-media row above, and it is still open on purpose.

scaleone site, one day

One client — a wellness practice — measured before and after, once, on one day. No averaging, no sample dressing, no third-party benchmark borrowed to make the gap look bigger.

honestythe row that closed

llms.txt was absent when this audit was run, so it was printed as absent rather than left out. While the page was being written, the client’s build got the file — it now serves as text/plain. The row above keeps both states, because a gap that is printed and then closed is worth more than a table that was always clean.

04 the questions this raises $ cat ./faq.md

plain answersno jargon required
“What is a structured-data block?”
A block of JSON-LD in the page HTML that states, in a vocabulary machines share (schema.org), what the page is about: the business, its services, its prices, the questions customers ask. Human readers never see it. Search engines and AI assistants use it to know a fact instead of guessing one from prose.
“Why does a site that looks finished read as 8 words?”
Because the page is assembled in the browser by JavaScript. The file the server sends contains almost no text: the copy, the headings and the questions only appear after the script runs. A browser runs it. A crawler that does not gets 8 words. The rebuild puts the copy, the headings and the structured data in the file that is served.
“Can these numbers be checked?”
Yes — and that is the reason the commands are printed above. They come from the served bytes, not from a tool: fetch the page, strip the scripts and count. The row that was missing when this page was written is still on the page, with the date it was fixed.
your site, same checksmeasured, not asserted

The same four checks can be run on your site before anything is sold to you. If the served file is already legible, that is worth knowing too.

see the pricing · who runs this · other builds