diff --git a/install.html b/install.html index 02f7885..af7e4a4 100644 --- a/install.html +++ b/install.html @@ -132,21 +132,24 @@ payment_methods: [BTC-OnChain, BTC-LightningNetwork]Slug — lowercase, hyphens, will appear in the public URL. e.g. bitcoin-ticker-pro.
  • Display name — shown on the buyer’s purchase page and on receipts.
  • Description — one or two sentences; rendered as plain text.
  • -
  • Price (sats) — an integer. e.g. 50000 for ~$30 USD at current rates.
  • +
  • Price — the currency picker accepts sats, USD, or EUR. For sats, enter an integer (e.g. 50000). For USD/EUR, enter the amount in dollars/euros — Keysat converts to BTC at invoice creation and the buyer pays the locked-in BTC amount.
  • The product is created with no policies attached. Next:

    -

    Step 7 — Define a default policy

    -

    Go to Policies → Create a new policy. Pick the product, then:

    +

    Step 7 — Define one or more policies

    +

    Go to Policies → Create a new policy. Pick the product, then fill in:

    +

    If you're selling a multi-tier product (e.g. Basic / Pro / Max), repeat this step for each tier. Drag the cards in the Policies grid to set the order shown to buyers.

    +

    Step 8 — Share your purchase URL

    Your public purchase URL is now live at:

    diff --git a/integrate.html b/integrate.html index 39fe979..ccbcace 100644 --- a/integrate.html +++ b/integrate.html @@ -58,12 +58,13 @@

    Pick an SDK

    -

    Three official SDKs ship today. They are wire-compatible — a license issued by your Keysat verifies identically in any of them.

    +

    Four official SDKs ship today. They are wire-compatible — a license issued by your Keysat verifies identically in any of them. Cross-check fixtures in the daemon repo prove each SDK accepts the same bytes the daemon mints.

    +
    # npm
    @@ -79,6 +80,10 @@ pip install keysat-licensing-client
     
     # or with poetry
     poetry add keysat-licensing-client
    +

    If your language isn’t covered, see Wire format. The format is small and porting takes about an afternoon.

    @@ -235,7 +240,7 @@ result = verifier.verify(license_key_from_user) POST/v1/admin/productsCreate a product. POST/v1/admin/policiesCreate a policy. POST/v1/admin/discount-codesCreate a discount or comp code. - GET/v1/admin/licenses/searchFind licenses by email, npub, or invoice. + GET/v1/admin/licensesList / search licenses by buyer email or BTCPay invoice id. (Backend also supports npub search; the buyer-side npub capture flow is still in progress.) POST/v1/admin/licenses/<id>/revokeRevoke a license. POST/v1/admin/webhook-endpointsRegister an outbound webhook. GET/v1/admin/auditRead audit log. diff --git a/operate.html b/operate.html index 316f175..f1e80a5 100644 --- a/operate.html +++ b/operate.html @@ -55,9 +55,9 @@

    The Keysat backup payload is intentionally tiny. It contains:

    That’s it. No log files (those rotate locally), no caches.

    @@ -83,19 +83,19 @@

    The signing keypair restores along with the database, so all previously-issued licenses verify identically against the same public key. You don’t need to re-distribute the public key to your customers.

    Rotating the signing key

    -

    You generally don’t want to rotate the signing key — doing so invalidates every license you’ve ever issued. v0.1 doesn’t support rotation; the key is generated once at first start and never changed.

    +

    You generally don’t want to rotate the signing key — doing so invalidates every license you’ve ever issued. There is no admin-UI affordance for rotation today; the key is generated once on first start (and persisted to the server_keys SQLite table) and stays there for the life of the instance.

    If you absolutely need to rotate (e.g. you suspect the keypair has leaked off the box):

    1. Stop Keysat.
    2. -
    3. Move /data/issuer-key.pem aside.
    4. +
    5. Drop the row in the server_keys table (or move the database aside entirely if you also want to start clean).
    6. Restart Keysat — it will generate a fresh keypair on first run.
    7. -
    8. Re-issue all active licenses to existing customers using the new key. The admin UI doesn’t support bulk re-issuance yet; this is a manual SQL exercise.
    9. -
    10. Push a software update that swaps the embedded public key.
    11. +
    12. Re-issue all active licenses to existing customers using the new key. The admin UI doesn’t support bulk re-issuance yet; this is a manual SQL + scripted-API exercise.
    13. +
    14. Push a software update that swaps the embedded public key in your downstream apps.
    -

    The cleaner path, for v0.2 onward, will be to support a rolling rotation where both keys verify for a transition period.

    +

    A future release may support rolling rotation (two keys verifying during a transition window). It's not on the v0.2 / v0.3 roadmap.

    Troubleshooting

    @@ -107,7 +107,7 @@

    BTCPay rejects the invoice request because the store has no configured wallet. Open BTCPay, find your store, and configure either an on-chain wallet or a Lightning node before retrying.

    Webhook deliveries failing

    -

    Check the audit log in the admin UI — failed deliveries land there with the response status. Common causes:

    +

    In the admin UI go to Webhooks — failed deliveries past the 10-attempt retry budget land in the "Failed" filter (the DLQ), with the response status and an inline "Retry" button. The audit log is a secondary source. Common causes: