Skip to content

Clean up how DebateOwl shows in search results - #251

Merged
Programcode merged 1 commit into
mainfrom
seo/search-result-cleanup
Oct 27, 2026
Merged

Programcode merged 1 commit into
mainfrom
seo/search-result-cleanup

Conversation

@Programcode

@Programcode Programcode commented Oct 27, 2026 •

Copy link
Copy Markdown
Owner

Makes DebateOwl look cleaner in Google results and AI answers: shorter titles in a consistent form, one-sentence descriptions, a favicon you can still read at 16px, brand links that go back to the home page, and the same trial button text everywhere.

www redirect: a Vercel setting, no code change

https://www.debateowl.com already redirects to the apex on every path and keeps the query string. I checked it live with curl:

https://www.debateowl.com/tools/debate-timer?x=1  ->  308  https://debateowl.com/tools/debate-timer?x=1
https://www.debateowl.com/                        ->  308  https://debateowl.com/
http://www.debateowl.com/                         ->  308  https://www.debateowl.com/  (Vercel's forced HTTPS, then the redirect above)

The redirect comes from the debate-navigator project's Domains list (www.debateowl.com → debateowl.com, status 308), not from vercel.json. A host rule in vercel.json would never run, because the domain redirect fires first. Google treats 308 the same as 301, and every page already names its apex canonical URL, so www should drop out of results as Google recrawls. That happens with time, not with a different status code.

If you want a literal 301 anyway, it's a dashboard change and I haven't made it: Vercel → debate-navigator → Settings → Domains → www.debateowl.com → Edit → keep "Redirect to debateowl.com" and set the status to 301 Moved Permanently. To nudge Google afterwards, request indexing for https://debateowl.com/ in Search Console. docs/operations.md now says where the redirect lives.

Titles and descriptions

  • Every indexable page has a title of the form "Page name | DebateOwl", under 60 characters, in en, hu and es. This covers the landing page, the tool pages, terms, privacy, sources and all 31 static guides and comparison pages. The home page is "DebateOwl: AI debate prep and practice", with hu "DebateOwl: MI-alapú vitafelkészülés és gyakorlás" and es "DebateOwl: preparación y práctica de debate con IA". "| DebateOwl Guide" and the doubled "DebateOwl Pricing and Plans | DebateOwl" are gone.
  • Every description is one sentence of 129–155 characters. The free tool descriptions lead with "Free" (hu "Ingyenes"). In Spanish, "gratis" goes where it reads naturally: "Gratis y sin cuenta: …" on the hub and "Cronómetro de debate gratis …" on the timer. The tools hub CTA no longer calls DebateOwl "a paid practice app" in any language.
  • og:title, og:description, twitter:title and twitter:description match the title and description on every page. The static guides had no twitter title or description before; they have them now. The app shell (index.html) gets the new home strings too.
  • The guides' heads now live only in PAGES in scripts/generate_seo_content.py. The 10 overrides in seo_guides.py are removed, and the pages are regenerated.
  • The JSON-LD name and description fields on WebPage, Article and WebApplication follow the head strings automatically. I didn't touch Organization, WebSite, msvalidate, canonical or hreflang.

Links back to the home page

  • The logo and brand name on every public page link to the home page in the page's own language (/, /hu, /es) and are labelled "DebateOwl home" ("DebateOwl főoldal", "Inicio de DebateOwl"). Before, the landing nav and footer on /hu and /es pointed at the English /.
  • Guides, comparisons, pricing and tool pages already had a visible breadcrumb and a BreadcrumbList starting with DebateOwl at https://debateowl.com/. Terms, privacy and sources had no breadcrumb, so they now get a BreadcrumbList (DebateOwl → page). I didn't add a visible breadcrumb there: their header is already a one-click link home.

Favicon

favicon.ico was already square with 16, 32 and 48px frames, and favicon.png was 48×48, so the size rules were met. At 16px, though, the owl was a blur: the pale tile, the glasses-style eye rings and the gradients turned to mush. Google also shows a downscaled 48px icon, which had the same problem. I drew a simplified version of the same owl for those three sizes: flat brand blue, the same ears and silhouette, bigger white eyes with dark pupils, the orange beak and the light belly, on a transparent background. The 72px and larger icons keep the full mark, which reads fine at those sizes. The source is src/assets/owl/owl-favicon.svg. Browsers cache the icons for 30 days, so returning visitors will see the new one gradually.

