Skip to content

Commit 9f015d9

Browse files
authored
Merge pull request #300 from Programcode/t3/operator-identity
Name the person who runs DebateOwl on /about and /terms
2 parents 1549030 + d4a2d0a commit 9f015d9

11 files changed

Lines changed: 75 additions & 40 deletions

File tree

‎public/llms.txt‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ DebateOwl runs at https://debateowl.com/. It is a separate product from debatela
77
## Key facts (as of October 2026)
88

99
- Who it is for: students, competitive debaters and their coaches.
10+
- Who runs it: Ádám Gáborjáni, an independent student developer in Hungary. Pi-Stack (pi-stack.org) is the name he publishes his projects under, and Programcode is his GitHub username. Contact: hello@debateowl.com.
1011
- 8 prep modes: Case generator, Brainstorm, Factoids, Flowchart, Case attacker, Ask coach, Crossfire and Sparring. Plus 3 utilities: Library, Debate timer and History.
1112
- Case format: A DebateOwl case is written the way school debaters prepare: an opening, two to four arguments each with an explanation, evidence and why it matters, "If they say… we answer…" replies, a closing line and the sources it used.
1213
- Second speech (R2): no new arguments; about two minutes reinforcing our arguments, then about four minutes of "If they say X, we answer Y" replies.
@@ -21,7 +22,7 @@ DebateOwl runs at https://debateowl.com/. It is a separate product from debatela
2122

