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 })],