Tier: S (1-2 days) | Type: seo
Context. Wave 7 shipped react-i18next with EN + ES, but the site emits no hreflang alternates and canonical URLs are inconsistent per page. Google is currently guessing which locale to serve and duplicate-content risk is real once Wave 8 adds a third locale (see issue #13).
Scope.
- Add
<link rel="alternate" hreflang> entries for every localized route, plus hreflang="x-default" pointing to EN.
- Add a single canonical URL per route using
react-helmet-async (already in the dep tree per src/pages/Blog.tsx).
- Audit every existing page (
Home, Faq, Privacy, Newsletter, UseCases, Stellar, Roadmap, Grants, CaseStudies, Careers, About, Vitals, Contributors, Blog, Ecosystem) for consistent canonical + description + og:* metadata.
- Central helper in
src/utils/seo.ts so future pages inherit correctly.
Acceptance.
Files. src/utils/seo.ts (new), every src/pages/*.tsx.
Tier: S (1-2 days) | Type: seo
Context. Wave 7 shipped
react-i18nextwith EN + ES, but the site emits nohreflangalternates and canonical URLs are inconsistent per page. Google is currently guessing which locale to serve and duplicate-content risk is real once Wave 8 adds a third locale (see issue #13).Scope.
<link rel="alternate" hreflang>entries for every localized route, plushreflang="x-default"pointing to EN.react-helmet-async(already in the dep tree persrc/pages/Blog.tsx).Home,Faq,Privacy,Newsletter,UseCases,Stellar,Roadmap,Grants,CaseStudies,Careers,About,Vitals,Contributors,Blog,Ecosystem) for consistent canonical + description +og:*metadata.src/utils/seo.tsso future pages inherit correctly.Acceptance.
<link rel="canonical">with the absolute production URLhreflangalternates for every shipped locale +x-defaultcurl -sL usewraith.xyz/es/faq | grep -c hreflang>= 2 in a staging testFiles.
src/utils/seo.ts(new), everysrc/pages/*.tsx.