Skip to content

feat(seo): sync SEO fixes across all nine locales#134

Merged
wavekat-eason merged 1 commit into
feat/seo-recent-postsfrom
feat/seo-i18n-sync
Jul 26, 2026
Merged

feat(seo): sync SEO fixes across all nine locales#134
wavekat-eason merged 1 commit into
feat/seo-recent-postsfrom
feat/seo-i18n-sync

Conversation

@wavekat-eason

Copy link
Copy Markdown
Contributor

Stacked on #133 — mirrors the English work into the eight translations and clears the meta-length backlog site-wide. Merge #133 first; GitHub will retarget this to main automatically.

Posts — 4 posts × 8 locales

Renamed headings, self-contained lead sentences, the merged click-to-call intro, the per-system audio format table, and the new FAQs — translated rather than transplanted.

The demand term is bridged to the product noun in each market's own vocabulary:

Locale Term used for "auto attendant"
zh-Hans / zh-Hant 自动总机 / 自動總機
ja オートアテンダント(自動受付)
ko 자동응답 (오토 어텐던트)
de automatische Telefonzentrale
es operadora automática
fr standard automatique
it centralino automatico

"Call flow" stays the product noun everywhere, and each locale's new FAQ says plainly that it is not a full enterprise IVR — so no page argues with itself in any language.

Meta lengths — why this was needed

A faithful translation runs 30–60% longer than its English source, so 59 title/description fields were truncating in SERPs; one French description was 261 characters against a ~160 budget. All are now inside budget, measured by display width rather than character count — CJK truncates at roughly half the character count of Latin text, so a naïve .length check both over- and under-reports.

This pass also covers the five older posts, not just the recent four.

Pages — 8 locales each

  • /voice/ gains the two feature cards, the two FAQs (feeding the existing FAQPage schema), and the SoftwareApplication featureList.
  • /voice/prompts/ gains the FAQ connecting the generator to call flows.

Verification

  • npx astro build → 213 pages; npm run check:links → no broken or leaking internal links.
  • Structural parity audit: every localized post matches the English H2/H3/table counts exactly, and all eight localized product pages match the English feature/FAQ/schema counts.
  • No URLs changed. Slugs come from filenames, not titles; nothing was renamed, and nothing in the repo links to an in-post heading anchor.

🤖 Generated with Claude Code

https://claude.ai/code/session_01EwxQJL43iApJRb4NS5p6vD

Mirrors the English work from the previous commit into the eight
translations, and clears the meta-length backlog site-wide.

Posts (4 posts x 8 locales):
- Renamed headings, self-contained lead sentences, the merged
  click-to-call intro, the per-system audio format table, and the new
  FAQs, all translated rather than transplanted.
- The demand term is bridged to the product noun in each market's own
  vocabulary: 自动总机 / 自動總機 / オートアテンダント / 자동응답 /
  automatische Telefonzentrale / operadora automática / standard
  automatique / centralino automatico. The product noun ("call flow")
  stays untranslated-in-meaning everywhere, and each locale's new FAQ
  states plainly that it is not a full enterprise IVR.

Meta lengths — the reason this was needed:
- A faithful translation runs 30-60% longer than its English source, so
  59 title/description fields were truncating in SERPs; one French
  description was 261 characters. All are now inside budget, measured by
  display width rather than character count, since CJK truncates at
  roughly half the character count of Latin text.
- This also covers the five older posts, not just the recent four.

Pages (8 locales each):
- /voice/ gains the two feature cards, the two FAQs (feeding the
  existing FAQPage schema), and the SoftwareApplication featureList.
- /voice/prompts/ gains the FAQ connecting the generator to call flows.

