Skip to content

feat(seo): sharpen posts and voice pages sitewide#133

Merged
wavekat-eason merged 3 commits into
mainfrom
feat/seo-recent-posts
Jul 26, 2026
Merged

feat(seo): sharpen posts and voice pages sitewide#133
wavekat-eason merged 3 commits into
mainfrom
feat/seo-recent-posts

Conversation

@wavekat-eason

@wavekat-eason wavekat-eason commented Jul 26, 2026

Copy link
Copy Markdown
Contributor

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.ai/code/session_01EwxQJL43iApJRb4NS5p6vD

Review the four most recent posts against the site's SEO/GEO rules and
fix what they missed.

Posts:
- Titles and descriptions back inside SERP budgets (two descriptions ran
  187 and 197 chars; two titles overran once " — WaveKat" is appended).
- Bridge the entity term to the demand term: a call flow is what other
  systems sell as an auto attendant. Adds that to the lead, the title,
  and a new FAQ that also states plainly what it is not (a full IVR),
  so the page never argues with itself.
- Label-only H2s ("What it does", "Turning it on", "How it works")
  rewritten as the thing the section answers.
- Self-contained lead sentences under headings that started mid-thought,
  so a passage still reads correctly lifted out of context.
- Drop the duplicated product definition in the click-to-call intro.
- Add a per-system audio format table to the voice generator post, and
  cross-link the posts that belong together.

Pages:
- /voice/ never contained "call flow", "auto attendant" or
  "click-to-call", so the page that should own those queries had nothing
  to rank on. Adds two feature cards, two FAQs (feeding the existing
  FAQPage schema), and a featureList on the SoftwareApplication schema.
- /voice/prompts/ links the generator to call flows.

CLAUDE.md: every page, post and translation now gets a claude-seo review
before shipping, with the length budgets written down — including the
CJK ones, since SERP truncation is pixel-width, not characters.

Translations are not updated yet: the 8 locales still mirror the old
English structure, and their meta fields have their own length problem
(one French description is 261 chars). Both land next.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EwxQJL43iApJRb4NS5p6vD
@github-actions

Copy link
Copy Markdown
Contributor

wavekat-eason and others added 2 commits July 26, 2026 13:51
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.com/claude-code)

https://claude.ai/code/session_01EwxQJL43iApJRb4NS5p6vD

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EwxQJL43iApJRb4NS5p6vD
@wavekat-eason wavekat-eason changed the title feat(seo): sharpen recent posts and voice page feat(seo): sharpen posts and voice pages sitewide Jul 26, 2026
@wavekat-eason
wavekat-eason merged commit 4971509 into main Jul 26, 2026
2 checks passed
@wavekat-eason
wavekat-eason deleted the feat/seo-recent-posts branch July 26, 2026 02:33
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