Part of #4.
The engine name is spread across five places in one file: two head consts, the steps array, the install array, the faqs array, and three sections of markup. Most of those strings only name Claude and can be reworded in place. Three state facts that are true of Claude and of no other engine: the claude setup-token flow and the Keychain, the plan that absorbs the cost, and the per-repository instruction file. Those cannot be made engine-neutral by wording, so they have to state both engines. The list below is the verified set with anchors, so the engine work does not have to re-derive it from a grep.
What is there today
- The head takes both of its strings from two consts:
resources/views/index.stx#L16is the<title>text and#L17the description. They render four times, at#L93,#L94,#L98and#L99, so those two edits move the tab title, the meta description,og:titleandog:descriptiontogether. - The hero names Claude twice: the h1 at
resources/views/index.stx#L192and the subhead at#L195, which repeats#L17word for word. - How it works names Claude in its h2 at
resources/views/index.stx#L244and in the Run step body at#L35, rendered by the loop at#L255. - The bento cell at
resources/views/index.stx#L288namesCLAUDE.mdas the per-repository instruction file. It is a filename rather than the engine's name, which is why it is easy to skim past, but it is user-visible copy and a second engine reads a different file. - The download section names Claude in its subhead at
resources/views/index.stx#L320, in install step 2 at#L54(rendered at#L333), and in the screenshot alt text at#L347. - Three FAQ answers name Claude:
resources/views/index.stx#L70(FAQ 3, the API key),#L74(FAQ 4, what it can do) and#L78(FAQ 5, the cost). All three render throughat#L366. #L70is the only answer whose facts are engine-specific rather than engine-named. It statesclaude setup-tokenand the Keychain.#L78bills against "your Claude plan". Both are wrong for a second engine's auth and billing, not merely worded for one.- Two things need no change.
resources/views/index.stx#L101, theog:image:alt, describes the hero photo and never names the engine. The two exchanges at#L19-L30are real replies, which the header comment at#L9-L11commits the page to, and neither names the engine.resources/views/404.stxhas no Claude string at all. - Copy in the three arrays has no room for structure.
#L366renders one escaped string into one<p>, and#L255and#L333do the same for. An answer that sets out two engines' auth flows as separate paragraphs or list items needs that markup changed. - The page cannot branch on the reader's engine. Its only data import is
resources/data/release.jsonatresources/views/index.stx#L47, and it is one public view served to every visitor, so a forked answer has to name both engines in the same paragraph.
Proposal
- Put the breadth in the mechanism copy. Rewrite
resources/views/index.stx#L35,#L244and#L320so the engine is named as one of two, for example "Claude Code or Codex" in the Run step and the download subhead, and an h2 that does not name a single engine's session. - Leave a named engine in the two strongest strings.
#L192and#L16keep "Claude". The<title>at#L16is 55 characters today, and listing both engines pushes it past the length search results show, which is a second reason to leave it alone. - Fork the API key answer at
#L70. Keep the opening "No", then give each engine its own path: the Claude Code CLI on a Claude plan through a token fromclaude setup-token, and the other engine's own sign-in, both held in the Keychain. Check the wording against the app's auth code rather than writing it from the old answer. - Fork the cost answer at
#L78the same way, so it reads as nothing on top of the plan you already have for the engine you chose, and keep the sentence about the dashboard showing what each run would have cost at API rates, in cents. - Change
#L288to name both instruction files, or to say "that repository's agent instructions, hooks and settings" with the filenames after it. - Reword install step 2 at
#L54so it says signing in to the engine you chose. Reword#L17and the hero subhead at#L195in the same pass, since they are one sentence written twice. - Leave
#L347until the screenshot itself changes, then rewrite it to match the new image.
Requirements
- The alt text follows the image, not the copy.
#L347describespublic/images/menubar-setup.png, whose setup step says to sign in to Claude. Editing the alt before the screenshot is retaken makes it describe something the image does not show. - The two exchanges stay byte for byte.
#L19-L30are real replies from real runs and the header comment at#L9-L11is a promise about them. Nothing here touches them. - The hero keeps one engine named. The goal is copy that survives a second engine, not the page's strongest line flattened into "your agent".
- A forked answer that needs two paragraphs needs markup.
#L366is one<p>around one escaped string. Either hold each forked answer to a single paragraph, or change the loop at#L360-L366so an answer can carry structure. - Editing
#L16or#L17moves four rendered tags. Re-read#L93,#L94,#L98and#L99afterwards, and check a social card preview, not only the page. - No em-dash and no en-dash.
resources/views/index.stxhas none today andAGENTS.md#L441forbids them in user-visible strings. Copy edits are exactly where that rule gets broken. - This is copy only. No new views, no route changes, no engine selection logic. The engine work is tracked separately.
Acceptance
grep -n Claude resources/views/index.stxreturns only lines that are deliberately Claude-specific: the title at#L16, the h1 at#L192, and the Claude half of the two forked FAQ answers. Every other hit from today's thirteen either names both engines or is gone.- FAQ 3 and FAQ 5 each state the auth path and the billing for both engines, and a reader on either one can follow them without guessing.
- The tab title, meta description,
og:titleandog:descriptionall render the edited consts, verified in the built page and in a social card preview. #L19-L30and#L101are unchanged, and#L347still matches the image it describes.grep -n '[—–]' resources/views/index.stxreturns nothing../buddy lintpasses and the diff touches onlyresources/views/index.stx.