"use client"; import { useState } from "react"; import Link from "next/link"; import { c2api } from "@/lib/c2api"; /** * SAAS_PLAN.md B6's waitlist form — POST /waitlist (routers/waitlist.py) is * public, source-IP rate-limited, and deliberately not coupled to any plan * or tier: the commercial model (who runs the node, what a customer * actually buys) is still an open decision (SAAS_PLAN.md section 6.1), so * this collects only {email, org_name, note} and makes no promise about * price or plan. */ export default function WaitlistPage() { const [email, setEmail] = useState(""); const [orgName, setOrgName] = useState(""); const [note, setNote] = useState(""); const [submitting, setSubmitting] = useState(false); const [error, setError] = useState(null); const [done, setDone] = useState(false); async function handleSubmit(e: React.FormEvent) { e.preventDefault(); setSubmitting(true); setError(null); try { await c2api.joinWaitlist({ email, org_name: orgName || undefined, note: note || undefined }); setDone(true); } catch (err) { setError(err instanceof Error ? err.message : "Could not submit — try again in a moment."); } finally { setSubmitting(false); } } return (
D DRB
{done ? ( <>

You're on the list

Thanks — we'll reach out at the email you gave us. In the meantime, feel free to{" "} read the FAQ.

) : ( <>

Request access

Self-serve signup isn't open yet. Leave your details and we'll follow up to get your organization set up.

setEmail(e.target.value)} required autoComplete="email" className="w-full bg-gray-800 border border-gray-700 rounded-lg px-3 py-2 text-white text-sm focus:outline-none focus:border-indigo-500" />
setOrgName(e.target.value)} className="w-full bg-gray-800 border border-gray-700 rounded-lg px-3 py-2 text-white text-sm focus:outline-none focus:border-indigo-500" />