Repository navigation
Give five guide pages their own content and one brand config - #152
Conversation
Google crawled /ai-debate-practice, /ai-debate-coach,
/ai-debate-case-generator, /best-ai-debate-tools and
/debate-rebuttal-practice but did not index them. Each had about 2,000
characters of visible text, and every feature card repeated the same
sentence, three times per page across all 49 guides.
- The shared template no longer prints that sentence. Cards can carry a
page-specific description; pages without one show the title only.
- The five pages get long-form copy in scripts/seo_guides.py: step-by-step
how-tos, a worked example, WSDC/BP/PF/LD tips and their own FAQs. The
FAQ list feeds both the visible FAQ and the FAQPage JSON-LD.
- src/config/site.json now holds the origin, product, brand and
organization names. The generator, pages.ts, the prerender entry,
prerender.mjs and sitemap.mjs read it, and guide copy uses {product}.
- CONTENT_DATE moves to 2026-10-18 because every guide's text changed.
Titles, canonicals, the Article and Breadcrumb JSON-LD and the related
guide links are unchanged on all five pages.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
ℹ️ Recent review info
📝 Walkthrough
Note 🎁 Summarized by CodeRabbit Free
Comment |
|
CI didn't run on fc8a7e1. Every Actions job (docs, quality, browser-smoke, and the four suite jobs) stopped 2–3 seconds after it started, with no steps. GitHub's annotation says: "The job was not started because recent account payments have failed or your spending limit needs to be increased." This is a billing block, not a test failure. These checks ran locally at the same head (
The staging database gate and the full desktop and mobile Playwright suite did not run. This PR doesn't touch either. |
Why
Google crawls
/ai-debate-practice,/ai-debate-coach,/ai-debate-case-generator,/best-ai-debate-toolsand/debate-rebuttal-practicebut doesn't index them. Each prerendered page had about 2,000 characters of visible text, and the feature cards repeated "A crawlable overview of a DebateLab workflow that opens into the private app." three times on every one of the 49 guides. To a crawler the pages looked thin and near-identical.What changed
scripts/seo_guides.py, merged intoPAGESby slug so the list order stays the same (the related-guide links are picked by position). Each page gets:<details>block and theFAQPageJSON-LD, so the two can't drift apart.src/config/site.jsonholds the origin, product, brand and organization names. The generator,src/lib/seo/pages.ts(including thePAGE_HEADSstrings),src/prerender/entry.tsx(its Organization and SoftwareApplication literals),scripts/prerender.mjsandscripts/sitemap.mjsall read it. Guide copy uses a{product}token. The new copy adds no hardcoded brand or domain strings.CONTENT_DATEis now 2026-10-18, since every guide's visible text changed. The sitemap<lastmod>follows it.docs/operations.mdexplains how to regenerate the guides and where the brand config lives.The copy only claims what the app does. Sparring runs School 4-6-6-3, LD and PF. Generate's format setting covers BP, Policy, Classroom and Custom. WSDC tips are written as prep advice, and the pages don't claim the app simulates a WSDC round.
Visible text before → after
Measured on
dist/<slug>/index.htmlfromnpm run build:<head>, scripts and styles removed, tags stripped, whitespace collapsed. Word counts include about 240 words of nav, related links and footer that every guide shares.The boilerplate sentence went from 3 occurrences on each page to 0 across all 49 guides.
Checked
<head>(title, description, canonical, OG tags) is byte-identical tomain. So are the Article and BreadcrumbList JSON-LD (apart fromdateModified) and the related-guides link block. OnlyFAQPage.mainEntitychanged, and it matches the visible FAQ questions one for one.dateModified. I checked this by script againstmain.site.jsongives the same prerendered landing, terms, privacy and 404 HTML apart from asset hashes. The sitemap still lists the same 52 URLs.npm run verifypassed locally atfc8a7e1f: docs check, lint with knip and repo rules, typecheck, 304 unit tests, 30 collaboration tests, 356 edge tests, build, service-worker test and 30 Playwright smoke tests. That's a local pass, not CI./debate-rebuttal-practiceat desktop width and/ai-debate-case-generatorat 390px from the builtdist/. Both rendered correctly, with no horizontal overflow on mobile.Not in this PR
index.html, Edge Function CORS and others) are left for the Rebuttl rename.plan/rebrand-rebuttlis untouched.🤖 Generated with Claude Code
Summary by CodeRabbit