Skip to content

Licensing

Checking is free to run everywhere: the CLI, hooks, and the core API work unlicensed. The dashboard is the licensed feature.

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.

Terminal window
STYLIST_LICENSE=<key> stylist serve # or serve -license <key>

Inspect any key:

Terminal window
stylist license inspect <key>

Issuing keys requires the private signing key, which customers do not have (so shipping these subcommands in every binary is harmless):

Terminal window
stylist license keygen # one-time: create the signing keypair
stylist license issue -key <private-hex> \
-org "ACME Corp" -expires 2027-12-31 -features dashboard

Release builds embed the vendor public key via -ldflags "-X main.vendorPublicKey=<hex>". For development and testing, STYLIST_LICENSE_PUBKEY overrides the embedded key.