Skip to content

Fix residual docs metadata from Ahrefs audit - #7893

Merged
lawrencecchen merged 51 commits into
mainfrom
feat-seo-docs-audit
Jul 12, 2026
Merged

lawrencecchen merged 51 commits into
mainfrom
feat-seo-docs-audit

Conversation

@lawrencecchen

@lawrencecchen lawrencecchen commented Jul 11, 2026 •

Copy link
Copy Markdown
Contributor

Stacked on #7888.

Routes 17 audited docs families through one metadata builder. HTML, Open Graph, Twitter, canonical URLs, and route-specific locale availability share one bounded copy selection.

Tests: bun test (590 passed, 91 skipped), bun run typecheck, changed-file ESLint, SKIP_ENV_VALIDATION=1 bun run build.


View with Codesmith Autofix with Codesmith
Need help on this PR? Tag /codesmith with what you need. Autofix is disabled.


Note

Low Risk
SEO and metadata-only changes with no auth or runtime behavior; main risk is incorrect titles/descriptions or alternates on docs pages if message keys are wrong.

Overview
Routes 17 docs pages through a shared auditedDocsMetadata helper so HTML titles, descriptions, Open Graph, Twitter cards, and canonical/hreflang alternates all use the same bounded SEO pipeline (including availableLocales for remote-tmux).

docsPageSeoCopy now picks docs titles without stacking layout taglines, uses a separate socialTitle for OG/Twitter, and builds descriptions only from metaDescriptionShort, the first complete sentence of metaDescription or intro, with stricter punctuation rules (e.g. Khmer ៖). Locale files gain metaDescriptionShort (and some copy tweaks) where needed.

seo.test.ts extends audits so rendered titles include the docs layout suffix and descriptions stay within 110–160 snippet units.

Reviewed by Cursor Bugbot for commit c81e844. Bugbot is set up for automated code reviews on this repo. Configure here.


Summary by cubic

Centralizes docs SEO metadata with a single helper and enforces audited, route‑specific descriptions across 17 pages. Titles stay within bounds without stacking the docs layout suffix; Open Graph/Twitter use a separate social title.

  • Bug Fixes

    • Use only audited description sources: prefer metaDescriptionShort, then the first complete sentence of metaDescription or intro; ignore headings; reject HTML/rich text and {…} placeholders; trim trailing colons (incl. Khmer ៖); reject truncated or generic fragments; keep copy tied to the route.
    • Keep titles within bounds with the rendered docs suffix; prevent duplicate branding and stacked taglines; pick OG/Twitter socialTitle independently; fix canonical/hreflang alternates and restrict remote-tmux locales; make width checks deterministic.
  • Refactors

    • Add web/app/[locale]/(landing)/docs/audited-docs-metadata.ts; replace per‑page generateMetadata across all 17 docs routes; pass availableLocales for remote-tmux.
    • Update docsPageSeoCopy to select compact titles (e.g., oh-my-opencode), use complete metadata sentences, and disable auto context via seoTitle({ appendLocalizedContext: false }); add metaDescriptionShort to locales and extend tests for docs metadata regressions and Khmer punctuation.

Written for commit c81e844. Summary will update on new commits.

Review in cubic

Summary by CodeRabbit

  • New Features

    • Added centralized, localized metadata generation for documentation pages.
    • Improved SEO titles, descriptions, canonical links, social previews, and alternate-language metadata.
    • Added concise metadata descriptions across multiple languages and documentation sections.
  • Bug Fixes

    • Improved punctuation handling and prevented duplicated titles, formatting artifacts, and truncated metadata in search and social previews.
  • Tests

    • Expanded coverage for localized documentation metadata, title selection, descriptions, and social preview content.

@vercel

vercel Bot commented Jul 11, 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 Jul 12, 2026 3:46am
cmux-staging Building Building Preview, Comment Jul 12, 2026 3:46am

@coderabbitai

coderabbitai Bot commented Jul 11, 2026 •

Copy link
Copy Markdown

Review Change Stack

📝 Walkthrough

Walkthrough

The PR centralizes metadata generation for audited documentation pages, adds localized SEO copy selection and validation, updates translated metadata strings, and expands SEO regression tests across routes and locales.

Changes

Audited docs SEO