Favicon before and after

Trial buttons

The hero, nav (desktop and mobile) and final landing buttons say "Start free trial", with hu "Ingyenes próba indítása" and es "Comenzar prueba gratis", matching the pricing card. The final button used to say "Launch DebateOwl". e2e/loading-performance.spec.ts now clicks "Start free trial".

Verification

GitHub Actions is billing-blocked, so these are local results at the head commit:

  • npm run verify passes at ce9ce55c (exit 0): docs check, lint (eslint, knip, repo rules), typecheck, 690 unit tests, 30 collaboration tests, 483 Edge Function tests, build with check-site and check-links, service-worker test, and 47/47 desktop Chromium @smoke e2e tests.

  • Outside the smoke set, I ran e2e/loading-performance.spec.ts, e2e/localization.spec.ts and e2e/free-tools.spec.ts on desktop Chromium: 21 passed and 2 failed. The landing CTA test with the new "Start free trial" text passes. The 2 failures (loading-performance.spec.ts:63, a locator('header') strict-mode hit in the signed-in app; localization.spec.ts:102, which looks for a level-1 "404" heading the not-found page no longer has) fail the same way on main at 69cf666, so this PR didn't cause them.

  • npm run build: prerender, sitemap, check-site (55 HTML files, no problems) and check-links pass. I checked the built HTML for 16 main pages: each title and description is in sync across the four tags, each subpage has a BreadcrumbList, and each brand link carries the right label and locale.

  • Hero, nav, pricing and final buttons in the built /, /hu and /es show the new text.

  • Not checked: production, where nothing is deployed, and how Google actually renders the favicon. The render above is a mock-up of the result row.

🤖 Generated with Claude Code

Summary by CodeRabbit

  • New Features
    • Trial calls to action now say “Start free trial” in English, Spanish, and Hungarian.
    • Home links are localized and have clearer accessible labels.
    • Legal and sources pages include breadcrumb structured data.
  • Updates
    • Refreshed titles and descriptions across the site to better reflect page content, features, pricing, and debate formats.
    • Updated hosting and redirect information in the operations guide.

Titles follow "Page name | DebateOwl" on every indexable page in English,
Hungarian and Spanish, and the home page is "DebateOwl: AI debate prep and
practice". Each meta description is one sentence saying what the page does;
the free tool pages lead with "Free" and no longer call DebateOwl a paid
app. og: and twitter: tags carry the same strings, and the static guides
gain the twitter title and description they lacked. The guides' heads now
live only in PAGES in generate_seo_content.py.

The logo and name link to the home page in the page's own language and are
labelled "DebateOwl home". Terms, privacy and sources get a BreadcrumbList
like the guides and tool pages already have.

The favicon gets a simplified small-size owl (flat colours, bigger eyes, no
tile) for the 16, 32 and 48 px frames; its source is
src/assets/owl/owl-favicon.svg.

