refactor(web): remove install script, simplify onboarding to 3 steps
Some checks failed
CI / Typecheck (push) Has been cancelled
CI / Broker tests (Postgres) (push) Has been cancelled
CI / Docker build (linux/amd64) (push) Has been cancelled
CI / Lint (push) Has been cancelled

Drop /install route (curl|bash script). Install is just `npm i -g
claudemesh-cli`. Update hero, FAQ, getting-started, and join flow to
reflect the simplified 3-step onboarding: install → join → launch.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Alejandro Gutiérrez
2026-04-08 11:09:17 +01:00
parent b0113913f2
commit 2c24f667f9
5 changed files with 14 additions and 140 deletions

View File

@@ -146,46 +146,23 @@ export default function GettingStartedPage() {
<STEP
n="1"
title="Install the CLI"
cmd="curl -fsSL https://claudemesh.com/install | bash"
note="Checks Node >= 20, installs claudemesh-cli from npm, registers the MCP server + status hooks in Claude Code. Equivalent to: npm install -g claudemesh-cli && claudemesh install"
cmd="npm i -g claudemesh-cli"
note="Requires Node.js 20+. Installs the claudemesh CLI globally."
>
<p>
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{" "}
<Link
href="https://claudemesh.com/install"
href="https://docs.npmjs.com/resolving-eacces-permissions-errors"
className="underline decoration-[var(--cm-fg-tertiary)] underline-offset-4 hover:text-[var(--cm-fg)]"
>
read it first
</Link>{" "}
if you prefer.
npm docs
</Link>
.
</p>
</STEP>
<div
className="py-3 text-center text-xs text-[var(--cm-fg-tertiary)]"
style={{ fontFamily: "var(--cm-font-mono)" }}
>
or install manually:
<code className="ml-2 rounded bg-[var(--cm-bg-elevated)] px-2 py-1 text-[var(--cm-fg-secondary)]">
npm install -g claudemesh-cli && claudemesh install
</code>
</div>
<STEP
n="2"
title="Restart Claude Code"
note="The MCP server and status hooks registered in step 1 only take effect after a restart."
>
<p>
Close and reopen Claude Code (or your IDE with Claude Code
extension). This loads the claudemesh MCP server so the 43 mesh
tools appear.
</p>
</STEP>
<STEP
n="3"
title="Join a mesh"
cmd="claudemesh join https://claudemesh.com/join/eyJ2IjoxLC..."
note="Replace the URL with your actual invite link. The CLI verifies the ed25519 signature, generates your keypair locally, and enrolls with the broker."
@@ -204,7 +181,7 @@ export default function GettingStartedPage() {
</STEP>
<STEP
n="4"
n="3"
title="Launch with real-time messaging"
cmd="claudemesh launch --name Alice"
note="Wraps `claude` with the mesh dev-channel. Peers can message you in real-time. Without launch, mesh tools still work but messages are pull-only via check_messages."

View File

@@ -1,100 +0,0 @@
/**
* GET /install — serves a shell installer for claudemesh-cli.
*
* Intended to be piped into bash:
* curl -fsSL https://claudemesh.com/install | bash
*
* The script is kept short + auditable. It does not try to install
* Node for the user — it checks for a compatible Node + npm and
* directs them to install Node themselves if missing. Running `bash`
* against a domain you do not fully trust is always a risk; publishing
* the script this way (rather than obfuscating it behind a binary
* blob) lets security-conscious users inspect before executing.
*/
const SCRIPT = `#!/usr/bin/env bash
# claudemesh-cli installer
# Source: https://claudemesh.com/install
# Audit: curl -fsSL https://claudemesh.com/install | less
set -euo pipefail
RED=$'\\033[31m'; GREEN=$'\\033[32m'; DIM=$'\\033[2m'; BOLD=$'\\033[1m'; RESET=$'\\033[0m'
say() { printf "%s\\n" "$*"; }
ok() { printf "%s✓%s %s\\n" "\${GREEN}" "\${RESET}" "$*"; }
err() { printf "%s✗%s %s\\n" "\${RED}" "\${RESET}" "$*" >&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 <invite-url>\${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",
},
});
}

View File

@@ -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+.
</p>
</li>
<li className="rounded-[var(--cm-radius-md)] border border-[var(--cm-clay)]/40 bg-[var(--cm-bg-elevated)] p-5">
@@ -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{" "}
<code style={{ fontFamily: "var(--cm-font-mono)" }}>claude</code>{" "}
tools work, but messages are pull-only.
Spawns Claude Code with mesh connectivity, peer messaging,
and native access to deployed MCP services.
</p>
</li>
</ol>

View File

@@ -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 <invite-url>` — 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 <invite-url>` — 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?",

View File

@@ -83,7 +83,7 @@ export const Hero = () => {
style={{ fontFamily: "var(--cm-font-mono)" }}
>
<span className="text-[var(--cm-clay)]">$</span>
<span>curl -fsSL claudemesh.com/install | bash</span>
<span>npm i -g claudemesh-cli</span>
</div>
</div>
</Reveal>