Glue files not covered by subproject repos: top-level docs, logo, keysat-design-system, and crosscheck tests. Subproject folders are gitignored (each has its own Gitea remote).
4.5 KiB
Building and sideloading Keysat
This repo ships three components that you'll bundle into a single installable .s9pk:
licensing-service/— the Rust daemon (keysatbinary).licensing-service-startos/— the StartOS 0.4.0.x wrapper (TypeScript manifest + actions + Dockerfile).licensing-client-rust/andlicensing-client-ts/— SDKs for downstream software. Not bundled into the.s9pk; published separately when you cut a release.
The Rust service's on-disk folder name is still licensing-service/ for continuity, but the crate, binary, and operator-visible branding are all Keysat now.
Prerequisites
- A working StartOS 0.4.0.x development environment on a Linux or macOS workstation. Follow docs.start9.com if you haven't set this up yet.
start-cliinstalled on your PATH, with~/.startos/developer.key.peminitialised (start-cli init).- Node 20+ (for the StartOS SDK, TypeScript).
- Docker + buildx (for multi-arch image builds).
- Network reachability from your workstation to your Start9 server (LAN or Tor — whatever you usually use to
start-cli install). - A running BTCPay Server on the same Start9 server (Keysat depends on it).
You do not need Rust locally — the Dockerfile pulls a pinned rust:1.75-slim-bookworm image.
One-time setup
1. Fetch the shared build logic
Every 0.4.0.x wrapper includes s9pk.mk, which is maintained by the Start9 team. Fetch the current copy once:
cd licensing-service-startos
curl -o s9pk.mk https://raw.githubusercontent.com/Start9Labs/hello-world-startos/master/s9pk.mk
The Makefile include s9pk.mk line will error out until that file is in place.
2. Install TypeScript deps
cd licensing-service-startos
npm install
Building
From licensing-service-startos/:
# Build for all supported architectures (x86_64 + aarch64)
make
# Or just the architecture your Start9 box runs
make arm # Raspberry Pi / Apple Silicon
make x86 # x86_64 StartOS server
The resulting artifact lands in licensing-service-startos/*.s9pk — a single file you can sideload.
Sideloading
cd licensing-service-startos
make install
This uses your ~/.startos/developer.key.pem to push the package to the Start9 server it's registered against. First-run prompts for the Start9 dashboard password; subsequent installs reuse the cached session.
If you prefer to upload the .s9pk through the StartOS dashboard UI, copy the file off your workstation and drag it into Sideload package from the dashboard.
First-boot checklist
Once installed, open Keysat in your StartOS dashboard and run these actions in order:
- Set operator name — your display name, shown on the public homepage.
- Connect BTCPay — opens a BTCPay consent page in your browser. Click Authorize; Keysat auto-detects your store and registers its inbound webhook.
- Check BTCPay connection — confirms the authorize completed and the webhook is live.
- Create product — one per thing you plan to sell.
- Create policy — at least one per product, slugged
default. Sets the shape of keys issued through the public purchase flow.
At this point your buyers can POST /v1/purchase against your Keysat URL, pay via BTCPay, and poll back for their license key.
Testing it end-to-end
Keysat ships with a cross-check test suite that independently signs license keys with a Python reference implementation and replays them through the Rust and TypeScript SDK parsers. See tests/crosscheck/README.md.
The simplest smoke test against a live install:
# On your workstation, once the service is running on StartOS:
curl https://<your-keysat-url>/v1/pubkey
curl https://<your-keysat-url>/healthz
The first returns the Ed25519 public key you'll bake into downstream software. The second should just return {"ok":true}.
Troubleshooting
- "KEYSAT_ADMIN_API_KEY must be at least 32 characters" — shouldn't happen from StartOS (the wrapper generates the key), but if you're running locally,
openssl rand -hex 32gives a valid value. - "BTCPay not yet configured — purchases will return 503" — run Connect BTCPay from the StartOS dashboard.
- Rebuilds don't reflect Rust source changes — Docker layer caching is aggressive;
make cleanbeforemaketo force a full rebuild. - Existing installs using
LICENSING_*env vars — the daemon still reads those as a fallback for one release cycle. New installs setKEYSAT_*directly.