Repository navigation
Lead with what Potluck Docs is, on the surfaces that get indexed - #24
Merged
Merged
Conversation
The product name carries no meaning on its own — nothing in "Potluck Docs" says docs, Astro, or template — so every surface that gets crawled has to state the category outright, or the name binds to nothing. Two did not. The root README is what GitHub renders on the repository page. It opened with "Potluck Docs — monorepo" and "The home of Potluck Docs, EkLine's recommended Astro + Starlight documentation template". The H1 spent its strongest slot on "monorepo", and the sentence hedged the category behind "The home of" and "recommended". It now opens with the plain statement of what the thing is, then says this repository holds it — which the next heading already explains in more detail anyway. The docs homepage `description` becomes the meta description and the og:description for potluck.ekline.io. It named "theming" and "an optional logged-in tier" — theming is table stakes any Starlight site has, and "logged-in tier" is not a phrase anyone searches. Both now carry the same sentence as the repository description: Potluck Docs is an open-source Astro + Starlight documentation template — interactive OpenAPI references, private docs behind your SSO, llms.txt built in. 154 characters, so search results show it whole rather than cutting it off. The three named features are the ones Starlight does not give you for free, which is the question a reader comparing templates is actually asking. The tagline follows the same vocabulary, keeping its call to action. packages/template/README.md is deliberately untouched. It ships verbatim into a customer's repository, where copy selling Potluck Docs to a search engine would be addressed to the wrong reader. Verified: 196 + 35 tests pass, check:shipped passes, npm run check clean, and a build confirms the sentence lands in both meta description and og:description. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01KAJXuNGSbvuzKo71RjFjw6
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
The built homepage emitted `<title>Potluck Docs | Potluck Docs</title>`.
Starlight composes every title as `${page title} ${delimiter} ${site title}`
with no special case for the two being equal — `utils/head.ts` line 36, in
0.40.0 — and this site's title is already "Potluck Docs", so the page spent
its strongest on-page signal repeating one opaque word.
The page is now named for the category instead:
<title>Astro + Starlight documentation template | Potluck Docs</title>
55 characters, so it is not truncated, and it is an exact match for the query
someone shopping for this actually types. Naming the stack is deliberate: a
new repository with no authority cannot rank for "documentation template",
but it can rank for "astro starlight documentation template", where the
searcher has already chosen the stack and is looking for exactly this.
Two things had to follow, because both read the page title:
`hero.title` is now set explicitly. `schemas/hero.ts` documents it as
defaulting to the top-level title, and `Hero.astro` destructures
`title = data.title` for the `<h1>`, so without this the visible heading
would have become the SEO string. It still reads "Potluck Docs" — the
rendered page is unchanged.
`og:title` is restored via a frontmatter `head` entry. It is the page title
with no site title appended (`head.ts` line 57), so the change above would
have taken the product name off every social card. Starlight's `mergeHead`
drops its own default when a page supplies a meta tag matching on `property`,
which is what makes the override clean rather than a duplicate tag.
Behavior confirmed by reading the installed Starlight 0.40.0 source, not from
memory: starlight.astro.build is blocked by this environment's egress proxy,
and the package is the version actually in use.
Verified from the build — title as above, `og:title` "Potluck Docs", meta
description unchanged, and the `<h1>` still "Potluck Docs". 196 + 35 tests,
check:shipped, and npm run check all pass.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KAJXuNGSbvuzKo71RjFjw6
puneet-ekline
marked this pull request as ready for review
September 21, 2026 05:48
This branch was successfully deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Copy and metadata alignment for search and answer engines. No behavior, dependency or runtime configuration change.
The problem
"Potluck Docs" carries no meaning on its own. Nothing in the string says docs, Astro, or template. Starlight is equally opaque as a name, but it has tens of thousands of stars doing that work; this repository was renamed today and has none. So every crawled surface has to state the category outright, or the name binds to nothing.
Three surfaces did not.
The root
README.mdis what GitHub renders on the repository page. It opened# Potluck Docs — monorepofollowed by "The home of Potluck Docs, EkLine's recommended Astro + Starlight documentation template". The H1 spent its strongest slot on "monorepo", and the sentence hedged the category behind "The home of" and "recommended". It now states what the thing is, then says this repository holds it — which the next heading, "Are you here to build a docs site?", already explains in more detail.The docs homepage
descriptionbecomes the meta description and og:description for potluck.ekline.io. It named "theming" and "an optional logged-in tier". Theming is table stakes any Starlight site has, and "logged-in tier" is not a phrase anyone searches.The homepage
<title>wasPotluck Docs | Potluck Docs.The sentence
154 characters, so a search result shows it whole rather than truncating around 155. Two things drove the shape:
npm create astro -- --template starlightfor nothing, so "it's a Starlight template" is not by itself a reason to pick this. Interactive OpenAPI references, server-enforced private and per-org docs, and llms.txt plus markdown twins are. Every claim is checked againstpackages/template/README.md.The same sentence is going on the GitHub repository description, so the repository page, the docs site's meta tags and its social card all agree. Answer engines cross-check surfaces; disagreement costs confidence.
The title fix
Starlight composes every title as
${page title} ${delimiter} ${site title}with no special case for the two being equal —utils/head.tsline 36 — and the site title is already "Potluck Docs". The page is now named for the category:55 characters, so nothing truncates, and it is an exact match for the query someone shopping for this actually types. Naming the stack is deliberate rather than modest: a new repository with no authority cannot rank for "documentation template", but it can rank for "astro starlight documentation template", where the searcher has already chosen the stack and is looking for precisely this.
Two things had to follow, because both read the page title:
hero.titleis now explicit.schemas/hero.tsdocuments it as defaulting to the top-level title, andHero.astrodestructurestitle = data.titlefor the<h1>. Without this the visible heading would have become the SEO string. It still reads "Potluck Docs" — the rendered page is unchanged.og:titleis restored via a frontmatterheadentry. It is the page title with no site title appended (head.tsline 57), so the change above would have taken the product name off every social card. Starlight'smergeHeaddrops its own default when a page supplies a meta tag matching onproperty, which is what makes this an override rather than a duplicate tag.Behavior was confirmed by reading the installed Starlight 0.40.0 source rather than from memory.
CLAUDE.mdrequires consulting the Starlight docs before any change here; starlight.astro.build is blocked by this environment's egress proxy, so I read the package actually in use, which is the stronger evidence for a version-specific question.What is deliberately untouched
packages/template/README.md. It ships verbatim into a customer's repository. Copy selling Potluck Docs to a search engine would be addressed to the wrong reader there, andCLAUDE.mdis explicit that shipped prose is written for the site's owner. Its opening already suits someone who has just extracted the template, with the full feature list immediately below.Verified
From the build:
packages/template196 tests,apps/docs35 tests, 0 failures.npm run checkclean on both projects (0 errors, 0 warnings, 0 hints).check:shippedpasses.🤖 Generated with Claude Code
https://claude.ai/code/session_01KAJXuNGSbvuzKo71RjFjw6