Build1 distinct publisher3 min readUpdated
An audit of one static site's hreflang and JSON-LD found a geo-redirect that would have hidden the Hebrew homepage from Googlebot, and a verifier that checked 21 of 365 changed nodes.
The Engineer · Build desk
Compiled by The EngineerSomething wrong?How this is made
A redirect that sends the wrong readers to the wrong language still answers with a 302 and then a 200. A stale array inside a JSON-LD blob is still valid JSON and still valid schema.org. Neither is a bug in the sense a test suite understands, which is why all four findings rendered perfectly and logged nothing [2].
The geo-redirect is the interesting one, because the obvious fix is the trap. The author's first instinct was to widen the rule: detect English-speaking countries and send them to /en/ [5]. That routes humans by IP, and it routes crawlers by IP too. Googlebot crawls predominantly from US addresses, so a country-keyed redirect on / would take it off the Hebrew homepage on almost every visit [6]. The page meant to rank in the primary market becomes the page the crawler cannot reach.
hreflang was already in place and already correct, x-default included [7]. The two ways it fails are both quiet. The cluster has to be reciprocal, and a missing back-link from /en/ to / entitles search engines to ignore the whole group [8]. And x-default reads like "our main language", which here would have meant Hebrew, when it is actually the fallback for a visitor whose language you do not publish at all [9].
The honest residual: hreflang is a search-engine protocol, and a crawler that fetches the bare domain and reads what comes back gets Hebrew, which is what several AI crawlers do [10]. The mitigation is off-site, not on: make /en/ the URL that appears in every directory listing and profile [10].
Then the arithmetic. The WebApplication node's inLanguage array listed eight languages [11] on a site that publishes twelve [1], so a third of the catalogue was missing from the most machine-readable statement on the page [1]. Four languages had shipped since the array was written, and nothing broke, because nothing ever does [12].
The sameAs finding has the same shape with more at stake: two profiles listed, two more verified and absent [14]. One omission was deliberate, and it is the right call. A submitted listing still in a moderation queue 404s until approval, and asserting an identity link to a page that does not exist is worse than asserting nothing [15].
The number that should travel furthest is the verification gap. A scripted replacement touched 365 nodes; the verification pass counted 21 [16], because it iterated the top level of each ld+json block and most Organization nodes sit nested below it [17]. That leaves 344 modified nodes that no check ever looked at, and a verifier with a 5.8 percent field of view [2]. It failed in the survivable direction, reporting too few changes rather than too many, and only because someone compared its output to what the script had actually done. The cheap defence against the stale-array class is a test that reads the language directory and diffs it against the array, roughly ten lines [13].
Follow any of these and your For You feed starts watching them — no settings page required.
Ranked by verification strength, evidence, and original report placement.
An hreflang set must be reciprocal: every page lists every other page including itself, and if /en/ does not point back at /, search engines are entitled to ignore the whole cluster.
x-default is not the site's default language but the fallback for users whose language the site does not publish; pointing it at the Hebrew homepage would have been the intuitive and wrong reading.
The author's rule is that structured-data values duplicating a fact held elsewhere in the codebase should be generated from the source of truth or covered by an assertion; a test reading the language directory listing and comparing it to the array is about ten lines.
The author runs a search engine that publishes in twelve languages from one static site hosted on Cloudflare Pages.
An audit of the site's machine-readable layer found four problems; none threw an error, none appeared in logs, and every page rendered correctly.
The site's primary market speaks Hebrew, so / serves Hebrew, with /en/, /ar/, /de/ and nine other language paths alongside it.
Evidence-backed comparisons of source perspectives and observed adoption signals. Read the methodology
Which Builder, Operator, and Investor concerns the observed source mix emphasized—not a truth score.
Evidence, demonstrated adoption, hype gap, incentives, and confidence are assessed independently, each on its own current evidence. How these are measured.
Specific and internally checkable, but single-source and unverifiable
The report is unusually concrete for an anecdote: quoted hreflang tags, the literal inLanguage array, the flat-scan code and its recursive replacement, and hard counts (21 of 365 nodes, 1,753 ld+json blocks) that are arithmetically consistent. Against that, it is one first-person post from one publisher, the domain is anonymised to example.com, no validator output or repository is shown, and the third-party behavioural claims about Googlebot crawl IPs and AI crawlers carry no attribution or measurement. Nothing can be independently reproduced from what is supplied.
One self-reported production site
Adoption evidence is limited to the author's own disclosure: a live twelve-language site on Cloudflare Pages with 1,753 ld+json blocks, and one bulk sameAs edit shipped through a parse-guarded pipeline. That is genuine production usage, not a demo, but it is n=1 and self-reported, with no third party shown using the recommended tree-walking verifier or the ten-line inLanguage assertion, and no post-fix indexing or traffic figures.
Mostly proportionate, with generalisation beyond the evidence
The tone is deliberately deflationary — 'None of this is clever' — and the author volunteers the limits of hreflang and one judgement call about a 404-ing sameAs, which pulls the gap toward zero. The small positive comes from framing that outruns the data: the harm of the unshipped geo-redirect is stated as near-certain, third-party crawler behaviour is asserted without citation, and single-site failure modes are generalised into universal rules with no outcome measurement.
Practitioner credibility, one client reference, no product pitch
The author writes as an operator of the audited site and mentions being 'one step away from telling my client the bulk edit had barely applied', so professional credibility and consulting reputation are plausible motives for publishing on a developer platform. Offsetting that, no product, vendor or paid tool is promoted, the domain is anonymised rather than marketed, and the post catalogues the author's own mistakes — a pattern inconsistent with strong commercial pressure. No sponsorship, funding or affiliation disclosure appears in the supplied material.
Coherent single account, no corroboration
Confidence is moderate: the narrative is internally consistent, the numbers reconcile, and the mechanism (flat scan versus nested Organization nodes) is a well-formed technical explanation that does not depend on trust. But there is one publisher, one author, an anonymised domain, no artefacts, and several load-bearing assertions about third-party crawlers that the cluster cannot check, so the specific figures and the protocol-behaviour claims should be treated as unconfirmed.
build
A default JSON-LD bundle beats a taxonomy research project on every new site1 distinct publisher
build
Three manual interventions in a month, and every guard was working as designed1 distinct publisher
build
Six MariaDB versions, one real difference: the only reason to leave 10.6 is the July 2026 clock1 distinct publisher
build
A build step instead of a backend: 1,025 records, 8 locales, no runtime API1 distinct publisher
Distinct publishers with included, body-backed reporting in this cluster.
dev.to
1 article · August 22, 2026