Skip to content

SEO: distinct titles, real 404s, pre-rendered pages, dating positioning - #10

Merged
pushpsood merged 2 commits into
mainfrom
seo/distinct-titles-404-prerender
Oct 25, 2026
Merged

pushpsood merged 2 commits into
mainfrom
seo/distinct-titles-404-prerender

Conversation

@pushpsood

Copy link
Copy Markdown
Owner

Summary

  • Distinct title/description/canonical per route; /login and /redeem indexable and in the sitemap; /app, /onboarding, /auth/setup noindex. Fixes Google listing /login and /redeem with the homepage title.
  • Unknown URLs return HTTP 404 with a noindex not-found page (CloudFront error responses) instead of a 200 homepage.
  • Page bodies pre-rendered at build time (src/prerender-entry.tsx) so non-JS crawlers see content; the app still mounts with createRoot.
  • Homepage positioned as a dating app; length/uniqueness limits enforced by src/tests/seo-routes.test.ts.
  • 1200x630 share images; structured data reflects what exists; Smart App Banner once an iOS listing exists; sitemap generated from seo-routes.ts.
  • Store links have one source (src/config/app-store-links.ts), are null until published (no store 404s), and app.onehook.club falls back to /login. Desktop "Get the app" goes to /#get-app.
  • Viewport allows pinch-zoom.

Tested

  • npm run lint, infra tsc -p tsconfig.infra.json, npm test (509 passing), npm run build, cdk synth --context env=prod (404 error responses, smart-link redirect behaviour).
  • Headless Chrome: JS-off pages render full content; JS-on pages have correct titles and no duplicated content.

After deploy

Resubmit sitemap.xml in Search Console and request indexing for /, /login, /redeem.

- Store listings live only in src/config/app-store-links.ts, imported by both
  the web app and the CDK stack (the old duplicate in infra was unnecessary).
- Listings are null until published: badges and in-app notices show
  'coming soon' instead of the current 404 store URLs.
- 'Get the app' goes to the store smart link only on a phone whose listing is
  live; otherwise to /#get-app (GetAppLink).
…itioning

- Every route gets its own pre-built HTML with its own title, description,
  canonical and robots; /login and /redeem are indexable and in the sitemap,
  /app, /onboarding, /auth/setup are noindex.
- Unknown URLs return HTTP 404 with a noindex not-found page instead of a 200
  homepage (soft 404). app.onehook.club falls back to /login, adds Vary.
- Page bodies are rendered at build time so non-JS crawlers see content.
- Homepage title says 'dating app'; titles <= 60 and descriptions <= 160 chars,
  enforced by src/tests/seo-routes.test.ts.
- 1200x630 share images; structured data limited to what exists (Web, INR,
  no FAQPage); Smart App Banner once an iOS listing exists.
- Sitemap generated from seo-routes (no fake lastmod); drop vite-plugin-sitemap.
- Viewport allows pinch-zoom; 16px form text on phones.
@pushpsood
pushpsood merged commit 90b30bc into main Oct 25, 2026
1 check passed
@pushpsood
pushpsood deleted the seo/distinct-titles-404-prerender branch October 25, 2026 05:42
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.

1 participant