Skip to content

Licensing a desktop application

A vendor shipping a desktop application — sold perpetual or by subscription, activated with a code, locked to the machine, and expected to keep working offline.

The setup: the application embeds the license client; no secret ships in the binary. The app sends the code and the machine’s fingerprint and receives a signed license it verifies locally.

You need You use
A license key the customer types in An activation code issued per entitlement
A license locked to one machine Node-locking via the device fingerprint; component matching survives a RAM upgrade or new network card
A 14-day trial A trial policy — same build, time-boxed license
Works offline for weeks The on-disk license cache plus an offline-grace window; the app validates the signed license without a network
Edition gates (Standard vs Pro) Features in the license token, checked locally
A shared pool of team seats A floating license: N concurrent seats per entitlement; workstations check a seat out on activation and back in on release, and the service — not the app — refuses the N+1th checkout
À-la-carte add-on modules Add-ons granted to the entitlement (bought outright or time-boxed); the granted features merge into the next license the customer’s app fetches — no new build, no reinstall
Perpetual or subscription — same build The entitlement’s subscription policy decides; the license token carries the model, so the app renders “never expires” or the renewal date from the same code path
“I got a new laptop” The customer re-activates with the same code; the old machine’s seat frees when its lease runs out (support tasks)
  1. Build the client once at startup: LicenseClientBuilder with the activation code the user entered, a DeviceIdDeviceFingerprint, the pinned public key, and the on-disk license store.
  2. Gate features from AccessLicenseAsync() — every check is local and instant. An expired or tampered license fails validation.
  3. The lease-and-grace rhythm handles connectivity: the app renews its lease when online and covers offline gaps with the grace window. Fully disconnected sites use the file-based offline flow instead.
  4. Optionally report feature usage and app events — telemetry that lands in the same dashboards as licensing data.

The whole runtime path is anonymous or license-token-authenticated: decompile the binary and there is no API secret to find, and no license to mint without the provider’s signing key.

See it live: the Atelier demo is this use case — a creative suite with a floating three-seat team pool, add-on modules bought from inside the app, and a perpetual-vs-subscription edition switch.

Start with the developer path.