Welcome to Keysat.
-Keysat is a self-hosted licensing service for software creators who want to be paid in Bitcoin. Buyers pay through your own BTCPay; your software verifies signed keys offline. You own the signing key, the customer list, and the payment rails.
+Keysat lets independent software creators sell their work on their own terms. You ship software — open source, closed source, free / paid versions, whatever fits — and Keysat handles the buy page, the Bitcoin payment via BTCPay, and a signed license for each buyer. How you use that license inside your software is up to you: a one-time purchase to unlock the whole app, a free + paid split with specific paid features, a tip-jar style supporter badge — all legitimate. The licensing layer is a primitive, not a script.
These docs cover both ends:
diff --git a/integrate.html b/integrate.html index ff97cea..e9156cb 100644 --- a/integrate.html +++ b/integrate.html @@ -53,7 +53,7 @@Integrate the SDK.
-Wire Keysat licenses into your software in under an afternoon. The verifier is pure-function, offline, and ships in five lines.
+Wire Keysat licenses into your software in under an afternoon. The verifier is pure-function, offline, and ships in five lines. What you do with the result — refuse to start without a license, unlock specific features, just show a "supporter" badge — is your call. The SDK is the primitive; the business model is yours.
Prerequisites
Before you start, you should have:
@@ -117,11 +117,13 @@ MCowBQYDK2VwAyEAmz7q8r4t1v…h3k2pXq9wL const result = verifier.verify(licenseKeyFromUser); -if (!result.valid) { - exitUnlicensed(); -} -if (!result.entitlements.has('export')) { - disableExport(); +// Now decide what to do with the result, based on YOUR business model. +// One-time purchase to use the app at all? Refuse to start unless valid. +// Free + paid features? Check entitlements per feature. +// Supporter badge only? Just render differently when valid. +if (result.valid) { + app.licensed = true; + app.entitlements = result.entitlements; } +# What you do with the result is your choice. +if result.valid: + app.licensed = True + app.entitlements = result.entitlementsThe verifier returns a result object with the following fields:
diff --git a/pricing.html b/pricing.html new file mode 100644 index 0000000..07651a1 --- /dev/null +++ b/pricing.html @@ -0,0 +1,218 @@ + + + + + +Pricing
++ Keysat dogfoods its own licensing — the Keysat daemon is itself licensed by a Keysat + instance running at licensing.keysat.xyz. + The same primitive operators use to gate features in their own software gates a few + Keysat features behind paid tiers. The free tier is genuinely useful — + most hobbyist operators will never need to upgrade. +
+ +Creator
+-
+
- Up to 5 products +
- Up to 5 policies per product +
- Up to 5 active discount codes +
- BTCPay payments (Bitcoin / Lightning) +
- One-time purchases +
- Self-host on Start9 (always) +
- Distributed via free codes — ask +
Pro
+-
+
- Unlimited products / policies / codes +
- Recurring subscriptions (when shipped, v0.3) +
- Zaprite payments — accept BTC + cards (when shipped, v0.3) +
- Multi-operator admin (when shipped) +
- Everything in Creator +
Patron
+-
+
- Same features as Pro +
- "Patron" badge in your admin UI +
- Funds Keysat development +
- Honest upsell — no fake feature gate +
What the caps count
++ All caps fire at create-time only. 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. +
+-
+
- Products: counts every product row (active + inactive). Operators don't get to evade the cap by toggling old rows inactive. +
- Policies per product: counts policies on a single product, regardless of public/active state. +
- Active discount codes: counts only
active=truecodes. Disable old codes to free up slots without deleting them — disabled codes don't function but stay in the audit trail.
+
Switching tiers
++ Buy a higher-tier license at licensing.keysat.xyz/buy/keysat, + then activate it via StartOS → Keysat → Actions → Activate Keysat license. + 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. +
++ Downgrading: drop your license file (or replace with a lower + tier). Existing rows stay; new ones are subject to the new caps. No data loss. +
+ +Running unlicensed
++ 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/5/5). The + license exists primarily so operators get a real "I bought it" experience + and so we can offer the upgrade path to Pro. Hobbyists can run Keysat + indefinitely without paying us a sat. +
+ +What's coming
++ Two big v0.3 features will be Pro-only when they ship: +
+-
+
- Recurring subscriptions — auto-renewal, customer-managed cancellation. +
- Zaprite payments — accept Bitcoin and credit cards. Massively expands your addressable buyers. +
+ Both will gate on the recurring_billing and card_payments entitlements
+ respectively. Free-tier operators will see a "Pro feature" banner and a one-click
+ upgrade flow when they try to use these.
+