Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion docs/operations.md
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ Vercel builds and serves the frontend from the Git repository. A push to `main`
- `trailingSlash: false`, which 308-redirects `/app/settings/` to `/app/settings` before routing, since rewrite and redirect sources match exactly;
- 301 redirects from the retired brand pages (`/debatelab`, `/debatelab-by-programcode`, and the rest) to `/`;
- 301 redirects from retired guide slugs to the guide that replaced them, such as `/debate-weighing-guide` to `/how-to-weigh-in-debate`. The `trailingSlash` 308 runs first, so `/debate-weighing-guide/` reaches the same page in two permanent hops and needs no rule of its own;
- revalidating cache headers (`public, max-age=0, must-revalidate`, without `no-store`, so a document can enter the back/forward cache) for `/`, `index.html`, `app-shell.html`, and `theme-init.js`. `sw.js` stays `no-store` so a new service worker is not stuck in the HTTP cache. Hashed `/assets/` are immutable. The unhashed images in `public/` (`favicon.ico`, `favicon.png`, `favicon-72.png`, `hero-visual.png`, `placeholder.svg`) are cached for 30 days. Jam's capture iframe is removed on `pagehide` (never via `unload`) so that cross-origin frame cannot veto the cache;
- revalidating cache headers (`public, max-age=0, must-revalidate`, without `no-store`, so a document can enter the back/forward cache) for `/`, `index.html`, `app-shell.html`, and `theme-init.js`. `sw.js` stays `no-store` so a new service worker is not stuck in the HTTP cache. Hashed `/assets/` are immutable. The unhashed images in `public/` (`favicon.ico`, `favicon.png`, `favicon-72.png`, `hero-visual.jpg`, `placeholder.svg`) are cached for 30 days. Jam's capture iframe is removed on `pagehide` (never via `unload`) so that cross-origin frame cannot veto the cache;
- `noindex` headers for `/app`, `/login`, `/share` and `/embed/debate-timer`. The app shell's robots meta is `noindex, nofollow`, the same policy. Public pages, including the prerendered `/expocit/sources`, are `index, follow`. A route deletes the platform `Access-Control-Allow-Origin: *` header on HTML responses and leaves it on static assets;
- Content Security Policy and the other response security headers, including the `Permissions-Policy` that allows the microphone for the app's own origin only. Jam is limited to `https://js.jam.dev` and `https://recorder.jam.dev`; `script-src` does not include `unsafe-eval`. Web Analytics and Speed Insights stay on this origin (`/_vercel/insights` and `/_vercel/speed-insights`), which `'self'` already allows. Every path except `/embed/debate-timer` refuses to be framed (`X-Frame-Options: DENY` and `frame-ancestors 'none'`). `/embed/debate-timer` allows any site to frame it and gets its own CSP, which permits only same-origin scripts and requests. The two rules use complementary sources (`/((?!embed/debate-timer$).*)` and `/embed/debate-timer`) so no path gets both, a new embed needs its path added to both, and `src/test/vercel-deployment-config.test.ts` fails if two matching rules ever set the same header.

