Build Daily

Tinley Park · May 29, 2026

SEO with a feedback loop

Three things had to be true after this week: the site is findable by strangers, I can tell when they show up, and the system gets better every time a post lands a citation. Thirteen SEO stories shipped — the schema work plus GA4 + GSC for measurement; the pre-commit gate that closes the loop ships next.

Start with the work. The bar wasn't write better prose. It was publish a typed schema that says what your prose is. BreadcrumbList JSON-LD on every content type. Person and Organization schema linked through an /about page that resolves. FAQPage where the post is structured Q&A. CollectionPage on listings. Dynamic OG images per post. An author bio component that matches the schema. The generateMetadata surface. A sitemap that updates with every deploy. An alt-text audit that finally caught the logo. None of it required me to rewrite a sentence.

The crawler is not a reader. The crawler is a parser. Give it strict types and it does the rest.

EEAT is a question, not a vibe

Google added EEAT — experience, expertise, authoritativeness, trust — to push back on AI-spam content. The phrase reads like a vibe. It isn't. It's a question: are you actually who you say you are?

The answer has to be machine-checkable. Person schema with a name. Organization schema with the same name. An /about page that links to the social profiles named in the schema. Bylines that match. Links that resolve to the real accounts. If any of those break, a crawler can't separate you from a bot. I encoded the identity once, in schema, and the rest of the surface inherits it. That was the work — not writing a better bio.

The rule that didn't fit

One example. The rulebook says add an H1 to the homepage. The site's wordmark already was one; I missed it on the first read and added a visible second heading, which looked wrong, and walked it back. The fix that landed is an invisible descriptive heading that crawlers and screen readers see but readers don't. A rule is a contract, not a literal — "tell a machine what the page is about" was already half-covered by the design; the fix only needed to cover the other half.

Why I cared at all

I'm one writer, this is the brand surface, and the people who matter aren't in my network. Recruiters Google candidates. Prospects search "build-in-public engineer." AI answer engines — Perplexity, ChatGPT search, Gemini — increasingly answer who builds local-first agent stacks by parsing JSON-LD and EEAT signals, not by reading prose. SEO is how strangers find the site without me sharing it. The bet underneath every post is that it becomes a long-lived asset, not a one-week social impression. Compounding only works if the crawler can parse what's there.

How I'll know it's working

SEO measurement stack — five layers from CI validators to cold inboundFive numbered rows ascending from cheapest signal to highest value. Layer 01: Validators — Lighthouse plus Rich Results in CI. Layer 02: Crawl health — Google Search Console. Layer 03: Traffic — GA4 linked to GSC. Layer 04: AI citations — manual spot-checks. Layer 05: Outcome — a cold inbound that names the site as the source.MEASUREMENT STACK · 5 LAYERSlowest effort at the bottom · highest signal at the top · trust the slow signals01VALIDATORSCI · PRE-COMMITLighthouse SEO + Rich Results validation. Catches regressions before prod.02CRAWL HEALTHGSCIndexed vs submitted, average position, branded + unbranded queries.03TRAFFICGA4 + GSCUnique visitors from non-social sources. The long tail is the SEO signal.04AI CITATIONSMANUALPerplexity, ChatGPT search, Gemini — five queries every Friday.05OUTCOMETHE GOALA cold inbound that names the site as the source. Once. Then again.FIG. 1 — Engineers over-index on layer 01. The actual decisions get made at 04 and 05.
↗ click to enlarge

The pipeline that keeps it improving

Same shape as the voice-learning loop that shipped on this site earlier in the week. Three pieces.

A pre-publish gate. Extend the existing pre-commit hook. Validate the JSON-LD on every commit touching content or templates. Run Lighthouse on every PR. Fail the build if a structured-data check regresses. Two stories queued for it; the wiring is small once the hook pattern exists.

A post-publish loop. A weekly digest will be pulled from Google Search Console and GA4. New keywords gained, positions lost, crawl errors, post-level engagement deltas. Cron'd to land in my inbox Sunday morning so the week starts with the read, not me digging for it. Status: GSC connected, GA4 wired and collecting, digest not built yet.

A citation flywheel. For every post that earns a real citation — in an AI engine, or as the answer to a non-branded search — the move is: reverse-engineer what made it citable, then encode the finding as a new pre-publish check or a new template rule. The voice rubric on this site grew from nine checks to ten on Saturday after a drafter run exposed a staircase-cascade tic; same shape will apply here. No citations to learn from yet — the flywheel is a shape, not a system, until the first one lands.

The missing piece is layer 04 automation — there's no API for did Perplexity cite this URL. For now: manual spot-checks against a fixed five-query battery, every Friday. If it turns out to matter enough, an agent runs the spot-checks. If it doesn't, manual stays cheap.

What ships next

The SEO pre-commit check ships by 2026-06-07. Lighthouse + Rich Results validation on every PR that touches web/content/ or web/components/. Same shape as the voice-parity hook — fast, free, local, informational by default with a threshold knob for hard-gating when the bar gets stable.

  • #seo
  • #eeat
  • #building-in-public
  • #feedback-loops

Continue reading