From 51fe28e45dbe79145efed09da5a78841d54f95a0 Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Tue, 31 Mar 2026 05:11:57 -0700 Subject: [PATCH] Add cmux SSH blog post (#2377) * Add cmux SSH blog post * Shorten SSH blog post, remove headings * Trim SSH blog post to 2 paragraphs * Remove first person, add feature bullet list * Clarify no port forwarding needed * Add cmux claude-teams and cmux omo blog posts * Wrap command names in code tags * Add code tags to SSH post, shorten claude-teams and omo paragraphs * Reorder blog posts: SSH first, then claude-teams and omo * Update omo post with actual oh-my-openagent details, improve titles * Add GPL blog post, fix omo title to specialist agents * Explain what the relay daemon is for in SSH post * Move drag-image to second bullet, use routes through * Rewrite SSH intro, add image upload video * Add SSH docs page, link blog posts to docs * Add omo demo video to blog post * Trim omo agent details * Lead omo paragraph with cmux omo command * Rename omo title to oh-my-openagent subagents * Add claude-teams demo video to blog post * Fix omo naming, link to docs instead of blog posts * Add demo videos to SSH blog, SSH docs, claude-teams docs, omo docs --------- Co-authored-by: Lawrence Chen --- .../[locale]/blog/cmux-claude-teams/page.tsx | 86 ++++++++++++++++ web/app/[locale]/blog/cmux-omo/page.tsx | 81 +++++++++++++++ web/app/[locale]/blog/cmux-ssh/page.tsx | 90 +++++++++++++++++ web/app/[locale]/blog/gpl/page.tsx | 56 +++++++++++ web/app/[locale]/blog/page.tsx | 8 ++ web/app/[locale]/components/blog-posts.ts | 32 ++++++ web/app/[locale]/components/docs-nav-items.ts | 1 + .../claude-code-teams/page.tsx | 11 +++ .../oh-my-opencode/page.tsx | 11 +++ web/app/[locale]/docs/ssh/page.tsx | 92 ++++++++++++++++++ web/app/sitemap.ts | 5 + web/messages/en.json | 84 ++++++++++++++++ web/public/blog/cmux-claude-teams-demo.mp4 | Bin 0 -> 2580973 bytes web/public/blog/cmux-omo-demo.mp4 | Bin 0 -> 5331026 bytes web/public/blog/cmux-ssh-image-upload.mp4 | Bin 0 -> 6566115 bytes 15 files changed, 557 insertions(+) create mode 100644 web/app/[locale]/blog/cmux-claude-teams/page.tsx create mode 100644 web/app/[locale]/blog/cmux-omo/page.tsx create mode 100644 web/app/[locale]/blog/cmux-ssh/page.tsx create mode 100644 web/app/[locale]/blog/gpl/page.tsx create mode 100644 web/app/[locale]/docs/ssh/page.tsx create mode 100644 web/public/blog/cmux-claude-teams-demo.mp4 create mode 100644 web/public/blog/cmux-omo-demo.mp4 create mode 100644 web/public/blog/cmux-ssh-image-upload.mp4 diff --git a/web/app/[locale]/blog/cmux-claude-teams/page.tsx b/web/app/[locale]/blog/cmux-claude-teams/page.tsx new file mode 100644 index 00000000..25abae72 --- /dev/null +++ b/web/app/[locale]/blog/cmux-claude-teams/page.tsx @@ -0,0 +1,86 @@ +import { useTranslations } from "next-intl"; +import { getTranslations } from "next-intl/server"; +import { buildAlternates } from "../../../../i18n/seo"; +import { Link } from "../../../../i18n/navigation"; + +export async function generateMetadata({ params }: { params: Promise<{ locale: string }> }) { + const { locale } = await params; + const t = await getTranslations({ locale, namespace: "blog.cmuxClaudeTeams" }); + return { + title: t("metaTitle"), + description: t("metaDescription"), + keywords: [ + "cmux", "Claude Code", "agent teams", "teammate mode", "tmux", + "terminal", "macOS", "AI coding agents", "split panes", + ], + openGraph: { + title: t("metaTitle"), + description: t("metaDescription"), + type: "article", + publishedTime: "2026-03-30T00:00:00Z", + }, + twitter: { + card: "summary_large_image", + title: t("metaTitle"), + description: t("metaDescription"), + }, + alternates: buildAlternates(locale, "/blog/cmux-claude-teams"), + }; +} + +export default function CmuxClaudeTeamsPage() { + const t = useTranslations("blog.posts.cmuxClaudeTeams"); + const tc = useTranslations("common"); + + return ( + <> +
+ + ← {tc("backToBlog")} + +
+ +

{t("title")}

+ + +