From 708e39ac47cce132c099c511db003505d1985418 Mon Sep 17 00:00:00 2001 From: Adam Date: Thu, 29 Oct 2026 16:56:05 +0000 Subject: [PATCH] Spell the brand "DebateOwl" everywhere Google reads it first - The homepage's first sentence now starts with the name: "DebateOwl helps you prepare cases and practice rounds with AI." (en, es, hu). The H1 and already used it. - Organization.sameAs drops the SaaSHub and Uneed listings: checked live on 29 Oct 2026, both still say "DebateLab" and never "DebateOwl". With no profile left, the node omits sameAs; check-site and the brand test now allow that but still reject a non-https or parent URL. - favicon.ico gains 64, 96, 128 and 256 px frames of the owl next to the existing 16, 32 and 48 px ones (20 KB, PNG-compressed), rasterized from src/assets/owl/owl-favicon.svg. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --- docs/operations.md | 2 +- public/favicon.ico | Bin 3345 -> 20126 bytes scripts/check-site.mjs | 3 ++- src/assets/owl/owl-favicon.svg | 2 +- src/config/site.json | 5 +---- src/lib/seo/pages.ts | 5 +++-- src/locales/en.json | 2 +- src/locales/es.json | 2 +- src/locales/hu.json | 2 +- src/test/seo/brand-entity.test.ts | 6 ++++-- 10 files changed, 15 insertions(+), 14 deletions(-) diff --git a/docs/operations.md b/docs/operations.md index 27cf810a..07da68cf 100644 --- a/docs/operations.md +++ b/docs/operations.md @@ -71,7 +71,7 @@ Every guide opens with the reader's main question as its first H2 and an answer To retire a guide, delete its `PAGES` entry, its `CLUSTERS` and `LINK_PHRASES` entries, and its `public/<slug>/` folder (the generator never deletes), add its redirects to `vercel.json`, and repoint any link to it. Two guides that answer the same search should become one page, not two thin ones. -The site origin, product name, brand line, organization name and the organization's `sameAs` profiles live in [`src/config/site.json`](../src/config/site.json). The app's head tags, the prerender and sitemap scripts, and the guide generator all read it, and guide copy names the product with a `{product}` token and the Pro price with `{pro_price}`. The number of prep modes comes from the tool lists in [`tool-links.tsx`](../src/components/features/tools/tool-links.tsx): the app's copy reads `PREP_MODE_COUNT` and `UTILITY_COUNT`, and guide copy uses `{mode_count}`, `{mode_names}` and `{utility_names}`. The trial length and Pro price come from `pricing` in the same file: i18next passes `{{trialDays}}`, `{{proMonthly}}`, `{{product}}`, `{{brand}}` and `{{host}}` to every catalog string, so the English, Spanish and Hungarian pages state the same facts. Do not hardcode those strings in new code or copy. App strings name the product with `{{product}}`, `{{brand}}` and `{{host}}`, which [`src/i18n.ts`](../src/i18n.ts) fills from `site.json` for every key. +The site origin, product name, brand line, organization name and the organization's `sameAs` profiles live in [`src/config/site.json`](../src/config/site.json). List a profile in `sameAs` only after checking that its live page spells the name "DebateOwl"; on 29 October 2026 the only two listings (SaaSHub and Uneed) still said "DebateLab", so the list is empty and the Organization node leaves `sameAs` out. The app's head tags, the prerender and sitemap scripts, and the guide generator all read it, and guide copy names the product with a `{product}` token and the Pro price with `{pro_price}`. The number of prep modes comes from the tool lists in [`tool-links.tsx`](../src/components/features/tools/tool-links.tsx): the app's copy reads `PREP_MODE_COUNT` and `UTILITY_COUNT`, and guide copy uses `{mode_count}`, `{mode_names}` and `{utility_names}`. The trial length and Pro price come from `pricing` in the same file: i18next passes `{{trialDays}}`, `{{proMonthly}}`, `{{product}}`, `{{brand}}` and `{{host}}` to every catalog string, so the English, Spanish and Hungarian pages state the same facts. Do not hardcode those strings in new code or copy. App strings name the product with `{{product}}`, `{{brand}}` and `{{host}}`, which [`src/i18n.ts`](../src/i18n.ts) fills from `site.json` for every key. After a production deploy, and only with Adam's approval, `npm run seo:indexnow` sends every URL in the sitemap to IndexNow in one request to `api.indexnow.org`, which shares it with Bing, Yandex, Seznam, Naver and the other engines that take part (not Google). It reads `dist/sitemap.xml` when a build is present and the live sitemap otherwise. `-- --only /tools /` sends just those pages, and `-- --dry-run` prints the request without sending it. The key file is `public/<key>.txt`. It is not wired into CI. diff --git a/public/favicon.ico b/public/favicon.ico index 9d6d5e204288a33f55e48caf03464ca813cb8dec..2e17b59ab82b1de6863cd621cbe45bb671f0f28b 100644 GIT binary patch delta 16986 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 B*YE%U delta 68 zcmbO?mvN$$83O|&12cnw0Ekv#@L*zK017cEC_wlZnHd=BfMNy)5dI-H1_pm1o*c+4 Jys`5H4*(H;2}l3{ diff --git a/scripts/check-site.mjs b/scripts/check-site.mjs index d62ab12b..2ec67406 100644 --- a/scripts/check-site.mjs +++ b/scripts/check-site.mjs @@ -171,7 +171,8 @@ function checkStructuredData(where, data, body) { if (!Array.isArray(byType('WebSite').alternateName)) report(where, 'WebSite.alternateName is not a list'); const organization = byType('Organization'); const sameAs = organization.sameAs; - if (!Array.isArray(sameAs) || !sameAs.length || sameAs.some((url) => !url.startsWith('https://'))) report(where, 'Organization.sameAs is not a list of https URLs'); + // 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. + 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'); // One name for one entity: the Organization on this domain is the product, and the company // that builds it is its parent, never a sameAs. if (organization.name !== SITE.product) report(where, `Organization.name is "${organization.name}", not the product name "${SITE.product}"`); diff --git a/src/assets/owl/owl-favicon.svg b/src/assets/owl/owl-favicon.svg index 4a5491d2..cfaf1f93 100644 --- a/src/assets/owl/owl-favicon.svg +++ b/src/assets/owl/owl-favicon.svg @@ -1,5 +1,5 @@ <svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 32 32"> - <!-- Source of public/favicon.ico (16, 32 and 48 px frames) and public/favicon.png (48 px). + <!-- Source of public/favicon.ico (16, 32, 48, 64, 96, 128 and 256 px frames) and public/favicon.png (48 px). The app mark (public/owl-mark.svg) goes muddy below 48 px, so this is the same owl with flat colours, bigger eyes and no tile. Rasterize it at each size; do not scale a PNG down. --> <path d="M4 32V12C4 9 4.6 6.6 5.6 4.6L5 0.6L10.4 4C12.2 3.2 14 3 16 3S19.8 3.2 21.6 4L27 0.6L26.4 4.6C27.4 6.6 28 9 28 12V32Z" fill="#0A6FF0"/> diff --git a/src/config/site.json b/src/config/site.json index 3225ce02..7d1967f7 100644 --- a/src/config/site.json +++ b/src/config/site.json @@ -18,10 +18,7 @@ "height": 512 }, "description": "DebateOwl (formerly DebateLab at debate.pi-stack.org) is an AI debate prep and practice app for students and competitive debaters.", - "sameAs": [ - "https://www.saashub.com/debatelab", - "https://www.uneed.best/tool/debatelab" - ], + "sameAs": [], "parent": { "name": "Pi-Stack", "url": "https://pi-stack.org/" diff --git a/src/lib/seo/pages.ts b/src/lib/seo/pages.ts index a88b87bd..2b1faeb8 100644 --- a/src/lib/seo/pages.ts +++ b/src/lib/seo/pages.ts @@ -12,7 +12,8 @@ export const ORGANIZATION_ID = `${SITE_ORIGIN}/#organization`; /** * The Organization behind the site, named for the product so search engines * see one name for one entity. Pi-Stack, which builds it, is its parent, not a - * sameAs: a sameAs profile is the same entity elsewhere. + * sameAs: a sameAs profile is the same entity elsewhere. site.json lists only + * profiles that spell the name "DebateOwl"; with none, the node has no sameAs. */ export function organizationNode() { const { name, logo, description, sameAs, parent } = site.organization; @@ -27,7 +28,7 @@ export function organizationNode() { email: site.contactEmail, contactPoint: { '@type': 'ContactPoint', contactType: 'customer support', email: site.contactEmail, availableLanguage: ['en', 'hu', 'es'] }, parentOrganization: { '@type': 'Organization', '@id': `${parent.url}#organization`, name: parent.name, url: parent.url }, - sameAs, + ...(sameAs.length ? { sameAs } : {}), }; } export const PRICING = site.pricing; diff --git a/src/locales/en.json b/src/locales/en.json index 3d6ad63a..d440def6 100644 --- a/src/locales/en.json +++ b/src/locales/en.json @@ -896,7 +896,7 @@ }, "hero": { "headline": "{{product}}: AI debate prep and practice", - "subheadline": "Prepare cases and practice rounds with AI.", + "subheadline": "{{product}} helps you prepare cases and practice rounds with AI.", "trialBadge": "{{trialDays}}-day free trial", "cta": "Start free trial", "trustBullet1": "No credit card required", diff --git a/src/locales/es.json b/src/locales/es.json index 98bc9b1f..ec4f891e 100644 --- a/src/locales/es.json +++ b/src/locales/es.json @@ -896,7 +896,7 @@ }, "hero": { "headline": "{{product}}: preparación y práctica de debate con IA", - "subheadline": "Prepara casos y practica rondas con IA.", + "subheadline": "{{product}} te ayuda a preparar casos y practicar rondas con IA.", "trialBadge": "Prueba gratis de {{trialDays}} días", "cta": "Comenzar prueba gratis", "trustBullet1": "Sin tarjeta de crédito", diff --git a/src/locales/hu.json b/src/locales/hu.json index 28e64c4d..7b8811d0 100644 --- a/src/locales/hu.json +++ b/src/locales/hu.json @@ -896,7 +896,7 @@ }, "hero": { "headline": "{{product}}: MI-alapú vitafelkészítés és gyakorlás", - "subheadline": "Készíts eseteket és gyakorolj fordulókat MI-vel.", + "subheadline": "A {{product}} segít eseteket készíteni és fordulókat gyakorolni MI-vel.", "trialBadge": "{{trialDays}} napos ingyenes próba", "cta": "Ingyenes próba indítása", "trustBullet1": "Bankkártya nem szükséges", diff --git a/src/test/seo/brand-entity.test.ts b/src/test/seo/brand-entity.test.ts index 7fb4b483..d0dc62b0 100644 --- a/src/test/seo/brand-entity.test.ts +++ b/src/test/seo/brand-entity.test.ts @@ -32,8 +32,10 @@ describe("brand entity", () => { logo: { "@type": "ImageObject", url: `${site.origin}/icon-512.png`, width: 512, height: 512 }, parentOrganization: { "@type": "Organization", name: "Pi-Stack", url: "https://pi-stack.org/" }, }); - expect(node.sameAs.length).toBeGreaterThan(0); - expect(node.sameAs).not.toContain("https://pi-stack.org/"); + // Only profiles that spell the name "DebateOwl" belong here, so the list may be empty; then the key is left out. + const sameAs: string[] = site.organization.sameAs; + expect(node).toEqual(sameAs.length ? expect.objectContaining({ sameAs }) : expect.not.objectContaining({ sameAs: expect.anything() })); + expect(sameAs).not.toContain("https://pi-stack.org/"); }); it("finds the guides", () => {