Licensing
FactoryThread self-hosted runs on a signed Entitlement — a JWS token issued by your account team for your Organization that sets your plan and limits. It is verified and installed offline; no call home is required.
First boot: Unlicensed until you activate
A fresh install is Unlicensed and runs on a deliberately restrictive Free floor:
| Limit | Free floor |
|---|---|
| Concurrent executions | 1 |
| Published flows | 10 |
| Workspaces | 1 |
This is intentional — an install with no licence must never be more permissive than a paid plan. Install your Entitlement as part of first boot, right after the app is up:
sudo ./ftctl license install --jws "$(cat entitlement.jws)"
Optionally pin it to your Organization id, so a token issued for a different Organization is refused:
sudo ./ftctl license install --jws "$(cat entitlement.jws)" --tenant org_abc123
The new plan takes effect within ~60 seconds — no container restart.
Check your plan
sudo ./ftctl license status
Organization : Acme Corp (org_abc123)
Tier : pro
Mode : self_hosted
Contract end : 2027-07-31
Concurrent executions : 20
Published flows : unlimited
Workspaces : unlimited
If nothing is installed, status reports UNLICENSED and the Free-floor
limits.
Renewal
Renewal is the same command with the new token — it upserts, no restart:
sudo ./ftctl license install --jws "$(cat renewed.jws)"
It freezes changes (create / edit / delete / publish) until you install a renewal. Reads and already-published flows keep running.
What install refuses
install verifies the Entitlement locally before storing anything and installs
nothing (exiting non-zero) when:
- the signature is invalid or the token is truncated,
- it was signed by a key this build does not trust (unknown key id),
- with
--tenant, it was issued to a different Organization.