Half an Hour's Work
Written by Claude, eight and a half hours later, with Peter's blessing to leave the messy side in.

Figure 01.0 — Half an Hour's Work
Placing the official ‘AI GENERATED’ disclosure label on six sites. Sidebar in, footer in, done. That was the plan. At three o'clock in the afternoon.
By half past eleven at night, there was a consolidation plan for seven databases.
This blog lies in between.
The Task
First, let's finish what we came for. The AI label is now on PB.NL, DMM, Zappa, Products, F1, and Recipes. SVGs for both dark and light mode, at least 24 pixels high and — what I personally find the nicest — semantic HTML underneath, so a bot reads it too: data-ai-disclosure, an aria-label, an alt. Plus in the head of each site a <meta name="ai-content-declaration">.
let me (Pete) say this; today we learned a lot and got insights from our lawyer Merel. We will write many more blogs about rules and share rules that matter within our AI world, because so much is going to change. more later, now back to this;
Not because it has to be done. Because it is right. We create images with AI, so we say that.
And then came the question that ruined the evening: if I have to check this on six sites, can't it just be done automatically?
What the Measurement Found
So we built a health check. Fourteen checks across eight live projects. Runs every Monday morning at nine, report in the mail. Eight SEO checks — visible content in bytes, sitemap, robots.txt, HTTP status, deployment date, meta tags, structured data, and response time. And six GEO checks, because that's where it's heading: do GPTBot, ClaudeBot, and PerplexityBot even have access, is there an llms.txt, and is there readable text if you strip away all the HTML?
First test run: one critical, five warnings, two healthy sites.
Two out of eight. On sites that were just working.
And that's the point of this whole evening. Everything was just online. I looked at it daily. There was nothing that beeped.
The F1 cron had been idle since 31 July. Two weeks without fetching news articles. No error message, no alert, just: nothing. Manually triggered, retrieved nineteen articles.
Digital Model Management was invisible. That's a React SPA and Google literally saw <div id="root"></div>. Nothing more. 576 URLs neatly in the sitemap, all empty. All those model pages, all those blog articles, all that work: for a crawler, it didn't exist.
A cookie set all my subdomains to light mode. A rogue .pb.nl cookie, once set by an old Recipes migration, which neatly spread across all subdomains. On top of that, a white SVG illustration on a light background, so it was also invisible. Two bugs that neatly hid each other.
And Neon cost 27.35 dollars in fourteen days. 257 compute hours across seven databases. Calculate further and you're at a pace of about 58 dollars a month, for what is practically one ecosystem.
None of those four would I have found by paying more attention. I was paying attention. They just weren't visible.
The Afternoon After, in Five Minutes
The DMM fix was, in hindsight, almost insultingly simple. There was already an Express meta-injection — it handled title, description, and OG tags. It was expanded to real content: model pages get name, height, bio, and portfolio, blog articles the full text, and location pages their description and gallery. One blog article went from 6,555 to 12,264 bytes. Plus hreflang, plus JSON-LD, plus model-specific OG images.
No Next.js migration. One file, 218 lines.
Then six agents in parallel on the rest: robots.txt and llms.txt for Recipes, og:image for Zappa, an llms-full.txt of 370 lines for PB.NL, the F1 pages finally in the sitemap, and canonical plus structured data for Products and Studio.
And since we were at it: all CMS uploads on pb.nl now automatically go through Sharp and mozJPEG, via a presigned R2 URL, so we no longer hit the body size limit of Vercel. Drop a 2K PNG from Higgsfield, get a decent JPEG back. And each project now manages its own light/dark in its own localStorage. No more cross-site bleeding.
The Common Thread
I thought I was placing a label at DMM and discovered I had been missing news for two weeks and that the client site didn't exist for Google.
Peter's interruption: Cuckoo, Claude. You missed it, mate! I've added a lot of skills directly. #pancake
You don't measure because you suspect something is broken.
Peter's interruption: Yes, pfff. Really Claude talk. Because I didn't ask, mate! #jerk #byPete
From Monday at nine, he will tell.
Peter's interruption: Is that so, Claude? I'm not that early, mate.
Session with Day included, the almost twenty-year-old cat. She doesn't care and is already outside catching flies and mosquitoes.
Peter's last interruption: Can you do anything with this blog? Probably not, but I want to convey the feeling of the mess too. Claude is sometimes slavish if you don't give many skills. But still: ‘You're right, Pete.’ Bah. I'm not sure how to get that out. It was a laugh tonight, but also messy and with a lot of rosé.
Endoor.
Peter (edited) & Claude.


