Skip to content

SEO fixes: titles that fit, schema on every tool hub, llms.txt, WebP covers - #233

Merged
xuelink merged 1 commit into
mainfrom
claude/seo-audit-visibility-5ae469
Sep 24, 2026
Merged

xuelink merged 1 commit into
mainfrom
claude/seo-audit-visibility-5ae469

Conversation

@xuelink

@xuelink xuelink commented Sep 24, 2026

Copy link
Copy Markdown
Member

From an SEO check over all 1,371 built pages, plus the live site's AI-crawler access.

Before After
Titles over 60 chars 108 15 (post titles of 61–64)
Descriptions over 160 6 0
Pages skipping h1 → h3 8 0
Tool hubs with no JSON-LD 6 0
Vague anchor text 1 0
Photo covers on /blog ~4.8 MB 88 KB
  • Titles: Seo.svelte appended " | LangX" to any title up to 56 characters, so 53–56 came out at 61–64. The suffix now goes on only when the whole fits in 60. Six post titles over 65 get an optional seoTitle front-matter field, used only for the title tag.
  • Homepage: the H1 now says "language exchange app", matching the title. The chapter H2s stay as they are, per DESIGN.md's Lowercase Chapter Rule.
  • Tool hubs: BreadcrumbList + ItemList and keyword titles on alphabet, vocabulary-test, meaning-quiz, word-game, similar and guess-the-language. /tools, /plans and /tokens get better titles too.
  • /llms.txt: prerendered from site data: summary, key pages, the homepage FAQ, every post, the tools.
  • WebP covers: scripts/covers.mjs makes a 176px square (list tile) and a full-size WebP for each of the 14 photo covers. The PNG/JPEG originals stay for og:image and RSS, and a post whose copies are missing falls back to its original.
  • Small fixes: footer group headings changed from h3 to h2 with identical computed style, six descriptions trimmed, one "here" link rewritten.

Verification: the scan was re-run on the new build. Compared in the browser against a build of main, the footer, the blog list, an article cover and an in-post full-bleed image keep the same boxes and page heights. svelte-check shows 0 errors and eslint is clean.

Not in this PR: the social preview image (static/images/site-preview.png) still shows the old H1 line. Separately, the FAQ says the minimum age is 16 while PRODUCT.md says 18; that's flagged as its own task.

🤖 Generated with Claude Code

…covers

From a check over every page of the build. Before: 108 titles over the
sixty characters a results line shows, six descriptions over 160, eight pages
that skipped from h1 to h3, six tool hubs with no structured data, no
llms.txt, and 4.8 MB of photo covers on /blog shown at 88px. After: 15 titles
over sixty, the longest 64; none of the rest.

- Seo.svelte added " | LangX" to any title up to 56 characters, so 53 to 56
  came out at 61 to 64. The suffix now goes on only when the whole fits.
- Six post titles past 65 get a shorter `seoTitle` in their front matter,
  used for the title tag alone; the heading, lists and drawn card keep theirs.
- The homepage H1 says "language exchange app", the words the title targets.
  The chapter H2s stay fragments: DESIGN.md's Lowercase Chapter Rule.
- The alphabet, vocabulary-test, meaning-quiz, word-game, similar and
  guess-the-language hubs get BreadcrumbList and ItemList, as their siblings
  have, and titles that say what they are. So do /tools, /plans and /tokens.
- /llms.txt, built from the same data as the pages: a summary, the key pages,
  the homepage FAQ, every post and the tools.
- scripts/covers.mjs makes WebP copies of the 14 photo covers: a 176px square
  for the list tile and a full-size one for the post. The originals stay for
  social cards and the feed; a post with no copies keeps showing its original.
- Footer group headings are h2, not h3, with the h3's metrics kept.
- Six descriptions trimmed under 160; one "here" link given words.

Checked against a build of main in the browser: the footer headings compute
the same styles and positions, and the blog list, a cover and an in-post
full-bleed image keep their boxes and page height. svelte-check has no errors.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@xuelink
xuelink merged commit 0479b2d into main Sep 24, 2026
1 check passed
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