Skip to content

Add cmux SSH blog post - #2377

Merged
lawrencecchen merged 22 commits into
mainfrom
feat-ssh-blog-post
Mar 31, 2026
Merged

lawrencecchen merged 22 commits into
mainfrom
feat-ssh-blog-post

Conversation

@lawrencecchen

@lawrencecchen lawrencecchen commented Mar 31, 2026 •

Copy link
Copy Markdown
Contributor

Summary

  • Adds blog post at /blog/cmux-ssh covering the SSH feature: persistent sessions, browser pane proxying, notification relay, coding agents over SSH, and architecture overview
  • Updates blog index, blog registry, sitemap, and en.json translations

Test plan

  • Verify Vercel preview renders the post at /blog/cmux-ssh
  • Check blog index shows the new post at the top
  • Verify prev/next navigation works from the post

Summary by cubic

Publishes four localized blog posts — cmux SSH, cmux claude-teams, cmux omo, and cmux is now GPL — and adds a localized /docs/ssh page. Updates the blog index, docs nav, sitemap, and embeds demo videos in the SSH post and related docs.

  • New Features
    • Blog posts: 4 localized posts with SEO metadata/alternates; blog index/registry updated (slug maps: cmuxSsh→cmux-ssh, cmuxClaudeTeams→cmux-claude-teams, cmuxOmo→cmux-omo, gpl→gpl; order: cmux-ssh, cmux-claude-teams, cmux-omo, gpl); back-to-blog links; posts link to relevant docs.
    • Media and docs: SSH post includes an image-upload demo and relay-daemon notes; claude-teams and omo posts include demo videos; added demo videos to /docs/ssh, /docs/agent-integrations/claude-code-teams, and /docs/agent-integrations/oh-my-opencode.
    • /docs/ssh: localized usage/flags and feature details; added to Docs nav and alternates; sitemap lists the four posts (lastModified 2026-03-30) and /docs/ssh (lastModified 2026-03-31); en.json updated.

Written for commit 4569f75. Summary will update on new commits.

Summary by CodeRabbit

  • New Features
    • Added three new localized blog posts: "cmux SSH", "cmux omo", and "cmux claude-teams" and surfaced them in the blog index with links and back-navigation.
  • Documentation
    • Published localized article content (titles, dates, summaries, paragraphs, and in-article links) for all three posts.
  • SEO / Site map
    • Added localized metadata (title, description, OpenGraph/Twitter fields, alternates) and included the new posts in the sitemap.

@vercel

vercel Bot commented Mar 31, 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 Mar 31, 2026 11:53am

@coderabbitai

coderabbitai Bot commented Mar 31, 2026 •

Copy link
Copy Markdown

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 three localized blog posts (cmux-omo, cmux-claude-teams, cmux-ssh): new Next.js route pages with generateMetadata + localized content, updates to blog listing and shared blogPosts, sitemap entries, and new English i18n messages for each post.

Changes

Cohort / File(s) Summary
New Blog Pages
web/app/[locale]/blog/cmux-ssh/page.tsx, web/app/[locale]/blog/cmux-omo/page.tsx, web/app/[locale]/blog/cmux-claude-teams/page.tsx
Added three localized Next.js App Router pages. Each exports async generateMetadata (loads translations, builds localized SEO/OpenGraph/Twitter metadata and alternates) and a default component rendering localized post content, back link, title, publication time, and post body (including one rich interpolation link).
Blog Index & Shared Posts
web/app/[locale]/blog/page.tsx, web/app/[locale]/components/blog-posts.ts
Added three new slugs (cmuxOmo, cmuxClaudeTeams, cmuxSsh) to the blog listing and extended exported blogPosts with corresponding entries (slug, key, title, date, summary).
Sitemap & i18n messages
web/app/sitemap.ts, web/messages/en.json
Registered /blog/cmux-claude-teams, /blog/cmux-omo, /blog/cmux-ssh in sitemap with lastModified: "2026-03-30", changeFrequency: "monthly", priority: 0.7; added English i18n keys for three blog category meta entries and three blog.posts.* objects containing titles, summaries, dates, and paragraph/content fields.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Possibly related PRs

Poem

🐰 I hopped through locales, stitched three posts tight,
Titles and metas set just right.
Sitemap pebbles and messages sown,
Three new burrows now have a home.
Tiny paws, big bytes — hop to deploy! 🥕✨

🚥 Pre-merge checks | ✅ 1 | ❌ 2

❌ Failed checks (2 warnings)

Check name Status Explanation Resolution
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.
Description check ⚠️ Warning The PR description includes a summary of changes but lacks complete sections required by the repository template. Add Testing section with how you tested the change and what you verified manually, include a Demo Video URL, and add the Review Trigger block and completed Checklist with all required items.
✅ Passed checks (1 passed)
Check name Status Explanation
Title check ✅ Passed The title 'Add cmux SSH blog post' accurately describes the primary change: adding a new blog post for the cmux SSH feature, which is the main focus of the PR.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ 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-ssh-blog-post

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.

@cubic-dev-ai cubic-dev-ai 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.

No issues found across 5 files

@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: 0e461dc93f

ℹ️ 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".

}

const blogSlugs = [
"cmuxSsh",

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P1 Badge Add locale strings before listing the new blog post

Adding cmuxSsh to the blog index makes t('posts.cmuxSsh.*') resolve on every locale, but this commit only adds the new keys in web/messages/en.json; e.g. web/messages/ja.json has no blog.cmuxSsh or blog.posts.cmuxSsh, so /ja/blog and /ja/blog/cmux-ssh now fall back to English content instead of localized copy. Since this project’s localization policy requires user-facing text to be translated for supported locales, this is a regression for non-English users.

Useful? React with 👍 / 👎.

@greptile-apps

greptile-apps Bot commented Mar 31, 2026

Copy link
Copy Markdown
Contributor

Greptile Summary

This PR adds the cmux SSH blog post, covering persistent remote sessions, browser pane proxying, notification relay, and coding agents over SSH. The implementation follows the established blog post pattern exactly — new page component, translation keys in en.json, registry entry in blog-posts.ts, index update in blog/page.tsx, and sitemap entry.

Key observations:

  • All translation namespaces are correct: blog.cmuxSsh for metadata (matching generateMetadata), blog.posts.cmuxSsh for post content (matching the component)
  • Prev/next navigation works correctly: cmux-ssh is inserted at index 0 of blogPosts (most recent), so BlogPager shows no "prev" and cmd-shift-u as "next"
  • Non-English locales fall back to English content gracefully via the deepMergeMessages strategy already in i18n/request.ts
  • The hardcoded title: "cmux SSH" in blog-posts.ts is shorter than the full en.json title, but this field is never used for rendering — BlogPager resolves all titles via t(\${post.key}.title`)` from translations

Confidence Score: 5/5

  • Safe to merge — content-only blog post addition with no logic changes and no functional issues found.
  • All five changed files follow the established patterns precisely. Translation namespaces are correct, prev/next pager navigation resolves correctly, the i18n fallback handles non-English locales, and the sitemap and registry entries are consistent. No P0 or P1 findings; the only minor observation (shorter hardcoded title in blog-posts.ts) is a pre-existing non-issue since that field is never rendered.
  • No files require special attention.

Important Files Changed

Filename Overview
web/app/[locale]/blog/cmux-ssh/page.tsx New blog post page, consistent with existing blog post pattern; uses correct translation namespaces (blog.cmuxSsh for metadata, blog.posts.cmuxSsh for content)
web/app/[locale]/blog/page.tsx Adds cmuxSsh at the top of blogSlugs and slugToPath, correctly placing the new post first in the blog index
web/app/[locale]/components/blog-posts.ts Adds the new post at array position 0; note the hardcoded title "cmux SSH" differs from the full en.json title, but this field is not used for rendering (BlogPager resolves titles from translations)
web/app/sitemap.ts Adds /blog/cmux-ssh entry; entry is inserted between zen-of-cmux and cmd-shift-u but the list was not chronologically ordered to begin with, so no functional issue
web/messages/en.json Adds both blog.cmuxSsh (metadata keys) and blog.posts.cmuxSsh (full post content including rich text cta); non-English locales will fall back to English via the deepMergeMessages strategy in i18n/request.ts

Flowchart

%%{init: {'theme': 'neutral'}}%%
flowchart TD
    A[User visits /blog] --> B[blog/page.tsx\nblogSlugs array]
    B --> C{slug = cmuxSsh}
    C --> D[slugToPath: cmux-ssh]
    D --> E[Link to /blog/cmux-ssh]

    F[User visits /blog/cmux-ssh] --> G[cmux-ssh/page.tsx]
    G --> H[generateMetadata\nnamespace: blog.cmuxSsh]
    G --> I[CmuxSshPage\nnamespace: blog.posts.cmuxSsh]
    H --> J[en.json\nblog.cmuxSsh.metaTitle/metaDescription]
    I --> K[en.json\nblog.posts.cmuxSsh.*]

    L[blog/layout.tsx] --> M[BlogPager]
    M --> N[blog-posts.ts\nblogPosts array]
    N --> O{findIndex slug = cmux-ssh\nindex = 0}
    O --> P[prev = null\nnext = cmd-shift-u]

    style G fill:#d4edda
    style K fill:#d4edda
    style J fill:#d4edda
Loading

Reviews (1): Last reviewed commit: "Add cmux SSH blog post" | Re-trigger Greptile

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

🧹 Nitpick comments (1)
web/app/[locale]/blog/cmux-ssh/page.tsx (1)

95-104: Consider adding target and rel attributes to the external GitHub link.

The external link to GitHub (line 101) opens in the same tab, which may cause users to navigate away from the blog post unexpectedly. The internal /docs/getting-started link correctly uses the Link component for client-side navigation.

💡 Suggested enhancement for external link
          github: (chunks) => (
-            <a href="https://github.com/manaflow-ai/cmux">{chunks}</a>
+            <a href="https://github.com/manaflow-ai/cmux" target="_blank" rel="noopener noreferrer">{chunks}</a>
          ),
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@web/app/`[locale]/blog/cmux-ssh/page.tsx around lines 95 - 104, The external
GitHub anchor inside the t.rich call currently opens in the same tab; update the
github renderer (the anonymous function passed as github: (chunks) => (<a
href="https://github.com/manaflow-ai/cmux">{chunks}</a>)) to include
target="_blank" and rel="noopener noreferrer" on the <a> element so the link
opens in a new tab securely while keeping the existing Link usage for the
internal route.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Nitpick comments:
In `@web/app/`[locale]/blog/cmux-ssh/page.tsx:
- Around line 95-104: The external GitHub anchor inside the t.rich call
currently opens in the same tab; update the github renderer (the anonymous
function passed as github: (chunks) => (<a
href="https://github.com/manaflow-ai/cmux">{chunks}</a>)) to include
target="_blank" and rel="noopener noreferrer" on the <a> element so the link
opens in a new tab securely while keeping the existing Link usage for the
internal route.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: f2bc2d70-5f5b-4f43-bbb6-9e6972fe188a

📥 Commits

Reviewing files that changed from the base of the PR and between d015ace and 0e461dc.

📒 Files selected for processing (5)
  • web/app/[locale]/blog/cmux-ssh/page.tsx
  • web/app/[locale]/blog/page.tsx
  • web/app/[locale]/components/blog-posts.ts
  • web/app/sitemap.ts
  • web/messages/en.json

@cubic-dev-ai cubic-dev-ai 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.

1 issue found across 2 files (changes from recent commits).

Prompt for AI agents (unresolved issues)

Check if these issues are valid — if so, understand the root cause of each and fix them. If appropriate, use sub-agents to investigate and fix each issue separately.


<file name="web/app/[locale]/blog/cmux-ssh/page.tsx">

<violation number="1" location="web/app/[locale]/blog/cmux-ssh/page.tsx:55">
P2: These list items are hard-coded English strings on a localized page. Use translation keys so other locales don’t render English-only content.</violation>
</file>

Reply with feedback, questions, or to request a fix. Tag @cubic-dev-ai to re-run a review.

Comment thread web/app/[locale]/blog/cmux-ssh/page.tsx Outdated
<p className="mt-6">{t("p1")}</p>

<ul className="mt-4 space-y-1">
<li>Browser panes route traffic through the remote network, so localhost:3000 reaches the remote dev server without -L flags</li>

@cubic-dev-ai cubic-dev-ai Bot Mar 31, 2026 •

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2: These list items are hard-coded English strings on a localized page. Use translation keys so other locales don’t render English-only content.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At web/app/[locale]/blog/cmux-ssh/page.tsx, line 55:

<comment>These list items are hard-coded English strings on a localized page. Use translation keys so other locales don’t render English-only content.</comment>

<file context>
@@ -50,7 +50,14 @@ export default function CmuxSshPage() {
-      <p>{t("p2")}</p>
+
+      <ul className="mt-4 space-y-1">
+        <li>Browser panes route traffic through the remote network, so localhost:3000 reaches the remote dev server without -L flags</li>
+        <li>Coding agents on the remote box send notifications to your local sidebar</li>
+        <li>cmux claude-teams and cmux omo work over SSH, spawning teammate panes locally while computation runs remote</li>
</file context>
Fix with Cubic

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

ℹ️ 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/app/[locale]/blog/cmux-ssh/page.tsx Outdated
Comment on lines +55 to +59
<li>Browser panes route traffic through the remote network, so localhost:3000 reaches the remote dev server without -L flags</li>
<li>Coding agents on the remote box send notifications to your local sidebar</li>
<li>cmux claude-teams and cmux omo work over SSH, spawning teammate panes locally while computation runs remote</li>
<li>Drag a file into a remote terminal to upload via scp</li>
<li>The sidebar shows connection state and detected listening ports</li>

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Localize SSH feature bullets via translation keys

These <li> entries are hardcoded English strings instead of coming from useTranslations, so localized routes such as /ja/blog/cmux-ssh will always show English for this section even if locale message files are translated. This introduces mixed-language content and bypasses the project’s i18n path used by other blog copy; move these bullets into blog.posts.cmuxSsh keys and render them via t(...)/t.rich(...).

Useful? React with 👍 / 👎.

@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: 0ead71d5fe

ℹ️ 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/app/[locale]/blog/page.tsx Outdated
Comment on lines +21 to +22
"cmuxOmo",
"cmuxClaudeTeams",

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P1 Badge Add locale keys before listing new OMO/Claude posts

Including cmuxOmo and cmuxClaudeTeams in blogSlugs makes /ja/blog immediately render t('posts.cmuxOmo.*') and t('posts.cmuxClaudeTeams.*'), but this commit only adds those namespaces in web/messages/en.json (there are no matching keys in web/messages/ja.json). As a result, Japanese users see English fallback content on the blog index and on /ja/blog/cmux-omo and /ja/blog/cmux-claude-teams, which regresses localization for those newly published pages.

Useful? React with 👍 / 👎.

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

ℹ️ 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".

"cmuxSsh",
"cmuxClaudeTeams",
"cmuxOmo",
"gpl",

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Add localized GPL strings before listing the new post

Adding gpl to blogSlugs makes localized pages resolve t('posts.gpl.*'), but this commit only adds blog.gpl/blog.posts.gpl in web/messages/en.json; there are no matching keys in web/messages/ja.json. As a result, /ja/blog and /ja/blog/gpl fall back to English content, which regresses localization consistency for Japanese users.

Useful? React with 👍 / 👎.

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

ℹ️ 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 on lines +21 to +24
"cmuxSsh",
"cmuxClaudeTeams",
"cmuxOmo",
"gpl",

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P1 Badge Add locale keys before listing new blog posts

Adding these slugs makes every non-English blog index/post resolve blog.posts.{cmuxSsh,cmuxClaudeTeams,cmuxOmo,gpl}.*, but this commit only adds those namespaces in web/messages/en.json, so localized routes silently fall back to English content. Fresh evidence: web/i18n/routing.ts declares 20 locales, and searching web/messages/*.json shows these new keys exist only in en.json, which regresses localization quality for all translated locales.

Useful? React with 👍 / 👎.

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

ℹ️ 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 on lines +41 to +43
<tr><td><code>-p, --port</code></td><td>{t("flagPort")}</td></tr>
<tr><td><code>-i, --identity</code></td><td>{t("flagIdentity")}</td></tr>
<tr><td><code>-o, --ssh-option</code></td><td>{t("flagSshOption")}</td></tr>

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P1 Badge Remove unsupported short SSH flags from docs

The SSH docs advertise -p, -i, and -o, but cmux ssh only accepts long flags (--port, --identity, --ssh-option): parseSSHCommandOptions in CLI/cmux.swift handles only the long forms, and ssh --help (same file) also lists only long flags. With the current examples/table, copy-pasting commands like cmux ssh user@remote -p 2222 is parsed as remote command arguments after the destination rather than SSH options, so users get incorrect behavior instead of setting port/identity/options.

Useful? React with 👍 / 👎.

@cubic-dev-ai cubic-dev-ai 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.

3 issues found across 7 files (changes from recent commits).

Prompt for AI agents (unresolved issues)

Check if these issues are valid — if so, understand the root cause of each and fix them. If appropriate, use sub-agents to investigate and fix each issue separately.


<file name="web/app/[locale]/blog/cmux-omo/page.tsx">

<violation number="1" location="web/app/[locale]/blog/cmux-omo/page.tsx:66">
P2: Avoid hardcoded English CTA text on a localized `[locale]` page; use a translation key so non-English locales render correctly.</violation>
</file>

<file name="web/messages/en.json">

<violation number="1" location="web/messages/en.json:691">
P1: `daemonPath` uses unescaped `<version>/<os>-<arch>` placeholders, which are parsed as rich-text tags instead of literal text in next-intl. This can break rendering of the SSH docs page.</violation>
</file>

<file name="web/app/[locale]/docs/ssh/page.tsx">

<violation number="1" location="web/app/[locale]/docs/ssh/page.tsx:27">
P2: Use long-form SSH flags in the docs examples and flag list. Documenting unsupported short options causes copied commands to be parsed incorrectly instead of setting SSH connection options.</violation>
</file>

Reply with feedback, questions, or to request a fix. Tag @cubic-dev-ai to re-run a review.

Comment thread web/messages/en.json
"daemonRelayHow": "Reverse TCP tunnel with HMAC-SHA256 auth so remote processes can call cmux commands locally",
"daemonSession": "Session management",
"daemonSessionHow": "Persists sessions across reconnects, coordinates PTY resize across multiple attachments",
"daemonPath": "The daemon binary is stored at ~/.cmux/bin/cmuxd-remote/<version>/<os>-<arch>/cmuxd-remote on the remote host and verified against a SHA-256 manifest embedded in the app."

@cubic-dev-ai cubic-dev-ai Bot Mar 31, 2026 •

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P1: daemonPath uses unescaped <version>/<os>-<arch> placeholders, which are parsed as rich-text tags instead of literal text in next-intl. This can break rendering of the SSH docs page.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At web/messages/en.json, line 691:

<comment>`daemonPath` uses unescaped `<version>/<os>-<arch>` placeholders, which are parsed as rich-text tags instead of literal text in next-intl. This can break rendering of the SSH docs page.</comment>

<file context>
@@ -653,6 +653,43 @@
+      "daemonRelayHow": "Reverse TCP tunnel with HMAC-SHA256 auth so remote processes can call cmux commands locally",
+      "daemonSession": "Session management",
+      "daemonSessionHow": "Persists sessions across reconnects, coordinates PTY resize across multiple attachments",
+      "daemonPath": "The daemon binary is stored at ~/.cmux/bin/cmuxd-remote/<version>/<os>-<arch>/cmuxd-remote on the remote host and verified against a SHA-256 manifest embedded in the app."
+    },
     "changelog": {
</file context>
Suggested change
"daemonPath": "The daemon binary is stored at ~/.cmux/bin/cmuxd-remote/<version>/<os>-<arch>/cmuxd-remote on the remote host and verified against a SHA-256 manifest embedded in the app."
"daemonPath": "The daemon binary is stored at ~/.cmux/bin/cmuxd-remote/[version]/[os]-[arch]/cmuxd-remote on the remote host and verified against a SHA-256 manifest embedded in the app."
Fix with Cubic

</p>

<p className="mt-4">
<Link href="/docs/agent-integrations/oh-my-opencode">Read the docs &rarr;</Link>

@cubic-dev-ai cubic-dev-ai Bot Mar 31, 2026 •

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2: Avoid hardcoded English CTA text on a localized [locale] page; use a translation key so non-English locales render correctly.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At web/app/[locale]/blog/cmux-omo/page.tsx, line 66:

<comment>Avoid hardcoded English CTA text on a localized `[locale]` page; use a translation key so non-English locales render correctly.</comment>

<file context>
@@ -61,6 +61,10 @@ export default function CmuxOmoPage() {
       </p>
+
+      <p className="mt-4">
+        <Link href="/docs/agent-integrations/oh-my-opencode">Read the docs &rarr;</Link>
+      </p>
     </>
</file context>
Fix with Cubic

<h2>{t("usage")}</h2>
<CodeBlock lang="bash">{`cmux ssh user@remote
cmux ssh user@remote --name "dev server"
cmux ssh user@remote -p 2222

@cubic-dev-ai cubic-dev-ai Bot Mar 31, 2026 •

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2: Use long-form SSH flags in the docs examples and flag list. Documenting unsupported short options causes copied commands to be parsed incorrectly instead of setting SSH connection options.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At web/app/[locale]/docs/ssh/page.tsx, line 27:

<comment>Use long-form SSH flags in the docs examples and flag list. Documenting unsupported short options causes copied commands to be parsed incorrectly instead of setting SSH connection options.</comment>

<file context>
@@ -0,0 +1,84 @@
+      <h2>{t("usage")}</h2>
+      <CodeBlock lang="bash">{`cmux ssh user@remote
+cmux ssh user@remote --name "dev server"
+cmux ssh user@remote -p 2222
+cmux ssh user@remote -i ~/.ssh/id_ed25519`}</CodeBlock>
+      <p>{t("usageDesc")}</p>
</file context>
Fix with Cubic

@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: 954f89b48a

ℹ️ 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".

}

export default function SshPage() {
const t = useTranslations("docs.ssh");

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P1 Badge Localize SSH docs strings before publishing route

This page is wired to useTranslations("docs.ssh"), but this commit only adds docs.ssh/docs.navItems.ssh in web/messages/en.json; rg '"ssh"\s*:\s*\{' web/messages/*.json shows no non-English equivalents. Because localized docs routes are enabled, users on locales like /ja/docs/ssh and the docs sidebar will get English fallback content, which violates the AGENTS.md requirement that all user-facing strings be localized.

Useful? React with 👍 / 👎.

</p>

<p className="mt-4">
<Link href="/docs/agent-integrations/claude-code-teams">Read the docs &rarr;</Link>

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P1 Badge Move blog CTA labels into locale messages

The CTA text is hardcoded English (Read the docs →) instead of coming from useTranslations, so localized blog routes will still show mixed-language UI even after post body translations are added. The same pattern appears in all three newly added posts (cmux-claude-teams, cmux-omo, cmux-ssh), and AGENTS.md explicitly requires user-facing strings to be localized.

Useful? React with 👍 / 👎.

@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: 4569f75b59

ℹ️ 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/messages/en.json
"flagNameVal": "Set the workspace title",
"flagPort": "SSH port (default 22)",
"flagIdentity": "Path to identity file",
"flagSshOption": "Pass arbitrary SSH options (e.g. -o StrictHostKeyChecking=no)",

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Document --ssh-option values without the -o prefix

This description tells users to pass --ssh-option values like -o StrictHostKeyChecking=no, but parseSSHCommandOptions (in CLI/cmux.swift) consumes exactly one value after --ssh-option and baseSSHArguments later adds its own -o wrapper for every option. In practice, a command copied from this text generates an invalid SSH invocation (or treats StrictHostKeyChecking=no as a remote command arg), so users cannot set the option as documented.

Useful? React with 👍 / 👎.

@lawrencecchen
lawrencecchen merged commit 51fe28e into main Mar 31, 2026
18 checks passed
@lawrencecchen
lawrencecchen deleted the feat-ssh-blog-post branch March 31, 2026 12:11

This branch was successfully deployed

1 active deployment
Preview — 4569f75b Deployed Mar 31, 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