Files
zeekay 7bf80b399b feat(brand): host-aware landing — zap-proto.io vs zerocopy.app
Single static deploy serves three custom domains; brand swaps client-side
on first effect:

  zap-proto.io          → developer brand ("Infinitely faster.")
  zap-proto.dev         → developer brand
  zerocopy.app          → marketing brand (ZApps, "future of I/O is here")
  zap-protocol.github.io → developer (legacy fallback, 301-target zap-proto.io)

Adds:
- lib/brand.ts: hostname → brand resolver + per-brand copy
- components/brand-hero.tsx: hero swaps tagline/headline/CTA per brand
- components/zapps-pillars.tsx: less-memory / lower-latency / future-proof
- components/protocol-family.tsx: zap-{http,ws,fix,rns,mcp,acp,a2a,base}
  showcase, status badges, links to github.com/zap-proto/<slug>
- public/CNAME: zap-proto.io (canonical apex)

Repo references migrated zap-protocol → zap-proto throughout site code,
docs, MDX. Old org redirects automatically; explicit stub READMEs land
via migration/migrate.sh once org membership is in place.

Build verified: pnpm build → 13 static pages, no errors.
2026-05-06 12:44:59 -07:00

145 lines
4.7 KiB
TypeScript

'use client';
// Protocol family showcase. The ZAP family of sub-protocols, each
// layered on the ZAP transport. Same shape across the site: each
// sub-protocol has a name, a one-line pitch, what it replaces, and a
// link to its repo. The repo URLs target the new `zap-proto/*` org.
import { Globe, Radio, TrendingUp, Compass, Cpu, MessageCircle, Network, Server } from 'lucide-react';
import type { ComponentType } from 'react';
interface SubProtocol {
name: string;
slug: string;
icon: ComponentType<{ className?: string }>;
pitch: string;
replaces: string;
status: 'shipping' | 'beta' | 'design';
}
const FAMILY: SubProtocol[] = [
{
name: 'zap-http',
slug: 'http',
icon: Globe,
pitch: 'HTTP request/response semantics over ZAP. Drop-in net/http API.',
replaces: 'HTTP/1.1 + HTTP/2 + TLS',
status: 'shipping',
},
{
name: 'zap-ws',
slug: 'ws',
icon: Radio,
pitch: 'Multi-stream pubsub. Per-stream FEC eliminates head-of-line blocking.',
replaces: 'WebSocket / SSE / HTTP/2 streams',
status: 'shipping',
},
{
name: 'zap-fix',
slug: 'fix',
icon: TrendingUp,
pitch: 'FIX 4.4 / 5.0 trading channel. Sub-microsecond p99 wire cost.',
replaces: 'FIX-over-TCP / FIX-over-TLS',
status: 'beta',
},
{
name: 'zap-rns',
slug: 'rns',
icon: Compass,
pitch: 'Service naming bound to KEM keypair. Spoofing reduces to key compromise.',
replaces: 'DNS / mDNS / SPIFFE',
status: 'beta',
},
{
name: 'zap-mcp',
slug: 'mcp',
icon: Cpu,
pitch: 'Model Context Protocol with mutual auth and non-repudiable provenance.',
replaces: 'MCP-over-HTTP+SSE / stdio',
status: 'beta',
},
{
name: 'zap-acp',
slug: 'acp',
icon: MessageCircle,
pitch: 'Agent Communication Protocol. FIPA-style speech acts, signed end-to-end.',
replaces: 'Plain HTTP agent endpoints',
status: 'design',
},
{
name: 'zap-a2a',
slug: 'a2a',
icon: Network,
pitch: 'Google Agent2Agent over ZAP. Agent cards, tasks, artifacts — all signed.',
replaces: 'A2A-over-HTTP+JSON',
status: 'design',
},
{
name: 'zap-base',
slug: 'spec',
icon: Server,
pitch: 'The transport. Cap\'n Proto wire, X-Wing/Z-Wing PQ KEM, mutual auth.',
replaces: 'TCP+TLS+gRPC / TCP+TLS+JSON',
status: 'shipping',
},
];
const STATUS_STYLE = {
shipping: 'text-emerald-400 bg-emerald-500/10 border-emerald-500/20',
beta: 'text-amber-400 bg-amber-500/10 border-amber-500/20',
design: 'text-zinc-400 bg-zinc-500/10 border-zinc-500/20',
} as const;
export function ProtocolFamily() {
return (
<section className="px-6 py-20 bg-fd-card border-y border-fd-border">
<div className="max-w-6xl mx-auto">
<div className="text-center mb-12">
<div className="inline-flex items-center gap-2 px-4 py-2 mb-6 text-sm font-medium text-blue-400 bg-blue-500/10 rounded-full">
<Network className="w-4 h-4" />
One wire. Many protocols.
</div>
<h2 className="text-3xl font-bold mb-4">The ZAP family</h2>
<p className="text-lg text-fd-muted-foreground max-w-2xl mx-auto">
Every sub-protocol composes onto the same ZAP transport. Authentication,
confidentiality, and post-quantum guarantees come from the wire — not from
each protocol re-implementing them.
</p>
</div>
<div className="grid gap-4 md:grid-cols-2 lg:grid-cols-3">
{FAMILY.map((p) => {
const Icon = p.icon;
return (
<a
key={p.slug}
href={`https://github.com/zap-proto/${p.slug}`}
target="_blank"
rel="noopener noreferrer"
className="group p-6 border border-fd-border rounded-lg hover:border-blue-500/50 transition-colors bg-fd-background"
>
<div className="flex items-start justify-between mb-3">
<div className="flex items-center gap-3">
<Icon className="w-5 h-5 text-blue-400" />
<span className="font-mono font-bold">{p.name}</span>
</div>
<span
className={`text-xs px-2 py-0.5 rounded-full border ${STATUS_STYLE[p.status]}`}
>
{p.status}
</span>
</div>
<p className="text-sm text-fd-foreground mb-3">{p.pitch}</p>
<p className="text-xs text-fd-muted-foreground">
Replaces:{' '}
<span className="font-mono text-fd-foreground/80">{p.replaces}</span>
</p>
</a>
);
})}
</div>
</div>
</section>
);
}