Skip to content

web: llms.txt overhaul + surface open source + fix agent-integration canonicals - #6523

Merged
lawrencecchen merged 13 commits into
mainfrom
feat-seo-discovery-pages
Jun 21, 2026
Merged

lawrencecchen merged 13 commits into
mainfrom
feat-seo-discovery-pages

Conversation

@lawrencecchen

@lawrencecchen lawrencecchen commented Jun 20, 2026 •

Copy link
Copy Markdown
Contributor

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, and claude-code-teams set no alternates, so they inherited the docs 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 self-canonicalizes via buildAlternates. 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:

  • Homepage hero subtitle leads with "Free and open source" (en + ja)
  • "Open source" added to the homepage feature bullet list (en + ja)
  • Homepage meta + OG description include it (en + ja)
  • SoftwareApplication JSON-LD gains license (GPL) + isAccessibleForFree + an "open source terminal" keyword (every locale)
  • Footer adds an "Open source" link to the repo (en + ja, English fallback elsewhere)

Verification

  • bun tsc --noEmit clean
  • bun test 140 pass / 0 fail
  • bunx eslint clean on changed files
  • Vercel preview builds

No 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, and claude-code-teams now set alternates via buildAlternates so each page self-canonicalizes instead of inheriting /docs from 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 SoftwareApplication JSON-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.

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>
@vercel

vercel Bot commented Jun 20, 2026 •

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
cmux Ready Ready Preview, Comment Jun 21, 2026 10:25am
cmux-staging Building Building Preview, Comment Jun 21, 2026 10:25am

@coderabbitai

coderabbitai Bot commented Jun 20, 2026 •

Copy link
Copy Markdown

Review Change Stack

Note

Reviews paused

It 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 reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

Adds a new (compare) Next.js route group with a shared layout, two reusable UI components (CompareTable, CompareCTA), and four static comparison pages (best-terminal-for-mac, cmux-vs-iterm2, cmux-vs-tmux, cmux-vs-warp). These routes are registered as English-only entries in the sitemap, middleware, and agent-page-paths. Four existing agent-integration docs pages gain buildAlternates in their generateMetadata. Footer, layout JSON-LD metadata, and i18n copy are updated across English and Japanese messages to reflect product positioning and OpenCode orchestration capabilities.

Changes

Compare Route Group and Wiring

Layer / File(s) Summary
Shared layout and compare UI components
web/app/[locale]/(compare)/layout.tsx, web/app/[locale]/(compare)/compare-ui.tsx
CompareLayout wraps page children with SiteHeader and SiteFooter. CompareTable renders a header/body table with the first cell bolded. CompareCTA renders a download call-to-action with a GitHub link and optional "See also" list.
Four comparison and discovery pages
web/app/[locale]/(compare)/best-terminal-for-mac/page.tsx, web/app/[locale]/(compare)/cmux-vs-iterm2/page.tsx, web/app/[locale]/(compare)/cmux-vs-tmux/page.tsx, web/app/[locale]/(compare)/cmux-vs-warp/page.tsx
Each page exports metadata with title, description, and canonical alternates, and a default component rendering headings, paragraphs, a CompareTable, and CompareCTA with related links.
Sitemap, middleware, and agent-page-paths wiring
web/app/sitemap.ts, web/proxy.ts, web/app/lib/agent-page-paths.ts
The four new comparison routes are added to englishOnly/englishOnlyPages sets in the sitemap and middleware, suppressing locale alternates. agentReadablePages gains four new path-to-title entries, and buildLlmsText is extended with richer cmux context content including "What cmux is" and "Key facts" sections.
SEO alternates on existing docs pages
web/app/[locale]/docs/agent-integrations/claude-code-teams/page.tsx, .../oh-my-claudecode/page.tsx, .../oh-my-codex/page.tsx, .../oh-my-opencode/page.tsx
buildAlternates is imported and an alternates field is added to generateMetadata returns on four docs pages, enabling multi-locale SEO alternate link tags.
i18n copy updates, footer link, and JSON-LD metadata
web/messages/en.json, web/messages/ja.json, web/app/[locale]/components/site-footer.tsx, web/app/[locale]/layout.tsx
Meta descriptions and homepage messaging are revised in English and Japanese i18n files. Site footer gains an external GitHub link. JSON-LD SoftwareApplication metadata is extended with isAccessibleForFree and license fields.

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~12 minutes

