Licensing
Tiers and what they unlock, how to activate a licence, and what to do when the solver
refuses with a LICENSE_ERROR:.
How licensing works
Nabla verifies your licence entirely offline — a licence server is only contacted during the Activate online step below, and at no other time. This means:
- no internet connection is ever needed to use Nabla after activation;
- a licence-server outage never stops a paying customer from working;
- a licence, once activated on your machine, keeps working for its full term regardless of network access.
Because verification is offline, a token, once minted, cannot be revoked. A refund or chargeback leaves a working licence on the customer's machine until it expires. The term of a paid subscription token is therefore one year — the exposure window is bounded, and the expiry date shown in Help → Licence… matches what was paid for.
Editions and what they unlock
Nabla ships in three editions. The free tier is not a crippled demo: a full 2D magnetostatic/transient solver with circuits, planar + axisymmetric support and the material editor is available with no licence at all. The paid editions add capabilities above that baseline.
| Capability | Nabla Free | Nabla Core | Nabla Machines |
|---|---|---|---|
| 2D magnetostatic, transient, planar & axisymmetric | ✓ | ✓ | ✓ |
| 1st-order (P1) elements | ✓ | ✓ | ✓ |
| One motion zone (rotary or linear) | ✓ | ✓ | ✓ |
| Circuit editor (R, L, C, sources, switches) | ✓ | ✓ | ✓ |
| Materials library | ✓ | ✓ | ✓ |
| Material editor and curve fitting | ✓ | ✓ | ✓ |
| DXF import and export | ✓ | ✓ | ✓ |
| Mesh node cap | 25 000 | Unlimited | Unlimited |
| Report watermark | Yes | No | No |
| Core Pro — all included in both paid editions | |||
| Time-harmonic solves | — | ✓ | ✓ |
| 2nd-order (P2) elements | — | ✓ | ✓ |
| Far-field (balloon) boundary condition | — | ✓ | ✓ |
| Multiple simultaneous motion zones | — | ✓ | ✓ |
| Crank–Nicolson time integration | — | ✓ | ✓ |
| Thermal — included in both paid editions | |||
| Steady and transient heat conduction | — | ✓ | ✓ |
| Convection, fixed-temperature, heat-flux BCs | — | ✓ | ✓ |
| Time-dependent volumetric heat sources | — | ✓ | ✓ |
| Automation — included in both paid editions | |||
| Python API and headless batch runs | — | ✓ | ✓ |
| MCP server (LLM-driven modelling) | — | ✓ | ✓ |
| Machines — Nabla Machines only | |||
| Parametric PMSM and IM builders | — | — | ✓ |
| Windings setup, skew, stator/rotor customisation | — | — | ✓ |
| Machine PDF report | — | — | ✓ |
| Performance — Nabla Machines only | |||
| Efficiency and loss maps, performance curves | — | — | ✓ |
| MTPA / MTPV trajectories, torque vs speed | — | — | ✓ |
| IM equivalent circuit extraction | — | — | ✓ |
| Demagnetisation risk analysis | — | — | ✓ |
The Performance entitlement requires Machines to be present as well: a mis-issued licence that grants Performance without Machines silently drops it rather than refusing to start. Granting a higher tier implicitly grants every tier below it — the paid editions are cumulative, so the upgrade from Core to Machines is one step.
See Help → Licence… at any time for the exact feature list your copy is entitled to, and Help → About for the licence state and expiry date.
What changes when a licence ends
Licensing never fails closed. The invariant is: an expired or missing licence never blocks you from opening a model or reading results you already have. This table summarises the four licence states and what each allows:
| State | Open & view | Edit geometry | Mesh | Solve | Save |
|---|---|---|---|---|---|
| Licensed — token present and valid | ✓ | ✓ | ✓ | ✓ (full) | ✓ |
| Grace — token expired but within the grace period (14 days by default) | ✓ | ✓ | ✓ | ✓ (with a banner reminder) | ✓ |
| Free — no token present, or the token is malformed | ✓ | ✓ | ✓ | ✓ (≤ 25 000 nodes, watermarked reports) | ✓ |
| Viewer — token expired past grace, or a perpetual licence whose maintenance period ended before this build was released | ✓ | ✓ | ✓ | ✗ (named refusal) | ✓ |
Activating a licence
Open Help → Licence…. The dialog is a single text field and two buttons:
- Paste your licence key and click Activate online. A licence key looks like
NBL-XXXX-XXXX-XXXX-XXXX— four groups of four characters. Nabla sends the key and your machine's fingerprint hashes to the licence server, which returns a signed token. The token is verified locally before it is stored, so a man-in-the-middle who substitutes a forged token just gets a refusal, never a silent downgrade. This is the primary path and needs an internet connection for a few seconds. - If the machine has no internet: click Export request file. That
writes a
.nbreqfile you can carry to a connected machine, email to yourself, or send to support. The response (.nblicfile) is imported through Import response file on the same dialog. The two files share the same wire format as the online call — the offline path is not a second code path, just a manual version of the same exchange.
You can also paste a full token string directly (it begins with a base64 blob followed by a dot)
— use this when support sends you a token rather than a key, or when the
NABLA_LICENSE environment variable route is the right one for a CI runner.
Automatic refresh
Subscriptions renew annually. When your licence is in its grace period, or within 30 days of
expiry, Nabla silently contacts the server to check for a renewal — a renewed token replaces
the current one with no prompt and no interruption. Perpetual licences never refresh. Set the
environment variable NABLA_OFFLINE=1 to disable every network call including the refresh.
Moving to another machine
A licence key allows activation on up to three machines simultaneously (the typical engineer's desktop, laptop and rebuild). To free a seat, open Help → Licence…, click Deactivate this machine — that tells the server to release the seat and removes the token locally. It deletes the local token even if the server call fails, so a machine behind a firewall can still be decommissioned.
The machine fingerprint
Each activation binds the licence to the activating machine through three independent hardware identifiers, each hashed separately:
| Kind | Windows source | Linux / macOS source |
|---|---|---|
| Machine | MachineGuid from the registry | /etc/machine-id |
| Volume | C: volume serial number | Root filesystem UUID |
| MAC | Lowest non-virtual network interface hardware address | Same |
A licence accepts the machine when at least two of the three hashes match — so a NIC swap or a reformatted data drive does not invalidate the licence, but moving the same token to an entirely different machine is refused. The three hashes are shown in Help → About with a Copy fingerprint button; support will ask for them.
Environment variables
NABLA_LICENSE- The token string itself. For CI runners, containers, and any situation where writing a file is inconvenient. Takes priority over every file-based lookup.
NABLA_LICENSE_FILE- Path to a
.nblictoken file. Second in priority afterNABLA_LICENSE. NABLA_OFFLINE- Set to
1to disable every network call: online activation, auto-refresh, and deactivation. A machine that never touches the network can still be licensed through the offline.nbreq/.nblicexchange. NABLA_LICENSE_SERVER- Override the activation server URL. For enterprise deployments with an on-premises licence server.
The file-based lookup order, first hit wins:
- Environment variables above
<project directory>/nabla.nblic(per-project, useful for site installs on a shared drive)%APPDATA%\Nabla\license.nblic(Windows) /~/.config/nabla/license.nblic(Linux)<install directory>/license.nblic
Understanding a LICENSE_ERROR: refusal
The solver independently enforces licensing and prints a line beginning
LICENSE_ERROR: when it refuses to run. The GUI catches this and raises a dialog; the
Python API turns it into a NablaLicenseError. Every refusal also prints a second,
human-readable line with the same information. The solver prints all refusals that
apply before exiting, so a model that needs two modules you do not have tells you about both in one
run.
The possible error slugs, and what they mean:
| Slug | What the solver is refusing to do | Required entitlement |
|---|---|---|
thermal | Run a thermal solve (physicsType == 1). The model has at
least one thermal boundary condition or the thermal module is enabled. |
Thermal |
core_pro | One of five capabilities gated behind Core Pro: (1) a
time-harmonic run (simulationType == 2), (2) 2nd-order P2 elements
(polyOrder == 2 in the mesh), (3) Crank–Nicolson
(timeTheta < 1.0), (4) a far-field boundary condition (bc_type == 11), or
(5) more than one simultaneously enabled motion zone. |
Core Pro |
machines | Run a model with rotor or stator skew
(nSkewSlices > 1). |
Machines |
perf | Not gated at the solver level (performance analysis runs in Java). This slug appears when the API or MCP layer is asked for a performance item without the entitlement. | Performance |
automation | Start the Python API at all (model.start()). This is
the one hard gate in the automation layer: without the Automation entitlement,
nabla_api.Nabla() raises a NablaLicenseError before the JVM boots. |
Automation |
max_nodes | The mesh has more nodes than your tier allows. The Free tier is capped at 25 000 nodes; a paid licence has no cap unless one was explicitly issued. The refusal names the counts: "mesh has N nodes; the Free tier is limited to M". | Any paid edition |
expired | The licence token's expiry date has passed, including the grace period. Opens and result viewing keep working; only new solves are refused. Renew through Help → Licence…. | A valid, non-expired token |
Pay attention to the human-readable line after the marker. The
LICENSE_ERROR:core_pro|… part is what the GUI parses; the next line is the plain-language
explanation: which capability the model asked for, what your licence covers, and what to do next.
The licence ID is always printed (never the key or the token), so support can look up your licence
from the log alone.
Licence troubleshooting
- "Licence signature invalid" (Free tier, no crash)
- One byte of the token file has been corrupted, or the token was edited by hand. Delete
license.nblicfrom%APPDATA%\Nabla\and re-activate. If the token was pasted from an email, check that nothing was clipped. - "Fingerprint mismatch" (only 1 of 3 hashes matched)
- The token was activated on a different machine. Copy it between machines only if you are moving one token to another of your own three seats — re-activate on the new machine rather than copying the file, so the activation record is updated. If you replaced a network card and a drive at the same time, deactivate the old seat first.
- Clock rollback
- Moving the system clock back more than one day puts the licence into its grace state rather than locking you out. This is deliberate: VMs and dual-boot machines legitimately jump in time. Set the clock correctly and restart Nabla to clear the warning.
- "This build was released after your maintenance period ended"
- A perpetual licence whose maintenance period ended before the current build was compiled. Install
a build released during your maintenance window, or renew maintenance. The licence itself is still
valid — it works with any build dated before
maintenance_until. - "Issued for a different product key"
- The token was signed with a different Ed25519 key than the one embedded in this build. This normally means the token is from a different product, or the signing key was rotated. Contact support.
- Server unreachable during activation
- If Activate online cannot reach the licence server, use the offline Export request file path instead. The app works in Free-tier mode while you wait for the response file. See Activating a licence above.
For the general rules about error dialogs and where the logs live, see Troubleshooting. Open Help → Licence… for the state of your copy — the dialog shows your licence ID, edition, state, expiry date and the feature list, plus the three fingerprint hashes support will ask for.
Next steps
- Automation — how licensing behaves in Python — the API and MCP layers' perspective.
- Troubleshooting — licence errors — the solver's own refusal messages in context.
- Getting started — the free tier — what you can do without a licence.
- File formats —
.nblicand.nbreqamong the model files. - Back to the contents.