Expand Down
3 changes: 2 additions & 1 deletion embed/debate-timer/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,8 @@
<title>Debate timer | DebateLab</title>
<meta name="robots" content="noindex" />
<link rel="canonical" href="https://debate.pi-stack.org/tools/debate-timer" />
<link rel="icon" type="image/png" href="/favicon.png" />
<link rel="icon" href="/favicon.ico" sizes="48x48" />
<link rel="icon" type="image/png" href="/favicon.png" sizes="48x48" />
<script src="/src/embed/debate-timer.tsx" type="module"></script>
</head>
<body>
Expand Down
14 changes: 9 additions & 5 deletions index.html
Original file line number Diff line number Diff line change
Expand Up @@ -10,25 +10,29 @@
from it with their own title, description, canonical URL and JSON-LD. -->
<title>DebateLab</title>
<meta name="description" content="DebateLab is an AI debate prep and practice app for students and competitive debaters: cases, rebuttals, evidence, coaching and timed practice rounds against an AI opponent." />
<meta name="keywords" content="DebateLab, debate lab, AI debate practice, debate practice platform, debate drills, rebuttal practice, argumentation training, debate coach, debate preparation" />
<meta name="author" content="DebateLab by Pi-Stack" />
<!-- The shell for /app, /login and /share. Prerender replaces this with the
public index directive on pages that have a canonical URL. -->
<meta name="robots" content="noindex, nofollow" />
<meta name="language" content="English" />
<meta name="theme-color" content="#f1f5f9" media="(prefers-color-scheme: light)" />
<meta name="theme-color" content="#0f172a" media="(prefers-color-scheme: dark)" />
<link rel="icon" type="image/png" href="/favicon.png" />
<link rel="icon" href="/favicon.ico" sizes="48x48" />
<link rel="icon" type="image/png" href="/favicon.png" sizes="48x48" />
<link rel="apple-touch-icon" href="/apple-touch-icon.png" sizes="180x180" />
<link rel="manifest" href="/manifest.webmanifest" />
<meta property="og:type" content="website" />
<meta property="og:site_name" content="DebateLab by Pi-Stack" />
<meta property="og:title" content="DebateLab by Pi-Stack | AI Debate Prep, Cases & Rebuttals" />
<meta property="og:description" content="DebateLab is an AI debate prep and practice app for students and competitive debaters: cases, rebuttals, evidence, coaching and timed practice rounds against an AI opponent." />
<meta property="og:image" content="https://debate.pi-stack.org/hero-visual.png" />
<meta property="og:image" content="https://debate.pi-stack.org/hero-visual.jpg" />
<meta property="og:image:width" content="1200" />
<meta property="og:image:height" content="630" />
<meta property="og:image:alt" content="DebateLab debate prep workspace preview" />
<meta name="twitter:card" content="summary_large_image" />
<meta name="twitter:title" content="DebateLab by Pi-Stack | AI Debate Prep" />
<meta name="twitter:description" content="DebateLab is an AI debate prep and practice app for students and competitive debaters: cases, rebuttals, evidence, coaching and timed practice rounds against an AI opponent." />
<meta name="twitter:image" content="https://debate.pi-stack.org/hero-visual.png" />
<meta name="twitter:image" content="https://debate.pi-stack.org/hero-visual.jpg" />
<meta name="twitter:image:alt" content="DebateLab debate prep workspace preview" />
<script src="/theme-init.js"></script>
<style>
body {
Expand Down
6 changes: 5 additions & 1 deletion public/ai-debate-case-generator/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -12,11 +12,15 @@
<meta property="og:title" content="AI Debate Case Generator with Citations | DebateLab" />
<meta property="og:description" content="Use an AI debate case generator to draft structured cases with claims, warrants, impacts, and evidence leads, then verify sources before round." />
<meta property="og:url" content="https://debate.pi-stack.org/ai-debate-case-generator" />
<meta property="og:image" content="https://debate.pi-stack.org/hero-visual.png" />
<meta property="og:image" content="https://debate.pi-stack.org/hero-visual.jpg" />
<meta property="og:image:width" content="1200" />
<meta property="og:image:height" content="630" />
<meta property="og:image:alt" content="DebateLab debate prep workspace preview" />
<meta property="article:published_time" content="2026-07-05" />
<meta property="article:modified_time" content="2026-10-21" />
<meta name="twitter:card" content="summary_large_image" />
<meta name="twitter:image" content="https://debate.pi-stack.org/hero-visual.jpg" />
<meta name="twitter:image:alt" content="DebateLab debate prep workspace preview" />
<link rel="stylesheet" href="/seo-pages.css" />
<script type="application/ld+json">{"@context":"https://schema.org","@graph":[{"@type":"Article","headline":"AI Debate Case Generator with Citations","name":"AI Debate Case Generator with Citations | DebateLab","url":"https://debate.pi-stack.org/ai-debate-case-generator","description":"Use an AI debate case generator to draft structured cases with claims, warrants, impacts, and evidence leads, then verify sources before round.","inLanguage":"en","dateModified":"2026-10-21","datePublished":"2026-07-05","author":{"@type":"Organization","@id":"https://debate.pi-stack.org/#organization","name":"Pi-Stack","url":"https://debate.pi-stack.org/"},"publisher":{"@type":"Organization","@id":"https://debate.pi-stack.org/#organization","name":"Pi-Stack","url":"https://debate.pi-stack.org/"},"about":{"@id":"https://debate.pi-stack.org/#software"}},{"@type":"FAQPage","mainEntity":[{"@type":"Question","name":"Can an AI debate case generator write a case I can actually use?","acceptedAnswer":{"@type":"Answer","text":"It can write a usable draft, not a finished case. A good generator gives you a thesis, a framework, contentions with warrants and impacts, the case the other side is likely to run, and counters to it. Treat its citations as research leads: open every source, confirm the exact claim and record the full citation. The judgement calls, such as which contention to cut and where to pre-empt the opposition, stay with you. Rewrite the case in your own words, because judges can hear when you are reading a draft for the first time."}},{"@type":"Question","name":"Does the case generator write a complete case?","acceptedAnswer":{"@type":"Answer","text":"It writes a complete draft: thesis, framework, contentions with warrants and impacts, the likely opposing case and counters. Treat it as a structure to cut, verify and rewrite in your own words."}},{"@type":"Question","name":"Are the generated citations reliable?","acceptedAnswer":{"@type":"Answer","text":"They are research leads. Every draft is researched on the web and lists the sources it found, and a contention that still needs evidence is marked Needs Source. Open every source, confirm the exact claim and record the full citation before using it."}},{"@type":"Question","name":"Which debate formats does the generator support?","acceptedAnswer":{"@type":"Answer","text":"Set the Current Debate's format to British Parliamentary, Policy, Classroom or Custom, and Generate reads it along with the debate's Instructions. Generate's own speaker roles (introductor, R1, R2 and conclusor) follow the School 4-6-6-3 format. For WSDC, Public Forum and Lincoln-Douglas, use Custom and describe the structure in the Instructions."}},{"@type":"Question","name":"Can I change one part of a case without starting over?","acceptedAnswer":{"@type":"Answer","text":"Yes. Regenerate a single section and the rest of the case stays on screen unchanged."}},{"@type":"Question","name":"Can I export a generated case?","acceptedAnswer":{"@type":"Answer","text":"Yes. Cases export to PDF and DOCX, and cases created in a Current Debate are saved to it automatically."}}]},{"@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"DebateLab by Pi-Stack","item":"https://debate.pi-stack.org/"},{"@type":"ListItem","position":2,"name":"AI Debate Case Generator with Citations","item":"https://debate.pi-stack.org/ai-debate-case-generator"}]}]}</script>
</head>
Expand Down
6 changes: 5 additions & 1 deletion public/ai-debate-coach/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -12,11 +12,15 @@
<meta property="og:title" content="AI Debate Coach for Strategy, Structure &amp; Practice | DebateLab" />
<meta property="og:description" content="Ask DebateLab&#x27;s AI debate coach for help with strategy, argument structure, weighing, rebuttals, speeches, prep questions, and practice feedback." />
<meta property="og:url" content="https://debate.pi-stack.org/ai-debate-coach" />
<meta property="og:image" content="https://debate.pi-stack.org/hero-visual.png" />
<meta property="og:image" content="https://debate.pi-stack.org/hero-visual.jpg" />
<meta property="og:image:width" content="1200" />
<meta property="og:image:height" content="630" />
<meta property="og:image:alt" content="DebateLab debate prep workspace preview" />
<meta property="article:published_time" content="2026-07-05" />
<meta property="article:modified_time" content="2026-10-21" />
<meta name="twitter:card" content="summary_large_image" />
<meta name="twitter:image" content="https://debate.pi-stack.org/hero-visual.jpg" />
<meta name="twitter:image:alt" content="DebateLab debate prep workspace preview" />
<link rel="stylesheet" href="/seo-pages.css" />
<script type="application/ld+json">{"@context":"https://schema.org","@graph":[{"@type":"Article","headline":"Ask an AI Debate Coach for Round-Ready Prep","name":"AI Debate Coach for Strategy, Structure & Practice | DebateLab","url":"https://debate.pi-stack.org/ai-debate-coach","description":"Ask DebateLab's AI debate coach for help with strategy, argument structure, weighing, rebuttals, speeches, prep questions, and practice feedback.","inLanguage":"en","dateModified":"2026-10-21","datePublished":"2026-07-05","author":{"@type":"Organization","@id":"https://debate.pi-stack.org/#organization","name":"Pi-Stack","url":"https://debate.pi-stack.org/"},"publisher":{"@type":"Organization","@id":"https://debate.pi-stack.org/#organization","name":"Pi-Stack","url":"https://debate.pi-stack.org/"},"about":{"@id":"https://debate.pi-stack.org/#software"}},{"@type":"FAQPage","mainEntity":[{"@type":"Question","name":"Can an AI debate coach actually help you prepare?","acceptedAnswer":{"@type":"Answer","text":"Yes, as a partner for thinking problems through: burdens, clash, weighing, speech structure and why a practice speech did not land. It works best with specific questions that name the format, your side and speaker role, what is already on the table and what you are stuck on. Vague questions get generic answers. Treat any sources it cites as leads to check. An AI coach has not watched you speak and does not know your judges or your partner, so take its conclusions to your human coach or team and let them correct what does not fit."}},{"@type":"Question","name":"What can I ask the AI debate coach?","acceptedAnswer":{"@type":"Answer","text":"Anything you would ask a coach between rounds: burdens, clash, weighing, speech structure, how to answer a specific argument, or why a practice speech did not land. Specific questions with format, side and speaker role get the best answers."}},{"@type":"Question","name":"Does the coach know my case?","acceptedAnswer":{"@type":"Answer","text":"It knows your Current Debate: the motion, and the Library sources you have marked active. Paste a speech or a case section into the question when you want feedback on that exact text."}},{"@type":"Question","name":"Can the AI coach cite sources?","acceptedAnswer":{"@type":"Answer","text":"Yes. Turn on Citations in Ask and the answer includes sources you can open. Check each one against the original before using it in a round."}},{"@type":"Question","name":"Will the coach write my speeches for me?","acceptedAnswer":{"@type":"Answer","text":"It can draft an outline or a passage, but you will speak better from structure you understand. Use it to find what is missing, then write the speech in your own words."}},{"@type":"Question","name":"How is this different from a general AI chatbot?","acceptedAnswer":{"@type":"Answer","text":"The coach works inside one debate at a time, so it keeps your motion, debate settings and sources in context, and it is set up for debate questions rather than essays."}}]},{"@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"DebateLab by Pi-Stack","item":"https://debate.pi-stack.org/"},{"@type":"ListItem","position":2,"name":"Ask an AI Debate Coach for Round-Ready Prep","item":"https://debate.pi-stack.org/ai-debate-coach"}]}]}</script>
</head>
Expand Down
6 changes: 5 additions & 1 deletion public/ai-debate-practice/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -12,11 +12,15 @@
<meta property="og:title" content="AI Debate Practice Platform | DebateLab" />
<meta property="og:description" content="Practice debate online with DebateLab: AI opponents, targeted drills, rebuttal feedback, evidence research, argument flowcharts, and tournament-ready prep tools." />
<meta property="og:url" content="https://debate.pi-stack.org/ai-debate-practice" />
<meta property="og:image" content="https://debate.pi-stack.org/hero-visual.png" />
<meta property="og:image" content="https://debate.pi-stack.org/hero-visual.jpg" />
<meta property="og:image:width" content="1200" />
<meta property="og:image:height" content="630" />
<meta property="og:image:alt" content="DebateLab debate prep workspace preview" />
<meta property="article:published_time" content="2026-07-05" />
<meta property="article:modified_time" content="2026-10-21" />
<meta name="twitter:card" content="summary_large_image" />
<meta name="twitter:image" content="https://debate.pi-stack.org/hero-visual.jpg" />
<meta name="twitter:image:alt" content="DebateLab debate prep workspace preview" />
<link rel="stylesheet" href="/seo-pages.css" />
<script type="application/ld+json">{"@context":"https://schema.org","@graph":[{"@type":"Article","headline":"AI Debate Practice for Stronger Cases, Rebuttals, and Speeches","name":"AI Debate Practice Platform | DebateLab","url":"https://debate.pi-stack.org/ai-debate-practice","description":"Practice debate online with DebateLab: AI opponents, targeted drills, rebuttal feedback, evidence research, argument flowcharts, and tournament-ready prep tools.","inLanguage":"en","dateModified":"2026-10-21","datePublished":"2026-07-05","author":{"@type":"Organization","@id":"https://debate.pi-stack.org/#organization","name":"Pi-Stack","url":"https://debate.pi-stack.org/"},"publisher":{"@type":"Organization","@id":"https://debate.pi-stack.org/#organization","name":"Pi-Stack","url":"https://debate.pi-stack.org/"},"about":{"@id":"https://debate.pi-stack.org/#software"}},{"@type":"FAQPage","mainEntity":[{"@type":"Question","name":"Can practising debate against an AI actually make you better?","acceptedAnswer":{"@type":"Answer","text":"Yes, if it shortens the loop of giving a speech, finding what failed, fixing one thing and giving it again. A useful session needs a motion, a side, real speech times, an opponent that responds to what you said and a verdict that names why you won or lost. DebateLab's Sparring runs School 4-6-6-3, Lincoln-Douglas and Public Forum rounds this way. AI practice adds repetitions between team practices but does not replace them: judge adaptation, delivery under pressure and strategic judgement still develop fastest with a coach and real rounds."}},{"@type":"Question","name":"Which formats can I spar against the AI in?","acceptedAnswer":{"@type":"Answer","text":"Sparring runs School 4-6-6-3, Lincoln-Douglas and Public Forum rounds with their speech order and times. For WSDC, British Parliamentary and other formats you can still generate cases, get coaching and drill rebuttals, and time speeches yourself."}},{"@type":"Question","name":"Can I give my practice speeches out loud?","acceptedAnswer":{"@type":"Answer","text":"Yes. Sparring and Crossfire can run as spoken rounds in the browser, so you can practise delivery as well as content."}},{"@type":"Question","name":"How often should I practise against an AI opponent?","acceptedAnswer":{"@type":"Answer","text":"Two or three focused sessions a week usually beats one long one. Each session should end with one specific fix that you drill before the next round."}},{"@type":"Question","name":"Does AI practice replace a coach or real rounds?","acceptedAnswer":{"@type":"Answer","text":"No. It adds repetitions between team practices. Judge adaptation, delivery under pressure and strategic judgement still develop fastest with people."}},{"@type":"Question","name":"Are my practice rounds private?","acceptedAnswer":{"@type":"Answer","text":"Yes. Rounds, verdicts and debriefs are saved to your account inside the Current Debate they belong to, behind sign-in. Search engines only see these public guides."}}]},{"@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"DebateLab by Pi-Stack","item":"https://debate.pi-stack.org/"},{"@type":"ListItem","position":2,"name":"AI Debate Practice for Stronger Cases, Rebuttals, and Speeches","item":"https://debate.pi-stack.org/ai-debate-practice"}]}]}</script>
</head>
Expand Down
Loading
Loading