Download Nabla
Nabla User Manual 0.1.0

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:

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.

Feature comparison across Nabla editions
CapabilityNabla FreeNabla CoreNabla 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 cap25 000UnlimitedUnlimited
Report watermarkYesNoNo
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:

What each licence state allows
StateOpen & viewEdit geometryMeshSolveSave
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:

  1. 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.
  2. If the machine has no internet: click Export request file. That writes a .nbreq file you can carry to a connected machine, email to yourself, or send to support. The response (.nblic file) 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:

Hardware identifiers that bind a licence to a machine
KindWindows sourceLinux / macOS source
MachineMachineGuid from the registry/etc/machine-id
VolumeC: volume serial numberRoot filesystem UUID
MACLowest non-virtual network interface hardware addressSame

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 .nblic token file. Second in priority after NABLA_LICENSE.
NABLA_OFFLINE
Set to 1 to 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 / .nblic exchange.
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:

  1. Environment variables above
  2. <project directory>/nabla.nblic (per-project, useful for site installs on a shared drive)
  3. %APPDATA%\Nabla\license.nblic (Windows) / ~/.config/nabla/license.nblic (Linux)
  4. <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:

LICENSE_ERROR: refusal slugs and their meanings
SlugWhat the solver is refusing to doRequired entitlement
thermalRun a thermal solve (physicsType == 1). The model has at least one thermal boundary condition or the thermal module is enabled. Thermal
core_proOne 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
machinesRun a model with rotor or stator skew (nSkewSlices > 1). Machines
perfNot 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
automationStart 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_nodesThe 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
expiredThe 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.nblic from %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