Verified: 213 pages build, no broken or leaking internal links, and every
localized post now matches the English heading and table structure
exactly.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EwxQJL43iApJRb4NS5p6vD
@wavekat-eason
wavekat-eason merged commit 0dfab40 into feat/seo-recent-posts Jul 26, 2026
@wavekat-eason
wavekat-eason deleted the feat/seo-i18n-sync branch July 26, 2026 01:51
wavekat-eason added a commit that referenced this pull request Jul 26, 2026
An SEO/GEO pass over the four most recent blog posts and the `/voice/`
product
pages, applied in **all nine languages** — plus the CLAUDE.md rule that
makes
this review mandatory going forward. (#134 merged into this branch, so
this PR
now carries both the English work and the full i18n sync.)

**No URLs changed.** No file was renamed, so every slug is identical and
no
redirects are needed. Some `##` headings were reworded; nothing in the
repo
links to an in-post heading anchor.

## Why

Three problems, found with the `claude-seo` skills:

1. **`/voice/` never said what people search for.** The product page
contained
the words "call flow", "auto attendant" and "click-to-call" exactly zero
times, so the two newest features had no landing page — only blog posts.
2. **Titles and descriptions were off-budget**, badly so in translation.
A
faithful de/es/fr/it translation runs 30–60% longer than its English
source,
and one French description had reached 261 characters against a ~160
budget.
3. **Posts buried their own answer.** Leads assumed context, headings
were
labels ("What it does", "How it works") rather than the question the
section
   answers, and one post defined the product twice in two consecutive
   paragraphs.

## Entity term vs demand term

The interesting decision here. "Call flow" is what the app calls the
feature;
"auto attendant" is what people type into Google. Renaming the feature
would
break the naming consistency CLAUDE.md asks for, so instead the two are
**bridged**: the product noun stays the entity everywhere, the demand
term goes
in the title, the description, one bridging sentence, and an FAQ that
says
plainly which is which — including that a call flow is *not* a full
enterprise
IVR. No page claims something its own FAQ then denies.

Each locale uses its own market's word rather than a transliteration:

| Locale | "auto attendant" |
|---|---|
| zh-Hans / zh-Hant | 自动总机 / 自動總機 |
| ja | オートアテンダント(自動受付) |
| ko | 자동응답 |
| de | automatische Telefonzentrale |
| es | operadora automática |
| fr | standard automatique |
| it | centralino automatico |

## What changed

**Posts** (4 × 9 languages)

- `answer-calls-with-a-call-flow` — retitled *Call Flows — an Auto
Attendant for
Small Business*; self-contained lead; new FAQ on auto attendant vs IVR.
- `click-to-call-phone-links` — merged the duplicated definition into
one
  definitional lead; description 187 → 145.
- `phone-menu-ivr-voice-generator` — new "Which format does your phone
system
need?" table (Asterisk/FreePBX/3CX/Twilio/hosted VoIP, verified against
each
  vendor's docs) and two FAQs; 971 → 1,309 words, 3 → 5 internal links.
- `hold-switch-and-transfer-calls` — description trimmed, cross-link
added.

Meta lengths were re-audited across all 81 posts by **display width**,
not
character count — CJK glyphs occupy two width units, so a naive
character count
over-penalizes Latin brand names inside CJK titles and flagged 8 posts
that were
in fact fine. All genuine overflows are fixed.

**Pages** (2 × 9 languages)

- `/voice/` — two feature cards (answers when you can't, click a number
to call
it), two FAQs, and a `featureList` on the `SoftwareApplication` schema.
- `/voice/prompts/` — FAQ linking the prompt generator to call flows.

**CLAUDE.md** — every page, post, or translation now gets a `claude-seo`
review
before it ships, with the length budgets (including the separate CJK
budget) and
the entity-vs-demand-term rule written down.

## Verification

- `npx astro build` — 213 pages
- `npm run check:links` — no broken or leaking internal links
- `npm run check:screenshots` — all 162 present
- Structural parity audit — every localized post matches the English
H2/H3/table
  counts exactly; all nine `/voice/` pages emit 14 FAQ questions and a
  `featureList`; all nine `/voice/prompts/` pages emit 7.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

https://claude.ai/code/session_01EwxQJL43iApJRb4NS5p6vD

---------

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant