Repository navigation
Expand file tree
/
Copy pathseo_comparison_pages.py
More file actions
2659 lines (2569 loc) · 217 KB
/
Copy pathseo_comparison_pages.py
File metadata and controls
2659 lines (2569 loc) · 217 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
#!/usr/bin/env python3
"""The comparison and prep pages, each with its own layout, including the native Spanish and Hungarian ones.
DebateOwl leads every page. Competitor facts stay sourced. The generator
refuses jargon, a missing pricing sentence, or two pages that share more
than two H2s.
"""
from html import escape, unescape
from pathlib import Path
import json
import re
import shutil
import seo_cluster
ROOT = Path(__file__).resolve().parents[1]
SITE = json.loads((ROOT / "src" / "config" / "site.json").read_text())
BASE = SITE["origin"]
PRODUCT = SITE["product"]
ORG = SITE["organization"]
PRICING = SITE["pricing"]
DATE = "2026-10-29"
LONG = "October 29, 2026"
PRICE = SITE["freePlan"].replace("{{product}}", PRODUCT).replace("{{trialDays}}", str(PRICING["trialDays"])).replace("{{proMonthly}}", PRICING["proMonthly"])
HU_PRICE = (
f"A {PRODUCT} alkalmazásnak nincs ingyenes csomagja ({PRICING['trialDays']} napos ingyenes próba, "
f"utána havi ${PRICING['proMonthly']}); a /hu/tools oldalon lévő külön eszközök ingyenesek, és fiók nélkül is használhatók."
)
BYLINE = f"By the {PRODUCT} team · Published {LONG} · Last updated {LONG}"
DISCLOSURE = (
f"{PRODUCT} makes one of the tools on this page. Facts about other products come from their own websites, "
f"checked on {LONG}. Check them before you pay."
)
HU_DISCLOSURE = (
f"A {PRODUCT} készíti az egyik eszközt ezen az oldalon. A többi termékről szóló tények a saját weboldalukról származnak, "
"2026. október 29-én ellenőrizve. Fizetés előtt ellenőrizd őket."
)
ES_DISCLOSURE = (
f"{PRODUCT} hace una de las herramientas de esta página. Los datos de los demás productos salen de sus propias webs, "
"consultadas el 30 de octubre de 2026. Compruébalos antes de pagar."
)
# The pricing sentence of the native pages, worded as es.json (faq.a9) and HU_PRICE have it,
# with the free tools linked by name instead of the bare /es/tools or /hu/tools path.
ES_PRICE_START = f"La app {PRODUCT} no tiene plan gratuito"
ES_PRICE_HTML = (
f"{ES_PRICE_START} (prueba gratis de {PRICING['trialDays']} días y después ${PRICING['proMonthly']}/mes); "
'las herramientas aparte, <a href="/es/tools">cronómetro, generador de mociones, hoja de flujo y calculadora de tiempo de discurso</a>, '
"son gratis y no piden cuenta."
)
HU_PRICE_START = f"A {PRODUCT} alkalmazásnak nincs ingyenes csomagja"
HU_PRICE_HTML = (
f"{HU_PRICE_START} ({PRICING['trialDays']} napos ingyenes próba, utána havi ${PRICING['proMonthly']}); "
'a különálló <a href="/hu/tools">időmérő, tételgenerátor, jegyzetlap és beszédidő-kalkulátor</a> ingyenes, és fiók nélkül is használható.'
)
MONTHS = {
"es": ["enero", "febrero", "marzo", "abril", "mayo", "junio", "julio", "agosto", "septiembre", "octubre", "noviembre", "diciembre"],
"hu": ["január", "február", "március", "április", "május", "június", "július", "augusztus", "szeptember", "október", "november", "december"],
}
def long_date(iso, lang="en"):
year, month, day = (int(part) for part in iso.split("-"))
if lang == "es":
return f"{day} de {MONTHS['es'][month - 1]} de {year}"
if lang == "hu":
return f"{year}. {MONTHS['hu'][month - 1]} {day}."
return f"{['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'][month - 1]} {day}, {year}"
# /best-ai-for-debate and its native Spanish and Hungarian pages name each other.
# render_best_ai_page in generate_seo_content.py prints the same set, as check-site.mjs requires.
BEST_AI_ALTERNATES = [
("en", f"{BASE}/best-ai-for-debate"),
("es", f"{BASE}/es/mejor-ia-para-preparar-un-debate"),
("hu", f"{BASE}/hu/melyik-ai-a-legjobb-vitara"),
("x-default", f"{BASE}/best-ai-for-debate"),
]
OWN = ' class="own"'
def hreflang_links(alternates):
return "".join(f'\n <link rel="alternate" hreflang="{lang}" href="{href}" />' for lang, href in alternates)
CASE = (
'A DebateOwl case is a speech you can read out: an opening, two to four arguments, each with an explanation, '
'evidence that names its source and year, and why it matters, then "If they say… we answer…" replies, a closing line, and the sources it used. '
"You can regenerate one weak section without touching the rest."
)
# The pricing sentence as the pages show it: once per page, in the call-to-action area,
# with the free tools named and linked instead of a bare "/tools".
PRICE_HTML = escape(PRICE).replace(
"the separate tools at /tools are free",
'the separate <a href="/tools">timer, motion generator, flow sheet and speech-time calculator</a> are free',
)
PRICE_START = f"The {PRODUCT} app has no free plan"
JARGON = re.compile(
r"\b(frameworks?|contentions?|warrants?|impact calculus|keretrendszer(?:t|ek)?|kontenció(?:k|t)?|contenci[oó]n(?:es)?|garant[ií]as?|marco teórico|érvelési keret\w*)\b",
re.I,
)
SIBLINGS = {
"debateowl-vs-debate-ladder",
"free-vs-paid-ai-debate-tools",
"chatgpt-vs-claude-for-debate",
"ai-debate-tools-for-teachers",
"how-to-prepare-for-a-debate-with-ai",
"best-ai-for-public-forum",
"hu/mi-vitafelkeszules",
"es/mejor-ia-para-preparar-un-debate",
"hu/melyik-ai-a-legjobb-vitara",
"debateowl-vs-argufight",
"debateowl-vs-mindduel",
"debateowl-vs-claude",
"debateowl-vs-publicforumai",
"debateowl-vs-gemini",
"debateowl-vs-hyperwrite",
"debateowl-vs-schoolai",
"debateowl-vs-debatable",
"debateowl-vs-prilo",
"debateowl-vs-debatethis",
"debateowl-vs-kialo-edu",
}
def esc(value):
return escape(str(value), quote=True)
def ensure_fonts(public):
dest = public / "fonts"
dest.mkdir(parents=True, exist_ok=True)
files = [
"fredoka/files/fredoka-latin-wght-normal.woff2",
"fredoka/files/fredoka-latin-ext-wght-normal.woff2",
"nunito/files/nunito-latin-wght-normal.woff2",
"nunito/files/nunito-latin-ext-wght-normal.woff2",
]
for rel in files:
src = ROOT / "node_modules" / "@fontsource-variable" / rel
if not src.exists():
raise SystemExit(f"Missing {src}. Run npm ci before generating these pages.")
target = dest / src.name
if not target.exists() or target.stat().st_size != src.stat().st_size:
shutil.copyfile(src, target)
TICK = (
'<svg class="tick" viewBox="0 0 16 16" width="18" height="18" aria-hidden="true">'
'<path d="M3.2 8.4 6.4 11.6 12.8 4.4" fill="none" stroke="#14B37D" stroke-width="2.4" '
'stroke-linecap="round" stroke-linejoin="round"/></svg>'
)
def fonts():
return """
@font-face{font-family:Fredoka;font-style:normal;font-display:swap;font-weight:300 700;src:url("/fonts/fredoka-latin-ext-wght-normal.woff2") format("woff2");unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}
@font-face{font-family:Fredoka;font-style:normal;font-display:swap;font-weight:300 700;src:url("/fonts/fredoka-latin-wght-normal.woff2") format("woff2");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}
@font-face{font-family:Nunito;font-style:normal;font-display:swap;font-weight:200 1000;src:url("/fonts/nunito-latin-ext-wght-normal.woff2") format("woff2");unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}
@font-face{font-family:Nunito;font-style:normal;font-display:swap;font-weight:200 1000;src:url("/fonts/nunito-latin-wght-normal.woff2") format("woff2");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}
*{box-sizing:border-box}html{scroll-behavior:smooth}body{margin:0;color:#1F2B40;font-family:Nunito,ui-rounded,system-ui,sans-serif;font-weight:600;line-height:1.65}h1,h2,h3,.cta,button,summary{font-family:Fredoka,Nunito,ui-rounded,system-ui,sans-serif;font-weight:600;letter-spacing:-.02em;line-height:1.15}a{color:#0556D6}a:focus-visible,button:focus-visible,input:focus-visible{outline:3px solid #0A6FF0;outline-offset:3px}.tick{display:inline-block;vertical-align:-3px;margin-right:6px;flex:none}.cta{display:inline-flex;align-items:center;justify-content:center;gap:8px;border-radius:14px;padding:14px 20px;background:#0A6FF0;color:#fff;text-decoration:none;box-shadow:0 5px 0 #02307E}.cta:active{transform:translateY(5px);box-shadow:none}.scroll{overflow-x:auto;-webkit-overflow-scrolling:touch;max-width:100%}table{border-collapse:collapse;width:100%}th,td{text-align:left;vertical-align:top;padding:10px 12px;border-bottom:1px solid #CDD7E4}th{font-family:Fredoka,Nunito,sans-serif}.byline,.disclosure,.updated{color:#46566F;font-size:.95rem}.answer{border-left:4px solid #0A6FF0;padding:4px 0 4px 16px}pre{overflow-x:auto;background:#0B1426;color:#EEF4FF;border-radius:16px;padding:16px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-weight:500;font-size:.92rem;line-height:1.45}code{font-family:inherit}
"""
def organization():
return {
"@type": "Organization",
"@id": BASE + "/#organization",
"name": ORG["name"],
"alternateName": SITE["alternateName"],
"url": BASE + "/",
"logo": {"@type": "ImageObject", "url": BASE + ORG["logo"]["path"], "width": ORG["logo"]["width"], "height": ORG["logo"]["height"]},
"email": SITE["contactEmail"],
"contactPoint": {"@type": "ContactPoint", "contactType": "customer support", "email": SITE["contactEmail"], "availableLanguage": ["en", "hu", "es"]},
}
def graph(page, faqs, howto=None):
url = f"{BASE}/{page['slug']}"
org = organization()
nodes = [
{
"@type": "Article",
"headline": page["h1"],
"name": page["title"],
"url": url,
"description": page["description"],
"inLanguage": page["lang"],
"datePublished": page.get("published", DATE),
"dateModified": page.get("modified", DATE),
"author": org,
"publisher": org,
"about": {"@id": BASE + "/#software"},
},
{"@type": "BreadcrumbList", "itemListElement": [
{"@type": "ListItem", "position": 1, "name": PRODUCT, "item": BASE + "/"},
{"@type": "ListItem", "position": 2, "name": page["h1"], "item": url},
]},
{"@type": "FAQPage", "mainEntity": [
{"@type": "Question", "name": q, "acceptedAnswer": {"@type": "Answer", "text": a}}
for q, a in [(page["question"], page["answer"]), *[(q, a) for q, a in faqs if q != page["question"]]]
]},
]
if howto:
nodes.append(howto)
raw = json.dumps({"@context": "https://schema.org", "@graph": nodes}, ensure_ascii=False, separators=(",", ":"))
return raw.replace("<", "\\u003c")
def sources(heading, items, checked="Checked Oct 29, 2026."):
rows = "".join(
f'<li id="{esc(key)}"><a href="{esc(url)}">{esc(url)}</a>. {esc(note)} {esc(checked)}</li>'
for key, url, note in items
)
return f'<section><h2>{esc(heading)}</h2><ol>{rows}</ol></section>'
def faq_block(heading, faqs, kind):
if kind == "details":
body = "".join(f"<details><summary>{esc(q)}</summary><p>{esc(a)}</p></details>" for q, a in faqs)
elif kind == "defs":
body = "<dl>" + "".join(f"<dt>{esc(q)}</dt><dd>{esc(a)}</dd>" for q, a in faqs) + "</dl>"
elif kind == "cards":
body = '<div class="qcards">' + "".join(f'<article><h3>{esc(q)}</h3><p>{esc(a)}</p></article>' for q, a in faqs) + "</div>"
else:
body = "".join(f"<h3>{esc(q)}</h3><p>{esc(a)}</p>" for q, a in faqs)
return f"<section><h2>{esc(heading)}</h2>{body}</section>"
def wins(items):
lis = "".join(f"<li>{TICK}<span>{item}</span></li>" for item in items)
return f'<ul class="wins">{lis}</ul>'
def chrome(page):
"""The byline, disclosure, "last updated" line and About aside, in the page's language."""
lang = page["lang"]
published = long_date(page.get("published", DATE), lang)
modified = long_date(page.get("modified", DATE), lang)
if lang == "es":
return {
"home": "/es",
"byline": f'Por el <a href="/es">equipo de {PRODUCT}</a> · Publicado el {published} · Última actualización: {modified}',
"disclosure": ES_DISCLOSURE,
"updated": f"Última actualización: {modified}",
"about": f'<aside class="about" aria-labelledby="about"><h2 id="about">Sobre {PRODUCT}</h2><p><a href="/es">{PRODUCT}</a> es una app de preparación y práctica de debate con IA. Cómo funciona y lo que cuesta está en la <a href="/es">página de inicio en español</a>.</p></aside>',
}
if lang == "hu":
return {
"home": "/hu",
"byline": f'<a href="/hu">{PRODUCT}</a> csapata · Közzétéve: {published} · Utolsó frissítés: {modified}',
"disclosure": page.get("disclosure", HU_DISCLOSURE),
"updated": f"Utolsó frissítés: {modified}",
"about": '<aside class="about" aria-labelledby="about"><h2 id="about">A DebateOwlról</h2><p>A <a href="/hu">DebateOwl</a> MI-alapú vitafelkészítő és gyakorlóalkalmazás. A működés és az ár a <a href="/hu">magyar kezdőlapon</a> olvasható.</p></aside>',
}
return {
"home": "/",
"byline": f'By the <a href="/">{PRODUCT} team</a> · Published {published} · Last updated {modified}',
"disclosure": DISCLOSURE.replace(LONG, modified),
"updated": f"Last updated: {modified}",
"about": f'<aside class="about" aria-labelledby="about"><h2 id="about">About {PRODUCT}</h2><p><a href="/">{PRODUCT}</a> is an AI debate prep and practice app. See <a href="/">how it works</a> or <a href="/debateowl-pricing">pricing</a>.</p></aside>',
}
def shell(page, style, body, faqs, howto=None):
url = f"{BASE}/{page['slug']}"
hreflang = ""
if "alternates" in page:
hreflang = hreflang_links(page["alternates"])
elif page["lang"] == "hu":
hreflang = hreflang_links([("hu", url), ("x-default", url)])
text = chrome(page)
# The Related block skips what the body already links (it links /best-ai-for-debate exactly once)
# and the sibling pages, which each page picks for itself within write_comparison_pages' limit.
cluster = ""
if page["slug"] in seo_cluster.PAGES:
skip = {item["path"] for item in seo_cluster.LINKS if f'href="{item["path"]}"' in body} | {f"/{slug}" for slug in SIBLINGS}
cluster = "\n " + seo_cluster.related_ai_debate(page["slug"], skip=skip)
if page["slug"].startswith("debateowl-vs-"):
cluster = "\n " + seo_cluster.vs_line(page["slug"])
# The first Hungarian page also carries the English disclosure; the native pages carry their own only.
extra_disclosure = f'<p class="disclosure">{esc(DISCLOSURE)}</p>' if page.get("english_disclosure") else ""
return f"""<!doctype html>
<html lang="{page['lang']}">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>{esc(page['title'])}</title>
<meta name="description" content="{esc(page['description'])}" />
<meta name="robots" content="index, follow, max-snippet:-1, max-image-preview:large" />
<link rel="canonical" href="{url}" />{hreflang}
<meta name="author" content="{esc(ORG['name'])}" />
<meta name="msvalidate.01" content="8FC8FD530126287EF8AD3977BFB24C17" />
<link rel="icon" href="/favicon.ico" sizes="48x48" />
<link rel="icon" type="image/png" href="/favicon.png" sizes="48x48" />
<link rel="icon" type="image/png" href="/icon-192.png" sizes="192x192" />
<link rel="apple-touch-icon" href="/apple-touch-icon.png" sizes="180x180" />
<meta property="og:type" content="article" />
<meta property="og:site_name" content="{esc(PRODUCT)}" />
<meta property="og:title" content="{esc(page['title'])}" />
<meta property="og:description" content="{esc(page['description'])}" />
<meta property="og:url" content="{url}" />
<meta property="og:image" content="{BASE}/hero-visual.jpg?v=2" />
<meta property="article:published_time" content="{page.get('published', DATE)}" />
<meta property="article:modified_time" content="{page.get('modified', DATE)}" />
<meta name="twitter:card" content="summary_large_image" />
<meta name="twitter:title" content="{esc(page['title'])}" />
<meta name="twitter:description" content="{esc(page['description'])}" />
<style>{fonts()}{style}</style>
<script type="application/ld+json">{graph(page, faqs, howto)}</script>
</head>
<body class="{esc(page['body'])}">
<main>
<p class="crumb"><a href="{text['home']}">{esc(PRODUCT)}</a></p>
<h1>{esc(page['h1'])}</h1>
<p class="byline">{text['byline']}</p>
<p class="disclosure">{esc(text['disclosure'])}</p>
{extra_disclosure}
<p class="updated">{esc(text['updated'])}</p>
<section class="answer" aria-labelledby="short-answer"><h2 id="short-answer">{esc(page['question'])}</h2><p>{esc(page['answer'])}</p></section>
{body}{cluster}
{text['about']}
</main>
</body>
</html>
"""
def page_ladder():
answer = (
"Pick DebateOwl if you have a real school or tournament debate coming up and need a case you can read out, "
'"If they say… we answer…" replies to the other side, and timed practice rounds in School 4-6-6-3, Lincoln-Douglas or Public Forum. '
"Pick Debate Ladder if you want to argue out loud against an AI and climb a ranked Elo ladder. "
"Many debaters could use both, one for prep and one for speaking reps."
)
faqs = [
("Is Debate Ladder free?", "New accounts get 100 free credits, and a debate costs about one credit per minute of speaking, according to its site (October 2026). More credits are sold; its /pricing page returned 404, so there is no published plan price beyond credits."),
("Is DebateOwl free?", "Not the app: it is paid after a 3-day free trial. Its debate timer, motion generator and flow sheet are free without an account."),
("Which should I use for a school debate next week?", "DebateOwl. It writes the case you will read and the answers to the other side, then lets you practise the round at real speech times. Debate Ladder is the better fit when the goal is ranked speaking reps on topics you did not choose."),
("Can I practise speaking out loud with DebateOwl?", "Yes. Sparring speeches can be typed or spoken."),
("Does Debate Ladder rank you?", "Yes. Ranked wins raise your Elo, which starts at 500, and losses lower it. Practice and custom debates are unrated."),
]
owl_checks = [
"I have a set motion and a date",
"I need to know what the other side will say and how to answer it",
"I'm in a School 4-6-6-3, LD or PF round",
"I want to export my case to Word, PDF or Google Docs",
"I'd like the app in Spanish or Hungarian",
]
ladder_checks = [
"I mostly want to practise speaking out loud",
"A ranked score keeps me motivated",
]
owl = "".join(f'<label><input type="checkbox" /> {esc(item)}</label>' for item in owl_checks)
ladder = "".join(f'<label><input type="checkbox" /> {esc(item)}</label>' for item in ladder_checks)
rows = [
("Main job", "Case prep plus timed practice rounds for a set motion", "Out-loud practice debates against an AI, ranked by Elo"),
("Speeches", "Format speeches: School 4-6-6-3, LD, PF in Sparring", "Opening, rebuttal, closing"),
("Written case", 'Yes: opening, 2–4 arguments, "If they say… we answer…", closing, sources', "Not listed on its homepage"),
("Scoring", "Judged verdict after a Sparring round", "AI judge on 5 criteria, Elo from 500"),
("Voice", "Type or speak", "Voice-first; type in practice mode"),
("Price", "No free plan: 3-day free trial, then $5/month + tax; the free timer needs no account", "100 free credits, then credits (about 1 per minute of speaking)"),
]
trs = "".join(f"<tr><th scope=\"row\">{esc(a)}</th><td>{esc(b)}</td><td>{esc(c)}</td></tr>" for a, b, c in rows)
body = f"""
<p class="lede">{TICK}<strong>Start here when the round is real.</strong> DebateOwl writes the case you will actually read, including the replies, then times the practice.</p>
<section class="verdict">
<h2>The pick for a dated round</h2>
<p>If your motion and your date are already set, DebateOwl is the pick. Its job is written prep: the speech and the replies are on the page before you say them, then a timed round gives you somewhere to say them, where Debate Ladder starts from your voice and a ranking. The <a href="/best-ai-for-debate">short answer</a> across more tools is a separate page. Debate Ladder stays the right extra when you want frequent out-loud reps and a ranking, including if you are not in a tournament at all.</p>
{wins([
"A case you can read out loud",
'"If they say X, we answer Y" replies',
"Timed rounds in three formats",
"Free timer, motions and flow sheet",
"$5/month after a 3-day trial",
])}
<p><a class="cta" href="/app">Build your case for the next round, then spar it</a></p>
<p>{PRICE_HTML}</p>
</section>
<section>
<h2>The 7-question checklist</h2>
<p>Tick the lines that are true this week. This is not a score. The side with more ticks is the closer fit, and two strong reasons for Debate Ladder are on the page on purpose. Many people tick some of both: prep in one, speaking reps in the other.</p>
<form>
<fieldset class="owl">
<legend>{TICK}DebateOwl</legend>
{owl}
</fieldset>
<fieldset>
<legend>Debate Ladder</legend>
{ladder}
</fieldset>
</form>
</section>
<section>
<h2>What DebateOwl does well</h2>
<p>{esc(CASE)}</p>
<p>Speaker roles follow a school round. The introductor gets the opening and the headline arguments. The first refutation speaker gets the full arguments. The second speaker brings no new arguments: about two minutes backing up the team's arguments, then about four minutes on "If they say X, we answer Y" replies, usually five or six blocks. The closing speaker brings no new arguments either: two or three reasons your side won, then the closing line.</p>
<p>Around that case, Attack looks for the weak link in the other side, Factoids researches a claim and names sources you still have to open, Crossfire drills questions, and Sparring runs a timed round in School 4-6-6-3, Lincoln-Douglas or Public Forum and ends with a judged verdict. World Schools, British Parliamentary, Policy and Congress use the prep tools, not a full simulated round. The app is in English, Spanish and Hungarian. Pro adds expanded AI prep access, all 10 models (including Claude Opus and Sonnet, GPT-6.1 Sol and Gemini), Active Grounding research and priority support. Evidence leads still need checking against the original source.</p>
<p>The free <a href="/tools/debate-timer">debate timer</a> is separate from the app: seven formats, protected time, points-of-information knocks and prep banks, and it saves the round in the browser. See also the <a href="/ai-debate-case-generator">case generator</a>, <a href="/ai-debate-practice">practice rounds</a>, <a href="/how-to-practice-rebuttals">rebuttal practice</a> and <a href="/debateowl-pricing">pricing</a>.</p>
</section>
<section>
<h2>What Debate Ladder does well</h2>
<p>Debate Ladder is best for people who want frequent out-loud reps and a ranking, on any topic, including non-competitors. Its homepage describes a voice-first debate game. You are assigned PRO or CON, then speak an opening, rebuttal and closing while an AI argues the other side. Practice mode lets you type. An AI judge scores logic, responsiveness, clarity, delivery and persuasiveness, then gives feedback. Ranked wins raise your Elo, which starts at 500, and losses lower it. Practice and custom debates are unrated. Topics run from beginner to expert, and you can write your own. New accounts get 100 free credits, and a debate costs about one credit per minute of speaking time. <a href="#s1">S1</a></p>
</section>
<section>
<h2>Side by side (checked October 29, 2026)</h2>
<div class="scroll"><table>
<caption>DebateOwl beside Debate Ladder. DebateOwl is the prep column.</caption>
<thead><tr><th scope="col"> </th><th scope="col">DebateOwl</th><th scope="col">Debate Ladder</th></tr></thead>
<tbody>{trs}</tbody>
</table></div>
<p>DebateOwl is best for students preparing a specific motion for a school or competitive round. Debate Ladder is best for ranked speaking practice that is not tied to one tournament motion.</p>
</section>
{faq_block("Questions people ask before they pick", faqs, "details")}
{sources("Where these facts come from", [("s1", "https://debateladder.com/", "Debate Ladder homepage. Its /pricing address returned 404.")])}
<p>The worked second-speech shape is on <a href="/how-to-prepare-for-a-debate-with-ai">how to prepare for a debate with AI</a>.</p>
"""
style = """
body.ladder{background:#F7FAFE}body.ladder main{width:min(980px,calc(100% - 32px));margin:32px auto 64px}
body.ladder h1{font-size:clamp(2.4rem,6vw,4.2rem);color:#0B1426;margin:8px 0}
body.ladder .lede{font-size:1.2rem}
body.ladder .verdict{background:#fff;border:2px solid #0B1426;border-radius:28px;padding:22px;margin:22px 0}
body.ladder form{display:grid;grid-template-columns:1.35fr .8fr;gap:16px;margin-top:12px}
body.ladder fieldset{border:2px solid #CDD7E4;border-radius:22px;background:#fff;padding:16px 18px}
body.ladder fieldset.owl{border-color:#0A6FF0;background:#EEF7FF}
body.ladder legend{font-family:Fredoka,Nunito,sans-serif;font-size:1.25rem;padding:0 6px}
body.ladder label{display:flex;gap:10px;align-items:flex-start;margin:10px 0}
body.ladder input{accent-color:#14B37D;width:1.15rem;height:1.15rem;margin-top:4px}
body.ladder .wins{list-style:none;padding:0;display:grid;gap:8px}
body.ladder .wins li{display:flex;align-items:center}
body.ladder table{min-width:640px;background:#fff}
body.ladder details{border-bottom:1px solid #CDD7E4;padding:10px 0}
@media(max-width:720px){body.ladder form{grid-template-columns:1fr}}
"""
return {
"slug": "debateowl-vs-debate-ladder",
"lang": "en",
"body": "ladder",
"title": "DebateOwl vs Debate Ladder: Case Prep or Ranked Voice Rounds? | DebateOwl",
"description": "Debate Ladder is a voice-first debate game with an Elo ladder. DebateOwl writes ready-to-read cases and runs timed rounds. A checklist to pick.",
"h1": "DebateOwl vs Debate Ladder",
"question": "DebateOwl or Debate Ladder: which should I use?",
"answer": answer,
"faqs": faqs,
"style": style,
"html_body": body,
}
def page_price():
answer = (
"Start with DebateOwl when you want a case you can read out, replies to the other side and timed rounds at the low end of paid prices: "
"$5/month after a 3-day free trial, with its separate debate tools free. "
"You can practise with AI for free: ChatGPT and Claude have free plans, PublicForumAI gives 3 practice rounds a month, Debate Ladder gives new accounts 100 credits, and ArguFight is free to start. "
"Paid plans mostly add more rounds, linked evidence or speaking time, at roughly $5 to $20 a month."
)
faqs = [
("Is there a free AI for debate practice?", "Yes. ChatGPT and Claude have free plans, PublicForumAI includes 3 full practice rounds a month, Debate Ladder gives new accounts 100 credits, and ArguFight is free to start. DebateOwl's app is paid after a 3-day trial, and its timer and motion generator cost nothing."),
("What is the cheapest paid AI debate tool?", "Among the tools in this table, the lowest monthly prices listed are Debatable's Tokens plan at $4.99/month, DebateOwl at $5/month + tax, and Symbai's individual plan at NZ$4.99/month. Debatable's Individual plan is $10 a year. Compare what each one actually includes before you treat the smallest number as the same product."),
("Is DebateOwl free?", "The app is not: you get a 3-day free trial, then Pro at $5/month + tax. The timer, flow sheet and motion generator on its free tools page cost nothing."),
("Are free AI debate tools good enough?", "For drills and background reading, often yes. Paid plans mainly add volume and linked evidence. Whatever you use, check evidence against the original source. For a tournament week, DebateOwl at $5/month is the low-priced way to get a case, replies and timed rounds together."),
("Is ChatGPT free for debate?", "Yes. OpenAI says the free version is available to everyone. Paid plans add more access."),
]
tools = [
("DebateOwl", "3-day free trial, no card; the separate debate tools are free, no account", "$5/month + tax (Pro)", "All 10 models, Active Grounding, priority support. The case, the replies and timed rounds are the job.", "This site"),
("ChatGPT", "Free version available to everyone", "Go, Plus, Pro, plus Business and Enterprise (dollar prices not shown on the page we opened)", "More messages. Plus and Pro add more models and deep research. Study mode and voice are on the free plan too.", "P1"),
("Claude", "Free plan, $0", "Pro $20/mo monthly ($17/mo billed annually); Max from $100/mo", "More usage, Opus, Research. The free plan includes web search, memory and voice.", "P2"),
("PublicForumAI", "Free: 3 full practice rounds/mo, unlimited AI Flow drills, 5 AI cases/mo plus 2 Premium cases with real sources, 15 training modules", "Premium $9.99/mo or $79/yr", "Unlimited rounds, real sourced evidence with links, rounds and ballots kept. Free rounds are kept 30 days.", "P3"),
("Debate Ladder", "100 free credits for new accounts", "More credits (about 1 credit per minute of speaking); no plan price published", "More debates", "S1"),
("ArguFight", '"Free to start"; "free forever for base debating"; free for classrooms', "Not listed on the pages we opened", "Not listed. Classrooms are described as free.", "P4, P5"),
("Debatable", "Free: 10 AI voice minutes after sign-in (about one round), not refilled; live rounds with people free. A short voice preview exists before sign-in.", "Individual $10/yr; Voice $12/mo; Tokens $4.99/mo; BYOK $1/mo; Team $50/yr; school programs $200/season", "120 AI voice minutes/mo and a written decision on Individual and Voice. Tokens adds extra voice rounds.", "P6"),
("Cardinal", '"Core tools free forever" (five tools marked free)', "Pro $10/month or $75 a season", "Practice rounds with an AI judge and a written ballot, a word counter, case files and more prep tools.", "P7"),
("Prilo NSDA", "Not stated", "$15/month or $60/year", "Sparring, a 3-minute cross-examination simulator, flowing practice, speech analytics, card cutting", "P8"),
("HyperWrite Debate Assistant", '"Limited trial"', "Premium $19.99/mo; Ultra $44.99/mo. Annual prices are also listed ($16/mo and $29/mo).", "More messages and citations", "P9, P10"),
("Debate Arena", "Free plan with unlimited debates vs AI and live opponents", "Gold plan (price not stated on the page opened)", "50+ personas, detailed evaluations, British Parliamentary practice", "P11"),
("Symbai", "Trial; a free read-only workspace after the trial. The individual button says try 1 month free.", "Individual NZ$4.99/mo; teacher or club plans from NZ$9.99/mo. Teacher plans say try 2 months free.", "AI coaching re-enabled", "P12"),
("Kialo Edu", 'Free ("free and always will be")', "None listed", "Nothing further is listed, because the classroom product is free.", "P13"),
]
trs = "".join(
f'<tr class="{"top" if i == 0 else ""}"><th scope="row">{TICK if i == 0 else ""}{esc(name)}</th><td>{esc(free)}</td><td>{esc(paid)}</td><td>{esc(adds)}</td><td>{esc(src)}</td></tr>'
for i, (name, free, paid, adds, src) in enumerate(tools)
)
body = f"""
<section class="band">
<h2>The pick on price</h2>
<p>For a case you can read, replies, and timed rounds, DebateOwl is the row to read first. {PRICE_HTML} See <a href="/best-ai-for-debate">the short answer</a> if you want the wider map, or <a href="/chatgpt-vs-claude-for-debate">ChatGPT and Claude</a> if the question is which general chatbot to open. <a href="/best-ai-for-public-forum">Public Forum tools</a> are compared speech by speech, and <a href="/debateowl-vs-debate-ladder">Debate Ladder</a> is the ranked voice game.</p>
<p class="row">{TICK}<strong>DebateOwl in one line:</strong> a readable case with replies and timed Sparring rounds, for $5 a month once the trial ends.</p>
<p><a class="cta" href="/tools">Try the free tools first, no account</a></p>
</section>
<section>
<h2>Price table (checked October 29, 2026)</h2>
<div class="scroll"><table>
<caption>DebateOwl is the first row. Prices as listed by each product on October 29, 2026.</caption>
<thead><tr><th scope="col">Tool</th><th scope="col">Free option</th><th scope="col">Paid price (as listed)</th><th scope="col">What paid adds</th><th scope="col">Source</th></tr></thead>
<tbody>{trs}</tbody>
</table></div>
<p>Prices and plans as listed on each product's own website on October 29, 2026, in the currency shown. Check before you subscribe.</p>
</section>
<section>
<h2>What $0 gets you</h2>
<ul>
<li>ChatGPT: a free version OpenAI says is available to everyone, including study mode and voice, with limits.</li>
<li>Claude: a $0 plan with web search, memory and voice mode.</li>
<li>DebateOwl's separate tools: a timer, motion generator, printable flow sheet and speech-time calculator, no account. The app itself is a 3-day trial, not a permanent free plan.</li>
<li>PublicForumAI: 3 full practice rounds a month, unlimited AI Flow drills, 5 cases a month plus 2 with real sources, and 15 training modules.</li>
<li>Debate Ladder: 100 credits for a new account, about one credit per minute of speaking.</li>
<li>ArguFight: free to start, free forever for base debating, and free for classrooms.</li>
<li>Debatable: 10 AI voice minutes after sign-in, not refilled, and live rounds with people at no charge.</li>
<li>Cardinal: the core tools, five of them marked free, described as free forever.</li>
<li>HyperWrite: a limited trial of the debate assistant.</li>
<li>Debate Arena: a free plan with unlimited debates against AI and live opponents.</li>
<li>Symbai: a trial, then a read-only workspace if you do not pay.</li>
<li>Kialo Edu: the classroom product, free, and the site says it always will be.</li>
<li>Prilo's pages we opened do not state a free option.</li>
</ul>
</section>
<section>
<h2>What paying adds</h2>
<p>Across these pages, payment tends to buy the same kinds of things, and the lists above are the ones to trust:</p>
<ul>
<li>More rounds or more minutes, once a free cap runs out.</li>
<li>Sourced evidence with links, where the product says the free tier argues without them.</li>
<li>Voice time, on the products that meter speaking.</li>
<li>Teacher dashboards, student analytics or class controls, on the products built for a whole class.</li>
</ul>
<p>DebateOwl's $5 plan is the low monthly price that adds the prep workspace: all 10 models, Active Grounding research and priority support. Open every source before a lead goes into a speech. Active Grounding is not a promise that a citation is already checked.</p>
</section>
<section class="steps">
<h2>The cheapest way to prep for a tournament</h2>
<ol>
<li>Use the free <a href="/tools">tools</a> for drills: the <a href="/tools/debate-timer">timer</a>, the <a href="/tools/debate-flow-sheet">flow sheet</a> and the <a href="/tools/debate-motion-generator">motion generator</a>. No account.</li>
<li>Use a free chatbot for background reading. It will not keep your motion, side and speech times for you.</li>
<li>Buy one month of a paid tool during tournament weeks. DebateOwl is $5/month + tax after the 3-day trial, which is the straightforward way to get the case, the replies and the timed rounds in one place. PublicForumAI's free tier may be enough for debaters who only need a few PF practice rounds and are not also writing a case to export.</li>
</ol>
<p>Plan details are on <a href="/debateowl-pricing">the pricing page</a>.</p>
</section>
<section>
<h2>Prices change</h2>
<p>Each product's own page wins over this table. A number here was copied from that page on October 29, 2026, and it can move. Debatable also lists a Tokens plan at $4.99/month for extra voice rounds, which is why the cheapest-price answer names it. Cardinal's Pro price is $10 a month or $75 a season, not only the monthly figure.</p>
</section>
{faq_block("Price questions", faqs, "defs")}
{sources("Sources for the prices", [
("p1", "https://chatgpt.com/pricing", "Free version available to everyone. Go, Plus and Pro are on the page; the FAQ also names Business and Enterprise. No dollar prices in the text we opened."),
("p2", "https://claude.com/pricing", "Free $0. Pro $17/mo annual or $20 monthly. Max from $100. Free plan: web search, memory, voice. Context window up to 1M, varying by model."),
("p3", "https://publicforumai.com/pricing", "Free tier and Premium at $9.99/mo or $79/yr."),
("s1", "https://debateladder.com/", "100 free credits. About one credit per minute. /pricing returned 404."),
("p4", "https://www.argufight.com/", "Free to start. Free forever for base debating."),
("p5", "https://www.argufight.com/for-schools", "Free for classrooms."),
("p6", "https://debatable.com/pricing", "Voice minutes and the Individual, Voice, Tokens, BYOK, Team and school prices."),
("p7", "https://cardinaldebate.org/", "Core tools free forever. Pro $10/month or $75 a season."),
("p8", "https://www.prilo.ai/nsda", "$15/month or $60/year."),
("p9", "https://www.hyperwriteai.com/aitools/debate-assistant", "Limited trial. Premium $19.99/mo. Ultra $44.99/mo."),
("p10", "https://www.hyperwriteai.com/pricing", "Premium and Ultra, including annual prices."),
("p11", "https://www.debatearena.app/ai-debate-practice", "Free plan and Gold. No Gold price on the page."),
("p12", "https://symbai.ai/pricing/", "NZ$ prices, trial, and the free read-only workspace."),
("p13", "https://www.kialo-edu.com/", "Free, and the site says it always will be."),
])}
"""
style = """
body.prices{background:#fff;color:#131E33}body.prices main{width:min(1180px,calc(100% - 28px));margin:20px auto 72px}
body.prices h1{font-size:clamp(2rem,4vw,3.2rem);border-bottom:4px solid #0B1426;padding-bottom:10px}
body.prices .band{background:#FFF8DB;border-radius:0 0 24px 24px;padding:8px 18px 18px;margin:0 -8px 28px}
body.prices table{min-width:920px;font-size:.95rem}
body.prices tr.top{background:#EEF7FF}
body.prices tr.top th{font-size:1.05rem}
body.prices .row{display:flex;align-items:center;flex-wrap:wrap;gap:4px;background:#fff;border:2px solid #0B1426;border-radius:999px;padding:8px 16px;margin:0 0 14px}
body.prices dt{font-family:Fredoka,Nunito,sans-serif;margin-top:16px}
body.prices .steps{display:grid;grid-template-columns:1.2fr .8fr;gap:24px;align-items:start}
body.prices .steps ol{font-size:1.05rem}
@media(max-width:800px){body.prices .steps{grid-template-columns:1fr}}
"""
return {
"slug": "free-vs-paid-ai-debate-tools",
"lang": "en",
"body": "prices",
"title": "Free vs Paid AI Debate Tools: What $0 Gets You (Oct 2026) | DebateOwl",
"description": "Free and paid AI debate tools compared by price, as of October 2026: what $0 includes, what paid plans add, and the cheapest way to prep.",
"h1": "Free vs paid AI debate tools: what you actually get",
"question": "Is there a free AI for debate practice, and what do the paid ones cost?",
"answer": answer,
"faqs": faqs,
"style": style,
"html_body": body,
}
def page_chat():
answer = (
"DebateOwl is the pick when you want the motion kept for you: a case you can read out, "
'"If they say… we answer…" replies, and timed Sparring rounds that end in a verdict. '
"ChatGPT and Claude both work well for debate prep, and neither is clearly better for everyone. "
"Debaters often use ChatGPT for fast brainstorming and Claude for a longer critique of a case they paste in. "
"What neither does by default is keep your motion, side and speech times."
)
faqs = [
("Is ChatGPT or Claude better for debate?", "Neither is clearly better for everyone. ChatGPT is a fast way to brainstorm, and Claude is a strong place to paste a long case and ask for a critique. DebateOwl is the pick when you also want the case shape, the replies and a timed round without rebuilding that setup."),
("Can ChatGPT run a debate round with me?", "It can role-play an opponent if you set it up. It has no built-in speech timer or verdict for debate formats, so long rounds work better in a tool built for them."),
("Is Claude free?", "Yes. Claude has a free plan. Pro is $20/month billed monthly, or $17/month billed annually."),
("Will AI make up sources?", "It can, so open every source and confirm the exact claim before it goes on a card."),
("What does DebateOwl add over a chatbot?", 'A saved workspace per motion, a case with "If they say… we answer…" replies, Crossfire drills and timed Sparring rounds with a verdict. The app is paid after a 3-day trial.'),
]
prompts = [
("1. Hold the other side", "Take the other side of this motion and do not concede unless my answer beats your point. Stay on that side for the whole exchange."),
("2. Five things they will say", "List the 5 things the other side will say about this motion. Give each one a one-line answer I could say aloud."),
("3. One question at a time", "Cross-examine me with one question at a time. Wait for my answer before you ask the next question."),
("4. The weakest reason", "Read this argument and find the weakest reason in it. Say what a judge would still be unsure about."),
("5. The second speech", 'Write a second speech: no new arguments, about 2 minutes backing up our arguments, then "If they say X, we answer Y" for each of their points.'),
]
blocks = "".join(f"<h3>{esc(title)}</h3><pre><code>{esc(text)}</code></pre>" for title, text in prompts)
body = f"""
<section class="verdict">
<h2>The pick when you want the round set up</h2>
<p>Open a chatbot for background. Come back to DebateOwl for the motion itself. A chatbot starts every new chat without your motion, your side or your speech times; DebateOwl keeps all three in one Current Debate, with the case and its replies saved beside them. <a href="/best-ai-for-debate">The short answer</a> compares more tools. Prices for these plans are on <a href="/free-vs-paid-ai-debate-tools">free vs paid AI debate tools</a>, and the full prep sequence is <a href="/how-to-prepare-for-a-debate-with-ai">how to prepare for a debate with AI</a>.</p>
<p class="ifyou"><strong>If you are</strong> exploring a topic you have never argued, pick ChatGPT. <strong>If you are</strong> pasting in a long case for critique, pick Claude. <strong>If you are</strong> preparing a set motion for a dated round, pick DebateOwl.</p>
<p><a class="cta" href="/ai-debate-case-generator">Skip the prompt setup: get a case with replies ready</a></p>
<p>{PRICE_HTML}</p>
</section>
<section>
<h2>Where a debate tool does the setup for you</h2>
<div class="scroll"><table>
<caption>DebateOwl is the first column. Chatbots can imitate parts of this if you prompt them every time.</caption>
<thead><tr><th scope="col"></th><th scope="col">DebateOwl</th><th scope="col">ChatGPT</th><th scope="col">Claude</th></tr></thead>
<tbody>
<tr><th scope="row">Remembers your motion, side and role</th><td>Built in: one Current Debate per motion</td><td>Only if you set it up (Projects or memory)</td><td>Only if you set it up (Projects or memory)</td></tr>
<tr><th scope="row">Case structure</th><td>Opening, 2–4 arguments, "If they say… we answer…", closing, sources</td><td>Whatever you prompt</td><td>Whatever you prompt</td></tr>
<tr><th scope="row">Timed rounds with a verdict</th><td>Sparring: School 4-6-6-3, LD, PF</td><td>No built-in debate timer</td><td>No built-in debate timer</td></tr>
<tr><th scope="row">Free option</th><td>No free app plan: paid after a 3-day free trial; the debate timer is free</td><td>Free version</td><td>Free plan</td></tr>
</tbody>
</table></div>
<p>If you already live in one chatbot, the <a href="/debateowl-vs-chatgpt">DebateOwl vs ChatGPT</a> page goes further. For the drills themselves, see <a href="/how-to-practice-rebuttals">rebuttal practice</a> and <a href="/how-to-cross-examine-in-debate">cross-examination</a>.</p>
</section>
<section>
<h2>What general chatbots are good at in debate</h2>
<p>Debate Ladder's guide to ChatGPT lists jobs a general chatbot does well: brainstorming both sides, steel-manning the other side, rebuttal drills, and questions you might be asked in cross-examination. Those are real uses. Treat the output as a draft, and verify every citation before it goes into a speech. <a href="#s2">S2</a></p>
</section>
<section>
<h2>Where Debate Ladder's guide says they struggle</h2>
<p>The same guide says that in long timed rounds a general chatbot drifts or softens, the difficulty is not calibrated, scoring is inconsistent, and there is no progress record. That is Debate Ladder's description of ChatGPT, not a claim we measured ourselves. A long round is easier in a tool that already knows the speech times. <a href="#s2">S2</a></p>
</section>
<section class="split">
<div>
<h2>ChatGPT for a fast first pass</h2>
<p>The free version is available to everyone. Paid plans on the pricing page include Go, Plus and Pro, and the FAQ also names Business and Enterprise. Dollar prices were not shown on the page we opened. Study mode and voice are available on the free plan, with limits on voice. It is best for quick idea generation and for practising out loud with voice, once you have told it the motion again. <a href="#p1">P1</a></p>
</div>
<div>
<h2>Claude for a long case you paste in</h2>
<p>The free plan is $0. Pro is $20 a month billed monthly, or $17 a month billed annually. Max starts at $100 a month. The free plan includes web search, memory and voice mode. The context window is up to 1 million tokens, varying by model, which is useful when you paste a full case and the evidence behind it. It is best for critique of long cases. This page does not cite a benchmark. <a href="#p2">P2</a></p>
</div>
</section>
<section>
<h2>Prompt pack: make any chatbot argue back</h2>
<p>These five prompts are plain-language instructions you can paste into ChatGPT or Claude. They do not replace a saved case.</p>
{blocks}
<p>DebateOwl's case generator writes this shape for you, including prompt 5's second speech, and you can regenerate one weak section without rewriting the rest.</p>
</section>
<section>
<h2>A week that uses all three</h2>
<p>Monday is for the chatbot. Paste the motion into ChatGPT and ask for the five arguments each side might run, then ask Claude to steel-man the side you understand less. Keep that list. Do not paste it into a speech yet. The job of Monday is to see the field, not to memorise a paragraph.</p>
<p>Tuesday is DebateOwl. Start a Current Debate with the motion and your side. Generate the case and read it aloud once, slowly, before you edit anything. Mark the argument you would be unhappy to say in front of a judge. Regenerate that section only. The replies at the bottom are the start of Tuesday night: pick the two you think the other side will actually run, and say the answer out loud in one breath.</p>
<p>Wednesday is evidence. Take one factual sentence from the case, ask Factoids for a lead, and open the source. If the source does not say what the case said, cut the sentence. A chatbot can suggest search terms for the same claim. It should not be the thing you quote.</p>
<p>Thursday is Crossfire. Ten minutes of one question at a time is enough. Write down the question that made you pause. That pause is the line to fix in the case, not a reason to add a sixth argument.</p>
<p>Friday is the timed round. Sparring in the format you actually debate, typed or spoken. Read the verdict for the reason it names, then change one thing. The free timer is there if you are drilling a format Sparring does not simulate, such as British Parliamentary or World Schools. Saturday is a human, if you have one. Sunday is off. The $5 month is for the weeks that look like this, not for a subscription you forget about in June.</p>
</section>
<section>
<h2>Using a chatbot and DebateOwl together</h2>
<p>Use the chatbot for background reading and for a first list of ideas. Use DebateOwl once the motion is chosen: generate the case, read the replies, run Crossfire, then spar at the real times.</p>
</section>
{faq_block("Questions about chatbots and debate", faqs, "cards")}
{sources("Notes on the chatbot pages", [
("s2", "https://debateladder.com/blog/chatgpt-for-debate-practice", "What that guide says ChatGPT is good and bad at. We rewrote its examples into plain words."),
("p1", "https://chatgpt.com/pricing", "Free version, Go, Plus and Pro, study mode and voice. No dollar prices on the page we opened."),
("p2", "https://claude.com/pricing", "Free, Pro, Max, and the free plan's web search, memory and voice. Context window up to 1M."),
])}
"""
style = """
body.chat{background:linear-gradient(#F2EEFF,#F7FAFE 280px)}body.chat main{width:min(1040px,calc(100% - 32px));margin:28px auto 70px}
body.chat h1{font-size:clamp(2.2rem,5vw,3.6rem);max-width:16ch}
body.chat .verdict{display:grid;grid-template-columns:1.4fr .8fr;gap:18px;align-items:center}
body.chat .verdict>h2,body.chat .verdict>p:first-of-type,body.chat .verdict>p:last-child{grid-column:1/-1;margin-bottom:0}
body.chat .ifyou{background:#fff;border-radius:18px;padding:12px 16px;border:1px solid #E2D9FF}
body.chat .split{display:grid;grid-template-columns:1fr 1fr;gap:22px}
body.chat .qcards{display:grid;gap:12px}body.chat .qcards article{background:#fff;border-radius:18px;padding:14px 16px;border:1px solid #E2D9FF}
body.chat table{min-width:720px;background:#fff}body.chat th:nth-child(2),body.chat td:nth-child(2){background:#EEF7FF}
@media(max-width:800px){body.chat .verdict,body.chat .split{grid-template-columns:1fr}}
"""
return {
"slug": "chatgpt-vs-claude-for-debate",
"lang": "en",
"body": "chat",
"title": "ChatGPT vs Claude for Debate (2026), and When to Use a Debate Tool | DebateOwl",
"description": "ChatGPT and Claude both help with debate prep. Where each fits, prompts that make them argue back, and when a debate-specific tool saves time.",
"h1": "ChatGPT vs Claude for debate prep",
"question": "Is ChatGPT or Claude better for debate?",
"answer": answer,
"faqs": faqs,
"style": style,
"html_body": body,
}
def page_teachers():
answer = (
"Start with DebateOwl when the debate is tomorrow and you do not want student accounts: the free timer, motion generator and printable flow sheet work in any browser and on a projector. "
"For a club preparing a round, the DebateOwl app writes a case students can read out, with replies and timed practice, at $5/month after the trial. "
"For every student debating an AI at once, Symbai and SchoolAI let teachers set up and monitor AI activities. "
"For a class tournament judged by AI, ArguFight offers free private classroom tournaments. For a graded written discussion, Kialo Edu is free."
)
faqs = [
("What should I use if I want a free tool for class tomorrow?", "DebateOwl's free tools, if you want no student accounts: the timer, the motion generator and the flow sheet. For a written discussion you can grade, Kialo Edu. For AI-judged class tournaments, ArguFight for Schools is free for classrooms."),
("Can students debate an AI in class?", "Yes. Symbai gives each student their own AI opponent in a workspace the teacher sets up, and SchoolAI lets teachers build AI activities and watch them live. SchoolAI's pages we opened do not call it a debate product. It is a general classroom platform where you can build a debate activity as a Space."),
("Do students need accounts for DebateOwl's tools?", "No. The free tools run in the browser with no account. The timer saves the round in the browser, not on a server."),
("Is the DebateOwl app free for schools?", "No. The app is paid after a 3-day free trial. The timer, motion generator and flow sheet stay free for the whole class, with no accounts."),
("Can I project the debate timer?", "Yes. It has a fullscreen mode, and it can be embedded on a class site."),
]
body = f"""
<section class="hero-note">
<h2>The pick for a class with no sign-ups</h2>
<p>If the lesson is tomorrow, DebateOwl's free tools are the pick: nothing to install, no student accounts, and a timer you can put on the projector. {PRICE_HTML} For the wider map, see <a href="/best-ai-for-debate">the short answer</a>. Topic ideas live on <a href="/debate-topics-for-students">debate topics for students</a>, and flowing is covered in <a href="/how-to-flow-in-debate">how to flow in debate</a>. A club that needs cases and rounds should read <a href="/how-to-prepare-for-a-debate-with-ai">how to prepare for a debate with AI</a>.</p>
<p class="kicker">Checklist for tomorrow's lesson</p>
<ul class="checklist">
<li>Put the free timer on the projector and pick the format</li>
<li>Draw a motion with the motion generator, or veto three</li>
<li>Print one flow sheet per student</li>
<li>For a club with a competition coming: try the app's 3-day trial</li>
</ul>
<p><a class="cta" href="/tools/debate-timer">Open the free classroom timer</a></p>
</section>
<section class="scene first">
<p class="kicker">Scenario 1</p>
<h2>I want to run a debate tomorrow with no sign-ups</h2>
<p>Use DebateOwl's free tools. The timer knows seven formats (Public Forum, Lincoln-Douglas, Policy, British Parliamentary, World Schools, Asian Parliamentary and School 4-6-6-3), shows protected time, and has points-of-information knocks and prep banks. You can build a custom format, share it as a link, and embed the timer. The motion generator has 300 original motions and a 3-motion veto drill. The flow sheet prints on A4 or Letter. The timer saves the round in the browser, not on a server. There are <a href="/es/tools">Spanish</a> and <a href="/hu/tools">Hungarian</a> versions too.</p>
<p>That is the clearest fit when you refuse to spend the lesson on accounts. Open the <a href="/tools">tools</a>, the <a href="/tools/debate-motion-generator">motion generator</a> and the <a href="/tools/debate-flow-sheet">flow sheet</a> from any laptop on the projector.</p>
</section>
<section class="scene">
<p class="kicker">Scenario 2</p>
<h2>I want every student to debate an AI at once</h2>
<h3>Symbai, when each student needs a workspace</h3>
<p>Symbai is best for a teacher who wants each student in their own debate workspace. Teachers create a debate and send each student a workspace, with settings such as difficulty and access to the AI tutor. There is a visual debate tree. Classroom controls let you disable the AI tutor for assessments, restrict copy-paste and lock after deadlines. The pricing page lists a dashboard with student analytics, and the homepage says progress is trackable over time. Teacher plans run from NZ$9.99 a month (up to 7 students) to NZ$79.99 a month (up to 100), and those buttons say "Try 2 Months For Free". <a href="#p12">P12</a> <a href="#p14">P14</a></p>
<h3>SchoolAI, when you already use a classroom AI</h3>
<p>SchoolAI is best for a school that already wants a general AI classroom platform, not a debate-only product. Its pages we opened do not use the word debate. Teachers design and manage AI Spaces. Mission Control shows what every student is doing in real time while a Space is active. Its listed compliance is FERPA, COPPA, SOC 2 Type 2 and 1EdTech certified. There is a Free Trial with 5 Space launches per year, plus Pro and Scale plans for schools. The homepage says teachers can try SchoolAI free. Dollar prices for Pro and Scale were not on the pricing page we opened. <a href="#p15">P15</a> <a href="#p16">P16</a></p>
</section>
<section class="scene">
<p class="kicker">Scenario 3</p>
<h2>I want a class tournament with a judge</h2>
<p>ArguFight for Schools is best for a private class tournament judged by AI, at no charge. It offers private, invite-only tournaments in bracket, championship and king-of-the-hill formats. Every match is judged 0–100 with written reasoning. Students get an Elo, a history and per-round feedback. It lists 26 languages, and getting started is free for classrooms. The schools page describes the tournaments and the written reasoning. The main site also lets you dictate an argument with speech-to-text in Chrome, Edge and the mobile app, so the product is not only typed. <a href="#p5">P5</a> <a href="#p4">P4</a></p>
</section>
<section class="scene">
<p class="kicker">Scenario 4</p>
<h2>I want a written discussion I can grade</h2>
<p>Kialo Edu is best for a graded written discussion, and it is free. Students write pros and cons under each other's points as an interactive map. There is an anonymous mode. Discussions are saved, so you can grade them later. It works with Google Classroom, Microsoft, Moodle, Blackboard, Clever and D2L. The site says it is free and always will be. <a href="#p13">P13</a></p>
</section>
<section class="scene club">
<p class="kicker">Scenario 5</p>
<h2>My debate club is preparing for a competition</h2>
<p>This is where the DebateOwl app is the pick. Students get a case they can read out, with "If they say… we answer…" replies, Crossfire drills and timed Sparring in School 4-6-6-3, Lincoln-Douglas or Public Forum, in English, Spanish or Hungarian. There is no teacher dashboard. It is built for the students who are preparing, not for a screen that shows every student at once. The app is paid after a 3-day free trial.</p>
<p>If you also want roles, timing and judges' score sheets for a live in-class debate, with an AI analysis from uploaded audio, Camelot for Debate does that in Italian and English. <a href="#p17">P17</a></p>
</section>
<section>
<h2>Before you use any AI tool with students</h2>
<ol class="privacy">
<li>Read the age requirements.</li>
<li>Read where the data goes.</li>
<li>See whether students need accounts.</li>
<li>Look for teacher controls, if the lesson needs them.</li>
<li>Read what the tool itself says about student data.</li>
</ol>
<p>DebateOwl's free tools need no account, and the timer saves the round in the browser, not on a server. The app, once a student signs in, keeps cases and rounds behind that account.</p>
</section>
{faq_block("Questions from teachers", faqs, "h3")}
{sources("Sources checked for this classroom guide", [
("p12", "https://symbai.ai/pricing/", "Teacher prices in NZ dollars, the trial, and the read-only workspace."),
("p14", "https://symbai.ai/", "Per-student workspaces, the debate tree, and classroom controls. The same controls are listed at https://symbai.ai/features/."),
("p15", "https://schoolai.com/pricing", "Free Trial with 5 Space launches a year, Pro, Scale, Mission Control, and the compliance list."),
("p16", "https://schoolai.com/", "Teachers can try SchoolAI free. The pages we opened do not use the word debate."),
("p5", "https://www.argufight.com/for-schools", "Free private classroom tournaments."),
("p4", "https://www.argufight.com/", "Speech-to-text, and free for base debating."),
("p13", "https://www.kialo-edu.com/", "Free written discussions and the integrations."),
("p17", "https://www.camelot.vote/en/debate", "Roles, timing, judge sheets, and AI analysis from uploaded audio, in Italian and English."),
])}
"""
style = """
body.teach{background:#F7FAFE}body.teach main{width:min(860px,calc(100% - 28px));margin:0 auto 64px}
body.teach h1{font-size:clamp(2.3rem,6vw,3.8rem);padding-top:28px}
body.teach .hero-note{background:#0B1426;color:#EEF4FF;margin:0 -16px;padding:8px 22px 22px;border-radius:0 0 32px 32px}
body.teach .hero-note a{color:#FCE48A}
body.teach .checklist{list-style:none;padding:0;margin:4px 0 12px}body.teach .checklist li{margin:6px 0}body.teach .checklist li::before{content:"";display:inline-block;width:.9em;height:.9em;border:2px solid #FCE48A;border-radius:4px;margin-right:10px;vertical-align:-1px}
body.teach .hero-note .kicker{color:#FCE48A}
body.teach .scene{padding:8px 0 4px;border-top:1px solid #CDD7E4}
body.teach .scene.first{border-top:none;background:#fff;margin:18px -16px 0;padding:8px 22px 18px;border-radius:24px}
body.teach .kicker{font-family:Fredoka,Nunito,sans-serif;color:#0556D6;margin-bottom:0}
body.teach .club{background:#FFF8DB;margin:0 -16px;padding:8px 22px 18px;border-radius:24px}
body.teach .privacy{font-size:1.15rem}
"""
return {
"slug": "ai-debate-tools-for-teachers",
"lang": "en",
"body": "teach",
"title": "AI Debate Tools for Teachers: 5 Classroom Scenarios | DebateOwl",
"description": "Which AI debate tool fits your classroom: no-signup timers, AI opponents for every student, class tournaments, graded discussion and club prep.",
"h1": "AI debate tools for teachers",
"question": "What should I use to run debates in class?",
"answer": answer,
"faqs": faqs,
"style": style,
"html_body": body,
}
def page_prep():
answer = (
"Use DebateOwl for the slow parts you would rather not invent from a blank page: read the motion, draft two to four arguments with evidence, "
'list what the other side will say and write an "If they say… we answer…" reply to each, then practise at real speech times. '
"Keep the judgement calls for yourself, and check every source before it goes into a speech. A general chatbot can do pieces of this if you prompt it."
)
steps = [
("Read the motion", "Open Brainstorm on the Current Debate and ask what each side has to prove.", "Paste the motion and ask it to define the terms and say what each side must prove.", "/debate-motion-analysis"),
("Gather sources", "Use Factoids for one claim and the Library for sources you already trust.", "Ask for the source and the year of every fact, then open each one. Cut anything you cannot find.", "/debate-evidence-finder"),
("Draft the arguments", "The case generator writes the opening, two to four arguments, and why each matters.", "Ask for a point, an explanation, evidence with a source and year, and why it matters. Do not accept a wall of text.", "/ai-debate-case-generator"),
("Predict the other side", "Run Attack on your case, and read the case's own \"If they say…\" lines.", "Ask for the strongest case against you, written so a fan of that side would agree.", "/how-to-practice-rebuttals"),
("Write the replies", 'The case already includes "If they say X, we answer Y" blocks. Regenerate one weak block if you need to.', "Demand one short answer per opposing point, in words you could say aloud.", ""),
("Drill the questions", "Crossfire asks one question at a time, or lets the AI question you.", "Say you will answer one question at a time and that it should wait.", "/how-to-cross-examine-in-debate"),
("Practise at real times", "Sparring runs School 4-6-6-3, Lincoln-Douglas or Public Forum and ends with a verdict. For every other format, use the free timer.", "You keep the clock yourself. The free timer already knows seven formats.", "/tools/debate-timer"),
]
rendered = []
howto_steps = []
for index, (name, owl, any_ai, href) in enumerate(steps, start=1):
link = f' See <a href="{esc(href)}">the related guide</a>.' if href else ""
rendered.append(
f'<li id="step-{index}"><h3>{index}. {esc(name)}</h3>'
f"<p><strong>In DebateOwl.</strong> {owl}</p>"
f"<p><strong>With any AI.</strong> {esc(any_ai)}{link}</p></li>"
)
howto_steps.append({
"@type": "HowToStep",
"position": index,
"name": f"{index}. {name}",
"text": f"In DebateOwl. {owl} With any AI. {any_ai}",
})
faqs = [
("Can AI help me prepare for a debate?", "Yes, as long as you treat what it gives you as a draft. Use it for the slow parts, and keep the judgement calls. Check every source before it goes into a speech."),
('What should a second speech include?', 'No new arguments: about two minutes backing up your team\'s arguments, then about four minutes of "If they say X, we answer Y" replies.'),
("Is using AI for debate prep cheating?", "Prep is usually fine, but most leagues restrict electronics or AI during the round itself. Check your league's rules."),
("How do I stop the AI making up evidence?", "Ask for the source and year of every fact, open each one, and cut anything you can't find."),
("Which AI should I use?", "For this plan, DebateOwl is the pick, because the modes match the steps, and it is paid after a 3-day trial. A wider comparison is on the short-answer page linked above."),
]
howto = {
"@type": "HowTo",
"name": "How to prepare for a debate with AI",
"description": answer,
"step": howto_steps,
}
body = f"""
<section class="rail">
<h2>Seven steps, DebateOwl first</h2>
<p>DebateOwl fits at step 3: once you know what each side must prove, the case generator drafts the arguments and the "If they say…" replies together, and Sparring times the round at step 7. The wider comparison is <a href="/best-ai-for-debate">the short answer</a>. If you are choosing between chatbots first, read <a href="/chatgpt-vs-claude-for-debate">ChatGPT vs Claude for debate</a>. A head-to-head with a ranked voice game is <a href="/debateowl-vs-debate-ladder">DebateOwl vs Debate Ladder</a>. Teachers running the class itself should read <a href="/ai-debate-tools-for-teachers">AI debate tools for teachers</a>. Case structure in general is in <a href="/how-to-write-a-debate-case">how to write a debate case</a>.</p>
<p class="row">{TICK}<strong>Where the app saves the most time:</strong> steps 3 to 5 come back as one draft you can read aloud.</p>
<ol class="steps">{''.join(rendered)}</ol>
<p><a class="cta" href="/app">Generate your first case in the 3-day trial</a></p>
<p>{PRICE_HTML}</p>
</section>
<section id="worked-example" class="sheet">
<h2>A worked second speech: phones in class</h2>
<p>Motion: "This House would ban phones in class." The same motion appears on the DebateOwl homepage. Nothing below is a real study. The brackets are placeholders you replace after you have opened a source.</p>
<p><strong>Opening line.</strong> Today we will show two arguments that prove phones belong outside class.</p>
<h3>Argument 1, in our team's first speech</h3>
<p><strong>Notifications break concentration.</strong> Explanation: a student who looks at a message then spends the next explanation catching up has missed the step the rest of the room is on. Evidence: [a study on refocus time: name the source and year you verified]. Why it matters: a lesson only works if the room is in it together.</p>
<h3>Argument 2, so the second speech has two points to back up</h3>
<p><strong>Class is a shared conversation.</strong> Explanation: when some students are on their phones, the people speaking lose the listeners the lesson depends on. Evidence: [a classroom observation you have checked: name the source and year]. Why it matters: a discussion you cannot join is not a discussion.</p>
<h3>Second speech, about 6 minutes</h3>
<p><strong>Part 1, about 2 minutes, reinforce.</strong> No new arguments. Back up the first argument with one fresh example: the student who glances down and then asks a question the room already answered. Back up the second with one fresh example: a partner task where one person is scrolling and the other is talking to an empty chair.</p>
<p><strong>Part 2, about 4 minutes, "If they say X, we answer Y".</strong></p>
<ol>
<li>If they say "Students need phones for emergencies", we answer: the school office can call home, and a phone in a bag at the office covers the same emergency without a screen on every desk.</li>
<li>If they say "Phones are learning tools", we answer: when a task actually needs a device, the class can share a computer or a set of tablets, which is different from every student having a private phone out all period.</li>
<li>If they say "A ban is unenforceable", we answer: schools already collect items that distract, and a basket at the door is easier to see than a rule about using a phone well.</li>
<li>If they say "Students must learn self-control", we answer: self-control is practised when the distraction is not buzzing during the explanation. The lesson is the place to pay attention.</li>
<li>If they say "Parents want to reach their children", we answer: parents can call the office, and students can check messages at lunch. A class period is short enough that a delay is not the same as being unreachable.</li>
</ol>
<p><strong>Closing line.</strong> That is why phones belong outside the lesson: the class stays on the work, and a real emergency still has a way through.</p>
<p>This is the shape DebateOwl's case generator produces for the second-speaker role. Every case also ends with the sources it used.</p>
</section>
<section>
<h2>What you still decide yourself</h2>
<p>The plan above will hand you a full draft. The round is still yours. Three decisions should not be delegated, even when the draft sounds confident.</p>
<p>The first is the motion's meaning. If "ban" in your motion means a legal prohibition and the draft treats it as a classroom norm, the whole case is about the wrong world. Read the actor, the action and the word that sets the strength of the claim before you fall in love with an argument. Brainstorm will offer readings. You pick the one a judge would accept without a fight.</p>
<p>The second is which argument you are willing to live on. Two to four arguments is the shape. Three of them can be true and only one of them can be the thing you return to in the last speech. If you cannot say, in one sentence, why that argument matters more than the other side's best point, you do not yet have a case. You have a list.</p>
<p>The third is the source. A named year is not a check. Open the page, find the sentence, and see whether it is about your claim or about a neighbouring one. If you cannot find it, the sentence leaves the speech. This is the same rule for DebateOwl, for ChatGPT and for Claude. Active Grounding, on the paid plan, is a research aid. It is not a substitute for the tab you open yourself.</p>
<p>A practical test before you close the laptop: give the second speech to an empty room, at about six minutes, with a timer. If part 1 starts a new argument, stop and cut it. If part 2 answers a point the other side would never say, replace that block with one they would. If you run out of time before the closing line, the reinforcement was too long. The free timer will do this drill for any format. Sparring will do it against an opponent for School 4-6-6-3, Lincoln-Douglas and Public Forum, and it will tell you a reason at the end. Change one thing from that reason. Then stop.</p>
<p>Teachers who want the class to do this without accounts can put the timer on a projector and print the flow sheet. Students who are preparing a dated round should be in the app, because that is where the case, the replies and the timed round stay attached to one motion. Both can be true in the same week.</p>
<p>If you only have twenty minutes, do the smallest version. Read the motion, generate the case, say the second speech's reply blocks once, and open one source. That is a complete prep, not a sketch you feel guilty about. The rest of the week can add the timed round.</p>
</section>
{faq_block("Questions about using AI for prep", faqs, "h3")}
{sources("Notes for this prep plan", [
("p1", "https://chatgpt.com/pricing", "A free chatbot is enough for the 'with any AI' lines. The free version is available to everyone."),
("p2", "https://claude.com/pricing", "Claude's free plan is the other general chatbot this plan allows."),
])}
"""
style = """
body.prep{background:#fff}body.prep main{width:min(820px,calc(100% - 36px));margin:24px auto 72px}
body.prep h1{font-size:clamp(2.2rem,5vw,3.5rem)}
body.prep .steps{list-style:none;padding:0;margin:0;border-left:3px solid #0A6FF0}
body.prep .steps li{padding:0 0 8px 22px;position:relative}
body.prep .steps li::before{content:"";position:absolute;left:-8px;top:8px;width:13px;height:13px;border-radius:50%;background:#0A6FF0}
body.prep .row{display:flex;align-items:center;gap:4px;border-top:2px solid #0A6FF0;border-bottom:2px solid #0A6FF0;padding:10px 0;margin:14px 0}
body.prep .sheet{background:#FFF8DB;border:3px solid #0B1426;border-radius:8px;padding:8px 22px 18px;margin-top:28px}
body.prep .sheet ol li{margin:8px 0}
"""
page = {
"slug": "how-to-prepare-for-a-debate-with-ai",
"lang": "en",
"body": "prep",
"title": "How to Prepare for a Debate with AI: 7 Steps and a Worked Example | DebateOwl",
"description": 'A 7-step plan to prep a debate with AI: read the motion, build arguments, predict the other side, write "If they say… we answer…" replies and spar.',
"h1": "How to prepare for a debate with AI",
"question": "How do I use AI to prepare for a debate?",
"answer": answer,
"faqs": faqs,
"style": style,
"html_body": body,
}
page["howto"] = howto
return page
def page_pf():
answer = (
"For Public Forum, start with DebateOwl when you want a case you can read out, "
'"If they say… we answer…" replies, crossfire drills, and Sparring at the 4-4-3-2 speech times, '
"for $5/month after a 3-day free trial. PublicForumAI is built only for PF and has free practice rounds. "
"Cardinal focuses on finding and cutting evidence. Prilo covers PF, Lincoln-Douglas and Policy with a cross-examination simulator."
)
faqs = [
("What should I use for Public Forum?", "Start with DebateOwl if you want the case, the replies, crossfire drills and timed speeches in one place. PublicForumAI is the free, PF-only practice round. Cardinal is the evidence tool. Prilo is the circuit tool with a cross-examination simulator and flowing drills."),
("Is there a free AI for PF practice?", "Yes. PublicForumAI's free plan has 3 full practice rounds a month, and Cardinal lists five free tools, described as free forever."),
("Can AI do crossfire practice?", "Yes. DebateOwl has timed Crossfire drills, and Prilo has a 3-minute cross-examination simulator. PublicForumAI says it doesn't yet have a crossfire feature, \"it's in the works\"."),
("Can I use AI during a PF round?", "PublicForumAI itself says its tools are for practice, not for live rounds. Check your league's rules."),
("How much does DebateOwl cost for PF?", "Pro is $5/month + tax after a 3-day free trial, with no permanent free plan. The PF timer with prep banks and the flow sheet are free."),
]
rows = [
("Constructive (4 min)", "A clear two-argument case with evidence", "DebateOwl case generator. PublicForumAI's case writer. Cardinal's card cutter."),
("Crossfire (3 min, three times)", "Fast questions and answers", 'DebateOwl Crossfire drills. Prilo\'s 3-minute cross-examination simulator. PublicForumAI says it doesn\'t yet have a crossfire feature, "it\'s in the works".'),
("Rebuttal (4 min)", "Answers to their case", 'DebateOwl "If they say… we answer…" replies, plus Attack. Prilo\'s AI rebuttal drafts.'),
("Summary (3 min) and final focus (2 min)", "Collapse onto the points that decide the round", "DebateOwl's Sparring verdict and Ask coach. PublicForumAI's full rounds, with a judge ballot and tech or lay feedback."),
("Evidence", "Real sources you can open", "Cardinal searches the web and opencaselist and cuts cards. PublicForumAI Premium adds real sourced evidence with working links. DebateOwl Factoids names sources you still have to check."),
("Flowing", "A record of every argument", "PublicForumAI's AI Flow, with speech recognition. Prilo's flowing practice. DebateOwl's free printable flow sheet."),
]
trs = "".join(f"<tr><th scope=\"row\">{esc(a)}</th><td>{esc(b)}</td><td>{esc(c)}</td></tr>" for a, b, c in rows)
body = f"""
<section class="order">
<h2>The pick for a Public Forum case and a timed round</h2>
<p>DebateOwl is the first name in the speech table because it covers the case you read, the replies, the crossfire drill and the timed speeches together. {PRICE_HTML} The rules of the format, without the tool comparison, are on <a href="/public-forum-debate">Public Forum debate</a>. Question drills are in <a href="/how-to-cross-examine-in-debate">how to cross-examine</a>, and weighing is in <a href="/how-to-weigh-in-debate">how to weigh</a>. The wider list is <a href="/best-ai-for-debate">the short answer</a>. Prices are on <a href="/free-vs-paid-ai-debate-tools">free vs paid</a>.</p>
{wins(["A PF case you can read out", '"If they say… we answer…" replies', "Crossfire as its own drill", "Sparring at 4-4-3-2, then $5/month"])}
<p>Sparring runs the PF speeches at those times and ends with a judged verdict. It does not insert the three crossfire periods. Practise those in Crossfire. The free <a href="/tools/debate-timer">timer</a> does run the crossfires and the prep banks, and the <a href="/tools/debate-flow-sheet">flow sheet</a> prints the columns. <a href="/debate-clash-points">Clash</a> is where you decide which argument the summary should keep.</p>
<p><a class="cta" href="/app">Spar a full PF round at 4-4-3-2 times</a></p>
</section>
<section>
<h2>Speech by speech</h2>
<div class="scroll"><table>
<caption>NSDA times, as the Public Forum guide on this site states them. DebateOwl is named first wherever it does the job.</caption>
<thead><tr><th scope="col">PF speech</th><th scope="col">What you need</th><th scope="col">Tools that help</th></tr></thead>
<tbody>{trs}</tbody>
</table></div>
</section>
<section class="profiles">
<h2>DebateOwl for Public Forum</h2>
<p>Best for students who want case writing, replies, crossfire and full speech rounds in one place at a low price. The case is an opening, two to four arguments with evidence and why each matters, the replies, a closing line and the sources. For PF, the first constructive carries the arguments, and the rebuttal is where you answer theirs without pretending a new argument belongs there. The app is in English, Spanish and Hungarian. The free timer has prep banks. The app is paid after the 3-day trial.</p>
<h2>PublicForumAI, the PF-only practice round</h2>
<p>Best for PF debaters who want a free, PF-only practice round. It was started in 2024 by students on a high school debate team in New York City. The free plan has 3 rounds a month and 5 cases a month. Premium is $9.99 a month or $79 a year. A round takes about 35 minutes including prep, without crossfire. There are middle school and high school difficulty levels. Its tools are for practice, not for live rounds. <a href="#p3">P3</a> <a href="#p18">P18</a></p>
<h2>Cardinal, for the cards</h2>
<p>Best for evidence work. Five tools are marked free, and the site calls the core tools free forever. Pro is $10 a month or $75 a season. Card search runs over the web and opencaselist. <a href="#p7">P7</a></p>
<h2>Prilo, for circuit drills</h2>
<p>Best for NSDA-circuit debaters who want cross-examination and flowing drills. It is $15 a month or $60 a year, and it covers Lincoln-Douglas, Public Forum and Policy, with a 3-minute cross-examination simulator and speech analytics. <a href="#p8">P8</a></p>
</section>
<section class="mini">
<h2>A tiny PF reply block</h2>
<p>This is an example resolution, not a claim about the current NSDA topic: "Resolved: Public schools should give students one homework-free weekend a month."</p>
<p><strong>One argument, on the proposition.</strong> A weekend with no homework gives students time to sleep and to show up on Monday able to listen. The reason is ordinary: homework that fills both days crowds out the rest a student needs before a week of class. Why it matters: a tired first speech, in class or in a round, is a worse speech.</p>
<ol>
<li>If they say "Students will fall behind", we answer: one weekend a month is not the end of practice, and the other weekends still carry the load.</li>
<li>If they say "Homework is how you learn", we answer: learning also needs a break, and a single protected weekend does not delete the assignments on the other days.</li>
<li>If they say "Families will fill the time with more activities", we answer: that is the family's choice, and the school's job is not to occupy every hour so the choice never comes up.</li>
</ol>
</section>
{faq_block("Public Forum questions", faqs, "details")}
{sources("Sources for the PF tools", [
("p18", "https://publicforumai.com/", "PF only, started in 2024 by NYC high school debaters, no crossfire feature yet, about 35 minutes, tech or lay judge, not for live rounds."),
("p3", "https://publicforumai.com/pricing", "Free plan and Premium at $9.99/mo or $79/yr."),
("p7", "https://cardinaldebate.org/", "Card search, five free tools, Pro at $10/month or $75 a season."),
("p8", "https://www.prilo.ai/nsda", "PF, LD and Policy, the 3-minute simulator, $15/month or $60/year."),
])}
"""
style = """
body.pf{background:#F7FAFE}body.pf main{width:min(900px,calc(100% - 32px));margin:20px auto 64px}
body.pf h1{font-size:clamp(2.4rem,6vw,4rem);color:#0B1426}
body.pf .order{background:#fff;border-radius:28px;padding:8px 20px 16px;box-shadow:0 16px 40px rgba(11,20,38,.06)}
body.pf .wins{display:flex;flex-wrap:wrap;gap:8px 16px;list-style:none;padding:0}
body.pf .wins li{display:flex;align-items:center}
body.pf table{min-width:680px}