fix: keep language switching on the canonical root URL #5

Merged
ClaudiuSchuster merged 1 commit from fix/root-language-switch-20261010 into main 2026-10-10 21:02:28 +00:00
Owner

Why

The owner requested language switching on the same homepage URL and removal of the separate English page from current navigation and Google discovery signals. Preserve all existing German and English copy and the recently published Person/favicons.

Result

  • The existing language control becomes a button. It changes the existing copy and language metadata in place, retains the root canonical and og:url, and remembers the selection for the current tab with guarded sessionStorage.
  • The static default remains complete German HTML. The English HTML document is removed; the sitemap contains only the canonical root and the head advertises no hreflang alternatives.
  • The 404 keeps its existing visible text. Both language choices lead to root and remember the chosen language when JavaScript is available.
  • A supported Sites Worker ESM handler sends actual HTTP 301 for /en, /en/, /en/index.html and /index.html to the root. Unknown routes return the actual bilingual 404 with noindex. Robots permits Google to follow the old redirects.
  • Authored and generated public assets move from dist/ to public/. The deterministic builder embeds their exact bytes into the supported dist/server/index.js artifact. The existing project ID, domain and public audience are retained.

Existing query language links are consumed and cleaned, but none are generated. English remains an interface language of one URL; it is deliberately no longer independently indexable. Old Google entries disappear through recrawling and processing, not an immediate removal guarantee.

Verification

  • make check: PASS, including static metadata, favicon formats, source references, the single-URL sitemap, language behavior, storage/history failures and 404 choices.
  • Worker HTTP checks: PASS for all 19 exact asset bodies, MIME, GET/HEAD, ETag/304, the four permanent redirects and real noindex 404s.
  • All 11,447 bytes of translation/project definitions are unchanged. Existing homepage and 404 text sequences are unchanged; Person JSON-LD and all images/fonts remain unchanged.
  • Independent frontend and Worker reviews: PASS.
  • Google Live Tests and initial HTTP responses will be checked after the existing Sites project is published. Successful source tests do not establish Google's processing of the new URL contract.

The technical record and earlier, clearly labelled two-URL results are retained in docs/search-console.md. No external project sitemap or metadata is changed by this PR.

Release

Merge this verified candidate, save and deploy the exact prepared source through the existing Sites project, then check the homepage, language button, old routes, sitemap, robots, favicon and unknown route. Record the Sites version and native source commit separately from this repository's merge commit. Follow up in the existing Search Console property using the root as the only canonical page.

## Why The owner requested language switching on the same homepage URL and removal of the separate English page from current navigation and Google discovery signals. Preserve all existing German and English copy and the recently published Person/favicons. ## Result - The existing language control becomes a button. It changes the existing copy and language metadata in place, retains the root canonical and og:url, and remembers the selection for the current tab with guarded sessionStorage. - The static default remains complete German HTML. The English HTML document is removed; the sitemap contains only the canonical root and the head advertises no hreflang alternatives. - The 404 keeps its existing visible text. Both language choices lead to root and remember the chosen language when JavaScript is available. - A supported Sites Worker ESM handler sends actual HTTP 301 for /en, /en/, /en/index.html and /index.html to the root. Unknown routes return the actual bilingual 404 with noindex. Robots permits Google to follow the old redirects. - Authored and generated public assets move from dist/ to public/. The deterministic builder embeds their exact bytes into the supported dist/server/index.js artifact. The existing project ID, domain and public audience are retained. Existing query language links are consumed and cleaned, but none are generated. English remains an interface language of one URL; it is deliberately no longer independently indexable. Old Google entries disappear through recrawling and processing, not an immediate removal guarantee. ## Verification - `make check`: PASS, including static metadata, favicon formats, source references, the single-URL sitemap, language behavior, storage/history failures and 404 choices. - Worker HTTP checks: PASS for all 19 exact asset bodies, MIME, GET/HEAD, ETag/304, the four permanent redirects and real noindex 404s. - All 11,447 bytes of translation/project definitions are unchanged. Existing homepage and 404 text sequences are unchanged; Person JSON-LD and all images/fonts remain unchanged. - Independent frontend and Worker reviews: PASS. - Google Live Tests and initial HTTP responses will be checked after the existing Sites project is published. Successful source tests do not establish Google's processing of the new URL contract. The technical record and earlier, clearly labelled two-URL results are retained in docs/search-console.md. No external project sitemap or metadata is changed by this PR. ## Release Merge this verified candidate, save and deploy the exact prepared source through the existing Sites project, then check the homepage, language button, old routes, sitemap, robots, favicon and unknown route. Record the Sites version and native source commit separately from this repository's merge commit. Follow up in the existing Search Console property using the root as the only canonical page.
Author
Owner

Exact remote PR verification

The complete repository gate, make check, passed from a fresh, clean HTTPS clone of this PR head 0dc7c99d7cb2f8cc322ada05381b092e257ac3ab. This repository has no tracked Forgejo, Gitea or GitHub CI workflow; the established gate is its Makefile check. No check was skipped or replaced.

The remote PR tree is 6480c7f99be2b5e2c0fbc409645eba9bf33584be, exactly equal to the prepared and pushed Sites source tree at 2cf5798db6df8eb8c2bd026702f21688b2ff044d. Both independently built Worker files have SHA-256 726d5013e1046972ef07beb7910b17be97fed8950b461c2188ea85158d011ab2.

