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.
How the pieces map
Section titled “How the pieces map”| 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) |
Integration sketch
Section titled “Integration sketch”- Build the client once at startup:
LicenseClientBuilderwith the activation code the user entered, aDeviceIdDeviceFingerprint, the pinned public key, and the on-disk license store. - Gate features from
AccessLicenseAsync()— every check is local and instant. An expired or tampered license fails validation. - 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.
- 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.