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.
Keysat Docs
Operator-facing documentation for Keysat — the Bitcoin-native self-hosted software licensing service for StartOS.
This repo is a static HTML site. No build step. The deployed version lives at keysat.xyz/docs.
Pages
- index.html — Introduction. What Keysat is, why it exists, and the sovereignty thesis behind it.
- install.html — Operator setup walkthrough. Installing the .s9pk on StartOS, connecting BTCPay, creating your first product and policy, and sharing your buy URL.
- integrate.html — Wiring Keysat licensing into your own software. Code examples for the TypeScript, Python, and Rust SDKs; entitlement-gating patterns; offline verification.
- operate.html — Day-to-day operations. Managing licenses, suspending / revoking, search, audit log, discount codes, refund flows.
- wire-format.html — Specification of the signed license key format (LIC1 envelope, base32 alphabet, Ed25519 signature scheme). Useful for porting the SDK to a new language.
Local development
The site is self-contained — open any .html file in a browser, or serve
the directory with any static file server:
# Python
python3 -m http.server 8000
# or
npx serve .
Then visit http://localhost:8000.
Styling
All pages share docs.css. Brand assets live in assets/. The visual
language matches the rest of the Keysat surface (cream paper-textured
background, navy ink, gold accents, classical type — Manrope for display,
Inter for body, JetBrains Mono for code).
Contributing
Issues and pull requests welcome. Substantive changes — new sections, restructuring, factual corrections to the wire-format spec — are best discussed in an issue first.
License
MIT. See LICENSE.