Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
143 changes: 143 additions & 0 deletions web/app/[locale]/(landing)/docs/cloud/cli/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,143 @@
import { getTranslations } from "next-intl/server";
import { auditedDocsMetadata } from "../../audited-docs-metadata";
import { DocsSchema } from "../../docs-schema";
import { CodeBlock } from "@/app/[locale]/components/code-block";
import { DocsHeading } from "@/app/[locale]/components/docs-heading";

export async function generateMetadata({ params }: { params: Promise<{ locale: string }> }) {
const { locale } = await params;
return auditedDocsMetadata({
locale,
pageKey: "cloudCli",
path: "/docs/cloud/cli",
});
}

export default async function CloudCliPage({
params,
}: {
params: Promise<{ locale: string }>;
}) {
const { locale } = await params;
const t = await getTranslations({ locale, namespace: "docs.cloudCli" });

return (
<>
<DocsSchema namespace="docs.cloudCli" path="/docs/cloud/cli" />
<DocsHeading level={1} id="title">{t("title")}</DocsHeading>
<p>{t("intro")}</p>
<p>{t("exitCodes")}</p>

<DocsHeading level={2} id="auth">{t("authTitle")}</DocsHeading>
<p>{t("authDesc")}</p>
<CodeBlock lang="bash">{`cmux auth login
cmux auth status --json
cmux auth logout
cmux auth team list
cmux auth team use <team-id>`}</CodeBlock>

<DocsHeading level={2} id="machines">{t("lifecycleTitle")}</DocsHeading>
<p>{t("lifecycleDesc")}</p>
<CodeBlock lang="bash">{`cmux vm ls [--json]
cmux vm new [--size 4g|8g|16g|24g|32g|64g] [--name <label>] [--workspace <id>] [--window <id>] [--focus true|false] [--detach]
cmux vm base [open] [--detach]
cmux vm base reset [--reason <text>]
cmux vm status <id>
cmux vm stats <id>
cmux vm resize <id> [--cpu <vCPUs>] [--memory <GiB>] [--disk <GiB>]
cmux vm rename <id> <label> | --clear
cmux vm pause <id>
cmux vm resume <id>
cmux vm wait <id> [--timeout <seconds>] [--wake]
cmux vm tools <id>
cmux vm ports <id>
cmux vm rm <id>`}</CodeBlock>

<DocsHeading level={2} id="checkpoints">{t("snapshotsTitle")}</DocsHeading>
<p>{t("snapshotsDesc")}</p>
<CodeBlock lang="bash">{`cmux vm snapshot <id> [--name <name>] # alias: checkpoint
cmux vm snapshot ls <id>
cmux vm snapshot rm <id> <snapshot-id>
cmux vm fork <id> [--name <name>] [--detach]
cmux vm restore <snapshot-id> [--detach]`}</CodeBlock>

<DocsHeading level={2} id="open">{t("openTitle")}</DocsHeading>
<p>{t("openDesc")}</p>
<CodeBlock lang="bash">{`cmux vm shell <id> # alias: attach
cmux vm tui <id> # full cmux TUI client
cmux vm desktop <id> # alias: vnc
cmux vm open <machine>[/<workspace>[/<terminal>[/<tab>]]] [--workspace <id>] [--focus true|false]
cmux vm open <machine>:desktop
cmux vm open <machine>:port/<n> [--print]
cmux vm open <machine> <port> [--print]`}</CodeBlock>

<DocsHeading level={2} id="run">{t("runTitle")}</DocsHeading>
<p>{t("runDesc")}</p>
<CodeBlock lang="bash">{`cmux vm exec [--timeout <seconds>] <id> -- <command...>
cmux vm run [--sync] [--pull <remote-path>] [--machine <id>] [--new] [--size <size>] [--timeout <seconds>] -- <command...>
cmux vm route [--cwd <dir>] [--new] [--provision] [--size <size>]
cmux vm agent --agent claude|codex|opencode|pi [--machine <id>] [--sync] [--cwd <dir>] [--name <name>] [--no-open] [--wait [--output] [--timeout <seconds>]] [--new] [--size <size>] -- <prompt>
cmux vm dev <machine> [<local-dir>] [--name <workspace>] [--layout <file>] [--command "<cmd>"] [--port <n>] [--remote <path>] [--sync|--no-sync] [--no-open] [--dry-run]
cmux vm prompt [--open claude|codex|opencode|pi]`}</CodeBlock>

<DocsHeading level={2} id="workspaces">{t("workspacesTitle")}</DocsHeading>
<p>{t("workspacesDesc")}</p>
<CodeBlock lang="bash">{`cmux vm tree [<machine>] [--refresh]
cmux vm workspace new <machine> [--name <name>] [--reuse] [--no-open]
cmux vm workspace open <machine> <workspace-id>
cmux vm workspace rename <machine> <workspace-id> <name>
cmux vm workspace close <machine> <workspace-id> # terminals keep running
cmux vm workspace rm <machine> <workspace-id> # terminals stop
cmux vm terminal send <machine> <terminal-id> [text] [--keys <k1,k2>]
cmux vm terminal read <machine> <terminal-id>
cmux vm terminal wait <machine> <terminal-id> --pattern <regex> [--timeout <seconds>]
cmux vm terminal wait-exit <machine> <terminal-id> [--timeout <seconds>]
cmux vm terminal output <machine> <terminal-id> [--after <offset>] [--max-bytes <n>]
cmux vm terminal rename <machine> <terminal-id> <name>
cmux vm terminal close <machine> <terminal-id>
cmux vm layout export <machine> [<workspace>]
cmux vm layout apply <machine> <file>|- [--name <name>] [--cwd <dir>] [--open]`}</CodeBlock>

<DocsHeading level={2} id="files">{t("filesTitle")}</DocsHeading>
<p>{t("filesDesc")}</p>
<CodeBlock lang="bash">{`cmux vm push <id> <local-path> [remote-path] [--exclude <pattern>]... [--no-default-excludes] [--watch]
cmux vm push --secret <id> <local-file> [remote-path] [--mode <octal>]
cmux vm pull <id> <remote-path> [local-path]
cmux vm env set <machine> KEY=VALUE... | --from-file <.env> | -
cmux vm env ls <machine> [--show]
cmux vm env rm <machine> KEY...`}</CodeBlock>

<DocsHeading level={2} id="domains">{t("domainsTitle")}</DocsHeading>
<p>{t("domainsDesc")}</p>
<CodeBlock lang="bash">{`cmux cloud domains [list]
cmux cloud domains zones
cmux cloud domains verify <domain>
cmux cloud domains publish <vm> <port> [--domain <hostname>] [--access personal|team|public] [--team <id>] [--yes]
cmux cloud domains access <hostname> personal|team|public [--yes]
cmux cloud domains grant <hostname> <email> [--expires <ISO-date>]
cmux cloud domains ungrant <hostname> <email>
cmux cloud domains grants <hostname>
cmux cloud domains rm <hostname>`}</CodeBlock>

<DocsHeading level={2} id="vpn">{t("vpnTitle")}</DocsHeading>
<p>{t("vpnDesc")}</p>
<CodeBlock lang="bash">{`cmux vpn up
cmux vpn status
cmux vpn down
cmux vpn revoke`}</CodeBlock>

<DocsHeading level={2} id="ai-accounts">{t("accountsTitle")}</DocsHeading>
<p>{t("accountsDesc")}</p>
<CodeBlock lang="bash">{`cmux ai-accounts list
cmux ai-accounts upload claude|codex|anthropic-key|openai-key [--label <label>] [--team <id>]
cmux coderouter status
cmux coderouter machines`}</CodeBlock>

<DocsHeading level={2} id="scripting-checklist">{t("preflightTitle")}</DocsHeading>
<p>{t("preflightDesc")}</p>
<CodeBlock lang="bash">{`cmux auth status
cmux vm ls --json
cmux vm route --json`}</CodeBlock>
</>
);
}
113 changes: 113 additions & 0 deletions web/app/[locale]/(landing)/docs/cloud/machines/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,113 @@
import { getTranslations } from "next-intl/server";
import { auditedDocsMetadata } from "../../audited-docs-metadata";
import { DocsSchema } from "../../docs-schema";
import { CodeBlock } from "@/app/[locale]/components/code-block";
import { DocsHeading } from "@/app/[locale]/components/docs-heading";

