The i18n + SEO Cleanup Chronicles: Canonical Chaos, hreflang Therapy, and Other Adventures
A long-form dev log on fixing multilingual routing and SEO consistency in CryptoBacktest, based on real commits across language toggles, canonical tags, sitemap, and robots.
Series: CRYPTOBACKTEST B.LOG
- 1. Ship Week Diaries: How v8.5 Turned into a Product Identity Rewrite
- 2. 8 years of Bitcoin data taught me more than any trading book
- 3. The Mobile Menu Trilogy: One Button, Three Fixes, Mild Emotional Damage
- 4. The i18n + SEO Cleanup Chronicles: Canonical Chaos, hreflang Therapy, and Other Adventures ← you are here

If you ever hear someone say:
"International SEO is easy, just add hreflang."
Please smile politely, offer them water, and slowly change the topic.
Because this saga was not one change.
It was a chain reaction across links, canonicals, sitemap entries, language toggles, and pages that all looked okay until you opened source and cried a little.
Why This Cleanup Happened
By mid-February, we had enough English/Korean pages that small mistakes multiplied:
- wrong counterpart links
- incorrect canonical paths
- missing or mismatched alternates
- language toggle inconsistencies
Everything still rendered.
That was the dangerous part.
Broken i18n SEO rarely crashes your app.
It just silently undercuts discoverability.
Commits That Defined the Cleanup
Core sequence:
a297d74(2026-02-15): fix language toggle redirect mappingsc2a31c1(2026-02-16): canonical + hreflang correction sweepf861324(2026-02-16): sitemap/robots overhaul2334e8f(2026-02-20): EN toggle style fix on Korean landing page
Yes, even button style made it into the SEO cleanup narrative.
Because if users can't confidently switch language, your perfect hreflang setup still loses practical value.
Canonical + hreflang: A Real Diff Example
From c2a31c1, English pages gained explicit alternates:
<link rel="canonical" href="https://cryptobacktest.com/app.html">
<link rel="alternate" hreflang="en" href="https://cryptobacktest.com/app.html">
<link rel="alternate" hreflang="ko" href="https://cryptobacktest.com/ko/app.html">
<link rel="alternate" hreflang="x-default" href="https://cryptobacktest.com/app.html">
And Korean pages were corrected from bad paths like:
<link rel="canonical" href="https://cryptobacktest.com/ko/ko/app.html">
to:
<link rel="canonical" href="https://cryptobacktest.com/ko/app.html">
That one duplicated /ko/ko/ was small in text, large in consequences.
Language Toggle Consistency Is Part of i18n Quality
From 2334e8f (ko/index.html), we fixed the EN toggle class/styling mismatch:
<a href="../index.html" class="btn-nav lang-toggle" style="background:rgba(255,255,255,0.1);border:1px solid rgba(255,255,255,0.2);color:var(--text-primary);padding:6px 14px;" title="English / Korean">🌐 EN</a>
This looked cosmetic, but it fixed a real trust issue.
When language controls look broken, users assume language behavior is broken too.
And honestly? They are often right.
Robots + Sitemap: Not Glamorous, Very Important
f861324 added robots.txt and expanded sitemap.xml metadata quality.
Snippet from robots.txt:
User-agent: *
Allow: /
Sitemap: https://cryptobacktest.com/sitemap.xml
And the sitemap moved from bare URL lists to richer entries:
<lastmod>2026-02-16</lastmod>
<changefreq>weekly</changefreq>
<priority>0.9</priority>
Is this exciting? No.
Does this matter? Absolutely.
SEO quality is usually a stack of "boring but correct" decisions.
Screenshot of the Core Surface

The homepage is where language identity starts:
- nav labels
- CTA clarity
- route expectations
- trust signals
If i18n is shaky here, everything downstream costs more.
Tangent: Why This Felt Hard as a Non-Developer
As a non-traditional builder, I expected hard things to be:
- strategy math
- indicator tuning
- simulation complexity
Turns out, one of the hardest things is making dozens of static pages behave like one coherent multilingual product.
No one claps for canonical tags in demos. But they absolutely notice when your language routing feels broken.
Practical Checklist We Ended Up Using
If you're doing a similar cleanup, this saved us:
- every page must have canonical + en/ko/x-default set
- language toggle must map to exact counterpart route
- sitemap alternates must mirror page-level alternates
- robots must include sitemap
- style consistency for language switch controls
Simple list. Massive reduction in subtle breakage.
Final Take
Internationalization is not a single feature. It's a reliability discipline.
You do not "finish i18n" once. You maintain it every time routing, content, or UI changes.
And yes, sometimes that means spending an evening debugging one path segment like /ko/ko/ and questioning your life choices.
That is still better than leaving it broken and wondering why search traffic feels weird three weeks later.