Keysat Docs
Get started · Install & setup

Install & setup.

From bare Start9 to your first issued license, in roughly the order you’ll do it. Allow about an afternoon.

Prerequisites

Step 1: Install Keysat

Two ways. Either gets you to the same place.

Option A: from the Keysat marketplace (recommended)

  1. In your StartOS dashboard, go to Marketplace → Add.
  2. Paste https://registry.keysat.xyz as the URL.
  3. Find Keysat in the marketplace listing and click Install.

Option B: sideload

  1. Download keysat.s9pk from the GitHub releases page.
  2. In your StartOS dashboard, go to Sideload and drag the file in.
  3. Click Install.

BTCPay Server is declared as a required dependency. If you don’t have it installed yet, StartOS will prompt you to install it as part of the same flow.

Step 2: Set your operator name

Open the admin web UI (Step 5) and go to Settings. Set your operator name there: a short label that identifies you as the seller, e.g. "aurora-software", "northpath", "my-name". This shows up on the public purchase pages and in the audit log.

This change is live-reloaded; you don’t need to restart the service.

Step 3: Connect BTCPay

Make sure BTCPay Server is running and has at least one store with a configured payment method (on-chain wallet or Lightning node). Without a payment method, BTCPay will reject Keysat’s invoice creation.

In the admin web UI, go to Settings → Payment providers and click Connect BTCPay (agents can drive the same connect over the API with POST /v1/admin/btcpay/connect). You’ll be redirected to BTCPay’s authorize page, where you grant Keysat the permissions it needs:

Once you confirm, BTCPay redirects back to Keysat with an API key and store id. Keysat:

  1. Stores the API key and store id in its local SQLite (encrypted at rest by StartOS).
  2. Registers an outbound webhook subscription on the store, pointed at Keysat’s /btcpay webhook endpoint.
  3. Verifies the connection by fetching the store’s payment-method list.

Connect is idempotent. If you click it again later, Keysat detects the existing connection and returns success without re-authorizing. To force a re-authorize, disconnect first from Settings → Payment providers (or POST /v1/admin/btcpay/disconnect).

Automating setup? On a sandbox daemon you can connect a non-mainnet BTCPay over the API instead of clicking, using a scoped key carrying the payment_providers:write scope. See Agent integration: Connect BTCPay programmatically.

Back in Settings → Payment providers (or via GET /v1/admin/btcpay/status), verify the wiring. It should report:

# Expected output:
status: connected
store: YOUR_STORE_ID
webhook: registered
payment_methods: [BTC-OnChain, BTC-LightningNetwork]

If payment_methods is empty, head back to BTCPay and configure at least one before continuing.

Step 4: Get your admin API key

Go to Actions → Show credentials. This reveals the 64-hex-character admin API key that gates all /v1/admin/* endpoints, including the admin UI.

Treat this key like a password. Anyone with it can issue, revoke, or read every license you’ve ever sold. Don’t paste it into Slack. Don’t check it into Git.

Step 5: Open the admin UI

Click the Launch UI button on Keysat’s service page. (StartOS surfaces this for any service that defines a type: 'ui' interface.) Paste the admin key from the previous step into the sign-in form.

From here on, you work in the admin UI. The StartOS Actions tab is reserved for the few operations that must happen outside the web UI: showing credentials, setting the web UI password, and activating or checking the Keysat self-license.

Step 6: Define your first product

In the admin UI, go to Products → Create a new product and fill in:

The product is created with no policies attached. Next:

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:

https://<your-keysat-host>/buy/<product-slug>

Buyers hit it, see your product, click "Pay", and BTCPay’s checkout takes over. On payment confirmation, Keysat receives a webhook from BTCPay, signs a license, and emails it to the buyer (if they entered an email) and shows it on the receipt page.

Test it end-to-end by creating a free-license discount code and redeeming it: the same code path runs, just without the payment leg.

What’s next