License
The License page displays your GEM installation's license status, the features included in your license, and lets you activate or upgrade a license key.
Open License
License Status
The status card shows:
- License -- GEM License, Trial, 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 / Zones -- Current counts. Devices and zones are unlimited on every license.
- License Key -- The activated license key (if present)
The Licensed Features card lists the premium drivers and feature modules included in your license. During a trial — or in development mode — every feature is available.
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 |
| Untrusted | The license signature could not be verified -- existing devices and zones keep running, but new ones cannot be added until the license is reactivated |
| Unverified | This installation has never completed a license check -- after a two-week grace window, new devices and zones cannot be added until the first check succeeds. Allow HTTPS access to updates.mygem.us and click Refresh Status; the state clears immediately on the first successful check |
What a License Includes
GEM uses feature-based pricing: you buy the platform plus exactly the premium integrations and capabilities you need. Devices and zones are unlimited on every license — there are no count tiers.
| Component | What it unlocks |
|---|---|
| GEM Platform | Always included — core drivers, automation engine, auto-generated site UIs, RBAC, mobile app, unlimited devices/zones/sites |
| Premium Drivers | Individual integration products (e.g. Lutron, BACnet, Modbus, KNX). Each unlocks a whole driver family; core drivers are always free |
| Feature Modules | Cross-cutting capability layers that work across drivers: AV System, Access Control & Visitor Management, Network Monitoring, Custom Driver Authoring, Web Services, and Custom UI & Widgets |
Build your license — and see current pricing — on the purchase page. The Upgrade License button opens it pre-filled with your installation ID.
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 a paid installation suspended or expired (delivered on the next successful check).
Trials are the exception: a trial carries a signed, absolute expiry date and will lock once that date passes (plus a short grace window for clock skew) even with no network connection — so a trial can't be made perpetual by activating once and going offline. Paid and perpetual licenses are never expired locally.
Brand-new installs must check in once: an installation that has never completed a license check gets a two-week grace window, after which it shows Unverified and blocks adding new devices and zones (everything already configured keeps running). The first successful check clears it permanently — this only affects installs that can never reach the license server.
Grandfathered Installations
Installations that existed before licensing was introduced are automatically granted full access (all premium drivers and feature modules) with the Grandfathered flag set. Grandfathered 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
- Premium drivers — adding a device that uses a premium driver requires that driver's product in your license. Core drivers are always available. Existing devices are never disabled, even if a license later changes.
- Feature modules — creating items owned by a module (AV zones/sources, channels, access groups, holiday calendars, monitors, custom drivers, web services, custom UIs/pages/widgets/themes) and using module-only capabilities (inbound web-service API, the script console, network discovery) require the corresponding module. The auto-generated site UI and rendering of any already-built UI are always free. Trials and development builds unlock everything; existing data keeps working.
- Devices and zones are unlimited — there are no count caps.
- Expired licenses prevent adding new devices, zones, and module-owned items 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.
Enforcement is based on the signed license envelope, not on the cached status values stored in the database. The most recent verified envelope is persisted and re-verified against the trusted server key on every boot, so editing cached license values (status, tier, device/zone limits) in the database has no effect on what is enforced. If the stored envelope is missing or fails verification on a build that requires signing, the controller holds at a safe floor — every existing device, zone, macro, and automation keeps running, but adding new devices or zones is blocked until the license is reactivated. Recovery is automatic: the next successful activation or license check stores a fresh verified envelope and clears the safe floor.
During the signing rollout, grandfathered and diamond (unlimited) licenses are exempt from the safe floor through a transition window so a legitimate unlimited install that crosses the signing cutoff before capturing its first envelope — for example one that was powered off or offline during the rollout — keeps running normally instead of being flagged untrusted. Because an unlimited grant has no device/zone cap, there is nothing to evade by deleting the envelope, so flooring it would be pure downside. This carve-out is time-boxed: once the transition window closes, every tier — including diamond — floors uniformly when the envelope is missing after the signing cutoff, fully restoring anti-rollback. Capped tiers (trial, standard, term) always floor.
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.
If the upload fails, the message distinguishes the failure mode: the support server may reject an oversized bundle (HTTP 413), in which case the attempt is still logged locally and you should email support directly; any other rejection reports the server's status code; and a connection that never reaches the server prompts you to check your internet connection.
Bundles are signed and uploaded to the update server. They never include device, zone, attribute, or user data — only configuration and operational telemetry.