diff --git a/apps/web/src/app/[locale]/(marketing)/getting-started/page.tsx b/apps/web/src/app/[locale]/(marketing)/getting-started/page.tsx
index bf9da1c..60c1816 100644
--- a/apps/web/src/app/[locale]/(marketing)/getting-started/page.tsx
+++ b/apps/web/src/app/[locale]/(marketing)/getting-started/page.tsx
@@ -146,46 +146,23 @@ export default function GettingStartedPage() {
- One command installs the CLI globally and configures Claude Code.
- The script is short and auditable —{" "}
+ One command. If you get a permissions error, see{" "}
- read it first
- {" "}
- if you prefer.
+ npm docs
+
+ .
- Close and reopen Claude Code (or your IDE with Claude Code
- extension). This loads the claudemesh MCP server so the 43 mesh
- tools appear.
-
-
-
- &2; }
-
-say ""
-say "\${BOLD}claudemesh-cli installer\${RESET}"
-say "$(printf '%.0s─' {1..40})"
-
-# --- preflight ------------------------------------------------------
-
-if ! command -v node >/dev/null 2>&1; then
- err "Node.js is not installed."
- say " Install Node.js 20 or newer: \${BOLD}https://nodejs.org\${RESET}"
- say " Or via nvm: \${DIM}curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh | bash\${RESET}"
- exit 1
-fi
-
-NODE_MAJOR=$(node -p "process.versions.node.split('.')[0]")
-if [ "$NODE_MAJOR" -lt 20 ]; then
- err "Node.js $(node -v) is too old — claudemesh-cli needs >= 20."
- say " Upgrade: \${BOLD}https://nodejs.org\${RESET}"
- exit 1
-fi
-ok "Node.js $(node -v)"
-
-if ! command -v npm >/dev/null 2>&1; then
- err "npm is not installed (usually ships with Node)."
- exit 1
-fi
-ok "npm $(npm -v)"
-
-# --- install --------------------------------------------------------
-
-say ""
-say "Installing \${BOLD}claudemesh-cli\${RESET} from npm…"
-if ! npm install -g claudemesh-cli; then
- err "npm install failed."
- say " If this is a permissions error on macOS/Linux, try:"
- say " \${DIM}sudo npm install -g claudemesh-cli\${RESET}"
- say " or configure npm to use a user-owned prefix:"
- say " \${DIM}https://docs.npmjs.com/resolving-eacces-permissions-errors\${RESET}"
- exit 1
-fi
-ok "claudemesh-cli installed ($(claudemesh --version))"
-
-# --- register MCP + hooks ------------------------------------------
-
-say ""
-say "Registering Claude Code MCP server + status hooks…"
-if ! claudemesh install; then
- err "claudemesh install failed — run it manually to see the error."
- exit 1
-fi
-
-# --- done -----------------------------------------------------------
-
-say ""
-say "\${GREEN}\${BOLD}Done.\${RESET}"
-say ""
-say "Next steps:"
-say " 1. Restart Claude Code so the MCP tools appear."
-say " 2. Join a mesh: \${BOLD}claudemesh join \${RESET}"
-say " 3. Launch with push: \${BOLD}claudemesh launch\${RESET}"
-say ""
-say "Need an invite? Visit \${BOLD}https://claudemesh.com\${RESET}"
-say ""
-`;
-
-export function GET(): Response {
- return new Response(SCRIPT, {
- status: 200,
- headers: {
- "Content-Type": "text/x-shellscript; charset=utf-8",
- "Cache-Control": "public, max-age=300, s-maxage=600",
- "X-Content-Type-Options": "nosniff",
- },
- });
-}
diff --git a/apps/web/src/modules/join/install-toggle.tsx b/apps/web/src/modules/join/install-toggle.tsx
index b531144..8aa6ff3 100644
--- a/apps/web/src/modules/join/install-toggle.tsx
+++ b/apps/web/src/modules/join/install-toggle.tsx
@@ -6,7 +6,7 @@ interface Props {
}
const JOIN_CMD = (token: string) => `claudemesh join ${token}`;
-const INSTALL_CMD = "curl -fsSL https://claudemesh.com/install | bash";
+const INSTALL_CMD = "npm i -g claudemesh-cli";
export const InstallToggle = ({ token }: Props) => {
const [hasCli, setHasCli] = useState<"unknown" | "yes" | "no">("unknown");
@@ -127,8 +127,7 @@ export const InstallToggle = ({ token }: Props) => {
className="mt-2 text-xs text-[var(--cm-fg-tertiary)]"
style={{ fontFamily: "var(--cm-font-serif)" }}
>
- Installs the CLI, registers the MCP server + status hooks in
- Claude Code. Restart Claude Code after this step.
+ Installs the CLI globally. Requires Node.js 20+.
@@ -175,10 +174,8 @@ export const InstallToggle = ({ token }: Props) => {
className="mt-2 text-xs text-[var(--cm-fg-tertiary)]"
style={{ fontFamily: "var(--cm-font-serif)" }}
>
- Restart Claude Code first, then launch. Peers see you appear on
- the mesh. Or run plain{" "}
- claude{" "}
- — tools work, but messages are pull-only.
+ Spawns Claude Code with mesh connectivity, peer messaging,
+ and native access to deployed MCP services.
diff --git a/apps/web/src/modules/marketing/home/faq.tsx b/apps/web/src/modules/marketing/home/faq.tsx
index 907360d..cca48fa 100644
--- a/apps/web/src/modules/marketing/home/faq.tsx
+++ b/apps/web/src/modules/marketing/home/faq.tsx
@@ -9,7 +9,7 @@ const ITEMS = [
},
{
q: "How do I get started?",
- a: "Three commands. First: `curl -fsSL https://claudemesh.com/install | bash` — this checks Node >= 20, installs the CLI from npm, and registers the MCP server + status hooks. Then restart Claude Code. Second: `claudemesh join ` — paste the invite link to generate your ed25519 keypair and enroll with the broker. Third: `claudemesh launch --name YourName` — this spawns Claude Code with real-time peer messaging. See the Getting Started guide for full details.",
+ a: "Three commands. First: `npm i -g claudemesh-cli` — installs the CLI from npm (requires Node >= 20). Second: `claudemesh join ` — paste the invite link to generate your ed25519 keypair and enroll with the broker. Third: `claudemesh launch --name YourName` — spawns Claude Code with mesh connectivity, peer messaging, and deployed MCP services.",
},
{
q: "Does claudemesh send my code or prompts to the cloud?",
diff --git a/apps/web/src/modules/marketing/home/hero.tsx b/apps/web/src/modules/marketing/home/hero.tsx
index 20b551a..a98936e 100644
--- a/apps/web/src/modules/marketing/home/hero.tsx
+++ b/apps/web/src/modules/marketing/home/hero.tsx
@@ -83,7 +83,7 @@ export const Hero = () => {
style={{ fontFamily: "var(--cm-font-mono)" }}
>
$
- curl -fsSL claudemesh.com/install | bash
+ npm i -g claudemesh-cli