← Back to blog
Dev LogSEOi18nWeb

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.

by Jay3 min readCRYPTOBACKTEST B.LOG

Series: CRYPTOBACKTEST B.LOG

  1. 1. Ship Week Diaries: How v8.5 Turned into a Product Identity Rewrite
  2. 2. 8 years of Bitcoin data taught me more than any trading book
  3. 3. The Mobile Menu Trilogy: One Button, Three Fixes, Mild Emotional Damage
  4. 4. The i18n + SEO Cleanup Chronicles: Canonical Chaos, hreflang Therapy, and Other Adventures ← you are here

CryptoBacktest blog page

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 mappings
  • c2a31c1 (2026-02-16): canonical + hreflang correction sweep
  • f861324 (2026-02-16): sitemap/robots overhaul
  • 2334e8f (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

CryptoBacktest home page

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:

  1. every page must have canonical + en/ko/x-default set
  2. language toggle must map to exact counterpart route
  3. sitemap alternates must mirror page-level alternates
  4. robots must include sitemap
  5. 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.