License
The License page displays your GEM installation's license status, allows activating or upgrading a license key, and shows device and zone usage against your plan limits.
Open License
License Status
The status card shows:
- Tier -- Your license tier (Trial, Opal, Sapphire, Diamond, Integrator, or Development)
- Status -- Current license state (active, trial, expired, or suspended)
- Trial Remaining -- Days left in trial period (trial licenses only)
- Expires -- License expiration date (if applicable)
- Devices -- Current device count vs. plan limit (or Unlimited)
- Zones -- Current zone count vs. plan limit (or Unlimited)
- License Key -- The activated license key (if present)
Click Refresh Status to re-check license status with the license server.
License States
| Status | Meaning |
|---|---|
| Active | License is valid and all features are available |
| Trial | Free trial period is active with a countdown of remaining days |
| Expired | License has expired -- existing devices and zones continue to work, but new ones cannot be added |
| Suspended | Installation has been suspended -- contact support |
License Tiers
| Tier | Price | Devices | Zones | Multi-site | Notes |
|---|---|---|---|---|---|
| Trial | free | unlimited during trial | unlimited during trial | — | |
| Opal | $1,500 | 25 | 100 | no | |
| Sapphire | $3,000 | 75 | 500 | no | |
| Diamond | $5,000 | unlimited | unlimited | yes | |
| Integrator | $10,000 | unlimited | unlimited | yes | Multi-tenant management, white-label |
| Development | — | unrestricted in dev mode | unrestricted in dev mode | — |
Every paid license is perpetual and includes:
- 1 year of Care — software updates + email support
- 1 year of Cloud Services — cloud tunnel, push notifications, mobile app, remote access
After year 1, customers can renew Care (Basic $50/mo or Priority $175/mo) and/or Cloud Services ($20/mo or $200/yr) independently. Local-only deployments don't need Cloud Services. Without renewal, the license remains active indefinitely (perpetual) — only updates and cloud features stop.
Licenses stay active indefinitely once activated. GEM caches the license status and continues working even when the license server is unreachable — only the server can mark an installation suspended or expired (delivered on the next successful check).
Grandfathered Installations
Installations that existed before licensing was introduced are automatically granted the Diamond tier with the Grandfathered flag set. Grandfathered Diamond licenses:
- Never show the trial/expiry banner.
- Never display the Activate License form prominently (it's collapsed behind a disclosure).
- Continue to work indefinitely even if the license server is unreachable.
- Are visually marked with a "Grandfathered" badge on the License page.
If a new install predates licensing but hasn't yet contacted the license server, the server grandfathers it on first contact when it reports devices -- no manual intervention required.
License Enforcement
- Device and zone limits are enforced when adding new devices or zones. Existing devices and zones are never disabled.
- Expired licenses prevent adding new devices and zones but do not affect existing operation.
- Update window — software updates are gated by the license's
updates_included_untildate. After it passes, existing devices/zones continue to work but new updates will not install until Care is renewed. - Cloud Services window — cloud tunnel, push notifications, mobile app, and remote access are gated by the license's
cloud_services_untildate. After it passes, local features keep working; cloud features require a Cloud Services subscription. - Fresh installations that have never contacted the license server are unrestricted until the first successful check lands.
- GEM checks license status automatically every 6 hours.
Activate License
Enter a license key in the format GEM-XXXX-XXXX-XXXX-XXXX and click Activate. The key is verified with the license server and the license status updates immediately on success.
Activation requires an internet connection to reach the license server.
Installation Info
The Installation Info card displays:
- Installation ID -- a unique identifier for this GEM installation. When purchasing a license, provide this ID to info@harnessautomation.com.
- License Server Key -- the short identifier of the baked-in license server public key this controller trusts. A key change here indicates a controller update that rotated the trusted signing key.
- Response Verification -- status of the last license response:
- Signed & verified (green) -- response was wrapped in a signed envelope and the signature verified against the trusted server key.
- Unverified (transition window) (orange) -- response arrived without a valid signature, but was accepted because the enforcement cutoff has not yet passed. After the cutoff, unverified responses are rejected and the controller falls back to the cached license.
- Not yet checked (gray) -- no license check has completed since startup.
- Client Auth -- status of this controller's outbound client-signing keypair:
- Registered with license server (green) -- the controller's public key has been accepted by the license server (TOFU registration complete). Subsequent license requests are signed with the private key stored in
.license_signing_key. - Pending first successful check (gray) -- registration will be attempted on the next license check or activation.
- Registered with license server (green) -- the controller's public key has been accepted by the license server (TOFU registration complete). Subsequent license requests are signed with the private key stored in
License responses are cryptographically signed. The private key that signs them lives on the license server; the corresponding public key is baked into each controller build. Controllers sign their outbound requests with a per-installation Ed25519 keypair and register the public key with the license server on first contact.
Information Collected
To support your installation and detect unauthorized cloning of licensed deployments, each license check includes a small hardware fingerprint:
hostname,machine_id(stable OS-level identifier),product_uuid(motherboard UUID)cpu_model,cpu_count, total memory, architecture, OS platform/release- Primary MAC address, Node.js runtime version
This information never leaves the license server and is used only for support, inventory, and to alert administrators when the same installation ID appears on different hardware. No device, zone, or user data is transmitted as part of licensing.
Admin Banner
When the license requires attention, a banner appears at the top of the admin interface:
- Info (blue) -- Trial with more than 7 days remaining, or active license nearing expiry
- Warning (orange) -- Trial with 7 or fewer days remaining
- Error (red) -- License expired or suspended
The banner includes a link to the License page for activation. Non-critical banners can be dismissed.
Support Bundle
The Support Bundle section provides a one-click diagnostic upload for support requests. Click Send Support Bundle and the controller assembles and uploads:
- Recent system logs (
journalctl -u gem, last ~1500 lines, when running under systemd) - A redacted copy of
gem.json— passwords, API keys, and other secrets are stripped before sending - License status, installation ID, and version
- Device, zone, subsystem, and UI page counts
- Hardware fingerprint and a health snapshot (uptime, memory, load average, database size, tunnel state)
On success, the License page displays a reference number — quote it when emailing support so the team can locate the bundle.
Bundles are signed and uploaded to the update server. They never include device, zone, attribute, or user data — only configuration and operational telemetry.