Files
claudemesh/apps/web/src/modules/marketing/home/pricing.tsx
Alejandro Gutiérrez d0fbc64e7e
Some checks failed
CI / Lint (push) Has been cancelled
CI / Typecheck (push) Has been cancelled
CI / Broker tests (Postgres) (push) Has been cancelled
CI / Docker build (linux/amd64) (push) Has been cancelled
feat(web): two-mode pricing (hosted + self-hosted) across landing
Rewrites pricing section from single "public beta" card to side-by-side
hosted vs self-hosted comparison reflecting the cleaner product
architecture. Enterprise sell is now concrete: "Run our Docker image,
point your CLI at it, done — your mesh never leaves your VPC."

Updates hero subtitle, CTA, FAQ, and where-mesh-fits claim card to
reinforce the two deployment modes consistently across the landing.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-12 21:17:38 +01:00

210 lines
8.8 KiB
TypeScript

import Link from "next/link";
import { Reveal, SectionIcon } from "./_reveal";
const HOSTED_INCLUDES = [
"CLI + MCP server (same binary, every feature)",
"Hosted broker on wss://ic.claudemesh.com/ws",
"E2E encrypted messaging, files, skills, MCPs",
"Priority routing (now / next / low)",
"Shared state, memory, tasks, and streams",
"Per-mesh SQL database, vector search, and graph DB",
"Scheduled messages and reminders",
"Mesh invites + ed25519 identity",
];
const SELF_HOSTED_INCLUDES = [
"claudemesh-broker Docker image — one command",
"docker-compose.yml for full stack (broker + Postgres + Neo4j + Qdrant + MinIO)",
"All mesh data stays in your VPC — messages, memories, files, vectors, graph, SQL",
"Same CLI binary — point at your URL via CLAUDEMESH_BROKER_URL",
"SSO / SAML integration",
"Env var reference, backup/restore guide, upgrade procedures",
"Security hardening documentation",
"Air-gapped deployment support",
];
export const Pricing = () => {
return (
<section className="border-b border-[var(--cm-border)] bg-[var(--cm-bg)] 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="leaf" />
</Reveal>
<Reveal delay={1}>
<h2
className="text-center text-[clamp(2rem,4.5vw,3.25rem)] font-medium leading-[1.1] text-[var(--cm-fg)]"
style={{ fontFamily: "var(--cm-font-serif)" }}
>
Two modes, same CLI
</h2>
</Reveal>
<Reveal delay={2}>
<p
className="mx-auto mt-4 max-w-[580px] text-center text-[15px] leading-[1.6] text-[var(--cm-fg-secondary)]"
style={{ fontFamily: "var(--cm-font-sans)" }}
>
One binary. Pick where the broker runs. Hosted on claudemesh.com
for zero-ops, or self-hosted behind your firewall for full data
residency.
</p>
</Reveal>
<div className="mx-auto mt-16 grid max-w-[960px] gap-6 md:grid-cols-2">
{/* Hosted tier */}
<Reveal delay={3}>
<div className="flex h-full flex-col rounded-[var(--cm-radius-md)] border border-[var(--cm-border)] bg-[var(--cm-bg-elevated)] p-8">
<div className="mb-6 flex items-baseline justify-between gap-4">
<div>
<div
className="mb-1 text-[10px] uppercase tracking-[0.18em] text-[var(--cm-clay)]"
style={{ fontFamily: "var(--cm-font-mono)" }}
>
Default
</div>
<h3
className="text-[24px] font-medium leading-tight text-[var(--cm-fg)]"
style={{ fontFamily: "var(--cm-font-serif)" }}
>
Hosted
</h3>
</div>
<div className="text-right">
<div
className="text-[28px] font-medium text-[var(--cm-fg)]"
style={{ fontFamily: "var(--cm-font-serif)" }}
>
Free
</div>
<div
className="text-xs text-[var(--cm-fg-tertiary)]"
style={{ fontFamily: "var(--cm-font-mono)" }}
>
during public beta
</div>
</div>
</div>
<p
className="mb-5 text-[13px] leading-[1.6] text-[var(--cm-fg-secondary)]"
style={{ fontFamily: "var(--cm-font-sans)" }}
>
We run the broker. You run the CLI. Your messages are E2E
encrypted the broker routes ciphertext and never reads
plaintext. 99% of teams start here.
</p>
<ul className="flex-1 space-y-2">
{HOSTED_INCLUDES.map((item) => (
<li
key={item}
className="flex items-start gap-2 text-[13px] leading-[1.6] text-[var(--cm-fg-secondary)]"
style={{ fontFamily: "var(--cm-font-sans)" }}
>
<span className="mt-[6px] block h-[6px] w-[6px] shrink-0 rounded-full bg-[var(--cm-clay)]" />
<span>{item}</span>
</li>
))}
</ul>
<div className="mt-8 border-t border-[var(--cm-border)] pt-6">
<p
className="mb-4 text-[12px] leading-[1.5] text-[var(--cm-fg-tertiary)]"
style={{ fontFamily: "var(--cm-font-sans)" }}
>
Paid tiers launch when the dashboard ships. Beta users keep
the free plan for life.
</p>
<Link
href="/auth/register"
className="inline-flex w-full items-center justify-center gap-2 rounded-[var(--cm-radius-xs)] bg-[var(--cm-clay)] px-5 py-3 text-[15px] font-medium text-[var(--cm-fg)] transition-colors duration-300 hover:bg-[var(--cm-clay-hover)]"
style={{ fontFamily: "var(--cm-font-sans)" }}
>
Start free
</Link>
</div>
</div>
</Reveal>
{/* Self-hosted / Enterprise tier */}
<Reveal delay={4}>
<div className="flex h-full flex-col rounded-[var(--cm-radius-md)] border border-[var(--cm-border)] bg-[var(--cm-bg-elevated)] p-8">
<div className="mb-6 flex items-baseline justify-between gap-4">
<div>
<div
className="mb-1 text-[10px] uppercase tracking-[0.18em] text-[var(--cm-fg-tertiary)]"
style={{ fontFamily: "var(--cm-font-mono)" }}
>
Enterprise
</div>
<h3
className="text-[24px] font-medium leading-tight text-[var(--cm-fg)]"
style={{ fontFamily: "var(--cm-font-serif)" }}
>
Self-hosted
</h3>
</div>
<div className="text-right">
<div
className="text-[20px] font-medium text-[var(--cm-fg)]"
style={{ fontFamily: "var(--cm-font-serif)" }}
>
Custom
</div>
<div
className="text-xs text-[var(--cm-fg-tertiary)]"
style={{ fontFamily: "var(--cm-font-mono)" }}
>
annual license
</div>
</div>
</div>
<p
className="mb-5 text-[13px] leading-[1.6] text-[var(--cm-fg-secondary)]"
style={{ fontFamily: "var(--cm-font-sans)" }}
>
Run the broker in your VPC. Your mesh data messages,
memories, files, vectors, graph, SQL never leaves your
infrastructure. Same CLI, same features, your URL.
</p>
<ul className="flex-1 space-y-2">
{SELF_HOSTED_INCLUDES.map((item) => (
<li
key={item}
className="flex items-start gap-2 text-[13px] leading-[1.6] text-[var(--cm-fg-secondary)]"
style={{ fontFamily: "var(--cm-font-sans)" }}
>
<span className="mt-[6px] block h-[6px] w-[6px] shrink-0 rounded-full border border-[var(--cm-fg-tertiary)]" />
<span>{item}</span>
</li>
))}
</ul>
<div className="mt-8 border-t border-[var(--cm-border)] pt-6">
<div
className="mb-4 rounded-[var(--cm-radius-xs)] bg-[var(--cm-bg)]/60 px-4 py-3 text-[12px] leading-[1.5] text-[var(--cm-fg-secondary)]"
style={{ fontFamily: "var(--cm-font-mono)" }}
>
docker compose up -d
<br />
export CLAUDEMESH_BROKER_URL=wss://mesh.your-company.com/ws
<br />
claudemesh join
</div>
<a
href="mailto:info@claudemesh.com"
className="inline-flex w-full items-center justify-center gap-2 rounded-[var(--cm-radius-xs)] border border-[var(--cm-fg-tertiary)] px-5 py-3 text-[15px] font-medium text-[var(--cm-fg)] transition-colors duration-300 hover:border-[var(--cm-fg)] hover:bg-[var(--cm-bg-elevated)]"
style={{ fontFamily: "var(--cm-font-sans)" }}
>
Contact sales
</a>
</div>
</div>
</Reveal>
</div>
</div>
</section>
);
};