From 17616de72069f2b9ddbc7b63ce7eb7f140f2d3c9 Mon Sep 17 00:00:00 2001 From: Adam Date: Sat, 31 Oct 2026 17:08:34 +0000 Subject: [PATCH] Answer "Which AI is best for debate?" on the home page and link every vs page The home page FAQ gets the question in English, Spanish and Hungarian, with an answer that sends brainstorming to ChatGPT, Claude or Gemini and set-motion prep to DebateOwl, and links the answer page in the page's language. The FAQPage JSON-LD carries the same entry, so it now has 11 questions. A "Compare DebateOwl" row in the guide hub links all eleven /debateowl-vs-* pages from the home page. /best-ai-debate-tools now also links Debate Ladder, and llms.txt lists /ai-debate-practice by its current title. Co-Authored-By: Claude Opus 5.5 --- public/best-ai-debate-tools/index.html | 2 +- public/llms.txt | 2 +- scripts/generate_seo_content.py | 4 +++- src/components/landing/FAQ.tsx | 15 +++++++++++++-- src/components/landing/GuideHub.tsx | 11 ++++++++++- src/locales/en.json | 16 ++++++++++++++-- src/locales/es.json | 16 ++++++++++++++-- src/locales/hu.json | 16 ++++++++++++++-- src/prerender/entry.tsx | 2 ++ 9 files changed, 72 insertions(+), 12 deletions(-) diff --git a/public/best-ai-debate-tools/index.html b/public/best-ai-debate-tools/index.html index 74490f99..367cf368 100644 --- a/public/best-ai-debate-tools/index.html +++ b/public/best-ai-debate-tools/index.html @@ -54,7 +54,7 @@ DebateOwl vs WinDebate DebateOwl Pricing and Plans AI Debate Practice for Stronger Cases, Rebuttals, and Speeches -Public Forum Debate Prep with AIFree vs paid AI debate tools: what you actually getChatGPT vs Claude for debate prepAI debate tools for teachersBest AI for Public Forum debateDebateOwl vs ArguFight: which debater should pick whichDebateOwl vs MindDuel: one motion, two workflowsDebateOwl vs Claude: the same prep night done twiceDebateOwl vs PublicForumAI: Public Forum only, or every formatDebateOwl vs Gemini: five assumptions about AI debate prep, checkedDebateOwl vs HyperWrite: a one-shot writer or a practice loopDebateOwl vs SchoolAI: a checklist for debate teachers +Public Forum Debate Prep with AIFree vs paid AI debate tools: what you actually getChatGPT vs Claude for debate prepAI debate tools for teachersBest AI for Public Forum debateDebateOwl vs ArguFight: which debater should pick whichDebateOwl vs MindDuel: one motion, two workflowsDebateOwl vs Debate LadderDebateOwl vs Claude: the same prep night done twiceDebateOwl vs PublicForumAI: Public Forum only, or every formatDebateOwl vs Gemini: five assumptions about AI debate prep, checkedDebateOwl vs HyperWrite: a one-shot writer or a practice loopDebateOwl vs SchoolAI: a checklist for debate teachers diff --git a/public/llms.txt b/public/llms.txt index cc2147c7..90c07c07 100644 --- a/public/llms.txt +++ b/public/llms.txt @@ -79,7 +79,7 @@ Free to use, no account needed, and they run in the browser. ## Guides -- [AI Debate Practice for Stronger Cases, Rebuttals, and Speeches](https://debateowl.com/ai-debate-practice): How to choose an AI debate practice tool, with a checklist and a comparison of DebateOwl, ArguFight, MindDuel, PublicForumAI and Debate Ladder. +- [Best AI Debate Practice Tools (2026): Sparring and Timed Rounds](https://debateowl.com/ai-debate-practice): How to choose an AI debate practice tool, with a checklist and a comparison of DebateOwl, ArguFight, MindDuel, PublicForumAI and Debate Ladder. - [AI Debate Case Generator with Citations](https://debateowl.com/ai-debate-case-generator): DebateOwl turns a motion into a ready-to-read debate case: an opening, arguments with evidence, If they say… replies, a closing line and sources to check. - [Practice Rebuttals Before Your Opponent Finds the Weakness](https://debateowl.com/debate-rebuttal-practice): Paste an opposing argument into DebateOwl to find its weak links, missing evidence and logic gaps, then practice the rebuttal you would give. - [Ask an AI Debate Coach for Round-Ready Prep](https://debateowl.com/ai-debate-coach): Ask DebateOwl's AI debate coach about strategy, arguments, rebuttals and speeches, with answers tied to your own motion, side and speaker role. diff --git a/scripts/generate_seo_content.py b/scripts/generate_seo_content.py index cc8c1364..6ab927bf 100644 --- a/scripts/generate_seo_content.py +++ b/scripts/generate_seo_content.py @@ -275,6 +275,7 @@ def fill(value): ("/best-ai-for-public-forum", "Best AI for Public Forum debate"), ("/debateowl-vs-argufight", "DebateOwl vs ArguFight: which debater should pick which"), ("/debateowl-vs-mindduel", "DebateOwl vs MindDuel: one motion, two workflows"), + ("/debateowl-vs-debate-ladder", "DebateOwl vs Debate Ladder"), ("/debateowl-vs-claude", "DebateOwl vs Claude: the same prep night done twice"), ("/debateowl-vs-publicforumai", "DebateOwl vs PublicForumAI: Public Forum only, or every format"), ("/debateowl-vs-gemini", "DebateOwl vs Gemini: five assumptions about AI debate prep, checked"), @@ -833,7 +834,8 @@ def compare_llms_lines(): def llms_txt(): """public/llms.txt: a plain summary for AI agents, from the same facts as the pages.""" - guides = "\n".join(f'- [{p["h1"]}]({page_url(p["slug"])}): {p["description"]}' for p in PAGES if p["slug"] not in COMPARE_SLUGS | {"debateowl-pricing"}) + # A page with its own headline (the title without the brand) is listed by it, as its reads. + guides = "\n".join(f'- [{p.get("headline", p["h1"])}]({page_url(p["slug"])}): {p["description"]}' for p in PAGES if p["slug"] not in COMPARE_SLUGS | {"debateowl-pricing"}) tools = "\n".join(f"- [{name}]({BASE}{route}): {blurb}" for route, name, blurb in FREE_TOOLS) return f"""# {BRAND} diff --git a/src/components/landing/FAQ.tsx b/src/components/landing/FAQ.tsx index 0364943f..7472b387 100644 --- a/src/components/landing/FAQ.tsx +++ b/src/components/landing/FAQ.tsx @@ -1,14 +1,25 @@ -import { useTranslation } from "react-i18next"; +import type { ReactNode } from "react"; +import { Trans, useTranslation } from "react-i18next"; import { ChevronDown } from "lucide-react"; import { PREP_MODE_COUNT } from "@/components/features/tools/tool-links"; import { factsAsOf } from "@/lib/seo/pages"; +import { useRouteLanguage } from "@/lib/seo/localized-routes"; import { Reveal } from "./Reveal"; +/** The "which AI for debate" answer page in each landing page's language (generated by scripts/seo_comparison_pages.py). */ +const BEST_AI_PAGE = { en: "/best-ai-for-debate", hu: "/hu/melyik-ai-a-legjobb-vitara", es: "/es/mejor-ia-para-preparar-un-debate" } as const; + const FAQ = () => { const { t, i18n } = useTranslation(); + const language = useRouteLanguage(); const asOf = factsAsOf(i18n.language); - const faqs = [ + const faqs: Array<{ question: string; answer: ReactNode }> = [ + { + question: t('faq.q10'), + // A static page, not an app route: a plain link loads it from the server. + answer: <Trans i18nKey="faq.a10" components={{ link: <a href={BEST_AI_PAGE[language]} className="font-semibold text-primary underline underline-offset-4" /> }} />, + }, { question: t('faq.q6'), answer: t('faq.a6', { modes: PREP_MODE_COUNT }) }, { question: t('faq.q8'), answer: t('faq.a8') }, { question: t('faq.q7'), answer: t('faq.a7', { asOf }) }, diff --git a/src/components/landing/GuideHub.tsx b/src/components/landing/GuideHub.tsx index ba8b1620..82fbd9bc 100644 --- a/src/components/landing/GuideHub.tsx +++ b/src/components/landing/GuideHub.tsx @@ -13,7 +13,16 @@ const GROUPS = [ { id: "formats", paths: ["/public-forum-debate", "/lincoln-douglas-debate", "/policy-debate", "/british-parliamentary-debate", "/world-schools-debate", "/congress-debate"] }, { id: "skills", paths: ["/how-to-write-a-debate-case", "/how-to-practice-rebuttals", "/debate-clash-points", "/debate-fallacies", "/debate-judge-adaptation", "/how-to-prepare-for-a-debate-tournament"] }, { id: "tools", paths: ["/tools", "/tools/debate-timer", "/tools/debate-motion-generator", "/tools/debate-flow-sheet", "/tools/speech-time-calculator"] }, - { id: "compare", paths: ["/best-ai-debate-tools", "/best-ai-for-debate", "/debateowl-vs-chatgpt", "/debateowl-vs-debate-ladder", "/free-vs-paid-ai-debate-tools", "/chatgpt-vs-claude-for-debate", "/best-ai-for-public-forum"] }, + { id: "compare", paths: ["/best-ai-debate-tools", "/best-ai-for-debate", "/free-vs-paid-ai-debate-tools", "/chatgpt-vs-claude-for-debate", "/best-ai-for-public-forum"] }, + // Every /debateowl-vs-* page, so each one is a click from the home page. + { + id: "versus", + paths: [ + "/debateowl-vs-chatgpt", "/debateowl-vs-claude", "/debateowl-vs-gemini", "/debateowl-vs-hyperwrite", "/debateowl-vs-schoolai", + "/debateowl-vs-publicforumai", "/debateowl-vs-windebate", "/debateowl-vs-debateclub", "/debateowl-vs-debate-ladder", + "/debateowl-vs-argufight", "/debateowl-vs-mindduel", + ], + }, ] as const; const TOOLS = GROUPS.find((group) => group.id === "tools")!; diff --git a/src/locales/en.json b/src/locales/en.json index c5cd15b0..d0992f92 100644 --- a/src/locales/en.json +++ b/src/locales/en.json @@ -1013,7 +1013,9 @@ "q8": "What does a {{product}} case include?", "a8": "{{caseFormat}}", "q9": "Is {{product}} free?", - "a9": "{{freePlan}}" + "a9": "{{freePlan}}", + "q10": "Which AI is best for debate?", + "a10": "It depends on the job. For brainstorming and background reading, a general chatbot such as ChatGPT, Claude or Gemini is fine. For preparing a set motion in your own format, with a case you can read out, \"If they say X, we answer Y\" replies and timed practice rounds, {{product}} is built for that. <link>Our comparison page</link> goes through the options one by one." }, "guideHub": { "title": "Debate guides and free tools", @@ -1023,6 +1025,7 @@ "skills": "Skills guides", "tools": "Free tools", "compare": "Compare", + "versus": "Compare {{product}}", "englishGuides": "Guides in English", "hungarianPrep": "Debate prep with AI, in Hungarian", "nativeAnswer": "Which AI is best for debate?", @@ -1055,7 +1058,16 @@ "debateowl-vs-debate-ladder": "{{product}} vs Debate Ladder", "free-vs-paid-ai-debate-tools": "Free vs paid AI debate tools", "chatgpt-vs-claude-for-debate": "ChatGPT vs Claude for debate", - "best-ai-for-public-forum": "Best AI for Public Forum" + "best-ai-for-public-forum": "Best AI for Public Forum", + "debateowl-vs-claude": "{{product}} vs Claude", + "debateowl-vs-publicforumai": "{{product}} vs PublicForumAI", + "debateowl-vs-gemini": "{{product}} vs Gemini", + "debateowl-vs-hyperwrite": "{{product}} vs HyperWrite", + "debateowl-vs-schoolai": "{{product}} vs SchoolAI", + "debateowl-vs-argufight": "{{product}} vs ArguFight", + "debateowl-vs-mindduel": "{{product}} vs MindDuel", + "debateowl-vs-windebate": "{{product}} vs WinDebate", + "debateowl-vs-debateclub": "{{product}} vs DebateClub" } }, "finalCta": { diff --git a/src/locales/es.json b/src/locales/es.json index 66a2e049..a85f6089 100644 --- a/src/locales/es.json +++ b/src/locales/es.json @@ -1013,7 +1013,9 @@ "q8": "¿Qué incluye un caso de {{product}}?", "a8": "Un caso de {{product}} se escribe como lo preparan los debatientes escolares: una apertura, de dos a cuatro argumentos, cada uno con explicación, evidencia y por qué importa, respuestas «Si dicen… respondemos…», una frase de cierre y las fuentes que usó.", "q9": "¿{{product}} es gratis?", - "a9": "La app {{product}} no tiene plan gratuito (prueba gratis de {{trialDays}} días y después ${{proMonthly}}/mes); las herramientas aparte de /es/tools son gratis y no piden cuenta." + "a9": "La app {{product}} no tiene plan gratuito (prueba gratis de {{trialDays}} días y después ${{proMonthly}}/mes); las herramientas aparte de /es/tools son gratis y no piden cuenta.", + "q10": "¿Qué IA es mejor para el debate?", + "a10": "Depende de para qué la quieras. Para sacar ideas y leer sobre el tema, un chatbot general como ChatGPT, Claude o Gemini sirve. Para preparar una moción concreta en tu formato, con un caso que puedes leer en voz alta, respuestas «Si dicen X, respondemos Y» y rondas de práctica cronometradas, {{product}} está hecho para eso. <link>Nuestra comparativa</link> repasa las opciones una por una." }, "guideHub": { "title": "Guías de debate y herramientas gratis", @@ -1023,6 +1025,7 @@ "skills": "Guías de habilidades", "tools": "Herramientas gratis", "compare": "Comparar", + "versus": "Comparar {{product}}", "englishGuides": "Guías en inglés", "hungarianPrep": "Preparación de debate con IA, en húngaro", "nativeAnswer": "Qué IA sirve para preparar un debate (guía en español)", @@ -1055,7 +1058,16 @@ "debateowl-vs-debate-ladder": "{{product}} frente a Debate Ladder", "free-vs-paid-ai-debate-tools": "Herramientas de debate con IA: gratis o de pago", "chatgpt-vs-claude-for-debate": "ChatGPT o Claude para debatir", - "best-ai-for-public-forum": "La mejor IA para Public Forum" + "best-ai-for-public-forum": "La mejor IA para Public Forum", + "debateowl-vs-claude": "{{product}} frente a Claude", + "debateowl-vs-publicforumai": "{{product}} frente a PublicForumAI", + "debateowl-vs-gemini": "{{product}} frente a Gemini", + "debateowl-vs-hyperwrite": "{{product}} frente a HyperWrite", + "debateowl-vs-schoolai": "{{product}} frente a SchoolAI", + "debateowl-vs-argufight": "{{product}} frente a ArguFight", + "debateowl-vs-mindduel": "{{product}} frente a MindDuel", + "debateowl-vs-windebate": "{{product}} frente a WinDebate", + "debateowl-vs-debateclub": "{{product}} frente a DebateClub" } }, "finalCta": { diff --git a/src/locales/hu.json b/src/locales/hu.json index 6af345e9..60a806f7 100644 --- a/src/locales/hu.json +++ b/src/locales/hu.json @@ -1013,7 +1013,9 @@ "q8": "Mit tartalmaz egy {{product}} által írt eset?", "a8": "A {{product}} úgy írja meg az esetet, ahogy az iskolai vitázók készülnek: nyitás, két–négy érv, mindegyik magyarázattal, bizonyítékkal és azzal, hogy miért fontos, „Ha azt mondják… erre azt feleljük…” válaszok, egy zárómondat és a felhasznált források.", "q9": "Ingyenes a {{product}}?", - "a9": "A {{product}} alkalmazásnak nincs ingyenes csomagja ({{trialDays}} napos ingyenes próba, utána havi ${{proMonthly}}); a /hu/tools oldalon lévő külön eszközök ingyenesek, és fiók nélkül is használhatók." + "a9": "A {{product}} alkalmazásnak nincs ingyenes csomagja ({{trialDays}} napos ingyenes próba, utána havi ${{proMonthly}}); a /hu/tools oldalon lévő külön eszközök ingyenesek, és fiók nélkül is használhatók.", + "q10": "Melyik MI a legjobb vitához?", + "a10": "A feladattól függ. Ötleteléshez és háttérolvasáshoz egy általános chatbot, például a ChatGPT, a Claude vagy a Gemini is megfelel. Ha egy konkrét indítványra készülsz a saját vitaformátumodban, és felolvasható esetet, „Ha azt mondják X-et, erre azt feleljük Y” válaszokat és időzített gyakorlófordulókat szeretnél, arra készült a {{product}}. <link>Részletes összehasonlításunk</link> egyenként végigveszi a lehetőségeket." }, "guideHub": { "title": "Vitaútmutatók és ingyenes eszközök", @@ -1023,6 +1025,7 @@ "skills": "Készségfejlesztő útmutatók", "tools": "Ingyenes eszközök", "compare": "Összehasonlítás", + "versus": "{{product}} összehasonlítások", "englishGuides": "Angol nyelvű útmutatók", "hungarianPrep": "Vitafelkészülés MI-vel (magyar útmutató)", "nativeAnswer": "Melyik AI a legjobb vitára? (magyar kérdések és válaszok)", @@ -1055,7 +1058,16 @@ "debateowl-vs-debate-ladder": "{{product}} vagy Debate Ladder", "free-vs-paid-ai-debate-tools": "Ingyenes és fizetős MI-vitaeszközök", "chatgpt-vs-claude-for-debate": "ChatGPT vagy Claude vitára", - "best-ai-for-public-forum": "A legjobb MI Public Forumhoz" + "best-ai-for-public-forum": "A legjobb MI Public Forumhoz", + "debateowl-vs-claude": "{{product}} vagy Claude", + "debateowl-vs-publicforumai": "{{product}} vagy PublicForumAI", + "debateowl-vs-gemini": "{{product}} vagy Gemini", + "debateowl-vs-hyperwrite": "{{product}} vagy HyperWrite", + "debateowl-vs-schoolai": "{{product}} vagy SchoolAI", + "debateowl-vs-argufight": "{{product}} vagy ArguFight", + "debateowl-vs-mindduel": "{{product}} vagy MindDuel", + "debateowl-vs-windebate": "{{product}} vagy WinDebate", + "debateowl-vs-debateclub": "{{product}} vagy DebateClub" } }, "finalCta": { diff --git a/src/prerender/entry.tsx b/src/prerender/entry.tsx index 1c993db7..e49619a7 100644 --- a/src/prerender/entry.tsx +++ b/src/prerender/entry.tsx @@ -84,6 +84,8 @@ function landingQuestions(language: PageLanguage = 'en'): Array<[string, string] const asOf = factsAsOf(language); return [ [i18n.t('shortAnswer.question'), i18n.t('shortAnswer.answer', { asOf })], + // The visible answer links its last sentence; the JSON-LD keeps the words without the tag. + [i18n.t('faq.q10'), i18n.t('faq.a10').replace(/<\/?link>/g, '')], [i18n.t('faq.q6'), i18n.t('faq.a6', { modes: PREP_MODE_COUNT })], [i18n.t('faq.q8'), i18n.t('faq.a8')], [i18n.t('faq.q7'), i18n.t('faq.a7', { asOf })],