All metadata, language, asset, HTTP 301/404, GET/HEAD and ETag checks passed for this exact candidate. The existing frontend and Worker reviews also passed. Production and Google follow-up remain the next release steps.

## Exact remote PR verification The complete repository gate, `make check`, passed from a fresh, clean HTTPS clone of this PR head `0dc7c99d7cb2f8cc322ada05381b092e257ac3ab`. This repository has no tracked Forgejo, Gitea or GitHub CI workflow; the established gate is its Makefile check. No check was skipped or replaced. The remote PR tree is `6480c7f99be2b5e2c0fbc409645eba9bf33584be`, exactly equal to the prepared and pushed Sites source tree at `2cf5798db6df8eb8c2bd026702f21688b2ff044d`. Both independently built Worker files have SHA-256 `726d5013e1046972ef07beb7910b17be97fed8950b461c2188ea85158d011ab2`. All metadata, language, asset, HTTP 301/404, GET/HEAD and ETag checks passed for this exact candidate. The existing frontend and Worker reviews also passed. Production and Google follow-up remain the next release steps.
Author
Owner

Publication and Google verification — Sites version 7

This PR is merged as bb9aea3b67e5d9f718bcc32632d791911368051c. The existing Sites project appgprj_6aca21d607d0819191cb082e490d5217 successfully published version 7 at 2026-10-10 21:03:55 UTC. The Sites source snapshot 2cf5798db6df8eb8c2bd026702f21688b2ff044d, PR head and external merged main have the same complete tree 6480c7f99be2b5e2c0fbc409645eba9bf33584be. The established make check gate and independent reviews passed; this repository has no native CI workflow.

Published behavior verified

  • German and English switch inline on https://chatgpt.claudiuschuster.de/; English remains after reload in the same tab. Canonical and og:url stay at root.
  • No active /en/ or /de/ language anchors or hreflang URLs remain; the sitemap contains exactly the root URL.
  • Ordinary public HTTP audit: all 19 assets match source bytes; /en, /en/, /en/index.html and /index.html each return 301 directly to root, followed by 200 in exactly one hop. Unknown URL and the error document return 404, with noindex. Root HEAD is 200.
  • Existing Person identity, translations, visible text and favicon/image/font assets were preserved.

Google evidence

Property: sc-domain:chatgpt.claudiuschuster.de. Live Test 10 October 2026, 23:12:19 CEST: HTTP 200, crawl/index allowed, root declared canonical, all resources loaded, no JavaScript messages. The fetched HTML contains the approved static Person (alternateName: ClaudiuSchuster), root metadata and favicon.

A single post-migration root indexing request was accepted at 21:17 UTC. The updated existing sitemap was also successfully submitted. Its report still shows the previously discovered two pages; the served XML now contains one. Google processing has not yet refreshed that count.

The stored regular root crawl remains 10 October 2026, 16:45:31 CEST, before this deployment. The earlier stored /en/ result may remain visible until Google recrawls the permanent redirect; no immediate disappearance or newly processed indexing is claimed.

The requested single-URL language experience is live. Future verification should record Google’s regular recrawl/canonical state and sitemap refresh separately from these successful technical checks and submissions.

## Publication and Google verification — Sites version 7 This PR is merged as `bb9aea3b67e5d9f718bcc32632d791911368051c`. The existing Sites project `appgprj_6aca21d607d0819191cb082e490d5217` successfully published **version 7** at **2026-10-10 21:03:55 UTC**. The Sites source snapshot `2cf5798db6df8eb8c2bd026702f21688b2ff044d`, PR head and external merged main have the same complete tree `6480c7f99be2b5e2c0fbc409645eba9bf33584be`. The established `make check` gate and independent reviews passed; this repository has no native CI workflow. ### Published behavior verified - German and English switch inline on `https://chatgpt.claudiuschuster.de/`; English remains after reload in the same tab. Canonical and og:url stay at root. - No active /en/ or /de/ language anchors or hreflang URLs remain; the sitemap contains exactly the root URL. - Ordinary public HTTP audit: all 19 assets match source bytes; `/en`, `/en/`, `/en/index.html` and `/index.html` each return **301 directly to root**, followed by 200 in exactly one hop. Unknown URL and the error document return **404**, with noindex. Root HEAD is 200. - Existing Person identity, translations, visible text and favicon/image/font assets were preserved. ### Google evidence Property: `sc-domain:chatgpt.claudiuschuster.de`. Live Test **10 October 2026, 23:12:19 CEST**: HTTP 200, crawl/index allowed, root declared canonical, all resources loaded, no JavaScript messages. The fetched HTML contains the approved static Person (`alternateName: ClaudiuSchuster`), root metadata and favicon. A single post-migration root indexing request was **accepted at 21:17 UTC**. The updated existing sitemap was also **successfully submitted**. Its report still shows the previously discovered **two** pages; the served XML now contains **one**. Google processing has not yet refreshed that count. The stored regular root crawl remains **10 October 2026, 16:45:31 CEST**, before this deployment. The earlier stored /en/ result may remain visible until Google recrawls the permanent redirect; no immediate disappearance or newly processed indexing is claimed. The requested single-URL language experience is live. Future verification should record Google’s regular recrawl/canonical state and sitemap refresh separately from these successful technical checks and submissions.
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
ClaudiuSchuster/claudiu-project-universe!5
No description provided.