23aa121afb
Five-page sweep to match the current daemon state. install.html: - Step 6 (first product): "Price (sats)" → reflects the currency picker (sats / USD / EUR) shipped in migration 0010. - Step 7 (first policy): drop the "default slug is consumed by public flow" myth — buy page renders a tier picker for any product with ≥2 public policies. Add references to entitlements catalog, hide-on-buy toggles, marketing bullets, recurring subscriptions, and the drag-to-reorder policy grid. integrate.html: - "Three official SDKs" → "Four official SDKs" + Go tab + install snippet. Notes the daemon's cross-check fixtures assert byte-for-byte parity across all four. - Admin API table: drop "by npub" from the licenses search description (backend supports it; UI hasn't surfaced it yet since the purchase flow doesn't capture npubs). operate.html: - Backups section: drop the imaginary `/data/issuer-key.pem` file — the signing keypair lives in the `server_keys` SQLite table, not in a PEM file on disk. Mention the self-license file path (`/data/keysat-license.txt`). - Rotation: drop the "v0.1 doesn't support / v0.2 will" framing; rotation isn't on the v0.2 / v0.3 roadmap and the v0.1 caveat is misleading. Update steps to reflect SQLite-as-keystore. - Webhook troubleshooting: point at the dedicated Webhooks → Failed (DLQ) view rather than the audit log. pricing.html: - Creator: 21,000 sats one-time → Free forever (matches actual master Keysat configuration). - Pro: 250,000 sats/yr → 100,000 sats/yr (recurring). Note recurring + tier upgrades have shipped; only Zaprite remains v0.3. - Patron: 500,000 sats/yr → 250,000 sats one-time perpetual. Differentiation rewritten: perpetual license + direct 1:1 support (not just "Pro with a badge"). - Active discount-code cap: 5 → 10 (real cap). - New "Prices shown are a snapshot" note pointing at the canonical live source (keysat.xyz#tiers + the buy page). - Updated unlicensed-caps line to show 5/5/10 with units. wire-format.html: - Replace the entirely-fabricated "KS-base32-blob with KSAT magic bytes" layout with the actual LIC1 envelope: `LIC1-<base32 payload>-<base32 signature>` split on dashes. - Document BOTH payload versions: v1 (legacy 74-byte fixed) and v2 (current default, 83-byte head + variable entitlements table). Field offsets, flag bits, signature scope all match the daemon source. - Drop the bogus Crockford-base32 + dash-grouping sections — the daemon uses RFC 4648 base32 with single-dash structure separators, not grouped-dashes for readability. - Drop the fabricated hex-dump worked example. - Porting section now points at `licensing-service/tests/crosscheck/` (the actual fixtures location) instead of a Python-SDK path. - Versioning policy: clarify envelope-tag vs payload-version cadence.
210 lines
8.4 KiB
HTML
210 lines
8.4 KiB
HTML
<!doctype html>
|
|
<html lang="en">
|
|
<head>
|
|
<meta charset="utf-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
<title>Keysat Docs — Pricing</title>
|
|
<link rel="icon" type="image/svg+xml" href="assets/favicon.svg">
|
|
<link rel="stylesheet" href="docs.css">
|
|
<style>
|
|
.tier-grid { display:grid; grid-template-columns:repeat(3, 1fr); gap:18px; margin:24px 0; }
|
|
@media (max-width:760px) { .tier-grid { grid-template-columns:1fr; } }
|
|
.tier-card {
|
|
background:var(--cream-50);
|
|
border:1px solid var(--border-1);
|
|
border-radius:12px;
|
|
padding:24px 22px;
|
|
display:flex; flex-direction:column;
|
|
}
|
|
.tier-card.featured {
|
|
border-color:var(--gold-500);
|
|
box-shadow:0 0 0 3px rgba(191,160,104,0.10), 0 8px 16px rgba(14,31,51,0.10);
|
|
position:relative;
|
|
}
|
|
.tier-card .badge {
|
|
position:absolute; top:-10px; left:50%; transform:translateX(-50%);
|
|
background:var(--gold-500); color:var(--navy-950);
|
|
font-size:10px; font-weight:700; letter-spacing:0.16em; text-transform:uppercase;
|
|
padding:4px 10px; border-radius:999px;
|
|
}
|
|
.tier-card h3 {
|
|
font-family:var(--font-display); font-size:22px; font-weight:600;
|
|
color:var(--navy-950); margin:0 0 6px; letter-spacing:-0.01em;
|
|
}
|
|
.tier-card .price {
|
|
font-family:var(--font-display); font-size:28px; font-weight:700;
|
|
color:var(--navy-950); letter-spacing:-0.02em; line-height:1.1;
|
|
margin-bottom:4px;
|
|
}
|
|
.tier-card .price .unit {
|
|
font-family:var(--font-body); font-size:13px; font-weight:500; color:var(--ink-500);
|
|
margin-left:6px;
|
|
}
|
|
.tier-card .frequency { font-size:12px; color:var(--ink-500); margin-bottom:18px; }
|
|
.tier-card ul {
|
|
list-style:none; padding:0; margin:0 0 22px;
|
|
font-size:14px; line-height:1.55; color:var(--ink-700);
|
|
flex:1;
|
|
}
|
|
.tier-card li { padding:4px 0 4px 22px; position:relative; }
|
|
.tier-card li::before {
|
|
content:'\2713'; position:absolute; left:0; top:5px;
|
|
color:var(--gold-700); font-weight:700;
|
|
}
|
|
.tier-card .cta {
|
|
display:inline-block; text-align:center;
|
|
padding:10px 16px;
|
|
background:var(--navy-800); color:var(--cream-50);
|
|
font-weight:600; font-size:14px;
|
|
border-radius:8px; text-decoration:none;
|
|
}
|
|
.tier-card .cta.secondary {
|
|
background:transparent; color:var(--navy-800);
|
|
border:1px solid var(--border-2);
|
|
}
|
|
.note {
|
|
background:var(--cream-100); border:1px solid var(--border-1);
|
|
border-radius:10px; padding:16px 18px; margin:24px 0;
|
|
font-size:14px; line-height:1.55;
|
|
}
|
|
</style>
|
|
</head>
|
|
<body>
|
|
|
|
<div class="topnav">
|
|
<a href="https://keysat.xyz" class="brand" title="Back to keysat.xyz"><img src="assets/keysat-mark.svg" alt=""><span>Keysat</span></a>
|
|
<span class="docs-tag">Docs</span>
|
|
</div>
|
|
|
|
<div class="layout">
|
|
<aside class="side">
|
|
<a href="#overview">Overview</a>
|
|
<a href="#tiers">The three tiers</a>
|
|
<a href="#what-counts">What the caps count</a>
|
|
<a href="#changing-tiers">Switching tiers</a>
|
|
<a href="#unlicensed">Running unlicensed</a>
|
|
</aside>
|
|
|
|
<main class="main">
|
|
|
|
<h1 id="overview">Pricing</h1>
|
|
<p class="lede">
|
|
Keysat dogfoods its own licensing — the Keysat daemon is itself licensed by a Keysat
|
|
instance running at <a href="https://licensing.keysat.xyz">licensing.keysat.xyz</a>.
|
|
The same primitive operators use to gate features in their own software gates a few
|
|
Keysat features behind paid tiers. The <strong>free tier is genuinely useful</strong> —
|
|
most hobbyist operators will never need to upgrade.
|
|
</p>
|
|
|
|
<div id="tiers" class="tier-grid">
|
|
|
|
<div class="tier-card">
|
|
<h3>Creator</h3>
|
|
<div class="price">Free<span class="unit">forever</span></div>
|
|
<div class="frequency">no payment required</div>
|
|
<ul>
|
|
<li>Up to 5 products</li>
|
|
<li>Up to 5 policies per product</li>
|
|
<li>Up to 10 active discount codes</li>
|
|
<li>BTCPay payments (Bitcoin / Lightning)</li>
|
|
<li>All four SDKs · full wire format</li>
|
|
<li>Webhooks, audit log, recovery, analytics opt-in</li>
|
|
<li>Self-host on Start9 (always)</li>
|
|
</ul>
|
|
<a class="cta secondary" href="https://licensing.keysat.xyz/buy/keysat?policy=creator">Get Creator</a>
|
|
</div>
|
|
|
|
<div class="tier-card featured">
|
|
<div class="badge">Most popular</div>
|
|
<h3>Pro</h3>
|
|
<div class="price">100,000<span class="unit">sats</span></div>
|
|
<div class="frequency">per year (recurring)</div>
|
|
<ul>
|
|
<li>Unlimited products / policies / codes</li>
|
|
<li>Recurring subscriptions — trials, grace, auto-renew</li>
|
|
<li>Zaprite payments — accept BTC + cards <em>(shipping in v0.3)</em></li>
|
|
<li>In-place tier upgrades (proration handled)</li>
|
|
<li>Everything in Creator</li>
|
|
</ul>
|
|
<a class="cta" href="https://licensing.keysat.xyz/buy/keysat?policy=pro">Upgrade to Pro</a>
|
|
</div>
|
|
|
|
<div class="tier-card">
|
|
<h3>Patron</h3>
|
|
<div class="price">250,000<span class="unit">sats</span></div>
|
|
<div class="frequency">one-time, perpetual</div>
|
|
<ul>
|
|
<li>Everything in Pro</li>
|
|
<li>Perpetual license — one-time, never renews</li>
|
|
<li>Direct one-on-one support</li>
|
|
<li>"Patron" badge in your admin UI</li>
|
|
<li>Listed on the Patrons page at keysat.xyz</li>
|
|
<li>Early access to release-candidate builds</li>
|
|
</ul>
|
|
<a class="cta secondary" href="https://licensing.keysat.xyz/buy/keysat?policy=patron">Become a Patron</a>
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<div class="note">
|
|
<strong>Prices shown are a snapshot.</strong> The canonical source is the live
|
|
tier cards at <a href="https://keysat.xyz#tiers">keysat.xyz</a> (rendered
|
|
dynamically from the master Keysat instance) and
|
|
<a href="https://licensing.keysat.xyz/buy/keysat">licensing.keysat.xyz/buy/keysat</a>.
|
|
Launch-special discounts (when active) show on those pages with a "LAUNCH
|
|
SPECIAL" ribbon and the discount auto-applied; they're not represented here.
|
|
</div>
|
|
|
|
<div class="note">
|
|
<strong>What's gated.</strong> Capacity caps (products / policies-per-product /
|
|
active discount codes) are enforced at create-time on the Creator tier. Pro
|
|
unlocks the <code>recurring_billing</code> entitlement (auto-renewing
|
|
subscriptions) and will unlock <code>zaprite_payments</code> (card payments
|
|
via Zaprite) when that lands in v0.3. Patron differs from Pro by being a
|
|
one-time perpetual license rather than an annual subscription, plus direct
|
|
one-on-one support — not a feature gate, a different ownership model.
|
|
</div>
|
|
|
|
<h2 id="what-counts">What the caps count</h2>
|
|
<p>
|
|
All caps fire at <strong>create-time only</strong>. Once you're under the cap,
|
|
you're never retroactively kicked off. A Creator-tier operator who currently
|
|
has 5 products keeps all 5 if you ever lower the caps in the future. The cap
|
|
just stops them from creating a 6th.
|
|
</p>
|
|
<ul>
|
|
<li><strong>Products</strong>: counts every product row (active + inactive). Operators don't get to evade the cap by toggling old rows inactive.</li>
|
|
<li><strong>Policies per product</strong>: counts policies on a single product, regardless of public/active state.</li>
|
|
<li><strong>Active discount codes</strong>: counts only <code>active=true</code> codes. Disable old codes to free up slots without deleting them — disabled codes don't function but stay in the audit trail.</li>
|
|
</ul>
|
|
|
|
<h2 id="changing-tiers">Switching tiers</h2>
|
|
<p>
|
|
Buy a higher-tier license at <a href="https://licensing.keysat.xyz/buy/keysat">licensing.keysat.xyz/buy/keysat</a>,
|
|
then activate it via StartOS → Keysat → Actions → <em>Activate Keysat license</em>.
|
|
The daemon picks up the new entitlements on next request — no restart needed.
|
|
The persistent banner in your admin sidebar always shows your current tier
|
|
and the next-tier CTA.
|
|
</p>
|
|
<p>
|
|
<strong>Downgrading</strong>: drop your license file (or replace with a lower
|
|
tier). Existing rows stay; new ones are subject to the new caps. No data loss.
|
|
</p>
|
|
|
|
<h2 id="unlicensed">Running unlicensed</h2>
|
|
<p>
|
|
Keysat works without any license at all — you'll see "Unlicensed" in the
|
|
sidebar and get the same caps as a Creator-tier operator
|
|
(5 products / 5 policies per product / 10 active discount codes). The
|
|
Creator tier is free either way; the self-license flow exists primarily so
|
|
operators get a real "I bought it" experience for the paid tiers and so we
|
|
can offer the upgrade path to Pro. Hobbyists can run Keysat indefinitely
|
|
without paying us a sat.
|
|
</p>
|
|
|
|
</main>
|
|
</div>
|
|
|
|
</body>
|
|
</html>
|