export async function generateMetadata({ params }: { params: Promise<{ locale: string }> }) {
const { locale } = await params;
return auditedDocsMetadata({
locale,
pageKey: "cloudMachines",
path: "/docs/cloud/machines",
});
}

export default async function CloudMachinesPage({
params,
}: {
params: Promise<{ locale: string }>;
}) {
const { locale } = await params;
const t = await getTranslations({ locale, namespace: "docs.cloudMachines" });

return (
<>
<DocsSchema namespace="docs.cloudMachines" path="/docs/cloud/machines" />
<DocsHeading level={1} id="title">{t("title")}</DocsHeading>
<p>{t("intro")}</p>

<DocsHeading level={2} id="create">{t("createTitle")}</DocsHeading>
<p>{t("createApp")}</p>
<p>{t("createCli")}</p>
<CodeBlock lang="bash">{`cmux vm new
cmux vm new --size 16g --name "search index"
cmux vm new --detach --json`}</CodeBlock>
<p>{t("createFailed")}</p>

<DocsHeading level={2} id="sizes">{t("sizesTitle")}</DocsHeading>
<p>{t("sizesDesc")}</p>
<table>
<thead>
<tr>
<th>{t("sizeColumn")}</th>
<th>{t("memoryColumn")}</th>
<th>{t("cpuColumn")}</th>
<th>{t("diskColumn")}</th>
<th>{t("planColumn")}</th>
</tr>
</thead>
<tbody>
<tr><td><code>4g</code></td><td>4 GB</td><td>2</td><td>16 GB</td><td>{t("planPaid")}</td></tr>
<tr><td><code>8g</code></td><td>8 GB</td><td>4</td><td>32 GB</td><td>{t("planPaid")}</td></tr>
<tr><td><code>16g</code></td><td>16 GB</td><td>8</td><td>64 GB</td><td>{t("planPaid")}</td></tr>
<tr><td><code>24g</code></td><td>24 GB</td><td>12</td><td>96 GB</td><td>{t("planPaid")}</td></tr>
<tr><td><code>32g</code></td><td>32 GB</td><td>16</td><td>128 GB</td><td>{t("planMax")}</td></tr>
<tr><td><code>64g</code></td><td>64 GB</td><td>32</td><td>128 GB</td><td>{t("planMax")}</td></tr>
</tbody>
</table>
<p>{t("sizesDefault")}</p>

<DocsHeading level={2} id="plan-limits">{t("limitsTitle")}</DocsHeading>
<p>{t("limitsDesc")}</p>
<ul>
<li>{t("limitsFree")}</li>
<li>{t("limitsPaid")}</li>
<li>{t("limitsTeam")}</li>
<li>{t("limitsMax")}</li>
</ul>
<p>{t("limitsPricing")}</p>

<DocsHeading level={2} id="resize">{t("resizeTitle")}</DocsHeading>
<p>{t("resizeDesc")}</p>
<CodeBlock lang="bash">{`cmux vm resize brave-otter --memory 16G
cmux vm resize brave-otter --cpu 8 --disk 128G`}</CodeBlock>

<DocsHeading level={2} id="pause-and-resume">{t("pauseTitle")}</DocsHeading>
<p>{t("pauseDesc")}</p>
<p>{t("pauseIdle")}</p>
<CodeBlock lang="bash">{`cmux vm pause brave-otter
cmux vm resume brave-otter
cmux vm wait brave-otter --wake --timeout 180`}</CodeBlock>
<p>{t("waitDesc")}</p>

<DocsHeading level={2} id="checkpoints-and-forks">{t("snapshotsTitle")}</DocsHeading>
<p>{t("snapshotsDesc")}</p>
<p>{t("snapshotsUse")}</p>
<CodeBlock lang="bash">{`cmux vm checkpoint brave-otter --name before-migration
cmux vm snapshot ls brave-otter
cmux vm restore <snapshot-id>
cmux vm fork brave-otter --name try-b
cmux vm snapshot rm brave-otter <snapshot-id>`}</CodeBlock>
<p>{t("snapshotsCapability")}</p>

<DocsHeading level={2} id="rename">{t("renameTitle")}</DocsHeading>
<p>{t("renameDesc")}</p>
<CodeBlock lang="bash">{`cmux vm rename brave-otter "billing api"
cmux vm rename brave-otter --clear`}</CodeBlock>

<DocsHeading level={2} id="status">{t("statusTitle")}</DocsHeading>
<p>{t("statusDesc")}</p>
<CodeBlock lang="bash">{`cmux vm status brave-otter
cmux vm stats brave-otter`}</CodeBlock>

<DocsHeading level={2} id="delete">{t("deleteTitle")}</DocsHeading>
<p>{t("deleteDesc")}</p>
<p>{t("deleteCheckpoint")}</p>
<CodeBlock lang="bash">{`cmux vm rm brave-otter`}</CodeBlock>

<DocsHeading level={2} id="when-your-plan-ends">{t("accessTitle")}</DocsHeading>
<p>{t("accessDesc")}</p>
</>
);
}
95 changes: 95 additions & 0 deletions web/app/[locale]/(landing)/docs/cloud/networking/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
import { getTranslations } from "next-intl/server";
import { auditedDocsMetadata } from "../../audited-docs-metadata";
import { DocsSchema } from "../../docs-schema";
import { CodeBlock } from "@/app/[locale]/components/code-block";
import { DocsHeading } from "@/app/[locale]/components/docs-heading";

