Repository navigation
feat(course): SEO for the /learn/ pages - #1434
Merged
Merged
Conversation
…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>
Contributor
X Brain Health CheckScore: 100.0/100 X Brain is above merge threshold |
Contributor
🧪 Brain Stress Test ResultsTests: 261/261 passed, 0 leaked |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
SEO for the course's static pages from #1428. Those pages were live but nothing linked to them.
Linked.
scripts/boot-shell.ts, which crawlers see before React mounts) now links/learn/. The label is the course's own title fromcourse.generated.ts.Snippets.
SAY_SEO_TITLEin the spec.Content. Each lesson page now also shows:
bits-and-trits went from about 490 words to 930.
Structured data.
BreadcrumbList.ItemListof all 30 lessons.CoursegetseducationalLevel: Beginner.llms.txt.
onboarding.t27getsCOURSE,COURSE_SOURCEandCOURSE_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