Skip to content

feat(course): SEO for the /learn/ pages - #1434

Merged
gHashTag merged 1 commit into
mainfrom
feat/course-seo
Oct 5, 2026
Merged

gHashTag merged 1 commit into
mainfrom
feat/course-seo

Conversation

@gHashTag

@gHashTag gHashTag commented Oct 5, 2026

Copy link
Copy Markdown
Owner

SEO for the course's static pages from #1428. Those pages were live but nothing linked to them.

  • Linked.

    • The home page's static shell (scripts/boot-shell.ts, which crawlers see before React mounts) now links /learn/. The label is the course's own title from course.generated.ts.
    • Every course screen in the app links its static page: "Link to share, with a preview card: t27.ai/learn//".
  • Snippets.

    • Titles carry the query: "Bits, trits and GF16: FPGA course, lesson 4 of 30" (RU: "...: курс по FPGA, урок 4 из 30"). This is new SAY_SEO_TITLE in the spec.
    • Descriptions are cut at a word before 155 characters; they were up to 285.
  • Content. Each lesson page now also shows:

    • the widget's own description, read from the widget page's og:description, not copied;
    • the full source of the lesson's tutorial spec, for the 10 lessons that have one.

    bits-and-trits went from about 490 words to 930.

  • Structured data.

    • Every page gets a BreadcrumbList.
    • The overview gets an ItemList of all 30 lessons.
    • The Course gets educationalLevel: Beginner.
  • llms.txt. onboarding.t27 gets COURSE, COURSE_SOURCE and COURSE_NOTE. The generator refuses a course address that is off t27.ai.

Cards are unchanged: their HTML did not change, so nothing was redrawn.

Closes #1433

{
  "version": 1,
  "head_sha": "3632bcb8098daa719b3165aa2c5362e38dbe7463",
  "summary": "The course's static /learn/ pages are now linked from the home shell and the app, carry search-sized titles and descriptions, the lesson's spec source and widget description, breadcrumbs, and are named in llms.txt.",
  "changes": [
    "scripts/boot-shell.ts: the home shell links learn/ with the course title from course.generated.ts.",
    "src/pages/Course.tsx: CourseNotes links the static page of the course or lesson to share; new SAY_SHARE and SAY_SEO_TITLE in course.t27 and course.ru.json.",
    "scripts/course-pages.mjs: SEO title, descriptions cut before 155 characters, widget og:description and tutorial spec source on lesson pages, BreadcrumbList, ItemList and educationalLevel in JSON-LD; 62 pages regenerated.",
    "specs/catalog/onboarding.t27 and scripts/onboarding-from-spec.mjs: COURSE, COURSE_SOURCE and COURSE_NOTE, checked to be on t27.ai; llms.txt and agents.t27 regenerated."
  ],
  "tests": [
    {"command": "npm run check:course-pages", "result": "62 pages up to date; 6 tests pass, including breadcrumbs, ItemList and snippet lengths", "status": "passed", "evidence": "Local run on this branch."},
    {"command": "npm run check:course && npm run test:course", "result": "30 lessons, spec tests 6 and asserts 24 hold; 15 pass", "status": "passed", "evidence": "Local run on this branch."},
    {"command": "npm run check:onboarding && npm run test:onboarding-spec", "result": "up to date, spec tests 10 and asserts 55 hold; 4 pass", "status": "passed", "evidence": "Local run on this branch."},
    {"command": "vite build && npm run check:boot-shell", "result": "boot-shell contract ok, 12 links, dist/index.html carries it", "status": "passed", "evidence": "Local run on this branch."},
    {"command": "npm run typecheck:ratchet", "result": "179 errors across 26 files, baseline 179; no file gained", "status": "passed", "evidence": "Local run on this branch."}
  ],
  "limitations": [
    "eslint react-hooks/set-state-in-effect in Course.tsx is on main already; this change does not touch that effect.",
    "Search Console and Yandex Webmaster need the owner's sign-in; sitemaps are submitted there separately."
  ],
  "tags": ["Course", "Website", "SEO"],
  "blog": {
    "title": "Making the t27 course findable",
    "summary": "The course's static pages existed but nothing linked to them; now the home page and the app link them, and each lesson carries its own spec source.",
    "outline": [
      "Why a page reachable only from a sitemap ranks poorly, and how the home page's crawler-visible shell and the in-app share link fix that.",
      "Search-sized titles and descriptions generated from the course spec in two languages, with a test that holds them to the length a result shows.",
      "Giving thirty lesson pages enough of their own words: the tutorial spec's real source and the tool's own description, read rather than copied."
    ]
  }
}

🤖 Generated with Claude Code

…spec source, breadcrumbs

The home page shell now links /learn/, and every course screen links its own
static page to share. Titles carry the query ("...: FPGA course, lesson 4 of
30"), descriptions fit a result (<=155), each lesson page shows its widget's
own description and its tutorial spec's source, and JSON-LD gains
BreadcrumbList and, on the overview, ItemList. onboarding.t27 (llms.txt)
names the course.

Closes #1433

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@github-actions github-actions Bot added the status:in-progress 🔵 Agent working label Oct 5, 2026
@github-actions

github-actions Bot commented Oct 5, 2026

Copy link
Copy Markdown
Contributor

X Brain Health Check

Score: 100.0/100
Status: 🟢 HEALTHY
Threshold: 80/100

X Brain is above merge threshold

@github-actions

github-actions Bot commented Oct 5, 2026

Copy link
Copy Markdown
Contributor

🧪 Brain Stress Test Results

Tests: 261/261 passed, 0 leaked
Status: 🟢 PASS
Gate: every test in zig build test-brain-stress passes and none leaks

@gHashTag
gHashTag merged commit 990aa6f into main Oct 5, 2026
37 checks passed
@gHashTag
gHashTag deleted the feat/course-seo branch October 5, 2026 19:25
@github-actions github-actions Bot added status:completed Done and removed status:in-progress 🔵 Agent working labels Oct 5, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Course SEO: link the /learn/ pages, shorter snippets, real content, breadcrumbs

1 participant