Every landing trial button says "Start free trial" (hu "Ingyenes próba
indítása", es "Comenzar prueba gratis"), matching the pricing card.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Copilot AI balanced review requested due to automatic review settings October 27, 2026 20:34

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot was unable to review this pull request because the user who requested the review has insufficient remaining quota.

@coderabbitai

coderabbitai Bot commented Oct 27, 2026 •

Copy link
Copy Markdown

Review in Change Stack →

Recent review info
Run configuration
Commits

Reviewing files that changed from the base of the PR and between 69cf666 and ce9ce55.

Files ignored due to path filters: 3
  • public/favicon.ico is excluded by !**/*.ico
  • public/favicon.png is excluded by !**/*.png
  • src/assets/owl/owl-favicon.svg is excluded by !**/*.svg
Files selected for processing: 48
  • docs/operations.md
  • e2e/loading-performance.spec.ts
  • index.html
  • public/ai-debate-case-generator/index.html
  • public/ai-debate-coach/index.html
  • public/ai-debate-practice/index.html
  • public/ai-rebuttal-generator/index.html
  • public/argument-flowchart/index.html
  • public/best-ai-debate-tools/index.html
  • public/british-parliamentary-debate/index.html
  • public/congress-debate/index.html
  • public/debate-clash-points/index.html
  • public/debate-evidence-finder/index.html
  • public/debate-fallacies/index.html
  • public/debate-judge-adaptation/index.html
  • public/debate-motion-analysis/index.html
  • public/debate-rebuttal-practice/index.html
  • public/debate-speech-structure/index.html
  • public/debate-topics-for-students/index.html
  • public/debateowl-pricing/index.html
  • public/debateowl-vs-chatgpt/index.html
  • public/debateowl-vs-debateclub/index.html
  • public/debateowl-vs-windebate/index.html
  • public/how-to-cross-examine-in-debate/index.html
  • public/how-to-flow-in-debate/index.html
  • public/how-to-practice-rebuttals/index.html
  • public/how-to-prepare-for-a-debate-tournament/index.html
  • public/how-to-weigh-in-debate/index.html
  • public/how-to-write-a-debate-case/index.html
  • public/lincoln-douglas-debate/index.html
  • public/llms.txt
  • public/online-debate-timer/index.html
  • public/policy-debate/index.html
  • public/public-forum-debate/index.html
  • public/world-schools-debate/index.html
  • scripts/generate_seo_content.py
  • scripts/seo_guides.py
  • src/components/free-tools/ToolPageLayout.tsx
  • src/components/landing/Footer.tsx
  • src/components/landing/Navbar.tsx
  • src/components/layout/PublicPageShell.tsx
  • src/locales/en.json
  • src/locales/es.json
  • src/locales/hu.json
  • src/pages/tools/ToolsHubPage.tsx
  • src/pages/tools/localized/copy-es.ts
  • src/pages/tools/localized/copy-hu.ts
  • src/prerender/entry.tsx
Files with no reviewable changes: 1
  • scripts/seo_guides.py

Included review availability: This review used your included allowance. Your plan provides up to 1 included review per hour; 0 remain after this review.

Walkthrough

This pull request revises localized calls to action, home-link behavior, and SEO metadata across the site. It adds structured data for legal and sources pages and documents the Vercel domain redirect.

Changes: Localized copy and SEO

Layer / File(s) Summary
Localized calls to action and home links
src/locales/*, src/components/landing/*, src/components/free-tools/ToolPageLayout.tsx, src/components/layout/PublicPageShell.tsx, src/pages/tools/*, e2e/loading-performance.spec.ts
Updates trial CTA text and DebateOwl home-link labels in localized content. The landing-page navbar and footer use the current language for the home route. Tools-page descriptions change to identify DebateOwl as an AI debate preparation and practice app. The CTA test selects “Start free trial.”
SEO metadata generation
scripts/generate_seo_content.py, scripts/seo_guides.py
Revises SEO copy in the generator and adds a trial-length substitution and Twitter title and description metadata. Removes title and description fields from ten guide entries.
Published page SEO metadata
index.html, public/*/index.html, public/llms.txt
Revises titles and descriptions across page, Open Graph, Twitter, and structured metadata. Updates accessible labels on multiple brand links and revises multilingual and English page descriptions.
Legal and sources structured data
src/prerender/entry.tsx
Adds breadcrumbs to terms and privacy structured data. Adds web-page structured data and breadcrumbs for the sources page.

Hosting reference

Layer / File(s) Summary
Vercel domain redirect reference
docs/operations.md
Documents that www.debateowl.com redirects to the apex domain through Vercel’s Domains setting while preserving the path and query.

Estimated code review effort: 3 (Moderate) | ~25 minutes

  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Note

🎁 Summarized by CodeRabbit Free

Your organization is on the Free plan. CodeRabbit will generate a high-level summary and a walkthrough for each pull request. For a comprehensive line-by-line review, please upgrade your subscription to CodeRabbit Essentials by visiting https://app.coderabbit.ai/settings/billing.

Comment @coderabbitai help to get the list of available commands.

@Programcode
Programcode merged commit 9868daa into main Oct 27, 2026
3 of 10 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants