Repository navigation
SEO/AEO: DebateOwl entity, icons on every page, speech-times and comparison tables - #249
Conversation
…comparison tables - Organization JSON-LD is DebateOwl (logo 512, sameAs, Pi-Stack as parentOrganization); meta author DebateOwl - WebSite/SoftwareApplication alternateName "Debate Owl"; WebSite inLanguage en/hu/es - Guide pages get favicon/192/apple-touch icon links, meta author, byline and a DebateOwl home link - /online-debate-timer: speech-times table generated from src/lib/free-tools/formats.ts - Tables on /debateowl-vs-chatgpt, vs-windebate, vs-debateclub and the case generator - Case generator and coach answers open with DebateOwl; definitions + DefinedTerm, new FAQs - 'Formerly DebateLab' in the footer and llms.txt; Bingbot in robots AI group - check-site enforces the entity and icon links; tests pin the timer table to the formats
|
Warning Review limit reachedEnable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available. Next included review available in 49 minutes. View limit details
|
| Layer / File(s) | Summary |
|---|---|
Configure and validate site identity src/config/site.json, src/lib/seo/pages.ts, src/prerender/entry.tsx, scripts/check-site.mjs, src/test/seo/brand-entity.test.ts |
The configuration now stores structured DebateOwl organization data and the former identity. Prerendering uses the shared Organization node, and site checks and tests validate the identity and guide metadata. |
Apply DebateOwl identity to guide pages index.html, public/*/index.html |
The homepage and generated guide pages update author, icon, and structured-data metadata. Many pages add a DebateOwl team byline or link the product name to the homepage. |
Generate definitions and speech-time tables scripts/generate_seo_content.py, docs/operations.md, scripts/seo_guides.py, src/test/seo/brand-entity.test.ts |
The generator supports definition blocks and builds speech-time tables from timer format data. The timer guide uses generated data, and tests compare its contents with the built-in formats. |
Revise guide content and former-name references scripts/seo_guides.py, scripts/seo_answers.py, public/ai-debate-case-generator/index.html, public/ai-debate-coach/index.html, public/online-debate-timer/index.html, public/debateowl-vs-*/index.html, src/components/landing/Footer.tsx, src/locales/*, public/llms.txt, public/robots.txt |
Several guides add definitions, FAQs, worked examples, or comparison tables. The footer and site description identify DebateLab as the former name. The named crawler group adds Bingbot. |
Estimated code review effort: 3 (Moderate) | ~25 minutes
Sequence Diagram(s)
sequenceDiagram
participant Formats as formats.ts
participant Table as speech_times_table()
participant Renderer as render_block()
participant Guide as generated timer guide
Formats->>Table: format and segment data
Table->>Renderer: speech-times table
Renderer->>Guide: rendered guide block
- Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts
Note
🎁 Summarized by CodeRabbit Free
-
Your organization is on the Free plan. CodeRabbit will generate a high-level summary and a walkthrough for each pull request. For a comprehensive line-by-line review, please upgrade your subscription to CodeRabbit Essentials by visiting https://app.coderabbit.ai/settings/billing.
Comment @coderabbitai help to get the list of available commands.
Implements P1, P2 and the quick wins from the DebateOwl SEO/AEO brief (2026-10-27).
Entity
Organizationis now DebateOwl (@id …/#organization, alternateName "Debate Owl", 512×512ImageObjectlogo, description with "formerly DebateLab", sameAs SaaSHub + Uneed) with Pi-Stack asparentOrganization, not the name or a sameAs.WebSite.alternateName= ["Debate Owl", "debateowl.com"],inLanguageen/hu/es;SoftwareApplication.alternateName"Debate Owl".<meta name="author" content="DebateOwl">on the app shell and every guide page.Icons: guide pages had no icon links; they now carry favicon.ico 48, favicon.png 48, icon-192 192 and apple-touch-icon 180. The shell gains the 192px link.
Content
/online-debate-timer: speech-times-by-format table generated fromsrc/lib/free-tools/formats.ts(the free timer's configs and their cited NSDA/WUDC/WSDC/UADC sources), so the two can't disagree. No speech times typed by hand./debateowl-vs-chatgpt,/debateowl-vs-windebate,/debateowl-vs-debateclub, built only from claims already on those pages. A "draft vs finished case" table on/ai-debate-case-generator.<dl id="definition">+DefinedTerm) and new FAQs on those two pages and on the timer page.Guards:
check-sitenow fails on an Organization not named for the product or missing its logo/parent, on a parent listed in sameAs, and on any indexed page without the icon links or the DebateOwl author.src/test/seo/brand-entity.test.tspins the timer table toFORMATS.Verify:
npm run verifypasses locally (CI is blocked by billing): 94 test files, check-site 55 HTML files, no problems; check-links no problems; 47/47 e2e smoke tests.Not in this PR: GSC reindex and Bing Webmaster Tools (not code). The http://debate.pi-stack.org → https 308 hop is Vercel's edge, which vercel.json can't change.
Summary by CodeRabbit