seo: dynamic per-route title/meta description + noindex on app routes
Open
Nobody has claimed this yet.
- Dominant language
- TypeScript
- Stars
- 7
- Forks
- 1
- Avg merge
- 1h 41m
- Merged PRs (30d)
- 21
Description
Problem
index.html sets one static <title> and meta description shared by every route — /, /app, /app/blocks/world/:worldId/:lessonNumber, /app/thinking/world/:worldId/:lessonNumber, etc. Consequences:
- The browser tab title never changes when navigating within the app (every screen already renders its own
<h1>per.ai/agents/context.md's route table, but the document<title>doesn't follow it). - Gameplay routes inherit the landing page's marketing description in any social share preview or search result, which is inaccurate and, because lesson/world screens are highly repetitive in structure, a thin/duplicate-content risk if they were ever indexed.
Task
- Add lightweight per-route document head management — a small custom hook (e.g.
useDocumentHead(title, options)) that setsdocument.titleand updates/creates the<meta name="description">and<meta name="robots">tags on route change. No new dependency should be needed for this; if one is proposed anyway it must be called out in the plan per the "no new dependency without it appearing in the plan" hard constraint. /keeps the existing rich title/description andindex, follow.- All
/app/*routes get a route-appropriate title (e.g."{World name} — CodeKids","{Lesson name} — CodeKids") andnoindex, follow(keepfollowso link equity still flows, just don't index the gameplay screens themselves).
Files
index.html(baseline meta stays as the/default)src/App.tsx(wire the hook into each route)- new hook/util, e.g.
src/hooks/useDocumentHead.ts
Part of
#74
Contributor guide
No contributing guide indexed for this repository
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Read index.html and the route table in .ai/agents/context.md, then inspect src/App.tsx to see how the listed routes are rendered. Add the new hook or utility under src/hooks and wire it to the routes; done means / retains its existing metadata while every /app/* route has an appropriate title, description, and noindex, follow robots value.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- typescript
- Domain
- frontend, web-dev
- Issue type
- Feature
- Difficulty
- 3/5
- Estimated time
- 1-2 days
- Activity status
- Active
- Clarity
- Mostly clear
- Newbie friendliness
- 74/100