"use client"; import { useState } from "react"; import Link from "next/link"; import { PLANS, type BillingInterval } from "@/lib/billing"; import { Card } from "@/components/ui/Card"; import { Badge } from "@/components/ui/Badge"; import { LinkButton } from "@/components/ui/Button"; function CheckIcon() { return ( ); } export default function PricingPage() { const [interval, setInterval] = useState("monthly"); return (

Simple, node-based pricing

Every plan includes the full incident pipeline — transcription, correlation, mapping, and the Discord relay. Plans differ in how many nodes and seats you get, and how far back your history goes.

{/* Interval toggle */}
{(["monthly", "annual"] as BillingInterval[]).map((i) => ( ))}
{/* Plan cards */}
{PLANS.map((plan) => { const price = interval === "annual" ? plan.priceAnnualUsd : plan.priceMonthlyUsd; const priceLabel = price === null ? "Custom" : price === 0 ? "Free" : `$${interval === "annual" ? Math.round(price / 12) : price}`; return ( {plan.highlighted && Most popular}

{plan.name}

{plan.tagline}

{priceLabel} {price !== null && price > 0 && /mo} {interval === "annual" && price !== null && price > 0 && (

billed ${plan.priceAnnualUsd}/year

)}
{plan.priceMonthlyUsd === null ? "Contact sales" : "Get started"}
    {plan.features.map((f) => (
  • {f}
  • ))}
); })}

Prices shown are sample figures for this demo build — nothing here is connected to a live payment processor.

Questions about a plan?{" "} Check the FAQ {" "}or{" "} sign in to talk to us.

); }