fix(site): give the landing page a title, and align the tagline everywhere - #67
Merged
Conversation
vishr
force-pushed
the
fix/landing-page-title
branch
from
August 17, 2026 17:06
9b450e8 to
95e73f2
Compare
…the repo
Starlight renders "<page title> <delimiter> <site title>". Every page reads
correctly under that rule — "Install · Onebox", "CLI commands · Onebox" — except
the landing page, whose own title is the site title, so it came out as
"Onebox · Onebox".
astro.config.mjs already carried a note about this, saying titleDelimiter exists
because the page otherwise "renders as Onebox | Onebox". That fixed the
separator and not the duplication: a delimiter cannot know both halves are the
same word. The note read as though the problem were solved, which is probably
why it survived; it now says what the setting actually does, which is serve
every other page.
The wording is the three beats the repository already uses on itself. The GitHub
description reads "plan-before-apply, zero-downtime deploys for one box"; as a
single title that is 61 characters and long enough to be cut short in search
results, so it is split into clauses rather than trimmed and every idea
survives.
index.html Onebox · Plan-before-apply deploys. Zero downtime. One box.
start/install.html Install · Onebox
reference/cli.html CLI commands · Onebox
404.html 404 · Onebox
og:title is set alongside it. Starlight defaults that to the bare page title, so
without it the link renders in Slack, X and LinkedIn as a card called "Onebox" —
identified by its own name and nothing else, which is the problem this change
exists to fix. Both tags are deduped by Starlight against its defaults rather
than appended, verified in the built output: one <title>, one og:title.
Frontmatter is the mechanism because it is the one that works. Emitting a
<title> from the Head component instead produces two title tags with Starlight's
own — the wrong one — first; that was measured, not assumed.
The `tagline` in astro.config.mjs is brought into step. It renders nowhere
today: Starlight uses it for a splash hero, and index.mdx supplies its own. It
is updated anyway, because the day a second splash page exists is not the day to
discover the tagline drifted.
No claim is made that 59 characters is safe from truncation. Search engines cut
on rendered width, not a character count, and this string capitalises three
words the original did not. It is shorter, which is the honest claim.
`just check` passes.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
vishr
force-pushed
the
fix/landing-page-title
branch
from
August 17, 2026 17:44
95e73f2 to
be34fe1
Compare
The lines that introduce the product described its constraint with three different nouns. The CLI's one-line summary said "one host", docs/product.md's title said "one box", and the README, the site description, the CLI's own long help and llms.txt all said "one server". Nothing was wrong; they just did not agree, and these are the lines a reader meets first. The two outliers now say server as well. This is deliberately not a sweep. Body prose across the documentation still says "host" in about five places — "one host has one owner", "two Onebox applications on one host", "side by side on one host" — and it is right there, because those sentences are about the machine rather than about the product's scope. Renaming them would trade one inconsistency for a worse one. "Box" survives where it is the product's name rather than a noun: Onebox, and the tagline's closing beat "One box." No generated page moved. The CLI reference publishes the long help, which already said server; only the short summary changed, and that is not published. `just docs-generate` confirms it. `just check` passes, as do the cmd and app test suites. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
vishr
force-pushed
the
fix/landing-page-title
branch
from
August 17, 2026 17:51
fed3995 to
913c4aa
Compare
vishr
added a commit
that referenced
this pull request
Aug 18, 2026
fix(site): give the landing page a title, and align the tagline everywhere
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.
The landing page titled itself
Onebox · Onebox. Fixing that turned into settling what the project's one-line description actually is, since the repository had six different phrasings of it.The title
The wording is the three beats the repository already used on itself — the GitHub description read
plan-before-apply, zero-downtime deploys for one box. As a single title that is 61 characters and long enough to be cut short in search results, so it is split into clauses rather than trimmed, and every idea survives.No claim is made that 59 characters is safe from truncation: search engines cut on rendered width, not character count, and this string capitalises three words the original did not. It is shorter, which is the honest claim.
Why the old comment did not catch it
astro.config.mjsalready had a note sayingtitleDelimiterexists because the page otherwise "renders asOnebox | Onebox". That fixed the separator and not the duplication — a delimiter cannot know both halves are the same word. The note read as though the problem were solved, which is probably why it survived. It now describes what the setting actually does: serve every other page.og:title
Set alongside the title. Starlight defaults it to the bare page title, so without it the link rendered in Slack, X and LinkedIn as a card called "Onebox" — identified by its own name and nothing else, which is the problem this change exists to fix.
Both tags are deduped by Starlight against its defaults rather than appended. Verified in the built output: one
<title>, oneog:title, and the override is page-scoped —/start/installstill gets Starlight's default.Frontmatter is the mechanism because it is the one that works. Emitting a
<title>from the Head component instead produces two title tags with Starlight's own — the wrong one — first. Measured, not assumed.Alignment elsewhere
astro.config.mjs→taglineonebox (ob) — plan-before-apply deploys. Zero downtime. One box.cmd/ob/main.go→Shortdocs/product.mdH1The
taglinerenders nowhere today — Starlight uses it for a splash hero andindex.mdxsupplies its own. Updated anyway, because the day a second splash page exists is not the day to discover it drifted.The noun change is deliberately not a sweep. Body prose still says "host" in about five places, and it is right there — those sentences are about the machine, not about the product's scope.
Review
/code-review highraised four findings on the first version. All four are fixed here: a stale duplicate comment I had left behind that contradicted the code above it, the missingog:title, the now-falsetitleDelimiternote, and the unsupportable truncation claim. The reviewer independently confirmed the mechanism — Starlight 0.41.7 dedupestag: 'title'atutils/head.ts:150.Codex was asked to judge the finalists and ranked this wording first, over its own earlier recommendation.
Verified
just check— All checks passedgo test ./cmd/... ./internal/app/— passjust docs-generate— no generated page moved<title>, oneog:title, page-scoped override, config tagline still absent from<body>🤖 Generated with Claude Code