Layer / File(s) Summary
Docs SEO copy and punctuation rules
web/i18n/audited-seo.ts, web/i18n/seo.ts
Adds audited docs page keys and generates localized titles, social titles, and descriptions with Khmer punctuation support and configurable title context.
Shared metadata helper and page wiring
web/app/[locale]/(landing)/docs/audited-docs-metadata.ts, web/app/[locale]/(landing)/docs/*/page.tsx
Adds auditedDocsMetadata and routes audited docs pages through it, including locale-specific remote-tmux metadata.
Localized metadata source updates
web/messages/*.json
Adds or revises metaDescriptionShort, metaDescription, and related metadata strings across supported locales.
SEO matrix and regression coverage
web/tests/seo.test.ts
Tests audited route metadata, punctuation, title composition, description sourcing, formatting placeholders, and social-title selection.

Estimated code review effort: 4 (Complex) | ~45 minutes

Possibly related PRs

  • manaflow-ai/cmux#7561: Updates metadata generation for overlapping documentation routes using shared SEO helper logic.

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 No Hacky Sleeps ❌ Error FAIL: cmux-tui-core/src/server.rs adds std::thread::sleep(STREAM_DISCONNECT_POLL) in the accept loop as a fixed backoff for socket readiness. Replace the wall-clock backoff with an event-driven accept/cancel signal or dedicated retry scheduler that waits on the real socket/error event.
Cmux Full Internationalization ❌ Error FAIL: audited docs metadata isn’t fully localized—ar/da/ko/no lack audited docs metaDescriptionShort entries, and several locales duplicate full copy into metaDescriptionShort. Add distinct translated audited-docs metaDescriptionShort entries (or equivalent localized fields) for every locale in web/i18n/routing.ts, and make ohMyOpenCode short copy distinct where it matches the full description.
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (22 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly matches the main change: centralizing docs metadata after the Ahrefs audit.
Description check ✅ Passed The description covers the summary and testing, but omits the demo, review-trigger, and checklist sections from the template.
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 No Swift 6 isolation regression found: changed production Swift types are value types or an actor, and detached work captures only a Sendable file descriptor.
Cmux Swift Blocking Runtime ✅ Passed PR commit changes only TS/JSON docs SEO files; no Swift files or blocking-runtime primitives are introduced, so the Swift rule is not triggered.
Cmux Browser Automation Off-Main ✅ Passed PR only changes docs metadata/i18n; core browser command/router files aren’t touched and the patch has no browser wait/routing keywords, so the off-main rule isn’t implicated.
Cmux Expensive Synchronous Load ✅ Passed PASS: no RestorableAgentSessionIndex.load() or other agent-history loader was moved onto @MainActor; the new TextBoxGitIgnoreProbe path is async/off-main and uses Task.detached inside an ac...
Cmux Cache Substitution Correctness ✅ Passed PASS: The diff only rewires docs SEO metadata and locale strings; no persistence/history/undo/snapshot read was replaced by a cache, and auditedDocsMetadata still uses getMessages.
Cmux Algorithmic Complexity ✅ Passed Only metadata helpers changed; their scans/sorts run on tiny curated candidate arrays, not scalable user-owned collections or hot paths.
Cmux Swift Concurrency ✅ Passed No banned async patterns were introduced: the new Task usages are awaited subprocess/test boundaries, and the diff adds no DispatchQueue/Combine/completion-handler APIs.
Cmux Swift @Concurrent ✅ Passed No Swift concurrency rule violation: the new git-probe async helpers are background-only, and the diff adds no invalid @concurrent/nonisolated annotations.
Cmux Swift File And Package Boundaries ✅ Passed No Swift boundary violation: the new helper is 114 lines and cohesive, the 856-line store shrank by 105 lines, and the huge CLI file only got incidental edits.
Cmux Swiftpm Lockfiles ✅ Passed PR diff only touches docs/i18n files; no Package.resolved, .gitignore, workflow, or Xcode project changes are present, so the SwiftPM lockfile rule isn’t implicated.
Cmux Swift Logging ✅ Passed No added Swift logging hunks; the diff introduces no print/debugPrint/dump/NSLog/Logger changes in runtime code.
Cmux User-Facing Error Privacy ✅ Passed Diff only changes docs SEO metadata/i18n; no user-facing error/alert/API copy was added, and new throws are internal key-validation messages.
Cmux Swiftui State Layout ✅ Passed No changed file is a SwiftUI view; searches found no SwiftUI imports or state/layout patterns in the touched Swift files.
Cmux Architecture Rethink ✅ Passed PASS: PR only changes web/docs i18n files and SEO tests; no Swift files or architectural-rethink patterns are present, so the Swift rule is not applicable.
Cmux Swift Auxiliary Window Close Shortcuts ✅ Passed No NSWindow/WindowGroup or cmuxAuxiliaryWindowIdentifiers changes appear in the diff; the PR touches docs, CLI, and tests only.
Cmux Source Artifacts ✅ Passed Changed files are source/docs/tests/configs; the generated files are explicit checked-in outputs with generator headers, and no temp/build/artifact paths appear.
Cmux No Test Or Debug Seam In Production Source ✅ Passed PASS: The only changed Swift files are production sources, and the diff adds plain API/code with no #if DEBUG, test-only names, or widened accessors.
Cmux No Ambient Global State ✅ Passed Swift diff uses instance-based types/extensions only; no new top-level free funcs, mutable globals, or singletons were introduced.
✨ 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-docs-audit

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.

@greptile-apps

greptile-apps Bot commented Jul 11, 2026 •

Copy link
Copy Markdown
Contributor

Greptile Summary

This PR centralizes audited metadata for 17 documentation route families. The main changes are:

  • Adds one shared builder for HTML, Open Graph, Twitter, canonical, and locale metadata.
  • Selects bounded page and social titles without duplicating the docs layout suffix.
  • Uses curated localized descriptions with safe sentence-level fallbacks.
  • Expands localized SEO tests and message catalog entries.

Confidence Score: 5/5

This looks safe to merge.

  • The latest changes consistently use the shared metadata path across the audited routes.
  • The restricted locale set remains preserved for the remote-tmux route.
  • No blocking issue tied to an earlier review finding remains in the changed code.

Important Files Changed

Filename Overview
web/app/[locale]/(landing)/docs/audited-docs-metadata.ts Adds the shared server-side metadata builder used by the audited documentation routes.
web/i18n/audited-seo.ts Adds bounded documentation title, social title, and description selection.
web/i18n/seo.ts Extends Khmer punctuation handling and supports disabling automatic title context.
web/tests/seo.test.ts Expands route and locale checks for metadata sources, bounds, punctuation, and suffix composition.

Reviews (19): Last reviewed commit: "Merge remote-tracking branch 'origin/mai..." | Re-trigger Greptile

@chatgpt-codex-connector chatgpt-codex-connector 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.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 29dd57e68a

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread web/i18n/audited-seo.ts Outdated
@lawrencecchen
lawrencecchen changed the base branch from feat-seo-site-audit to main July 12, 2026 00:37
# Conflicts:
#	web/i18n/audited-seo.ts
#	web/i18n/seo.ts
#	web/tests/seo.test.ts

@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: 6

🤖 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/messages/de.json`:
- Line 1469: Update the German metaDescriptionShort translation to remove the
duplicated “mit” by using grammatically correct phrasing such as “per cmux ssh
mit Remote-Computern,” while preserving the rest of the description unchanged.
- Around line 1539-1541: Update the German `metaDescriptionShort` value in the
affected translation entry so it is genuinely condensed and no longer
byte-identical to `metaDescription`, while preserving the same core meaning and
language.

In `@web/messages/it.json`:
- Around line 1539-1540: Update the ohMyOpenCode metaDescriptionShort
translation in it.json so it is a genuinely condensed version rather than a
verbatim duplicate of metaDescription, matching the shorter-copy intent used by
the corresponding es.json, fr.json, and bs.json entries.

In `@web/messages/uk.json`:
- Line 1554: Align the metaDescriptionShort entries in the touched Ukrainian and
Simplified Chinese locale files so the same audited pages are covered in each,
including keyboardShortcuts, ohMyOpenCode, ssh, and ios. Add the missing curated
descriptions or remove inconsistent entries as needed, preserving the existing
localized wording and ensuring identical page coverage across both locale files.

In `@web/messages/zh-CN.json`:
- Around line 1540-1541: Update the ohMyOpenCode entry’s metaDescriptionShort to
a genuinely shorter, distinct summary rather than duplicating metaDescription,
while preserving metaDescription unchanged and keeping the short description’s
core product and cmux context.
- Line 1072: Align metaDescriptionShort coverage across zh-CN.json and uk.json
for the audited message entries: add the missing descriptions for ssh and ios in
zh-CN, and for keyboardShortcuts and ohMyOpenCode in uk, including the
additional entry at the referenced location. Preserve the existing
locale-specific wording and JSON structure.
🪄 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: 5f04cf62-cd6c-4244-86c1-4f5b0bf72a35

📥 Commits

Reviewing files that changed from the base of the PR and between 0c3a602 and c81e844.

📒 Files selected for processing (36)
  • web/app/[locale]/(landing)/docs/agent-integrations/oh-my-opencode/page.tsx
  • web/app/[locale]/(landing)/docs/api/page.tsx
  • web/app/[locale]/(landing)/docs/audited-docs-metadata.ts
  • web/app/[locale]/(landing)/docs/browser-automation/page.tsx
  • web/app/[locale]/(landing)/docs/concepts/page.tsx
  • web/app/[locale]/(landing)/docs/configuration/page.tsx
  • web/app/[locale]/(landing)/docs/custom-commands/page.tsx
  • web/app/[locale]/(landing)/docs/dock/page.tsx
  • web/app/[locale]/(landing)/docs/getting-started/page.tsx
  • web/app/[locale]/(landing)/docs/ios/page.tsx
  • web/app/[locale]/(landing)/docs/keyboard-shortcuts/page.tsx
  • web/app/[locale]/(landing)/docs/notifications/page.tsx
  • web/app/[locale]/(landing)/docs/remote-tmux/page.tsx
  • web/app/[locale]/(landing)/docs/session-restore/page.tsx
  • web/app/[locale]/(landing)/docs/skills/page.tsx
  • web/app/[locale]/(landing)/docs/ssh/page.tsx
  • web/app/[locale]/(landing)/docs/textbox/page.tsx
  • web/app/[locale]/(landing)/docs/workspace-groups/page.tsx
  • web/i18n/audited-seo.ts
  • web/i18n/seo.ts
  • web/messages/bs.json
  • web/messages/de.json
  • web/messages/es.json
  • web/messages/fr.json
  • web/messages/it.json
  • web/messages/ja.json
  • web/messages/km.json
  • web/messages/pl.json
  • web/messages/pt-BR.json
  • web/messages/ru.json
  • web/messages/th.json
  • web/messages/tr.json
  • web/messages/uk.json
  • web/messages/zh-CN.json
  • web/messages/zh-TW.json
  • web/tests/seo.test.ts

Comment thread web/messages/de.json
"title": "SSH",
"metaTitle": "SSH",
"metaDescription": "Stellen Sie mit cmux ssh eine Verbindung zu Remote-Computern her. Browserfenster werden durch das Remote-Netzwerk geleitet, Bilder werden per Drag-and-Drop per SCP verschoben und Agentenbenachrichtigungen kommen sofort nach Hause.",
"metaDescriptionShort": "Verbinde dich mit cmux ssh mit Remote-Computern. Browser laufen über das Remote-Netzwerk, Dateien über scp und Agentenmeldungen zurück zum Mac.",

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Grammar: duplicated "mit" in German short description.

"Verbinde dich mit cmux ssh mit Remote-Computern." repeats "mit", which reads as a translation slip (e.g. "Verbinde dich per cmux ssh mit Remote-Computern." would be correct German).

✏️ Proposed fix
-      "metaDescriptionShort": "Verbinde dich mit cmux ssh mit Remote-Computern. Browser laufen über das Remote-Netzwerk, Dateien über scp und Agentenmeldungen zurück zum Mac.",
+      "metaDescriptionShort": "Verbinde dich per cmux ssh mit Remote-Computern. Browser laufen über das Remote-Netzwerk, Dateien über scp und Agentenmeldungen zurück zum Mac.",
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
"metaDescriptionShort": "Verbinde dich mit cmux ssh mit Remote-Computern. Browser laufen über das Remote-Netzwerk, Dateien über scp und Agentenmeldungen zurück zum Mac.",
"metaDescriptionShort": "Verbinde dich per cmux ssh mit Remote-Computern. Browser laufen über das Remote-Netzwerk, Dateien über scp und Agentenmeldungen zurück zum Mac.",
🤖 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/messages/de.json` at line 1469, Update the German metaDescriptionShort
translation to remove the duplicated “mit” by using grammatically correct
phrasing such as “per cmux ssh mit Remote-Computern,” while preserving the rest
of the description unchanged.

Comment thread web/messages/de.json
Comment on lines +1539 to 1541
"metaDescription": "cmux omo startet OpenCode mit oh-my-openagent. Claude, GPT, Gemini und Grok arbeiten parallel als Agenten, jeweils in einem nativen cmux-Split.",
"metaDescriptionShort": "cmux omo startet OpenCode mit oh-my-openagent. Claude, GPT, Gemini und Grok arbeiten parallel als Agenten, jeweils in einem nativen cmux-Split."
},

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

metaDescriptionShort is an exact duplicate of metaDescription.

Unlike the equivalent ohMyOpenCode keys in es.json, fr.json, and bs.json (where the short variant is genuinely condensed), this German pair is byte-identical. This defeats the purpose of a distinct "short" social/meta description and re-introduces the duplicated-content pattern this PR is meant to eliminate.

✏️ Suggested distinct short copy
       "metaDescription": "cmux omo startet OpenCode mit oh-my-openagent. Claude, GPT, Gemini und Grok arbeiten parallel als Agenten, jeweils in einem nativen cmux-Split.",
-      "metaDescriptionShort": "cmux omo startet OpenCode mit oh-my-openagent. Claude, GPT, Gemini und Grok arbeiten parallel als Agenten, jeweils in einem nativen cmux-Split."
+      "metaDescriptionShort": "cmux omo koordiniert Claude, GPT, Gemini und Grok als parallele OpenCode-Agenten, jeweils in einem nativen cmux-Split."
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
"metaDescription": "cmux omo startet OpenCode mit oh-my-openagent. Claude, GPT, Gemini und Grok arbeiten parallel als Agenten, jeweils in einem nativen cmux-Split.",
"metaDescriptionShort": "cmux omo startet OpenCode mit oh-my-openagent. Claude, GPT, Gemini und Grok arbeiten parallel als Agenten, jeweils in einem nativen cmux-Split."
},
"metaDescription": "cmux omo startet OpenCode mit oh-my-openagent. Claude, GPT, Gemini und Grok arbeiten parallel als Agenten, jeweils in einem nativen cmux-Split.",
"metaDescriptionShort": "cmux omo koordiniert Claude, GPT, Gemini und Grok als parallele OpenCode-Agenten, jeweils in einem nativen cmux-Split."
},
🤖 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/messages/de.json` around lines 1539 - 1541, Update the German
`metaDescriptionShort` value in the affected translation entry so it is
genuinely condensed and no longer byte-identical to `metaDescription`, while
preserving the same core meaning and language.

Comment thread web/messages/it.json
Comment on lines +1539 to +1540
"metaDescription": "cmux omo avvia OpenCode con il plugin oh-my-openagent. Claude, GPT, Gemini e Grok lavorano in parallelo come agenti, ciascuno in una divisione cmux nativa.",
"metaDescriptionShort": "cmux omo avvia OpenCode con il plugin oh-my-openagent. Claude, GPT, Gemini e Grok lavorano in parallelo come agenti, ciascuno in una divisione cmux nativa."

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

metaDescriptionShort duplicates metaDescription verbatim.

Same issue as de.json: the short variant for ohMyOpenCode is byte-identical to the full description, unlike the genuinely condensed short copy used for this key in es.json/fr.json/bs.json.

✏️ Suggested distinct short copy
       "metaDescription": "cmux omo avvia OpenCode con il plugin oh-my-openagent. Claude, GPT, Gemini e Grok lavorano in parallelo come agenti, ciascuno in una divisione cmux nativa.",
-      "metaDescriptionShort": "cmux omo avvia OpenCode con il plugin oh-my-openagent. Claude, GPT, Gemini e Grok lavorano in parallelo come agenti, ciascuno in una divisione cmux nativa."
+      "metaDescriptionShort": "cmux omo coordina Claude, GPT, Gemini e Grok come agenti OpenCode paralleli, ciascuno in una divisione cmux nativa."
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
"metaDescription": "cmux omo avvia OpenCode con il plugin oh-my-openagent. Claude, GPT, Gemini e Grok lavorano in parallelo come agenti, ciascuno in una divisione cmux nativa.",
"metaDescriptionShort": "cmux omo avvia OpenCode con il plugin oh-my-openagent. Claude, GPT, Gemini e Grok lavorano in parallelo come agenti, ciascuno in una divisione cmux nativa."
"metaDescription": "cmux omo avvia OpenCode con il plugin oh-my-openagent. Claude, GPT, Gemini e Grok lavorano in parallelo come agenti, ciascuno in una divisione cmux nativa.",
"metaDescriptionShort": "cmux omo coordina Claude, GPT, Gemini e Grok come agenti OpenCode paralleli, ciascuno in una divisione cmux nativa."
🤖 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/messages/it.json` around lines 1539 - 1540, Update the ohMyOpenCode
metaDescriptionShort translation in it.json so it is a genuinely condensed
version rather than a verbatim duplicate of metaDescription, matching the
shorter-copy intent used by the corresponding es.json, fr.json, and bs.json
entries.

Comment thread web/messages/uk.json
"title": "SSH",
"metaTitle": "SSH",
"metaDescription": "Підключайтеся до віддалених машин за допомогою cmux ssh. Панелі браузера маршрутизуються через віддалену мережу, зображення перетягуються через scp, а сповіщення агента надходять додому.",
"metaDescriptionShort": "Підключайтеся через cmux ssh до віддалених машин, маршрутизуйте браузер віддалено, передавайте файли через scp і отримуйте сповіщення агентів.",

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🗄️ Data Integrity & Integration | 🟠 Major | 🏗️ Heavy lift

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

# Show supported locales and message files.
sed -n '1,220p' web/i18n/routing.ts

printf '\n--- message files ---\n'
git ls-files 'web/messages/*.json' | sort

printf '\n--- metaDescriptionShort occurrences ---\n'
rg -n '"metaDescriptionShort"\s*:' web/messages/*.json

Repository: manaflow-ai/cmux

Length of output: 9755


🏁 Script executed:

#!/bin/bash
set -euo pipefail

# Compare coverage of metaDescriptionShort for the likely audited docs keys.
python3 - <<'PY'
import json, glob, os
from collections import defaultdict

files = sorted(glob.glob('web/messages/*.json'))
keys = ["ssh", "ios", "keyboardShortcuts", "ohMyOpenCode"]
for path in files:
    with open(path, encoding='utf-8') as f:
        data = json.load(f)
    found = {}
    # Search top-level namespaces recursively for those page keys.
    for key in keys:
        # Most message files have docs metadata nested under docs.*; print any subtree containing the key.
        def walk(obj, prefix=""):
            if isinstance(obj, dict):
                if key in obj and isinstance(obj[key], dict):
                    if "metaDescriptionShort" in obj[key]:
                        return obj[key]["metaDescriptionShort"]
                for k, v in obj.items():
                    res = walk(v, prefix + k + ".")
                    if res is not None:
                        return res
            return None
        found[key] = walk(data)
    print(os.path.basename(path), found)
PY

Repository: manaflow-ai/cmux

Length of output: 5105


🏁 Script executed:

#!/bin/bash
set -euo pipefail

# If the metadata lives under docsMetadata/auditedDocsMetadata, inspect those sections directly.
python3 - <<'PY'
import json, glob, os

for path in sorted(glob.glob('web/messages/*.json')):
    with open(path, encoding='utf-8') as f:
        data = json.load(f)
    def pick(d, path_keys):
        for k in path_keys:
            if not isinstance(d, dict) or k not in d:
                return None
            d = d[k]
        return d
    # Common possible locations; print if present.
    candidates = [
        ("docsMetadata",),
        ("auditedDocsMetadata",),
        ("metadata",),
        ("docs",),
    ]
    print("\n", os.path.basename(path))
    for cand in candidates:
        node = pick(data, cand)
        if isinstance(node, dict):
            for k in ("ssh", "ios", "keyboardShortcuts", "ohMyOpenCode"):
                if k in node:
                    val = node[k]
                    if isinstance(val, dict) and "metaDescriptionShort" in val:
                        print(" ", ".".join(cand + (k,)), "=>", val["metaDescriptionShort"])
PY

Repository: manaflow-ai/cmux

Length of output: 4168


🏁 Script executed:

#!/bin/bash
set -euo pipefail

# Find where the audited docs metadata is stored in each locale catalog.
rg -n '"(auditedDocsMetadata|docsMetadata|metaDescriptionShort|keyboardShortcuts|ohMyOpenCode|ssh|ios)"' web/messages/*.json | head -n 400

Repository: manaflow-ai/cmux

Length of output: 24476


Align curated meta descriptions across locales.
web/messages/uk.json:1554,1625 and web/messages/zh-CN.json:1072,1541 split the audited metaDescriptionShort pages between different locale subsets, so some locales still lack curated descriptions for keyboardShortcuts, ohMyOpenCode, ssh, or ios. Make the page set and metaDescriptionShort coverage identical in every touched locale file.

🤖 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/messages/uk.json` at line 1554, Align the metaDescriptionShort entries in
the touched Ukrainian and Simplified Chinese locale files so the same audited
pages are covered in each, including keyboardShortcuts, ohMyOpenCode, ssh, and
ios. Add the missing curated descriptions or remove inconsistent entries as
needed, preserving the existing localized wording and ensuring identical page
coverage across both locale files.

Comment thread web/messages/zh-CN.json
"title": "快捷键",
"description": "cmux 中所有可用的快捷键,按类别分组。",
"metaDescription": "cmux 的所有 macOS 快捷键,涵盖工作区、surface、分屏面板、浏览器、通知、查找和窗口管理。",
"metaDescriptionShort": "cmux 的所有 macOS 快捷键,涵盖工作区、surface、分屏面板、浏览器、通知、查找、可配置的键盘操作、搜索流程与窗口导航。",

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🗄️ Data Integrity & Integration | 🟠 Major | 🏗️ Heavy lift

Cross-locale metaDescriptionShort coverage gap (mirrors uk.json in reverse).

zh-CN.json adds metaDescriptionShort for keyboardShortcuts, textBox, and ohMyOpenCode, but not for ssh/ios — while web/messages/uk.json does the opposite (adds it for ssh/ios, omits it for keyboardShortcuts/ohMyOpenCode). This same-PR divergence means the curated short description isn't consistently available per locale for the audited page set.

Also applies to: 1526-1526

🤖 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/messages/zh-CN.json` at line 1072, Align metaDescriptionShort coverage
across zh-CN.json and uk.json for the audited message entries: add the missing
descriptions for ssh and ios in zh-CN, and for keyboardShortcuts and
ohMyOpenCode in uk, including the additional entry at the referenced location.
Preserve the existing locale-specific wording and JSON structure.

Comment thread web/messages/zh-CN.json
Comment on lines +1540 to +1541
"metaDescription": "oh-my-opencode(cmux omo)在 cmux 中运行带 oh-my-openagent 插件的 OpenCode CLI。将 Claude、GPT、Gemini 和 Grok 作为并行 agent 编排,每个都在独立的原生 cmux 分屏中。",
"metaDescriptionShort": "oh-my-opencode(cmux omo)在 cmux 中运行带 oh-my-openagent 插件的 OpenCode CLI。将 Claude、GPT、Gemini 和 Grok 作为并行 agent 编排,每个都在独立的原生 cmux 分屏中。"

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

metaDescriptionShort duplicates metaDescription verbatim.

Both fields for ohMyOpenCode contain the exact same text. This provides no distinct short-form curated description and runs counter to the PR's own stated goal of rejecting duplicated SEO copy. Please author a genuinely shorter/distinct summary for metaDescriptionShort.

🤖 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/messages/zh-CN.json` around lines 1540 - 1541, Update the ohMyOpenCode
entry’s metaDescriptionShort to a genuinely shorter, distinct summary rather
than duplicating metaDescription, while preserving metaDescription unchanged and
keeping the short description’s core product and cmux context.

@lawrencecchen
lawrencecchen merged commit 690ca58 into main Jul 12, 2026
34 checks passed

This branch was successfully deployed

1 active deployment
Preview – cmux — c81e8446 Deployed Jul 12, 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