v0.2.0:7 — align package copy with website positioning

The Start9 registry card was still showing "Keysat — self-hosted
Bitcoin-paid software license server" while keysat.xyz now leads
with "Bitcoin-native self-hosted licensing service for software
creators." Operators landing on the registry from the marketing
site got a jarring tagline mismatch.

Aligned everywhere the old copy was hardcoded:

- startos/manifest/i18n.ts (short + long descriptions — these
  drive the registry card)
- assets/ABOUT.md (in-StartOS About panel)
- README.md (root + licensing-service/)
- licensing-service/Cargo.toml description

Long description also picked up two updates that should have
landed when the features did but never made it into the marketing
copy:
- Zaprite mention (Bitcoin + cards) alongside BTCPay
- Recurring subscriptions + in-place tier upgrades

Pure copy change. No code, no behavior, no schema. Republishing as
:7 because the registry card text lives inside the .s9pk and
won't refresh on operators' boxes without a version bump.
This commit is contained in:
Grant
2026-05-09 19:10:26 -05:00
parent ad338d0c3d
commit b95b47e0d5
6 changed files with 16 additions and 12 deletions
+1 -1
View File
@@ -5,7 +5,7 @@
<h1 align="center">Keysat</h1>
<p align="center">
Self-hosted, Bitcoin-paid software-licensing service for Start9.
Bitcoin-native self-hosted licensing service for software creators. Runs on Start9.
</p>
> **About this README.** Keysat is a from-scratch service authored for
+1 -1
View File
@@ -1,6 +1,6 @@
# About Keysat
**Keysat** is a self-hosted, Bitcoin-paid software licensing server: every operator runs their own instance on their own hardware, so there is no central authority, no shared database, and no lock-in. You own the signing key, the customer records, and the payment rails.
**Keysat** is a Bitcoin-native, self-hosted licensing service for software creators: every operator runs their own instance on their own hardware, so there is no central authority, no shared database, and no lock-in. You own the signing key, the customer records, and the payment rails.
After installing:
+1 -1
View File
@@ -3,7 +3,7 @@ name = "keysat"
version = "0.1.0"
edition = "2021"
rust-version = "1.75"
description = "Keysat — self-hosted Bitcoin-paid software licensing server for Start9"
description = "Keysat — Bitcoin-native self-hosted licensing service for software creators"
license-file = "LICENSE"
publish = false
+1 -1
View File
@@ -1,6 +1,6 @@
# Keysat
**Keysat** is a self-hosted Bitcoin-paid software licensing server, designed to run as a [Start9](https://start9.com) 0.4.0.x service alongside [BTCPay Server](https://btcpayserver.org). One instance can sell, issue, validate, and revoke licenses for any number of software products you own.
**Keysat** is a Bitcoin-native, self-hosted licensing service for software creators, designed to run as a [Start9](https://start9.com) 0.4.0.x service alongside [BTCPay Server](https://btcpayserver.org) (or [Zaprite](https://zaprite.com) for Bitcoin + cards). One instance can sell, issue, validate, and revoke licenses for any number of software products you own.
> The repository directory is still called `licensing-service/` on disk for continuity with earlier revisions. The crate, the binary, the StartOS package id, and all user-visible strings use **Keysat**.
+9 -7
View File
@@ -2,15 +2,17 @@
// later. Only English is filled in here; add more locales as needed.
export const short = {
en_US: 'Keysat — self-hosted Bitcoin-paid software license server.',
en_US: 'Bitcoin-native self-hosted licensing service for software creators.',
}
export const long = {
en_US: `Keysat lets you sell licenses to your own software products using
Bitcoin payments via BTCPay Server. Every instance runs on the operator's own
StartOS — there is no central authority. The service issues Ed25519-signed
license keys that downstream software can verify offline, with optional
expiry, entitlements, fingerprint binding, and per-seat activation caps.
Supports multiple products per instance and closed-source, open-core, and
en_US: `Keysat is a Bitcoin-native, self-hosted licensing service for
software creators. Sell licenses to your own software products with payments
via BTCPay Server (Bitcoin / Lightning) or Zaprite (Bitcoin + cards). Every
instance runs on the operator's own StartOS — there is no central authority.
The service issues Ed25519-signed license keys that downstream software can
verify offline, with optional expiry, entitlements, fingerprint binding, and
per-seat activation caps. Supports multiple products per instance, recurring
subscriptions, in-place tier upgrades, and closed-source, open-core, and
open-source distribution models.`,
}
+3 -1
View File
@@ -58,6 +58,8 @@ const RELEASE_NOTES = [
// in RELEASE_NOTES above (the milestone). Subsequent revisions
// append here.
const ROUTINE_NOTES = [
'0.2.0:7 — Marketing-copy alignment. Package short and long descriptions now read "Bitcoin-native self-hosted licensing service for software creators" — matches keysat.xyz and the new positioning. Long description also calls out Zaprite (Bitcoin + cards), recurring subscriptions, and tier upgrades, all of which shipped in earlier :N revisions but weren\'t reflected in the registry listing. Same change applied to the daemon Cargo.toml description, repo READMEs, and the in-StartOS About panel for consistency. No code changes; pure copy.',
'',
'0.2.0:6 — **Recurring subs + trials + self-tier live refresh actually work now.** Major bug-and-UX-fix release driven by hands-on testing of v0.2.0:5. The recurring-sub feature shipped in :4 had a critical gap: buying a recurring policy issued a license but never created the corresponding subscription row, so the renewal worker never picked it up — purchases silently behaved like one-shots. The trial flow shipped with `trial_days` configurable in admin but the field had zero effect on the purchase path. And admin tier changes on the daemon\'s own license never propagated to the running daemon, making it impossible to test Creator-tier gates on the master Keysat. This release fixes all three plus a slate of UX papercuts found during testing.',
'',
'**Recurring purchases now create subscriptions.** `issue_license_for_invoice` calls `subscriptions::create_subscription` whenever the resolved policy has `is_recurring=1`. The Subscriptions tab populates correctly; the renewal worker sees the row; cancellation works. Idempotent against webhook re-delivery.',
@@ -155,7 +157,7 @@ const ROUTINE_NOTES = [
].join('\n\n')
export const v0_2_0 = VersionInfo.of({
version: '0.2.0:6',
version: '0.2.0:7',
releaseNotes: { en_US: ROUTINE_NOTES },
// No on-disk transformation needed — v0.2.0:0 is a label change.
// SQLite-level migrations live separately under