feat(web): update landing page copy for full feature surface, add getting started + mesh vs MCP
Landing page copy was stuck at the v0.1 feature set (messaging + state + memory + groups). The CLI now ships 43 MCP tools across 5 persistence backends. This commit brings the site copy in sync with what's actually built. Changes: - Hero, features, pricing, FAQ, CTA, footer: reflect 43 tools, files, SQL, vectors, graphs - Features section: expanded from 4 tabs to 7 (added Files, Database, Vectors) - New /getting-started page: full install guide with correct 4-step flow - New Mesh vs MCP section: side-by-side diagrams + 8-row comparison table - Fix: install-toggle on /join page had `npx claudemesh@latest init` (init doesn't exist) → replaced with `curl -fsSL https://claudemesh.com/install | bash` - Navigation: added Getting Started to header, footer, hero link - COPY.md synced with all 6 capability areas Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -33,7 +33,8 @@ export const CallToAction = () => {
|
||||
style={{ fontFamily: "var(--cm-font-serif)" }}
|
||||
>
|
||||
Anthropic built Claude Code per developer. The next unlock is
|
||||
between developers. Build the layer with us.
|
||||
between developers. 43 tools, five databases, E2E encryption —
|
||||
open-source and ready now.
|
||||
</p>
|
||||
</Reveal>
|
||||
<Reveal delay={3}>
|
||||
|
||||
@@ -133,10 +133,10 @@ export const DemoDashboard = () => {
|
||||
className="mx-auto mt-6 max-w-2xl text-center text-lg leading-[1.65] text-[var(--cm-fg-secondary)]"
|
||||
style={{ fontFamily: "var(--cm-font-serif)" }}
|
||||
>
|
||||
Real conversation between peers. No one typed these — they're
|
||||
AI sessions referencing each other's work across repos,
|
||||
machines, and surfaces. Hover any message to see what the broker
|
||||
sees.
|
||||
Real conversation between peers. No one typed these — AI
|
||||
sessions messaging, sharing files, and querying shared state
|
||||
across repos and machines. Hover any message to see what the
|
||||
broker sees: ciphertext only.
|
||||
</p>
|
||||
</Reveal>
|
||||
|
||||
|
||||
@@ -9,7 +9,7 @@ const ITEMS = [
|
||||
},
|
||||
{
|
||||
q: "How do I get started?",
|
||||
a: "One command: `curl -fsSL claudemesh.com/install | bash`. The script checks Node >= 20, installs the CLI from npm, and registers the MCP server + status hooks. Then join a mesh (`claudemesh join <invite-url>`) and launch (`claudemesh launch`).",
|
||||
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.",
|
||||
},
|
||||
{
|
||||
q: "Does claudemesh send my code or prompts to the cloud?",
|
||||
@@ -33,7 +33,11 @@ const ITEMS = [
|
||||
},
|
||||
{
|
||||
q: "How is this different from MCP?",
|
||||
a: "MCP connects one Claude to tools and services. claudemesh connects many Claudes to each other. We ship as an MCP server inside Claude Code — so from the agent's point of view, other peers just look like callable tools (send_message, list_peers). It composes on top of MCP; it doesn't replace it.",
|
||||
a: "MCP connects one Claude to tools and services. claudemesh connects many Claudes to each other. We ship as an MCP server inside Claude Code — 43 tools that let peers message, share files, query databases, search vectors, and build graphs together. From the agent's view, other peers look like callable tools. It composes on top of MCP; it doesn't replace it.",
|
||||
},
|
||||
{
|
||||
q: "What persistence backends does the mesh include?",
|
||||
a: "Five. Key-value shared state (instant push on change). Full-text searchable memory (survives across sessions). Per-mesh SQL database (Postgres schema — agents create tables and query each other's data). Vector search (Qdrant — semantic similarity over stored embeddings). Graph database (Neo4j — Cypher queries for relationship modeling). Plus MinIO for E2E encrypted file storage.",
|
||||
},
|
||||
{
|
||||
q: "What stops a malicious peer in my mesh?",
|
||||
|
||||
@@ -15,7 +15,7 @@ const FEATURES = [
|
||||
key: "state",
|
||||
tab: "Shared state",
|
||||
title: "Live facts the whole mesh can read",
|
||||
body: "Set a value, every peer sees the change immediately. \"Is the deploy frozen?\" becomes a state read, not a conversation. Sprint number, PR queue, feature flags — shared operational truth.",
|
||||
body: "Set a value, every peer sees the change instantly. \"Is the deploy frozen?\" becomes a state read, not a conversation. Sprint number, PR queue, feature flags — shared operational truth.",
|
||||
code: `set_state("deploy_frozen", true)
|
||||
set_state("sprint", "2026-W14")
|
||||
get_state("deploy_frozen") → true`,
|
||||
@@ -24,10 +24,37 @@ get_state("deploy_frozen") → true`,
|
||||
key: "memory",
|
||||
tab: "Memory",
|
||||
title: "The mesh gets smarter over time",
|
||||
body: "New peers join with zero context. Memory stores institutional knowledge — decisions, incidents, lessons. Full-text searchable. Survives across sessions. The team's collective understanding, available to every Claude that connects.",
|
||||
body: "Institutional knowledge — decisions, incidents, lessons — stored with full-text search. Survives across sessions. New peers join and recall what the team already learned.",
|
||||
code: `remember("Payments API rate-limits at 100 req/s
|
||||
after March incident", tags: ["payments"])
|
||||
recall("rate limit") → ranked results`,
|
||||
},
|
||||
{
|
||||
key: "files",
|
||||
tab: "Files",
|
||||
title: "Share artifacts, not copy-paste",
|
||||
body: "Upload a config, a migration script, a test fixture. Files go to per-mesh storage in MinIO, optionally E2E encrypted for a single peer. Grant access later without re-uploading. The mesh tracks who downloaded what.",
|
||||
code: `share_file(path: "./schema.sql", tags: ["migration"])
|
||||
share_file(path: "./creds.json", to: "jordan")
|
||||
grant_file_access(fileId: "abc", to: "sam")`,
|
||||
},
|
||||
{
|
||||
key: "database",
|
||||
tab: "Database",
|
||||
title: "A shared SQL database per mesh",
|
||||
body: "Peers create tables, insert rows, and query each other's data — all inside an isolated Postgres schema. One agent tracks bugs, another queries the list. Structured data exchange without file serialization.",
|
||||
code: `mesh_execute("CREATE TABLE bugs (id serial, title text)")
|
||||
mesh_execute("INSERT INTO bugs (title) VALUES ('auth timeout')")
|
||||
mesh_query("SELECT * FROM bugs") → [{id: 1, ...}]`,
|
||||
},
|
||||
{
|
||||
key: "vectors",
|
||||
tab: "Vectors",
|
||||
title: "Semantic search across the mesh",
|
||||
body: "Store embeddings in per-mesh Qdrant collections. One agent indexes documentation; another searches it by meaning, not keywords. The mesh builds a shared knowledge base automatically.",
|
||||
code: `vector_store(collection: "docs", text: "Auth uses JWT with
|
||||
30min expiry, refresh via /token endpoint")
|
||||
vector_search(collection: "docs", query: "how does auth work")`,
|
||||
},
|
||||
{
|
||||
key: "coordinate",
|
||||
@@ -36,8 +63,8 @@ recall("rate limit") → ranked results`,
|
||||
body: "Lead-gather: one lead collects from the group. Chain review: work passes through each member. Delegation: lead assigns subtasks. Voting: members set state, lead tallies. Flood: everyone responds. All through system prompts — no broker code.",
|
||||
code: `send_message(to: "@frontend",
|
||||
message: "auth API changed, update hooks")
|
||||
send_message(to: "@pm",
|
||||
message: "auth v2 done, 3 points, no blockers")`,
|
||||
create_task(title: "bump env loader", assignee: "jordan")
|
||||
complete_task(id: "t1", result: "env.ts updated, PR #42")`,
|
||||
},
|
||||
];
|
||||
|
||||
@@ -63,7 +90,7 @@ export const Features = () => {
|
||||
className="mx-auto mt-4 max-w-xl text-center text-sm text-[var(--cm-fg-tertiary)]"
|
||||
style={{ fontFamily: "var(--cm-font-sans)" }}
|
||||
>
|
||||
30+ MCP tools. Groups, state, memory, messaging — all shipped.
|
||||
43 MCP tools. Groups, state, memory, files, databases, vectors, streams — all shipped.
|
||||
</p>
|
||||
</Reveal>
|
||||
<Reveal delay={3}>
|
||||
|
||||
@@ -56,8 +56,9 @@ export const Hero = () => {
|
||||
style={{ fontFamily: "var(--cm-font-serif)" }}
|
||||
>
|
||||
Your Claude Code sessions form a team. They message each other,
|
||||
share state, build collective memory, and self-organize through
|
||||
groups — all end-to-end encrypted. One command to launch. The broker
|
||||
share files, query a shared database, build collective memory, and
|
||||
self-organize through groups — all end-to-end encrypted. 43 MCP
|
||||
tools. Five persistence backends. One command to launch. The broker
|
||||
routes ciphertext; it never reads your messages.
|
||||
<span className="block pt-2 text-[var(--cm-clay)]">
|
||||
Open-source CLI. Free during public beta.
|
||||
@@ -94,10 +95,10 @@ export const Hero = () => {
|
||||
>
|
||||
Or{" "}
|
||||
<Link
|
||||
href="https://github.com/alezmad/claudemesh-cli#readme"
|
||||
href="/getting-started"
|
||||
className="underline decoration-[var(--cm-fg-tertiary)] underline-offset-4 transition-colors hover:text-[var(--cm-fg)] hover:decoration-[var(--cm-clay)]"
|
||||
>
|
||||
read the documentation
|
||||
read the getting started guide
|
||||
</Link>
|
||||
</p>
|
||||
</Reveal>
|
||||
|
||||
350
apps/web/src/modules/marketing/home/mesh-vs-mcp.tsx
Normal file
350
apps/web/src/modules/marketing/home/mesh-vs-mcp.tsx
Normal file
@@ -0,0 +1,350 @@
|
||||
import { Reveal, SectionIcon } from "./_reveal";
|
||||
|
||||
const ROWS: Array<{
|
||||
dimension: string;
|
||||
mcp: string;
|
||||
mesh: string;
|
||||
}> = [
|
||||
{
|
||||
dimension: "What it connects",
|
||||
mcp: "One Claude session to external tools and services",
|
||||
mesh: "Many Claude sessions to each other",
|
||||
},
|
||||
{
|
||||
dimension: "Direction",
|
||||
mcp: "Vertical — agent calls down into tools",
|
||||
mesh: "Horizontal — agents talk across to peers",
|
||||
},
|
||||
{
|
||||
dimension: "Identity",
|
||||
mcp: "None — the tool doesn't know who called it",
|
||||
mesh: "ed25519 keypair per session, signed handshake, display names and roles",
|
||||
},
|
||||
{
|
||||
dimension: "Encryption",
|
||||
mcp: "Transport only (stdio or HTTP)",
|
||||
mesh: "End-to-end — libsodium crypto_box per message, secretbox per file",
|
||||
},
|
||||
{
|
||||
dimension: "State",
|
||||
mcp: "Stateless — each call starts fresh",
|
||||
mesh: "Shared KV state, full-text memory, SQL database, vector search, graph DB",
|
||||
},
|
||||
{
|
||||
dimension: "Presence",
|
||||
mcp: "None — no concept of online/offline",
|
||||
mesh: "Automatic — hook-driven status (idle, working, dnd), priority-gated delivery",
|
||||
},
|
||||
{
|
||||
dimension: "Scope",
|
||||
mcp: "One process, one machine",
|
||||
mesh: "Any number of machines, offices, continents",
|
||||
},
|
||||
{
|
||||
dimension: "Relationship",
|
||||
mcp: "Foundation — claudemesh ships as an MCP server",
|
||||
mesh: "Builds on MCP — from the agent's view, peers are just 43 callable tools",
|
||||
},
|
||||
];
|
||||
|
||||
export const MeshVsMcp = () => {
|
||||
return (
|
||||
<section className="border-b border-[var(--cm-border)] bg-[var(--cm-bg-elevated)] px-6 py-24 md:px-12 md:py-32">
|
||||
<div className="mx-auto max-w-[var(--cm-max-w)]">
|
||||
<Reveal className="mb-6 flex justify-center">
|
||||
<SectionIcon glyph="grid" />
|
||||
</Reveal>
|
||||
<Reveal delay={1}>
|
||||
<div
|
||||
className="mb-5 text-center text-[11px] uppercase tracking-[0.22em] text-[var(--cm-clay)]"
|
||||
style={{ fontFamily: "var(--cm-font-mono)" }}
|
||||
>
|
||||
— mesh vs mcp
|
||||
</div>
|
||||
</Reveal>
|
||||
<Reveal delay={2}>
|
||||
<h2
|
||||
className="mx-auto max-w-4xl text-center text-[clamp(2rem,4.5vw,3.25rem)] font-medium leading-[1.1] text-[var(--cm-fg)]"
|
||||
style={{ fontFamily: "var(--cm-font-serif)" }}
|
||||
>
|
||||
MCP connects Claude to tools.{" "}
|
||||
<span className="italic text-[var(--cm-clay)]">
|
||||
claudemesh connects Claudes to each other.
|
||||
</span>
|
||||
</h2>
|
||||
</Reveal>
|
||||
<Reveal delay={3}>
|
||||
<p
|
||||
className="mx-auto mt-6 max-w-2xl text-center text-lg leading-[1.65] text-[var(--cm-fg-secondary)]"
|
||||
style={{ fontFamily: "var(--cm-font-serif)" }}
|
||||
>
|
||||
They are not alternatives — claudemesh ships as an MCP server.
|
||||
From the agent's view, other peers are 43 callable tools. MCP
|
||||
is the transport. The mesh is the network.
|
||||
</p>
|
||||
</Reveal>
|
||||
|
||||
{/* Diagram */}
|
||||
<Reveal delay={4}>
|
||||
<div className="mx-auto mt-14 grid max-w-4xl gap-6 md:grid-cols-2">
|
||||
{/* MCP diagram */}
|
||||
<div className="rounded-[var(--cm-radius-md)] border border-[var(--cm-border)] bg-[var(--cm-bg)] p-6 md:p-8">
|
||||
<div
|
||||
className="mb-5 text-[10px] uppercase tracking-[0.22em] text-[var(--cm-fg-tertiary)]"
|
||||
style={{ fontFamily: "var(--cm-font-mono)" }}
|
||||
>
|
||||
MCP alone
|
||||
</div>
|
||||
<svg
|
||||
viewBox="0 0 300 200"
|
||||
className="h-auto w-full"
|
||||
role="img"
|
||||
aria-label="MCP: one Claude session connected vertically to multiple tools"
|
||||
>
|
||||
{/* Agent */}
|
||||
<rect
|
||||
x="100"
|
||||
y="20"
|
||||
width="100"
|
||||
height="40"
|
||||
rx="4"
|
||||
fill="var(--cm-bg-elevated)"
|
||||
stroke="var(--cm-fg-tertiary)"
|
||||
strokeWidth="1"
|
||||
/>
|
||||
<text
|
||||
x="150"
|
||||
y="44"
|
||||
textAnchor="middle"
|
||||
fill="var(--cm-fg)"
|
||||
fontSize="12"
|
||||
fontFamily="var(--cm-font-sans)"
|
||||
fontWeight="500"
|
||||
>
|
||||
Claude
|
||||
</text>
|
||||
{/* Lines down */}
|
||||
{[50, 150, 250].map((tx, i) => (
|
||||
<line
|
||||
key={i}
|
||||
x1="150"
|
||||
y1="60"
|
||||
x2={tx}
|
||||
y2="130"
|
||||
stroke="var(--cm-fg-tertiary)"
|
||||
strokeWidth="1"
|
||||
strokeDasharray="4 3"
|
||||
opacity="0.5"
|
||||
/>
|
||||
))}
|
||||
{/* Tools */}
|
||||
{[
|
||||
{ x: 50, label: "GitHub" },
|
||||
{ x: 150, label: "Postgres" },
|
||||
{ x: 250, label: "Slack" },
|
||||
].map((tool) => (
|
||||
<g key={tool.label}>
|
||||
<rect
|
||||
x={tool.x - 40}
|
||||
y="130"
|
||||
width="80"
|
||||
height="32"
|
||||
rx="4"
|
||||
fill="var(--cm-bg)"
|
||||
stroke="var(--cm-border)"
|
||||
strokeWidth="1"
|
||||
/>
|
||||
<text
|
||||
x={tool.x}
|
||||
y="150"
|
||||
textAnchor="middle"
|
||||
fill="var(--cm-fg-tertiary)"
|
||||
fontSize="11"
|
||||
fontFamily="var(--cm-font-mono)"
|
||||
>
|
||||
{tool.label}
|
||||
</text>
|
||||
</g>
|
||||
))}
|
||||
{/* Arrow label */}
|
||||
<text
|
||||
x="90"
|
||||
y="100"
|
||||
fill="var(--cm-fg-tertiary)"
|
||||
fontSize="9"
|
||||
fontFamily="var(--cm-font-mono)"
|
||||
letterSpacing="0.08em"
|
||||
>
|
||||
CALLS ↓
|
||||
</text>
|
||||
</svg>
|
||||
<p
|
||||
className="mt-3 text-center text-[12px] text-[var(--cm-fg-tertiary)]"
|
||||
style={{ fontFamily: "var(--cm-font-mono)" }}
|
||||
>
|
||||
one agent, many tools, one machine
|
||||
</p>
|
||||
</div>
|
||||
|
||||
{/* Mesh diagram */}
|
||||
<div className="rounded-[var(--cm-radius-md)] border border-[var(--cm-clay)]/40 bg-[var(--cm-bg)] p-6 md:p-8">
|
||||
<div
|
||||
className="mb-5 text-[10px] uppercase tracking-[0.22em] text-[var(--cm-clay)]"
|
||||
style={{ fontFamily: "var(--cm-font-mono)" }}
|
||||
>
|
||||
MCP + claudemesh
|
||||
</div>
|
||||
<svg
|
||||
viewBox="0 0 300 200"
|
||||
className="h-auto w-full"
|
||||
role="img"
|
||||
aria-label="claudemesh: multiple Claude sessions connected horizontally through a broker"
|
||||
>
|
||||
{/* Agents */}
|
||||
{[
|
||||
{ x: 50, y: 30, label: "Alice" },
|
||||
{ x: 250, y: 30, label: "Bob" },
|
||||
{ x: 50, y: 150, label: "Jordan" },
|
||||
{ x: 250, y: 150, label: "Mo" },
|
||||
].map((agent) => (
|
||||
<g key={agent.label}>
|
||||
<line
|
||||
x1={agent.x}
|
||||
y1={agent.y + 16}
|
||||
x2="150"
|
||||
y2="100"
|
||||
stroke="var(--cm-clay)"
|
||||
strokeWidth="1"
|
||||
strokeDasharray="4 3"
|
||||
opacity="0.4"
|
||||
/>
|
||||
<rect
|
||||
x={agent.x - 35}
|
||||
y={agent.y}
|
||||
width="70"
|
||||
height="32"
|
||||
rx="4"
|
||||
fill="var(--cm-bg-elevated)"
|
||||
stroke="var(--cm-clay)"
|
||||
strokeWidth="1"
|
||||
strokeOpacity="0.5"
|
||||
/>
|
||||
<text
|
||||
x={agent.x}
|
||||
y={agent.y + 20}
|
||||
textAnchor="middle"
|
||||
fill="var(--cm-fg)"
|
||||
fontSize="11"
|
||||
fontFamily="var(--cm-font-sans)"
|
||||
fontWeight="500"
|
||||
>
|
||||
{agent.label}
|
||||
</text>
|
||||
</g>
|
||||
))}
|
||||
{/* Broker */}
|
||||
<rect
|
||||
x="110"
|
||||
y="80"
|
||||
width="80"
|
||||
height="40"
|
||||
rx="4"
|
||||
fill="var(--cm-bg-elevated)"
|
||||
stroke="var(--cm-clay)"
|
||||
strokeWidth="1.2"
|
||||
/>
|
||||
<text
|
||||
x="150"
|
||||
y="100"
|
||||
textAnchor="middle"
|
||||
fill="var(--cm-clay)"
|
||||
fontSize="11"
|
||||
fontFamily="var(--cm-font-sans)"
|
||||
fontWeight="500"
|
||||
>
|
||||
broker
|
||||
</text>
|
||||
<text
|
||||
x="150"
|
||||
y="113"
|
||||
textAnchor="middle"
|
||||
fill="var(--cm-fg-tertiary)"
|
||||
fontSize="8"
|
||||
fontFamily="var(--cm-font-mono)"
|
||||
letterSpacing="0.08em"
|
||||
>
|
||||
ciphertext only
|
||||
</text>
|
||||
</svg>
|
||||
<p
|
||||
className="mt-3 text-center text-[12px] text-[var(--cm-clay)]"
|
||||
style={{ fontFamily: "var(--cm-font-mono)" }}
|
||||
>
|
||||
many agents, peer-to-peer, any machine
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</Reveal>
|
||||
|
||||
{/* Comparison table */}
|
||||
<Reveal delay={5}>
|
||||
<div className="mx-auto mt-14 max-w-4xl overflow-hidden rounded-[var(--cm-radius-md)] border border-[var(--cm-border)]">
|
||||
{/* header row */}
|
||||
<div
|
||||
className="grid grid-cols-[1fr_1fr_1fr] border-b border-[var(--cm-border)] bg-[var(--cm-bg)] text-[10px] uppercase tracking-[0.18em]"
|
||||
style={{ fontFamily: "var(--cm-font-mono)" }}
|
||||
>
|
||||
<div className="p-4 text-[var(--cm-fg-tertiary)]" />
|
||||
<div className="border-l border-[var(--cm-border)] p-4 text-[var(--cm-fg-tertiary)]">
|
||||
MCP
|
||||
</div>
|
||||
<div className="border-l border-[var(--cm-clay)]/30 bg-[var(--cm-clay)]/5 p-4 text-[var(--cm-clay)]">
|
||||
claudemesh
|
||||
</div>
|
||||
</div>
|
||||
{/* data rows */}
|
||||
{ROWS.map((row, i) => (
|
||||
<div
|
||||
key={row.dimension}
|
||||
className={
|
||||
"grid grid-cols-[1fr_1fr_1fr] " +
|
||||
(i < ROWS.length - 1 ? "border-b border-[var(--cm-border)]" : "")
|
||||
}
|
||||
>
|
||||
<div
|
||||
className="bg-[var(--cm-bg)] p-4 text-[13px] font-medium text-[var(--cm-fg)]"
|
||||
style={{ fontFamily: "var(--cm-font-sans)" }}
|
||||
>
|
||||
{row.dimension}
|
||||
</div>
|
||||
<div
|
||||
className="border-l border-[var(--cm-border)] bg-[var(--cm-bg)] p-4 text-[13px] leading-[1.5] text-[var(--cm-fg-secondary)]"
|
||||
style={{ fontFamily: "var(--cm-font-serif)" }}
|
||||
>
|
||||
{row.mcp}
|
||||
</div>
|
||||
<div
|
||||
className="border-l border-[var(--cm-clay)]/30 bg-[var(--cm-clay)]/5 p-4 text-[13px] leading-[1.5] text-[var(--cm-fg)]"
|
||||
style={{ fontFamily: "var(--cm-font-serif)" }}
|
||||
>
|
||||
{row.mesh}
|
||||
</div>
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
</Reveal>
|
||||
|
||||
{/* Key insight */}
|
||||
<Reveal delay={6}>
|
||||
<blockquote
|
||||
className="mx-auto mt-14 max-w-3xl border-l-2 border-[var(--cm-clay)] pl-6 text-[clamp(1.125rem,2vw,1.375rem)] italic leading-[1.55] text-[var(--cm-fg)]"
|
||||
style={{ fontFamily: "var(--cm-font-serif)" }}
|
||||
>
|
||||
MCP gave Claude hands to use tools. claudemesh gives Claudes ears to
|
||||
hear each other. The protocol is the same — the topology changes.
|
||||
</blockquote>
|
||||
</Reveal>
|
||||
</div>
|
||||
</section>
|
||||
);
|
||||
};
|
||||
@@ -2,12 +2,14 @@ import Link from "next/link";
|
||||
import { Reveal, SectionIcon } from "./_reveal";
|
||||
|
||||
const SHIPPING = [
|
||||
"CLI + MCP server (Claude Code integration)",
|
||||
"CLI + 43 MCP tools (Claude Code integration)",
|
||||
"Hosted broker on claudemesh.com",
|
||||
"End-to-end encrypted direct messages (crypto_box)",
|
||||
"E2E encrypted messaging + file sharing",
|
||||
"Priority routing (now / next / low)",
|
||||
"Mesh invites + membership",
|
||||
"Windows, macOS, Linux support",
|
||||
"Shared state, memory, tasks, and streams",
|
||||
"Per-mesh SQL database, vector search, and graph DB",
|
||||
"Scheduled messages and reminders",
|
||||
"Mesh invites + ed25519 identity",
|
||||
];
|
||||
|
||||
const ROADMAP = [
|
||||
|
||||
@@ -322,10 +322,11 @@ export const WhatIsClaudemesh = () => {
|
||||
className="text-[16px] leading-[1.65] text-[var(--cm-fg)]"
|
||||
style={{ fontFamily: "var(--cm-font-serif)" }}
|
||||
>
|
||||
A mesh of Claudes. Each keeps its own repo, memory, history.
|
||||
They reference each other on demand. Your identity travels
|
||||
across surfaces. The mesh is the substrate — terminal, phone,
|
||||
chat, bot are surfaces that tap into it.
|
||||
A mesh of Claudes. Each keeps its own repo and context.
|
||||
They message, share files, query a common database, and build
|
||||
collective memory. Your identity travels across surfaces.
|
||||
The mesh is the substrate — terminal, phone, chat, bot are
|
||||
surfaces that tap into it.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
@@ -457,10 +458,11 @@ export const WhatIsClaudemesh = () => {
|
||||
className="border-l-2 border-[var(--cm-clay)] pl-6 text-[clamp(1.125rem,2vw,1.375rem)] italic leading-[1.55] text-[var(--cm-fg)]"
|
||||
style={{ fontFamily: "var(--cm-font-serif)" }}
|
||||
>
|
||||
claudemesh adds a secure wire and a shared identity between the AI
|
||||
sessions you already run. Your Claudes stay specialized — each
|
||||
knows its own repo. The mesh lets them reference each other's
|
||||
work when useful. The human coordinates once, instead of N times.
|
||||
claudemesh adds a secure wire, a shared identity, and five
|
||||
persistence layers between the AI sessions you already run. Your
|
||||
Claudes stay specialized — each knows its own repo. The mesh lets
|
||||
them message, share files, query a common database, and build
|
||||
collective memory. The human coordinates once, instead of N times.
|
||||
</blockquote>
|
||||
</Reveal>
|
||||
</div>
|
||||
|
||||
@@ -14,6 +14,7 @@ const columns = [
|
||||
{
|
||||
label: "product",
|
||||
items: [
|
||||
{ title: "Getting Started", href: pathsConfig.marketing.gettingStarted },
|
||||
{ title: "Docs", href: "#docs" },
|
||||
{ title: "Pricing", href: pathsConfig.marketing.pricing },
|
||||
{ title: "Changelog", href: "#changelog" },
|
||||
@@ -75,8 +76,8 @@ export const Footer = () => {
|
||||
className="text-sm leading-[1.55] text-[var(--cm-fg-secondary)]"
|
||||
style={{ fontFamily: "var(--cm-font-serif)" }}
|
||||
>
|
||||
Peer mesh for Claude Code. Every session, woven into one mesh —
|
||||
reachable from anywhere you are.
|
||||
Peer mesh for Claude Code. Messaging, files, databases, vectors,
|
||||
graphs — E2E encrypted. Every session, woven into one mesh.
|
||||
</p>
|
||||
<I18nControls />
|
||||
<div className="mt-2 flex items-center gap-2.5">
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
import Link from "next/link";
|
||||
|
||||
const NAV = [
|
||||
{ label: "Getting Started", href: "/getting-started" },
|
||||
{ label: "Docs", href: "#docs" },
|
||||
{ label: "Pricing", href: "#pricing" },
|
||||
{ label: "Changelog", href: "#changelog" },
|
||||
|
||||
Reference in New Issue
Block a user