Licensing (Umbryx EE)¶
Applies to EE only — Core runs without any license. Operator-facing summary; the full lifecycle description lives in Umbryx EE.
Where things live¶
System → License (platform admin):

- Current state: tier, lifecycle stage (
active/grace/wind_down), expiry - Activation card (unlicensed): download the activation request
(
umbryx-activation-request.c2v.json), Check now, and.licimport for air-gapped installs - Channel toggle: online (24 h heartbeat renewal) / offline
Activation¶
One file in each direction — the machine identity (fingerprint, hwid, instance key, nonce) travels inside the activation request file, so nothing else needs copying back and forth.
- Download the activation request on the instance and send the
.c2v.jsonto your vendor. - The vendor binds it to a license in the License Server admin (license → Activate → upload the activation request file).
- Online: nothing to upload back — the instance polls the license
server every few minutes while unlicensed and applies the token
automatically the moment the binding exists (Check now pulls it
immediately). Renewal afterwards is the normal 24 h heartbeat
(
LICENSE_SERVER_URL, defaulthttps://update.umbryx.pro). - Air-gapped: the vendor also downloads the signed
.licand sends it back → Import .lic on the instance → switch the channel to offline. No outbound calls in that mode.
Renewal outcomes: renewed, or inactive (server reports no license
→ grace clock starts); an unreachable server changes nothing until
contract expiry. Re-binding to new hardware is a vendor action — the
admin presses Activate with a fresh activation request file (or resets the device
binding first).
What the license controls¶
Tier limits (members, infrastructure instances, workstations, audit
retention) and feature flags (cloud provider classes, SSO, plugin
upload, multiple organizations, …) travel inside the signed token;
GET /api/system/license/state reports them. Manual per-org plan
overrides exist (PATCH /api/marketplace/plans/{org_id}) and are
left alone by heartbeat.
Wind-down behavior¶
After expiry + grace (default 14 days):
- Mutations return 402 (the UI shows a non-dismissible banner)
- Viewing, export, and teardown keep working
- Nothing is deleted; deployed infrastructure is never stopped by the platform
Troubleshooting¶
| Symptom | Diagnosis |
|---|---|
| 402 on writes | license in wind_down — upload a renewed token |
Heartbeat unreachable in logs |
license server unreachable from the instance (network/proxy) — harmless until contract expiry |
| Token rejected on upload | wrong instance: the token binds hardware hashes + the instance key (re-host requires re-activation) |