Licensing
Checking is free to run everywhere: the CLI, hooks, and the core API work unlicensed. The dashboard is the licensed feature.
How license keys work
Section titled “How license keys work”A license key is an ed25519 signature over JSON claims:
{ "org": "ACME Corp", "expires": "2027-12-31T23:59:59Z", "features": ["dashboard"] }encoded as base64(claims).base64(signature). The vendor signs with a
private key that never ships; released binaries embed only the public
key. Verification is therefore offline: no license server, no
phone-home, works in air-gapped VPC deployments.
Verification rejects tampered payloads and keys signed by anyone else. An invalid license doesn’t stop the server: it logs the problem and leaves the dashboard locked.
Expiry has a grace period, not a hard cutoff. A license still within 14 days of its expiry date logs an advance renewal warning but unlocks normally. A license up to 14 days past expiry still unlocks the dashboard too, with a stronger warning (“dashboard stays unlocked for a grace period, N days left”) so a lapsed renewal doesn’t lock customers out overnight. Past the 14-day grace window, the dashboard locks the same as any other invalid license. All of this is logged to stderr at startup, so an operator watching server logs sees it coming.
Using a license
Section titled “Using a license”STYLIST_LICENSE=<key> stylist serve … # or serve -license <key>Inspect any key:
stylist license inspect <key>Vendor tooling
Section titled “Vendor tooling”Issuing keys requires the private signing key, which customers do not have (so shipping these subcommands in every binary is harmless):
stylist license keygen # one-time: create the signing keypairstylist license issue -key <private-hex> \ -org "ACME Corp" -expires 2027-12-31 -features dashboardRelease builds embed the vendor public key via
-ldflags "-X main.vendorPublicKey=<hex>". For development and testing,
STYLIST_LICENSE_PUBKEY overrides the embedded key.