Repository navigation
Add cmux SSH blog post - #2377
Conversation
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
|
Note Reviews pausedIt looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the Use the following commands to manage reviews:
Use the checkboxes below for quick actions:
📝 WalkthroughWalkthroughAdds 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
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~25 minutes Possibly related PRs
Poem
🚥 Pre-merge checks | ✅ 1 | ❌ 2❌ Failed checks (2 warnings)
✅ Passed checks (1 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
💡 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", |
There was a problem hiding this comment.
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 SummaryThis 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 Key observations:
Confidence Score: 5/5
Important Files Changed
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
Reviews (1): Last reviewed commit: "Add cmux SSH blog post" | Re-trigger Greptile |
There was a problem hiding this comment.
🧹 Nitpick comments (1)
web/app/[locale]/blog/cmux-ssh/page.tsx (1)
95-104: Consider addingtargetandrelattributes 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-startedlink correctly uses theLinkcomponent 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
📒 Files selected for processing (5)
web/app/[locale]/blog/cmux-ssh/page.tsxweb/app/[locale]/blog/page.tsxweb/app/[locale]/components/blog-posts.tsweb/app/sitemap.tsweb/messages/en.json
There was a problem hiding this comment.
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.
| <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> |
There was a problem hiding this comment.
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>
There was a problem hiding this comment.
💡 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".
| <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> |
There was a problem hiding this comment.
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 👍 / 👎.
There was a problem hiding this comment.
💡 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".
| "cmuxOmo", | ||
| "cmuxClaudeTeams", |
There was a problem hiding this comment.
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 👍 / 👎.
There was a problem hiding this comment.
💡 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", |
There was a problem hiding this comment.
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 👍 / 👎.
There was a problem hiding this comment.
💡 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".
| "cmuxSsh", | ||
| "cmuxClaudeTeams", | ||
| "cmuxOmo", | ||
| "gpl", |
There was a problem hiding this comment.
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 👍 / 👎.
There was a problem hiding this comment.
💡 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".
| <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> |
There was a problem hiding this comment.
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 👍 / 👎.
There was a problem hiding this comment.
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.
| "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." |
There was a problem hiding this comment.
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>
| "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." |
| </p> | ||
|
|
||
| <p className="mt-4"> | ||
| <Link href="/docs/agent-integrations/oh-my-opencode">Read the docs →</Link> |
There was a problem hiding this comment.
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 →</Link>
+ </p>
</>
</file context>
| <h2>{t("usage")}</h2> | ||
| <CodeBlock lang="bash">{`cmux ssh user@remote | ||
| cmux ssh user@remote --name "dev server" | ||
| cmux ssh user@remote -p 2222 |
There was a problem hiding this comment.
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>
There was a problem hiding this comment.
💡 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"); |
There was a problem hiding this comment.
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 →</Link> |
There was a problem hiding this comment.
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 👍 / 👎.
There was a problem hiding this comment.
💡 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".
| "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)", |
There was a problem hiding this comment.
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 👍 / 👎.
Summary
/blog/cmux-sshcovering the SSH feature: persistent sessions, browser pane proxying, notification relay, coding agents over SSH, and architecture overviewTest plan
/blog/cmux-sshSummary by cubic
Publishes four localized blog posts —
cmux SSH,cmux claude-teams,cmux omo, andcmux is now GPL— and adds a localized/docs/sshpage. Updates the blog index, docs nav, sitemap, and embeds demo videos in the SSH post and related docs.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./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.jsonupdated.Written for commit 4569f75. Summary will update on new commits.
Summary by CodeRabbit