Possibly related PRs

  • manaflow-ai/cmux#4540: Modifies web/app/lib/agent-page-paths.ts by extending the agentReadablePages list with additional route paths similar to the new compare page routes added here.
  • manaflow-ai/cmux#5190: Updates web/app/lib/agent-page-paths.ts and web/app/sitemap.ts to register new discoverable routes using the same pattern as the compare pages wiring.
  • manaflow-ai/cmux#5319: Modifies web/app/[locale]/layout.tsx's JSON-LD SoftwareApplication metadata in the same area as the JSON-LD updates in this PR.

Poem

🐇 Hop, hop, new pages appear,
cmux versus all, comparison clear!
Tables and CTAs, English routes true,
Footer finds GitHub in every view.
JSON-LD shines with free and licensed grace—
The compare pages light up the place! 🌿


Important

Pre-merge checks failed

Please resolve all errors before merging. Addressing warnings is optional.

❌ Failed checks (2 errors, 1 warning)

Check name Status Explanation Resolution
Cmux Full Internationalization ❌ Error PR adds footer.openSource message key accessed via t("openSource") in site-footer.tsx, but provides translations only for en and ja; missing from 18 other locales (ar, bs, da, de, es, fr, it, km, k... Add footer.openSource translations to all 18 missing message files (web/messages/{ar,bs,da,de,es,fr,it,km,ko,no,pl,pt-BR,ru,th,tr,uk,zh-CN,zh-TW}.json) matching the en.json value "Open source".
Cmux Source Artifacts ❌ Error .claude/ directory with 25 files (commands, skills, scheduled_tasks.lock) added to source control; rule explicitly lists .claude/ as hidden scratch directory causing FAIL. Remove .claude/ directory from this commit or add it to .gitignore. The web/ file changes (compare pages, messages, sitemap, proxy, layout) are legitimate and pass the check.
Docstring Coverage ⚠️ Warning Docstring coverage is 17.65% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (20 passed)
Check name Status Explanation
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Cmux Swift Actor Isolation ✅ Passed This PR contains no Swift changes; it is entirely web/Next.js focused with TypeScript, React, and JSON modifications. The Swift actor isolation check is not applicable.
Cmux Swift Blocking Runtime ✅ Passed Custom check for Swift blocking runtime not applicable: PR contains only web/docs changes (92 .tsx, 103 .ts, 33 .json files) with zero Swift code changes.
Cmux Expensive Synchronous Load ✅ Passed Custom check only applies to production Swift changes; this PR is web/documentation-only (TypeScript/Next.js, JSON, sitemap) with no Swift code modifications.
Cmux Cache Substitution Correctness ✅ Passed PR contains only web/docs SEO changes with static pages, metadata configuration, and pure functions—no cache substitution, persistence, or storage logic present.
Cmux No Hacky Sleeps ✅ Passed All modified files contain no setTimeout, setInterval, sleep, polling, or any other timing/synchronization workarounds. The PR is docs/web-only with no production app/runtime changes introducing ha...
Cmux Algorithmic Complexity ✅ Passed Nested loop uses fixed-size compile-time constants (20 locales × 7 pages = 140 iterations max), not scalable user-data collections. Per the rule's scope and PASS criteria for "tiny fixed-size colle...
Cmux Swift Concurrency ✅ Passed PR contains only web/TypeScript changes (Next.js pages, JSON messages, TypeScript configs) with no Swift code modifications, making the Swift concurrency check inapplicable.
Cmux Swift @Concurrent ✅ Passed PR contains only web/TypeScript changes (no Swift files modified); the @concurrent check applies only to Swift code and is not applicable here.
Cmux Swift File And Package Boundaries ✅ Passed This PR contains no Swift file changes—all modifications are TypeScript/React web components and JSON metadata files. The Swift file boundary check is not applicable.
Cmux Swiftpm Lockfiles ✅ Passed PR contains only web/documentation changes (TypeScript, JSON, React components); no SwiftPM packages, Xcode projects, .gitignore, or dependency changes that would trigger this check.
Cmux Swift Logging ✅ Passed This PR contains no Swift code changes (17 files: 12 TSX, 3 TS, 2 JSON). Check applies only to Swift code; thus not applicable.
Cmux User-Facing Error Privacy ✅ Passed PR contains no user-facing error messages, alerts, command output, API responses, or recovery copy. All changes are SEO pages, metadata, and documentation without sensitive information exposure.
Cmux Swiftui State Layout ✅ Passed PR contains only web/TypeScript changes (SEO pages, metadata, sitemap, middleware) with no SwiftUI code modifications; custom check for SwiftUI state layout is not applicable.
Cmux Architecture Rethink ✅ Passed PR contains no Swift code modifications; check applies only to Swift architectural changes. This PR is web/docs-only (TypeScript, Next.js, JSON, translations).
Cmux Swift Auxiliary Window Close Shortcuts ✅ Passed PR contains web/docs changes only (TypeScript, React, JSON). No Swift files modified. Swift auxiliary window check is not applicable to this PR.
Cmux No Test Or Debug Seam In Production Source ✅ Passed Custom check for test/debug seams only applies to Swift files under Sources/ paths. PR contains only web/TypeScript changes; no Swift production source files were modified.
Title check ✅ Passed The title accurately captures the three main changes: llms.txt overhaul, surfacing open-source messaging, and fixing canonical URLs for agent-integration pages.
Description check ✅ Passed The PR description is comprehensive and well-structured, covering the main objectives, changes, and verification. It addresses all key sections of the template including summary of changes, testing/verification details, and risk assessment.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat-seo-discovery-pages

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.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Comment thread web/app/llms.txt/route.ts Outdated
Comment thread web/app/sitemap.ts Outdated
@greptile-apps

greptile-apps Bot commented Jun 20, 2026 •

Copy link
Copy Markdown
Contributor

Greptile Summary

This PR overhauled the /llms.txt content, fixed canonical URL inheritance for four agent-integration docs pages, and surfaced GPL/open-source messaging across the homepage and footer. All changes are web/docs only with no app or runtime modifications.

  • Canonical fix: Four agent-integration pages (claude-code-teams, oh-my-opencode, oh-my-codex, oh-my-claudecode) now call buildAlternates in generateMetadata, preventing them from inheriting the docs layout's /docs canonical.
  • Open source visibility: footer.openSource, home.feature.openSource/openSourceDesc, and new FAQ entries are added; all 20 locale files are fully updated with translated strings.
  • /llms.txt rewrite: buildLlmsText is replaced with a structured summary, "What cmux is", "Programmable", and "Key facts" sections.

Confidence Score: 5/5

Safe 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

Filename Overview
web/app/[locale]/components/site-footer.tsx Adds an "Open source" link to the GitHub repo in the footer copyright line; t("openSource") key is present in all 20 locale files.
web/app/[locale]/docs/agent-integrations/oh-my-opencode/page.tsx Adds buildAlternates to fix canonical URL inheritance from the docs layout; ohMyOpenCode.metaTitle/metaDescription keys updated in all 20 locale files.
web/app/[locale]/docs/agent-integrations/claude-code-teams/page.tsx Adds buildAlternates to self-canonicalize this page instead of inheriting the docs layout canonical of /docs.
web/app/lib/agent-page-paths.ts Significantly expands buildLlmsText with structured sections (summary, What cmux is, Programmable, Key facts) leading with GPL/open-source positioning.
web/app/[locale]/page.tsx Adds openSource feature bullet and ~10 new FAQ sections (orchestration, remote, scriptable, browser, skills, customize, sessions, support, feature requests); all new i18n keys are present across all locales.
web/app/[locale]/layout.tsx Adds isAccessibleForFree, license, and "open source terminal" keyword to the SoftwareApplication JSON-LD structured data.
web/proxy.ts Renames legalPages variable to englishOnlyPages for clarity; no functional change to routing logic.

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]
Loading
%%{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]
Loading