export async function generateMetadata({ params }: { params: Promise<{ locale: string }> }) {
const { locale } = await params;
return auditedDocsMetadata({
locale,
pageKey: "cloudNetworking",
path: "/docs/cloud/networking",
});
}

export default async function CloudNetworkingPage({
params,
}: {
params: Promise<{ locale: string }>;
}) {
const { locale } = await params;
const t = await getTranslations({ locale, namespace: "docs.cloudNetworking" });

return (
<>
<DocsSchema namespace="docs.cloudNetworking" path="/docs/cloud/networking" />
<DocsHeading level={1} id="title">{t("title")}</DocsHeading>
<p>{t("intro")}</p>

<DocsHeading level={2} id="files">{t("pushTitle")}</DocsHeading>
<p>{t("pushDesc")}</p>
<CodeBlock lang="bash">{`cmux vm push brave-otter ./app ~/app
cmux vm push brave-otter . ~/repo --no-default-excludes
cmux vm push brave-otter . ~/repo --exclude dist --watch
cmux vm pull brave-otter ~/repo/report.html ./report.html`}</CodeBlock>
<p>{t("pushLimit")}</p>
<p>{t("pullDesc")}</p>

<DocsHeading level={2} id="secret-files">{t("secretTitle")}</DocsHeading>
<p>{t("secretDesc")}</p>
<CodeBlock lang="bash">{`cmux vm push --secret brave-otter ~/.npmrc ~/.npmrc`}</CodeBlock>

<DocsHeading level={2} id="environment-variables">{t("envTitle")}</DocsHeading>
<p>{t("envDesc")}</p>
<CodeBlock lang="bash">{`cmux vm env set brave-otter --from-file .env
op read op://dev/stripe/key | cmux vm env set brave-otter -
cmux vm env ls brave-otter
cmux vm env rm brave-otter STRIPE_KEY`}</CodeBlock>
<p>{t("envTip")}</p>

<DocsHeading level={2} id="ports">{t("portsTitle")}</DocsHeading>
<p>{t("portsDesc")}</p>
<p>{t("portsList")}</p>
<CodeBlock lang="bash">{`cmux vm ports brave-otter
cmux vm open brave-otter:port/3000`}</CodeBlock>

<DocsHeading level={2} id="desktop">{t("desktopTitle")}</DocsHeading>
<p>{t("desktopDesc")}</p>
<CodeBlock lang="bash">{`cmux vm desktop brave-otter`}</CodeBlock>

<DocsHeading level={2} id="private-network">{t("networkTitle")}</DocsHeading>
<p>{t("networkDesc")}</p>
<p>{t("networkPeers")}</p>
<p>{t("networkMacs")}</p>

<DocsHeading level={2} id="vpn">{t("vpnTitle")}</DocsHeading>
<p>{t("vpnDesc")}</p>
<CodeBlock lang="bash">{`cmux vpn up
cmux vpn status
cmux vpn down`}</CodeBlock>

<DocsHeading level={2} id="public-urls">{t("publishTitle")}</DocsHeading>
<p>{t("publishDesc")}</p>
<CodeBlock lang="bash">{`cmux cloud domains publish brave-otter 3000
cmux cloud domains publish brave-otter 3000 --access team
cmux cloud domains publish brave-otter 8080 --access public --yes
cmux cloud domains list
cmux cloud domains grant <hostname> teammate@example.com
cmux cloud domains rm <hostname>`}</CodeBlock>
<p>{t("accessModes")}</p>
<ul>
<li>{t("accessPersonal")}</li>
<li>{t("accessTeam")}</li>
<li>{t("accessPublic")}</li>
</ul>
<p>{t("accessSignIn")}</p>
<p>{t("accessWarning")}</p>

<DocsHeading level={2} id="custom-domains">{t("customDomainTitle")}</DocsHeading>
<p>{t("customDomainDesc")}</p>
<CodeBlock lang="bash">{`cmux cloud domains verify preview.example.com
cmux cloud domains publish brave-otter 3000 --domain app.preview.example.com`}</CodeBlock>
</>
);
}
Loading
Loading