2223
- [Home](https://debateowl.com/): what DebateOwl is, the 8 prep modes, pricing and FAQ
2324
- [Pricing](https://debateowl.com/debateowl-pricing): trial, Pro and what each includes
24-
- [About](https://debateowl.com/about): what DebateOwl is, who makes it and its former name
25+
- [About](https://debateowl.com/about): what DebateOwl is, who runs it and its former name
2526
- [Contact](https://debateowl.com/contact): email hello@debateowl.com for support and feedback, privacy@debateowl.com for privacy and data requests
2627
- [Press kit and facts](https://debateowl.com/press): a one-sentence definition, former name, maker, languages, pricing, logo downloads and what DebateOwl is not
2728
- [Full text](https://debateowl.com/llms-full.txt): this file plus the plain text of the home page, About, Which AI is best for debate? and the press kit

‎scripts/check-site.mjs‎

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
// references do not resolve or whose WebSite and SoftwareApplication are not
99
// named for the product, or a page whose publisher or about names an @id the
1010
// home page does not define, or a home-page Organization not named for the
11-
// product or without its logo and parent;
11+
// product or without its logo and founder;
1212
// - an indexed page without the favicon and 192px icon links, or whose meta
1313
// author is not the organization;
1414
// - two indexed pages with the same <title>, which then compete for one query;
@@ -174,14 +174,16 @@ function checkStructuredData(where, data, body) {
174174
const sameAs = organization.sameAs;
175175
// sameAs is optional (site.json lists only profiles that spell the name "DebateOwl"), but when present it is a non-empty list of https URLs.
176176
if (sameAs !== undefined && (!Array.isArray(sameAs) || !sameAs.length || sameAs.some((url) => !url.startsWith('https://')))) report(where, 'Organization.sameAs is not a list of https URLs');
177-
// One name for one entity: the Organization on this domain is the product, and the company
178-
// that builds it is its parent, never a sameAs.
177+
// One name for one entity: the Organization on this domain is the product, and the person
178+
// who runs it is its founder, never a sameAs.
179179
if (organization.name !== SITE.product) report(where, `Organization.name is "${organization.name}", not the product name "${SITE.product}"`);
180180
const logo = organization.logo ?? {};
181181
if (logo['@type'] !== 'ImageObject' || !logo.url?.startsWith(`${SITE_ORIGIN}/`) || !logo.width || !logo.height) report(where, 'Organization.logo is not an ImageObject on this site with a width and height');
182-
const parent = organization.parentOrganization ?? {};
183-
if (!parent.name || !parent.url) report(where, 'Organization.parentOrganization has no name and url');
184-
else if (sameAs?.includes(parent.url)) report(where, `Organization.sameAs lists the parent ${parent.url}`);
182+
const founder = organization.founder ?? {};
183+
if (founder['@type'] !== 'Person' || !founder.name || !founder.url) report(where, 'Organization.founder is not a Person with a name and url');
184+
else if (sameAs?.includes(founder.url)) report(where, `Organization.sameAs lists the founder ${founder.url}`);
185+
// Pi-Stack is the name the founder publishes under, not a company: no parent organization or legal name.
186+
if (organization.parentOrganization || organization.legalName) report(where, 'Organization has a parentOrganization or legalName');
185187
const alternates = byType('WebSite').alternateName ?? [];
186188
if (!alternates.some((name) => name !== SITE.product)) report(where, 'WebSite.alternateName only repeats the name');
187189
}

‎scripts/generate_seo_content.py‎

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
BRAND = SITE["brand"]
2323
PRODUCT = SITE["product"]
2424
ORGANIZATION = SITE["organization"]
25+
OPERATOR = ORGANIZATION["operator"]
2526
FORMERLY = SITE["formerly"]
2627
PRICING = SITE["pricing"]
2728
# Prices and plan facts are stated "as of" this month; move it when they are rechecked.
@@ -872,6 +873,7 @@ def llms_txt():
872873
## Key facts (as of {FACTS_AS_OF})
873874
874875
- Who it is for: students, competitive debaters and their coaches.
876+
- Who runs it: {OPERATOR["name"]}, an independent student developer in {OPERATOR["country"]}. Pi-Stack ({OPERATOR["publishesAs"]["url"].removeprefix("https://").rstrip("/")}) is the name he publishes his projects under, and {OPERATOR["github"].rsplit("/", 1)[1]} is his GitHub username. Contact: {SITE["contactEmail"]}.
875877
- {len(PREP_MODES)} prep modes: {names(PREP_MODES)}. Plus {len(UTILITIES)} utilities: {names(UTILITIES)}.
876878
- Case format: {CASE_FORMAT}
877879
- {SITE["secondSpeech"]}
@@ -886,7 +888,7 @@ def llms_txt():
886888
887889
- [Home]({BASE}/): what {PRODUCT} is, the {len(PREP_MODES)} prep modes, pricing and FAQ
888890
- [Pricing]({page_url("debateowl-pricing")}): trial, Pro and what each includes
889-
- [About]({BASE}/about): what {PRODUCT} is, who makes it and its former name
891+
- [About]({BASE}/about): what {PRODUCT} is, who runs it and its former name
890892
- [Contact]({BASE}/contact): email {SITE["contactEmail"]} for support and feedback, {SITE["privacyEmail"]} for privacy and data requests
891893
- [Press kit and facts]({BASE}/press): a one-sentence definition, former name, maker, languages, pricing, logo downloads and what {PRODUCT} is not
892894
- [Full text]({BASE}/llms-full.txt): this file plus the plain text of the home page, About, Which AI is best for debate? and the press kit

‎src/config/site.json‎

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,14 @@
2020
"description": "DebateOwl (formerly DebateLab at debate.pi-stack.org) is an AI debate prep and practice app for students and competitive debaters.",
2121
"disambiguatingDescription": "DebateOwl is an AI debate prep and practice app for students, not a sports or computer-vision product.",
2222
"sameAs": ["https://github.com/Programcode/DebateOwl"],
23-
"parent": {
24-
"name": "Pi-Stack",
25-
"url": "https://pi-stack.org/"
23+
"operator": {
24+
"name": "Ádám Gáborjáni",
25+
"country": "Hungary",
26+
"github": "https://github.com/Programcode",
27+
"publishesAs": {
28+
"name": "Pi-Stack",
29+
"url": "https://pi-stack.org/"
30+
}
2631
}
2732
},
2833
"factsCheckedOn": "2026-10-20",

‎src/lib/seo/pages.ts‎

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,15 @@ export const ORGANIZATION_ID = `${SITE_ORIGIN}/#organization`;
1111

1212
/**
1313
* The Organization behind the site, named for the product so search engines
14-
* see one name for one entity. Pi-Stack, which builds it, is its parent, not a
15-
* sameAs: a sameAs profile is the same entity elsewhere. site.json lists only
16-
* profiles that spell the name "DebateOwl" and that DebateOwl itself runs; with
17-
* none, the node has no sameAs. /press, the fact sheet, is its subjectOf.
14+
* see one name for one entity. Its founder is the person who runs it; Pi-Stack
15+
* is only the name he publishes under, not a company, so it appears as his URL
16+
* and never as a parent organization or legal name. A sameAs profile is the same
17+
* entity elsewhere: site.json lists only profiles that spell the name "DebateOwl"
18+
* and that DebateOwl itself runs; with none, the node has no sameAs. /press, the
19+
* fact sheet, is its subjectOf.
1820
*/
1921
export function organizationNode() {
20-
const { name, logo, description, disambiguatingDescription, sameAs, parent } = site.organization;
22+
const { name, logo, description, disambiguatingDescription, sameAs, operator } = site.organization;
2123
return {
2224
'@type': 'Organization',
2325
'@id': ORGANIZATION_ID,
@@ -29,7 +31,7 @@ export function organizationNode() {
2931
disambiguatingDescription,
3032
email: site.contactEmail,
3133
contactPoint: { '@type': 'ContactPoint', contactType: 'customer support', email: site.contactEmail, availableLanguage: ['en', 'hu', 'es'] },
32-
parentOrganization: { '@type': 'Organization', '@id': `${parent.url}#organization`, name: parent.name, url: parent.url },
34+
founder: { '@type': 'Person', name: operator.name, url: operator.publishesAs.url, sameAs: [operator.github] },
3335
...(sameAs.length ? { sameAs } : {}),
3436
subjectOf: { '@type': 'WebPage', '@id': `${SITE_ORIGIN}/press#webpage`, url: `${SITE_ORIGIN}/press`, name: PAGE_HEADS['/press'].title },
3537
};

‎src/locales/en.json‎

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -883,7 +883,7 @@
883883
"about": "About",
884884
"contact": "Contact",
885885
"press": "Press kit",
886-
"copyright": "© 2026 Pi-Stack. All rights reserved.",
886+
"copyright": "© 2026 Ádám Gáborjáni. All rights reserved.",
887887
"formerly": "{{product}}, formerly DebateLab.",
888888
"navLabel": "Footer",
889889
"pricingGuide": "Pricing details",
@@ -1895,8 +1895,8 @@
18951895
"question": "What is {{product}}?",
18961896
"answer": "<home>{{product}}</home> is an AI debate prep and practice app for students and competitive debaters. It helps you write a case, find the weak points in an argument, research evidence with citations and practice timed rounds against an AI opponent.",
18971897
"notThis": "{{product}} is a debate app for students, not a sports or computer-vision product. The <press>press kit</press> has the short facts and the logo.",
1898-
"makerHeading": "Who makes it",
1899-
"maker": "{{product}} is built by a student developer and made by <pistack>Pi-Stack</pistack>.",
1898+
"makerHeading": "Who runs {{product}}",
1899+
"maker": "{{product}} is run by Ádám Gáborjáni, an independent student developer in Hungary. Pi-Stack (<pistack>pi-stack.org</pistack>) is the name he publishes his projects under, and <github>Programcode</github> is his GitHub username. Contact: <email>{{email}}</email>.",
19001900
"nameHeading": "The name",
19011901
"name": "{{product}} was called DebateLab, at debate.pi-stack.org, until {{date}}.",
19021902
"pricingHeading": "Pricing",
@@ -1916,7 +1916,7 @@
19161916
"formerlyLabel": "Former name",
19171917
"formerly": "{{name}}, at {{host}}, renamed on {{date}}",
19181918
"makerLabel": "Maker",
1919-
"maker": "Adam (<github>Programcode</github> on GitHub), a student developer in Hungary, published by <pistack>Pi-Stack</pistack>",
1919+
"maker": "Ádám Gáborjáni (<github>Programcode</github> on GitHub), an independent student developer in Hungary, who publishes his projects as Pi-Stack (<pistack>pi-stack.org</pistack>)",
19201920
"launchedLabel": "Launched",
19211921
"launched": "2026, under the name {{name}}",
19221922
"languagesLabel": "Languages",
@@ -1944,7 +1944,9 @@
19441944
"termsPage": {
19451945
"title": "Terms of Service",
19461946
"lastUpdated": "Last updated",
1947-
"date": "October 28, 2026",
1947+
"date": "November 2, 2026",
1948+
"operatorLabel": "Operator",
1949+
"operator": "{{product}} is operated by Ádám Gáborjáni, Hungary, publishing as Pi-Stack (<pistack>pi-stack.org</pistack>). Contact: <contact>{{contactEmail}}</contact>.",
19481950
"s1": "Acceptance of Terms",
19491951
"p1": "By using DebateOwl, you agree to these terms. If you do not agree, do not use the service.",
19501952
"s2": "Service Description",
@@ -2733,7 +2735,7 @@
27332735
},
27342736
"about": {
27352737
"title": "About {{product}} | {{brand}}",
2736-
"description": "{{product}} is an AI debate prep and practice app for students and competitive debaters, built by a student developer and made by Pi-Stack."
2738+
"description": "{{product}} is an AI debate prep and practice app for students and competitive debaters, run by Ádám Gáborjáni, an independent student developer in Hungary."
27372739
},
27382740
"contact": {
27392741
"title": "Contact | {{brand}}",

‎src/locales/es.json‎

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -883,7 +883,7 @@
883883
"about": "Acerca de",
884884
"contact": "Contacto",
885885
"press": "Kit de prensa",
886-
"copyright": "© 2026 Pi-Stack. Todos los derechos reservados.",
886+
"copyright": "© 2026 Ádám Gáborjáni. Todos los derechos reservados.",
887887
"formerly": "{{product}}, antes DebateLab.",
888888
"navLabel": "Pie de página",
889889
"pricingGuide": "Detalles de precios",
@@ -1895,8 +1895,8 @@
18951895
"question": "¿Qué es {{product}}?",
18961896
"answer": "<home>{{product}}</home> es una app de preparación y práctica de debate con IA para estudiantes y debatientes de competición. Te ayuda a escribir un caso, encontrar los puntos débiles de un argumento, buscar evidencia con citas y practicar rondas cronometradas contra un oponente de IA.",
18971897
"notThis": "{{product}} es una app de debate para estudiantes, no un producto de deportes ni de visión por computadora. El <press>kit de prensa</press> reúne los datos básicos y el logotipo.",
1898-
"makerHeading": "Quién lo hace",
1899-
"maker": "{{product}} lo desarrolla una persona estudiante y lo publica <pistack>Pi-Stack</pistack>.",
1898+
"makerHeading": "Quién gestiona {{product}}",
1899+
"maker": "{{product}} lo gestiona Ádám Gáborjáni, un estudiante y desarrollador independiente de Hungría. Pi-Stack (<pistack>pi-stack.org</pistack>) es el nombre con el que publica sus proyectos, y <github>Programcode</github> es su nombre de usuario en GitHub. Contacto: <email>{{email}}</email>.",
19001900
"nameHeading": "El nombre",
19011901
"name": "{{product}} se llamaba DebateLab, en debate.pi-stack.org, hasta el {{date}}.",
19021902
"pricingHeading": "Precios",
@@ -1916,7 +1916,7 @@
19161916
"formerlyLabel": "Nombre anterior",
19171917
"formerly": "{{name}}, en {{host}}, renombrado el {{date}}",
19181918
"makerLabel": "Creador",
1919-
"maker": "Adam (<github>Programcode</github> en GitHub), estudiante y desarrollador en Hungría; lo publica <pistack>Pi-Stack</pistack>",
1919+
"maker": "Ádám Gáborjáni (<github>Programcode</github> en GitHub), estudiante y desarrollador independiente en Hungría, que publica sus proyectos como Pi-Stack (<pistack>pi-stack.org</pistack>)",
19201920
"launchedLabel": "Lanzamiento",
19211921
"launched": "2026, con el nombre {{name}}",
19221922
"languagesLabel": "Idiomas",
@@ -1944,7 +1944,9 @@
19441944
"termsPage": {
19451945
"title": "Términos de servicio",
19461946
"lastUpdated": "Última actualización",
1947-
"date": "28 de octubre de 2026",
1947+
"date": "2 de noviembre de 2026",
1948+
"operatorLabel": "Responsable",
1949+
"operator": "{{product}} lo gestiona Ádám Gáborjáni, en Hungría, que publica como Pi-Stack (<pistack>pi-stack.org</pistack>). Contacto: <contact>{{contactEmail}}</contact>.",
19481950
"s1": "Aceptación de términos",
19491951
"p1": "Al usar DebateOwl, aceptas estos términos. Si no estás de acuerdo, no uses el servicio.",
19501952
"s2": "Descripción del servicio",
@@ -2733,7 +2735,7 @@
27332735
},
27342736
"about": {
27352737
"title": "Acerca de {{product}} | {{brand}}",
2736-
"description": "{{product}} es una app de preparación y práctica de debate con IA para estudiantes, desarrollada por una persona estudiante y publicada por Pi-Stack."
2738+
"description": "{{product}} es una app de preparación y práctica de debate con IA para estudiantes, gestionada por Ádám Gáborjáni, un estudiante y desarrollador independiente de Hungría."
27372739
},
27382740
"contact": {
27392741
"title": "Contacto | {{brand}}",

‎src/locales/hu.json‎

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -883,7 +883,7 @@
883883
"about": "Rólunk",
884884
"contact": "Kapcsolat",
885885
"press": "Sajtóanyag",
886-
"copyright": "© 2026 Pi-Stack. Minden jog fenntartva.",
886+
"copyright": "© 2026 Gáborjáni Ádám. Minden jog fenntartva.",
887887
"formerly": "{{product}}, korábban DebateLab.",
888888
"navLabel": "Lábléc",
889889
"pricingGuide": "Árak részletei",
@@ -1895,8 +1895,8 @@
18951895
"question": "Mi az a {{product}}?",
18961896
"answer": "A <home>{{product}}</home> MI-alapú vitafelkészítő és gyakorló alkalmazás diákoknak és versenyzőknek. Segít megírni az esetet, megtalálni egy érvelés gyenge pontjait, hivatkozásokkal ellátott bizonyítékot keresni, és időre gyakorolni egy MI-ellenféllel.",
18971897
"notThis": "A {{product}} vitaalkalmazás diákoknak, nem sport- vagy gépilátás-termék. A <press>sajtóanyagban</press> megtalálod a rövid adatokat és a logót.",
1898-
"makerHeading": "Ki készíti",
1899-
"maker": "A {{product}} alkalmazást egy diák fejlesztő építi, és a <pistack>Pi-Stack</pistack> adja ki.",
1898+
"makerHeading": "Ki üzemelteti a {{product}}-t",
1899+
"maker": "A {{product}}-t Gáborjáni Ádám, egy magyarországi független diákfejlesztő üzemelteti. A Pi-Stack (<pistack>pi-stack.org</pistack>) az a név, amelyen a projektjeit közzéteszi, a <github>Programcode</github> pedig a GitHub-felhasználóneve. Kapcsolat: <email>{{email}}</email>.",
19001900
"nameHeading": "A név",
19011901
"name": "A {{product}} neve {{date}}-ig DebateLab volt, a debate.pi-stack.org címen.",
19021902
"pricingHeading": "Árak",
@@ -1916,7 +1916,7 @@
19161916
"formerlyLabel": "Korábbi név",
19171917
"formerly": "{{name}}, a {{host}} címen; átnevezve: {{date}}",
19181918
"makerLabel": "Készítő",
1919-
"maker": "Ádám (a GitHubon <github>Programcode</github>), magyarországi diák fejlesztő; kiadó: <pistack>Pi-Stack</pistack>",
1919+
"maker": "Gáborjáni Ádám (a GitHubon <github>Programcode</github>), magyarországi független diákfejlesztő, aki Pi-Stack néven teszi közzé a projektjeit (<pistack>pi-stack.org</pistack>)",
19201920
"launchedLabel": "Indulás",
19211921
"launched": "2026, {{name}} néven",
19221922
"languagesLabel": "Nyelvek",
@@ -1944,7 +1944,9 @@
19441944
"termsPage": {
19451945
"title": "Felhasználási feltételek",
19461946
"lastUpdated": "Utolsó frissítés",
1947-
"date": "2026. október 28.",
1947+
"date": "2026. november 2.",
1948+
"operatorLabel": "Üzemeltető",
1949+
"operator": "A {{product}}-t Gáborjáni Ádám, egy magyarországi független diákfejlesztő üzemelteti, aki Pi-Stack néven teszi közzé a projektjeit (<pistack>pi-stack.org</pistack>). Kapcsolat: <contact>{{contactEmail}}</contact>.",
19481950
"s1": "Feltételek elfogadása",
19491951
"p1": "A DebateOwl használatával elfogadod ezeket a feltételeket. Ha nem értesz egyet, ne használd a szolgáltatást.",
19501952
"s2": "Szolgáltatás leírása",
@@ -2733,7 +2735,7 @@
27332735
},
27342736
"about": {
27352737
"title": "A {{product}} bemutatása | {{brand}}",
2736-
"description": "A {{product}} MI-alapú vitafelkészítő és gyakorló alkalmazás diákoknak és versenyzőknek, amelyet egy diák fejlesztő épít, és a Pi-Stack ad ki."
2738+
"description": "A {{product}} MI-alapú vitafelkészítő és gyakorló alkalmazás diákoknak és versenyzőknek, amelyet Gáborjáni Ádám, egy magyarországi független diákfejlesztő üzemeltet."
27372739
},
27382740
"contact": {
27392741
"title": "Kapcsolat | {{brand}}",

‎src/pages/AboutPage.tsx‎

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ export default function AboutPage() {
1212
const { t, i18n } = useTranslation();
1313
usePageHead('/about');
1414
const product = site.product;
15+
const { operator } = site.organization;
1516
const renamedOn = new Intl.DateTimeFormat(i18n.language, { day: 'numeric', month: 'long', year: 'numeric', timeZone: 'UTC' })
1617
.format(new Date(`${site.formerly.until}T00:00:00Z`));
1718

@@ -30,9 +31,17 @@ export default function AboutPage() {
3031
</p>
3132
</section>
3233
<section>
33-
<h2 className="text-lg font-semibold">{t('aboutPage.makerHeading')}</h2>
34+
<h2 className="text-lg font-semibold">{t('aboutPage.makerHeading', { product })}</h2>
3435
<p>
35-
<Trans i18nKey="aboutPage.maker" values={{ product }} components={{ pistack: <a href={site.organization.parent.url} className={linkClass} /> }} />
36+
<Trans
37+
i18nKey="aboutPage.maker"
38+
values={{ product, email: site.contactEmail }}
39+
components={{
40+
pistack: <a href={operator.publishesAs.url} className={linkClass} />,
41+
github: <a href={operator.github} className={linkClass} />,
42+
email: <a href={`mailto:${site.contactEmail}`} className={linkClass} />,
43+
}}
44+
/>
3645
</p>
3746
</section>
3847
<section>

0 commit comments

Comments
 (0)