Reviews (10): Last reviewed commit: "Expand FAQ (iOS, browser, skills, suppor..." | Re-trigger Greptile

Comment on lines +47 to +60
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>

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 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!

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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

📥 Commits

Reviewing files that changed from the base of the PR and between 1f1dd4a and 513bf41.

📒 Files selected for processing (15)
  • web/app/[locale]/(compare)/best-terminal-for-mac/page.tsx
  • web/app/[locale]/(compare)/cmux-vs-iterm2/page.tsx
  • web/app/[locale]/(compare)/cmux-vs-tmux/page.tsx
  • web/app/[locale]/(compare)/cmux-vs-warp/page.tsx
  • web/app/[locale]/(compare)/compare-ui.tsx
  • web/app/[locale]/(compare)/layout.tsx
  • web/app/[locale]/docs/agent-integrations/claude-code-teams/page.tsx
  • web/app/[locale]/docs/agent-integrations/oh-my-claudecode/page.tsx
  • web/app/[locale]/docs/agent-integrations/oh-my-codex/page.tsx
  • web/app/[locale]/docs/agent-integrations/oh-my-opencode/page.tsx
  • web/app/llms.txt/route.ts
  • web/app/sitemap.ts
  • web/messages/en.json
  • web/messages/ja.json
  • web/proxy.ts

