Repository navigation
web: llms.txt overhaul + surface open source + fix agent-integration canonicals - #6523
Conversation
Fixes the canonical bug that was suppressing the agent-integration docs: oh-my-opencode, oh-my-codex, oh-my-claudecode, and claude-code-teams set no alternates, so they inherited the parent layout's canonical of /docs. Google treated /docs as canonical for that content, which is why oh-my-opencode ranked weakly (#6-7) and indexed the wrong localized URL despite "oh-my-opencode"/"oh my opencode" being ~5.4K searches/mo at KD 0. Each page now declares its own self-canonical via buildAlternates. Adds discovery pages aimed at non-branded search, kept out of the main nav and docs sidebar and declared English-only in the sitemap (same convention as the legal pages): best-terminal-for-mac, cmux-vs-tmux, cmux-vs-iterm2, cmux-vs-warp. Copy is honest and framed on cmux's real strengths: workspace organization, agent notification rings, vertical tabs, libghostty rendering, and being purpose-built for macOS. Adds /llms.txt so AI assistants and crawlers get a concise, link-rich overview of cmux and its docs. Generalizes the middleware's English-only handling to cover the new pages so each has one canonical URL instead of a crawlable duplicate per locale. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
|
Note Reviews pausedIt looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the Use the following commands to manage reviews:
Use the checkboxes below for quick actions:
📝 WalkthroughWalkthroughAdds a new ChangesCompare Route Group and Wiring
Estimated code review effort🎯 2 (Simple) | ⏱️ ~12 minutes Possibly related PRs
Poem
Important Pre-merge checks failedPlease resolve all errors before merging. Addressing warnings is optional. ❌ Failed checks (2 errors, 1 warning)
✅ Passed checks (20 passed)
✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
Greptile SummaryThis PR overhauled the
Confidence Score: 5/5Safe to merge — docs and marketing web copy only, no app or runtime changes. All 29 changed files are web-only: locale message files, metadata/SEO helpers, docs page components, and the homepage. Every new i18n key (footer.openSource, home.feature.openSource/openSourceDesc, docs.ohMyOpenCode.*, and all ten new FAQ pairs) is present in all 20 locale files. The canonical fix correctly adds buildAlternates to the four agent-integration pages that previously inherited the docs layout canonical. TypeScript, tests, and ESLint are all clean per the PR description. No files require special attention. Important Files Changed
Flowchart%%{init: {'theme': 'neutral'}}%%
flowchart TD
A[Browser Request] --> B{Locale Middleware}
B -->|legal/english-only path| C[Rewrite to /en/path]
B -->|normal path| D[Next.js Routing]
D --> E[Locale Layout generateMetadata]
E --> F[SoftwareApplication JSON-LD + isAccessibleForFree + license GPL]
D --> G{Agent Integration Page}
G -->|before PR| H[Inherits /docs canonical from docs layout]
G -->|after PR| I[Self-canonical via buildAlternates]
I --> J[oh-my-opencode, claude-code-teams, oh-my-codex, oh-my-claudecode]
D --> K[Homepage /locale]
K --> L[Hero: Free and open source, Feature: openSource bullet, 10+ new FAQ sections]
K --> M[Footer: openSource link to GitHub repo]
%%{init: {'theme': 'base', 'themeVariables': {"darkMode": true, "background": "#0d1117", "primaryColor": "#21262d", "primaryTextColor": "#e6edf3", "primaryBorderColor": "#8b949e", "lineColor": "#8b949e", "textColor": "#e6edf3", "edgeLabelBackground": "#161b22", "actorBkg": "#21262d", "actorBorder": "#8b949e", "actorTextColor": "#e6edf3", "actorLineColor": "#8b949e", "signalColor": "#8b949e", "signalTextColor": "#e6edf3", "noteBkgColor": "#373320", "noteBorderColor": "#d4a72c", "noteTextColor": "#f0e6c0", "labelBoxBkgColor": "#21262d", "labelBoxBorderColor": "#8b949e", "labelTextColor": "#e6edf3", "loopTextColor": "#e6edf3", "activationBkgColor": "#30363d", "activationBorderColor": "#8b949e"}}}%%
flowchart TD
A[Browser Request] --> B{Locale Middleware}
B -->|legal/english-only path| C[Rewrite to /en/path]
B -->|normal path| D[Next.js Routing]
D --> E[Locale Layout generateMetadata]
E --> F[SoftwareApplication JSON-LD + isAccessibleForFree + license GPL]
D --> G{Agent Integration Page}
G -->|before PR| H[Inherits /docs canonical from docs layout]
G -->|after PR| I[Self-canonical via buildAlternates]
I --> J[oh-my-opencode, claude-code-teams, oh-my-codex, oh-my-claudecode]
D --> K[Homepage /locale]
K --> L[Hero: Free and open source, Feature: openSource bullet, 10+ new FAQ sections]
K --> M[Footer: openSource link to GitHub repo]
Reviews (10): Last reviewed commit: "Expand FAQ (iOS, browser, skills, suppor..." | Re-trigger Greptile |
| cmux is free and open source for macOS. | ||
| </p> | ||
| <div className="flex flex-wrap items-center gap-3"> | ||
| <DownloadButton location="compare" /> | ||
| <a | ||
| href="https://github.com/manaflow-ai/cmux" | ||
| className="text-sm opacity-70 hover:opacity-100" | ||
| > | ||
| View on GitHub | ||
| </a> | ||
| </div> | ||
| {related && related.length > 0 ? ( | ||
| <div className="mt-8 text-sm"> | ||
| <div className="opacity-60 mb-2">See also</div> |
There was a problem hiding this comment.
Hardcoded English strings not routed through next-intl
compare-ui.tsx introduces new user-facing copy ("cmux is free and open source for macOS.", "View on GitHub", "See also") that is hardcoded English JSX rather than consumed from next-intl or web/messages/. The four compare page components (best-terminal-for-mac, cmux-vs-tmux, cmux-vs-iterm2, cmux-vs-warp) have the same pattern — all heading and paragraph text is hardcoded English and has no corresponding entry in web/messages/en.json. The routing config lists 20 locales; if any of these pages are ever translated, the hardcoded strings would need a full refactor.
The layout comment explicitly notes these are English-only pages following the same convention as (legal), and the middleware + sitemap both enforce that. If the intent is to keep these permanently English-only (a reasonable SEO-first choice), a brief inline comment here calling out the deliberate decision (as the layout already does) would remove the ambiguity.
Rule Used: Flag production user-facing text that is not fully... (source)
Note: If this suggestion doesn't match your team's coding style, reply to this and let me know. I'll remember it for next time!
There was a problem hiding this comment.
Actionable comments posted: 1
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@web/app/sitemap.ts`:
- Around line 60-68: The englishOnly set is duplicated across sitemap.ts and
proxy.ts, creating a maintenance risk where the lists could diverge. Extract the
englishOnly set to a new shared constants module, then import it in both
sitemap.ts and proxy.ts instead of maintaining separate copies. This ensures a
single source of truth for the English-only route policy.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: ASSERTIVE
Plan: Pro
Run ID: eaf49145-f20e-4448-8440-2db538153173
📒 Files selected for processing (15)
web/app/[locale]/(compare)/best-terminal-for-mac/page.tsxweb/app/[locale]/(compare)/cmux-vs-iterm2/page.tsxweb/app/[locale]/(compare)/cmux-vs-tmux/page.tsxweb/app/[locale]/(compare)/cmux-vs-warp/page.tsxweb/app/[locale]/(compare)/compare-ui.tsxweb/app/[locale]/(compare)/layout.tsxweb/app/[locale]/docs/agent-integrations/claude-code-teams/page.tsxweb/app/[locale]/docs/agent-integrations/oh-my-claudecode/page.tsxweb/app/[locale]/docs/agent-integrations/oh-my-codex/page.tsxweb/app/[locale]/docs/agent-integrations/oh-my-opencode/page.tsxweb/app/llms.txt/route.tsweb/app/sitemap.tsweb/messages/en.jsonweb/messages/ja.jsonweb/proxy.ts
| const englishOnly = new Set([ | ||
| "/privacy-policy", | ||
| "/terms-of-service", | ||
| "/eula", | ||
| "/best-terminal-for-mac", | ||
| "/cmux-vs-tmux", | ||
| "/cmux-vs-iterm2", | ||
| "/cmux-vs-warp", | ||
| ]); |
There was a problem hiding this comment.
🧹 Nitpick | 🔵 Trivial | ⚡ Quick win
Extract English-only route policy to a shared constant.
englishOnly is duplicated here and in web/proxy.ts. Keeping two independent lists is a drift risk for canonical/locale behavior. Move this set to one shared module and import it in both places.
Suggested refactor
+// web/app/lib/english-only-pages.ts
+export const ENGLISH_ONLY_PAGES = new Set([
+ "/privacy-policy",
+ "/terms-of-service",
+ "/eula",
+ "/best-terminal-for-mac",
+ "/cmux-vs-tmux",
+ "/cmux-vs-iterm2",
+ "/cmux-vs-warp",
+]);- const englishOnly = new Set([
- "/privacy-policy",
- "/terms-of-service",
- "/eula",
- "/best-terminal-for-mac",
- "/cmux-vs-tmux",
- "/cmux-vs-iterm2",
- "/cmux-vs-warp",
- ]);
+ import { ENGLISH_ONLY_PAGES } from "`@/app/lib/english-only-pages`";
...
- if (englishOnly.has(path)) {
+ if (ENGLISH_ONLY_PAGES.has(path)) {- const englishOnlyPages = new Set([
- ...
- ]);
+ import { ENGLISH_ONLY_PAGES } from "`@/app/lib/english-only-pages`";
...
- if (englishOnlyPages.has(pathname)) {
+ if (ENGLISH_ONLY_PAGES.has(pathname)) {
...
- if (englishOnlyPages.has(rest)) {
+ if (ENGLISH_ONLY_PAGES.has(rest)) {🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@web/app/sitemap.ts` around lines 60 - 68, The englishOnly set is duplicated
across sitemap.ts and proxy.ts, creating a maintenance risk where the lists
could diverge. Extract the englishOnly set to a new shared constants module,
then import it in both sitemap.ts and proxy.ts instead of maintaining separate
copies. This ensures a single source of truth for the English-only route policy.
The repo already serves /llms.txt and per-page .md/.txt variants through the agent-page-variant system (buildLlmsText over agentReadablePages). Drop the hand-rolled /llms.txt route and instead register the new comparison/category pages in agentReadablePages and englishOnlyPages. This fixes the Web test that asserts every sitemap page resolves to a Markdown and text variant, and the new pages now appear in /llms.txt with .md/.txt variants for free. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Before, llms.txt was a one-line description plus a flat page index, which gives an LLM nothing quotable about what cmux is. Add a summary blockquote, a "What cmux is" section covering the real differentiators (libghostty, agent notification rings, workspace organization, vertical tabs, in-app browser, scriptable, agent-agnostic, open source), and a "Key facts" block (platform, license, built-on, works-with, download, source). The page index and .md/.txt variant explanation are unchanged. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
There was a problem hiding this comment.
Actionable comments posted: 1
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@web/app/lib/agent-page-paths.ts`:
- Around line 165-187: The user-facing copy describing cmux in the `/llms.txt`
content (the hardcoded markdown strings starting with "> cmux is a native macOS
terminal" through "## Page variants") must be localized using next-intl instead
of being hardcoded as English text. Extract this copy from the hardcoded string
literals in agent-page-paths.ts, add the corresponding message entries to the
appropriate locale files under web/messages/*, register any new locales in
web/i18n/routing.ts if needed, and replace the hardcoded text with references to
the localized messages using next-intl to ensure consistent localization across
all supported languages.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: ASSERTIVE
Plan: Pro
Run ID: fc314999-0bef-4934-99f4-4139a6c5c8be
📒 Files selected for processing (1)
web/app/lib/agent-page-paths.ts
| "> cmux is a native macOS terminal built on libghostty, purpose-built for running AI coding agents. It works with the CLI agents you already use (Claude Code, Codex, OpenCode, Gemini CLI, Aider, and any CLI tool) and adds workspace organization, agent notification rings, and vertical tabs on top of a GPU-accelerated terminal.", | ||
| "", | ||
| "## What cmux is", | ||
| "", | ||
| "- Native macOS app: written in Swift and AppKit with no Electron, built on libghostty (the Ghostty engine) for GPU-accelerated rendering.", | ||
| "- Agent-first: run many AI coding agents in parallel, each in its own workspace, instead of juggling one terminal.", | ||
| "- Notification rings: a pane lights up the moment an agent needs your attention, so you are not babysitting prompts.", | ||
| "- Workspace organization: a vertical sidebar groups work by workspace, each showing its git branch, working directory, ports, and the latest line of agent output.", | ||
| "- Vertical tabs: tabs live in the sidebar instead of a cramped top bar, scaling to dozens of concurrent sessions.", | ||
| "- In-app browser: split a scriptable browser pane alongside the terminal.", | ||
| "- Scriptable: a CLI and socket API drive workspaces, panes, and the browser for automation.", | ||
| "- Agent-agnostic and open source (GPL): bring your own agent, no required account to use the terminal.", | ||
| "", | ||
| "## Key facts", | ||
| "", | ||
| "- Platform: macOS", | ||
| "- License: GPL, free to download", | ||
| "- Built on: libghostty (the Ghostty terminal engine)", | ||
| "- Works with: Claude Code, Codex, OpenCode, Gemini CLI, Aider, and any CLI tool", | ||
| `- Download: ${origin}/download`, | ||
| "- Source: https://github.com/manaflow-ai/cmux", | ||
| "", | ||
| "## Page variants", |
There was a problem hiding this comment.
Localize new /llms.txt user-facing copy instead of hardcoding English.
This block introduces production user-facing web/markdown text directly in code, but it is not sourced from locale messages (next-intl) and does not show parity across supported locales.
As per coding guidelines, web user-facing copy must be locale-sourced and represented across all supported locales (web/i18n/routing.ts and matching web/messages/* entries).
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@web/app/lib/agent-page-paths.ts` around lines 165 - 187, The user-facing copy
describing cmux in the `/llms.txt` content (the hardcoded markdown strings
starting with "> cmux is a native macOS terminal" through "## Page variants")
must be localized using next-intl instead of being hardcoded as English text.
Extract this copy from the hardcoded string literals in agent-page-paths.ts, add
the corresponding message entries to the appropriate locale files under
web/messages/*, register any new locales in web/i18n/routing.ts if needed, and
replace the hardcoded text with references to the localized messages using
next-intl to ensure consistent localization across all supported languages.
Source: Coding guidelines
Lead with "fully scriptable" in the summary and add a dedicated "## Programmable" section: CLI + Unix socket control of the app (workspaces, panes, input, read-screen, screenshots), browser automation verbs, hooks, skills, custom commands, and scriptable sidebar/notifications. Add an Automation line to Key facts. Makes the strongest differentiator quotable by LLMs instead of a single buried bullet. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
cmux is free and open source (GPL) but the site barely said so. Make it explicit on the high-traffic surfaces: - Homepage hero subtitle now leads with "Free and open source" (en + ja). - Homepage meta + OG description include it for search/social snippets (en + ja). - SoftwareApplication JSON-LD gains license (GPL) and isAccessibleForFree, plus an "open source terminal" keyword, so it shows in structured data for every locale. - Footer adds an "Open source" link to the repo next to the copyright (en + ja; English fallback in other locales until translated). - /llms.txt summary now opens with "free and open source (GPL)". The comparison pages already state "free and open source" via the shared CTA. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
There was a problem hiding this comment.
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
web/app/lib/agent-page-paths.ts (1)
165-196:⚠️ Potential issue | 🟠 Major | ⚡ Quick winUnresolved:
/llms.txtcontent remains hardcoded English instead of localized.This comment was flagged in the previous review and has not been addressed. Lines 165–196 contain multi-section hardcoded English markdown describing cmux ("cmux is a free and open source...", "What cmux is", "Programmable", "Key facts") that is served to AI assistants and crawlers as part of the agent-page-variant system, but is not sourced from
next-intlorweb/messages.Per the coding guidelines on full internationalization, user-facing copy (including content for AI assistants and crawlers) must read from locale-specific sources and be represented across all supported locales. Even if
/llms.txtis intentionally English-only as part of the English-only discovery-pages strategy, this decision should be documented via a code comment explaining the rationale rather than leaving the hardcoding as implicit.Options to resolve:
Option A (Localize): Extract the
buildLlmsTextcontent intoweb/messages/en.jsonandweb/messages/ja.jsonwith new keys (e.g.,llms.intro,llms.whatCmuxIs,llms.programmable,llms.keyFacts), then import and reference them in the function.Option B (Document as English-only): Add an explicit code comment above
buildLlmsText()explaining that this endpoint is intentionally English-only for AI crawler compatibility, even when served on localized pages.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@web/app/lib/agent-page-paths.ts` around lines 165 - 196, The buildLlmsText function contains hardcoded English markdown content that describes cmux and is served to AI assistants and crawlers, but this content is not localized or sourced from the next-intl messages system. Either extract the multi-section markdown strings (intro, "What cmux is", "Programmable", "Key facts") into locale-specific keys in web/messages/en.json and web/messages/ja.json, then import and reference those keys in buildLlmsText, or add an explicit code comment directly above the buildLlmsText function explaining that this endpoint is intentionally English-only for AI crawler compatibility and documenting that decision as part of the English-only discovery-pages strategy.Source: Coding guidelines
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Outside diff comments:
In `@web/app/lib/agent-page-paths.ts`:
- Around line 165-196: The buildLlmsText function contains hardcoded English
markdown content that describes cmux and is served to AI assistants and
crawlers, but this content is not localized or sourced from the next-intl
messages system. Either extract the multi-section markdown strings (intro, "What
cmux is", "Programmable", "Key facts") into locale-specific keys in
web/messages/en.json and web/messages/ja.json, then import and reference those
keys in buildLlmsText, or add an explicit code comment directly above the
buildLlmsText function explaining that this endpoint is intentionally
English-only for AI crawler compatibility and documenting that decision as part
of the English-only discovery-pages strategy.
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: ASSERTIVE
Plan: Pro
Run ID: e45d7983-aa9d-4f5c-98b2-49f9913255f2
📒 Files selected for processing (5)
web/app/[locale]/components/site-footer.tsxweb/app/[locale]/layout.tsxweb/app/lib/agent-page-paths.tsweb/messages/en.jsonweb/messages/ja.json
Remove the (compare) route group and all its wiring (sitemap, middleware, agent-page-paths) so this PR ships only the llms.txt and front-page work. Add "Open source" to the homepage feature list (en + ja). Kept: the agent-integration self-canonical bugfix, oh-my-opencode metadata, the enriched /llms.txt, and the open-source surfacing across hero, meta, JSON-LD, and footer. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
There was a problem hiding this comment.
Cursor Bugbot has reviewed your changes and found 1 potential issue.
❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.
Reviewed by Cursor Bugbot for commit b11493a. Configure here.
| "- Built on: libghostty (the Ghostty terminal engine)", | ||
| "- Works with: Claude Code, Codex, OpenCode, Gemini CLI, Aider, and any CLI tool", | ||
| "- Automation: `cmux` CLI and Unix socket API, browser automation, hooks, skills, and custom commands", | ||
| `- Download: ${origin}/download`, |
There was a problem hiding this comment.
Broken download URL in llms.txt
Medium Severity
buildLlmsText advertises - Download: ${origin}/download, but the app only defines /download/confirmation (with optional dl=1), not a /download page. Crawlers and LLMs that follow that link get a 404 instead of the download flow.
Reviewed by Cursor Bugbot for commit b11493a. Configure here.
'terminal' is the phrase users search and matches the meta description and JSON-LD. Slight repeat with the tagline above is worth the clearer keyword. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Add four FAQ entries, each linking to the relevant docs: - Sessions: cmux restores windows/workspaces/panes/scrollback and survives a full reboot, not just an app quit (links to session restore). - Programmable: CLI + Unix socket control and browser automation (links to CLI reference and browser automation). - Remote: SSH workspaces and remote tmux attach (links to SSH docs). - Orchestration: subagents and teammates become native panes/splits, via Claude Code teams and oh-my-opencode (links to both). Rename the "Scriptable" feature bullet and FAQ to "Programmable" (en + ja). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Ghostty config drives themes/fonts/colors; ~/.config/cmux/cmux.json controls the sidebar, tab bar, split panes, and behavior; shortcuts are editable. Links to configuration and keyboard shortcuts docs (en + ja). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Notifications work with any agent that supports hooks or OSC (Claude Code, Codex, OpenCode, pi), not just Claude Code. Link text is now 'agent hooks'. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
cmux and tmux are not either/or: note that lots of people run cmux with SSH + tmux, and link to the native remote tmux attach (beta) doc. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
… languages New FAQ entries, each linking to the relevant resource: - iOS app (beta, paired via Mobile Connect, TestFlight) - Built-in browser (programmable via the socket API; links to browser automation) - Skills (links to cmux-skills repo and skills docs) - How can I support cmux? (links to Founders Edition) - Feature request / bug (links to GitHub issues, PRs, and a prefilled mailto) Localize every changed/new string across all 20 message catalogs: the open-source surfacing, the Programmable rename, the generalized notifications answer, the friendlier tmux answer with the remote-tmux beta link, the oh-my-opencode metadata, and all new FAQ entries. Inline link tags preserved per locale. Hero subtitle extends rightward on large screens (lg/xl) so it reads as two lines instead of three, without shifting the rest of the column. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>


Scoped-down SEO PR (comparison/competitor pages dropped per request; they can come later).
1. Fix the canonical bug suppressing agent-integration docs
oh-my-opencode,oh-my-codex,oh-my-claudecode, andclaude-code-teamsset noalternates, so they inherited the docs layout's canonical of/docs. Google treated/docsas canonical for that content, which is whyoh-my-opencoderanked weakly (#6-7) and indexed the wrong localized URL despite "oh-my-opencode" / "oh my opencode" being ~5.4K searches/mo at KD 0. Each page now self-canonicalizes viabuildAlternates. Also sharpened the oh-my-opencode title/description (en + ja).2. /llms.txt overhaul
Was a one-line description plus a flat page index. Now opens with a real summary blockquote, a "What cmux is" section, a dedicated "## Programmable" section (CLI + socket control, browser automation, hooks, skills, custom commands), and a "Key facts" block. Leads with "free and open source (GPL)".
3. Surface open source across the site
cmux is free and open source (GPL) but the site barely said so:
SoftwareApplicationJSON-LD gainslicense(GPL) +isAccessibleForFree+ an "open source terminal" keyword (every locale)Verification
bun tsc --noEmitcleanbun test140 pass / 0 failbunx eslintclean on changed filesNo app/runtime changes. Docs/web only.
🤖 Generated with Claude Code
Note
Low Risk
Docs, SEO metadata, and marketing copy only; no authentication, data handling, or application runtime changes.
Overview
This PR tightens docs SEO, expands agent-facing copy, and surfaces GPL/open source across the marketing site—no app runtime changes.
Agent-integration canonicals:
oh-my-opencode,oh-my-codex,oh-my-claudecode, andclaude-code-teamsnow setalternatesviabuildAlternatesso each page self-canonicalizes instead of inheriting/docsfrom the docs layout. oh-my-opencode meta titles/descriptions are sharpened in translations (including en/ja)./llms.txt: Replaces a one-line blurb with a structured summary (what cmux is, programmable CLI/socket/browser automation, key facts) leading with free/open source (GPL).Open source on the site: Hero subtitle and meta/OG copy, a new homepage Open source feature bullet, footer Open source link to GitHub, and
SoftwareApplicationJSON-LD fields (license,isAccessibleForFree, keywords).Homepage FAQ: Adds many new Q&As (sessions, programmability, SSH/remote, multi-agent orchestration, iOS beta, skills, browser, support, feature requests, customization) with doc links; expands tmux/notifications copy. Matching strings land across locale message files.
Reviewed by Cursor Bugbot for commit f855acb. Bugbot is set up for automated code reviews on this repo. Configure here.