diff --git a/site/app/pricing/page.tsx b/site/app/pricing/page.tsx index e39733d..fb382e4 100644 --- a/site/app/pricing/page.tsx +++ b/site/app/pricing/page.tsx @@ -2,153 +2,177 @@ import Link from "next/link"; import type { Metadata } from "next"; export const metadata: Metadata = { - title: "Pricing", - description: - "Priced per managed server. People, keys, workflows and secrets are free. Free for 3 servers, £4 per server per month, or £290 a year self-hosted.", + title: "Pricing", + description: + "Priced per managed server. People, keys, workflows and secrets are free. Free for 3 servers, £4 per server per month, or £290 a year self-hosted.", }; const COMPARISON: [string, string, string, string][] = [ - ["Managed servers", "3", "Unlimited", "Unlimited"], - ["Members", "1", "Unlimited", "Unlimited"], - ["SSH key assignment", "Yes", "Yes", "Yes"], - ["Workflows and step library", "Yes", "Yes", "Yes"], - ["Monitors", "3", "Unlimited", "Unlimited"], - ["Secrets vault", "No", "Yes", "Yes"], - ["Browser console", "No", "Yes", "Yes"], - ["OIDC single sign-on", "No", "Yes", "Yes"], - ["Audit history", "30 days", "Forever", "Forever"], - ["Runs on your hardware", "No", "No", "Yes"], - ["Support", "Community", "Next business day", "Priority"], + ["Managed servers", "3", "Unlimited", "Unlimited"], + ["Members", "1", "Unlimited", "Unlimited"], + ["SSH key assignment", "Yes", "Yes", "Yes"], + ["Workflows and step library", "Yes", "Yes", "Yes"], + ["Monitors", "3", "Unlimited", "Unlimited"], + ["Secrets vault", "No", "Yes", "Yes"], + ["Browser console", "No", "Yes", "Yes"], + ["OIDC single sign-on", "No", "Yes", "Yes"], + ["Audit history", "30 days", "Forever", "Forever"], + ["Runs on your hardware", "No", "No", "Yes"], + ["Support", "Community", "Next business day", "Priority"], ]; export default function PricingPage() { - return ( -
- Pricing -

- Per managed server. Nothing else counts. -

-

- People are free. Keys, workflows, monitors and secrets are free. You pay for servers running an agent, because - that is the only number that grows with you. -

+ return ( +
+ Pricing +

+ Per managed server. Nothing else counts. +

+

+ People are free. Keys, workflows, monitors and secrets are free. + You pay for servers running an agent, because that is the only + number that grows with you. +

-
-
-
-
Solo
-

A homelab, a couple of VPSes, and the keys on your own laptop.

-
-
- £0 forever -
-
    -
  • Up to 3 servers
  • -
  • Keys, workflows and monitors
  • -
  • One member, one instance
  • -
  • Community support
  • -
- - Get started - -
+
+
+
+
Solo
+

+ A homelab, a couple of VPSes, and the keys on your + own laptop. +

+
+
+ £0 forever +
+
    +
  • Up to 3 servers
  • +
  • Keys, workflows and monitors
  • +
  • One member, one instance
  • +
  • Community support
  • +
+ + Get started + +
-
-
-
Fleet
-

Real infrastructure, and more than one person holding the keys.

-
-
- £4 / server / month -
-
    -
  • Unlimited servers and members
  • -
  • Owner, admin and member roles
  • -
  • OIDC single sign-on
  • -
  • Browser console and secrets vault
  • -
  • Full audit history
  • -
  • Email support, next business day
  • -
- - Start 14-day trial - -
+
+
+
Professional
+

+ Real infrastructure, and more than one person + holding the keys. +

+
+
+ £4 / server / month +
+
    +
  • Unlimited servers and members
  • +
  • Owner, admin and member roles
  • +
  • OIDC single sign-on
  • +
  • Browser console and secrets vault
  • +
  • Full audit history
  • +
  • Email support, next business day
  • +
+ + Start 14-day trial + +
-
-
-
Self-hosted
-

The whole stack on your metal, behind your own boundary.

-
-
- £290 / year, per install -
-
    -
  • Everything in Fleet, no server cap
  • -
  • Your MongoDB, Redis and certificates
  • -
  • Mirror agent releases internally
  • -
  • Priority support and upgrade notes
  • -
- - Talk to us - -
-
- -
- - - - - - - - - - - {COMPARISON.map(([capability, solo, fleet, selfHosted]) => ( - - - - - - - ))} - -
CapabilitySoloFleetSelf-hosted
{capability}{solo}{fleet}{selfHosted}
-
- -
- Fine print, in plain words -
-
- COUNTING -
-

What counts as a server

-

One running agent, one server. Remove a box and it stops billing that day.

+
+
+
Self-hosted
+

+ The whole stack on your metal, behind your own + boundary. +

+
+
+ £290 / year, per install +
+
    +
  • Everything in Professional, no server cap
  • +
  • Your MongoDB, Redis and certificates
  • +
  • Mirror agent releases internally
  • +
  • Priority support and upgrade notes
  • +
+ + Talk to us + +
-
-
- LIMITS -
-

Going over on Solo

-

- Nothing is deleted. A fourth agent registers and heartbeats, but stops syncing keys until you upgrade or - remove a server. -

+ +
+ + + + + + + + + + + {COMPARISON.map( + ([capability, solo, professional, selfHosted]) => ( + + + + + + + ), + )} + +
CapabilitySoloProfessionalSelf-hosted
{capability}{solo}{professional}{selfHosted}
-
-
- EXIT -
-

Leaving

-

- Export every server, key, workflow and secret group as JSON whenever you like. Agents keep their last - synced state on disk, so nobody is locked out mid-migration. -

+ +
+ Fine print, in plain words +
+
+ COUNTING +
+

What counts as a server

+

+ One running agent, one server. Remove a box and + it stops billing that day. +

+
+
+
+ LIMITS +
+

Going over on Solo

+

+ Nothing is deleted. A fourth agent registers and + heartbeats, but stops syncing keys until you + upgrade or remove a server. +

+
+
+
+ EXIT +
+

Leaving

+

+ Export every server, key, workflow and secret + group as JSON whenever you like. Agents keep + their last synced state on disk, so nobody is + locked out mid-migration. +

+
+
+
-
-
-
-
- ); +
+ ); } diff --git a/site/components/InstrumentPanel.tsx b/site/components/InstrumentPanel.tsx index bc83f26..838aa09 100644 --- a/site/components/InstrumentPanel.tsx +++ b/site/components/InstrumentPanel.tsx @@ -2,13 +2,6 @@ import { useEffect, useState } from "react"; -/* - * The hero's signature element: a fleet panel that plays one honest cycle of - * what the product actually does a workflow runs three steps, a TLS monitor - * fails and opens an incident, a key revocation lands then rests. It is a - * dramatisation, not live data, so nothing here talks to an API. - */ - type LogLine = { time: string; body: React.ReactNode }; type Beat = {