Comment thread web/app/sitemap.ts Outdated
Comment on lines +60 to +68
const englishOnly = new Set([
"/privacy-policy",
"/terms-of-service",
"/eula",
"/best-terminal-for-mac",
"/cmux-vs-tmux",
"/cmux-vs-iterm2",
"/cmux-vs-warp",
]);

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 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>
Comment thread web/app/[locale]/(compare)/layout.tsx Outdated
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>

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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

📥 Commits

Reviewing files that changed from the base of the PR and between 83ed329 and f4e982f.

📒 Files selected for processing (1)
  • web/app/lib/agent-page-paths.ts

Comment thread web/app/lib/agent-page-paths.ts Outdated
Comment on lines +165 to +187
"> 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",

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major | 🏗️ Heavy lift

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>

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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 win

Unresolved: /llms.txt content 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-intl or web/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.txt is 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 buildLlmsText content into web/messages/en.json and web/messages/ja.json with 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

📥 Commits

Reviewing files that changed from the base of the PR and between 0799fcc and 8f77052.

📒 Files selected for processing (5)
  • web/app/[locale]/components/site-footer.tsx
  • web/app/[locale]/layout.tsx
  • web/app/lib/agent-page-paths.ts
  • web/messages/en.json
  • web/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>
@lawrencecchen lawrencecchen changed the title web: SEO discovery pages + fix agent-integration canonicals web: llms.txt overhaul + surface open source + fix agent-integration canonicals Jun 21, 2026

@cursor cursor Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes and found 1 potential issue.

Fix All in Cursor

❌ 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`,

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

Fix in Cursor Fix in Web

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>
lawrencecchen and others added 4 commits June 21, 2026 02:59
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>

This branch was successfully deployed

1 active deployment
Preview – cmux — f855acb0 Deployed Jun 21, 2026 by vercel[bot]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant