Managing licenses
View, regenerate, revoke, and reinstate customer licenses
The license key is the bearer token a customer's proxy sends on each heartbeat. As an admin you can inspect it, regenerate it, or revoke it to gate service.
Where to find it
Admin → Users → Edit on a customer. The License card sits below
the account form when the user is a Customer with an owned server.
You'll see:
| Field | Notes |
|---|---|
| License key | Masked (pk_•••••…•Ab3f); click the eye icon to reveal |
| Status badge | ACTIVE, GRACE, or EXPIRED |
| Installed version | Reported by the most recent heartbeat |
| Last heartbeat | Timestamp of last successful heartbeat |
| Grace expires | Only shown when status is GRACE |
Reveal + copy
Click the eye to unmask, then the clipboard icon to copy. Use this only
when supporting the customer (e.g. validating their config.json).
Don't share the key over insecure channels — anyone with the
plaintext can impersonate the proxy on your dashboard.
Regenerate
Regenerate issues a fresh 256-bit key. Effects:
- The new key is written to the DB immediately
- The old key starts returning 401 on the next heartbeat
- The customer's proxy will SIGTERM itself, restart, fail again — until they re-run Install from their dashboard
- Audit log entry:
server.license.regenerate
When to use:
- A leaked key (committed to git, shared in a screenshot, etc.)
- Routine rotation policy
- A customer's box was compromised and you want to invalidate the old install
Revoke (start grace)
Revoke flips the license status to GRACE with a 5-day grace
window. Effects:
- The proxy keeps running normally during the grace window
- The customer sees a License in grace period banner with the expiration date
- After grace expires, next heartbeat returns
EXPIREDand the proxy shuts itself down - Audit log entry:
server.license.revokewith grace days metadata
When to use:
- Non-payment with a deadline
- Account winding down at the end of a contract
- Suspending service while a billing question is resolved
The grace window is currently fixed at 5 days. Override per-revoke by
hand-editing graceExpiresAt in the DB if you need a different
duration.
Reinstate
While in GRACE or EXPIRED, click Reinstate to flip back to
ACTIVE. Effects:
licenseStatus = ACTIVE,graceExpiresAt = NULL- Next heartbeat (within 60 s) returns
ACTIVE - An
EXPIREDproxy in its restart loop will pick this up and stop shutting itself down — service resumes within a minute - Audit log entry:
server.license.reinstate
Audit trail
Every license action writes a row to the audit log with:
action— one ofserver.license.regenerate / revoke / reinstatetarget— server IDuserId/username— admin who performed the actionmetadata— grace days for revokes, etc.ip— admin's request IP
View at Admin → Audit Log.