Verify locally. Sell from inside the app.
Desktop apps can't always phone home. Monaiq's authorizations are signed and verified inside your app, then cached, so a dropped connection doesn't lock a paying customer out. Each machine runs on its own license code, and the app can sell your offerings itself — no API key ships in the binary.
Desktop licensing is hard. We know.
Desktop licensing has its own challenges — users with unreliable internet, keys copied from machine to machine, and buyers who would rather not leave the app to pay. A licensing check that needs the network every time fails all three.
Monaiq's answer is a signed authorization your app verifies itself, a cache that rides out an outage, and a license code per machine that the buyer can revoke on their own.
Built for desktop deployment
Licensing that doesn't assume a perfect connection.
Local Verification
Every authorization is signed and verified in your app, then cached until it expires — seven days by default — and served for a grace window if the service can't be reached. A bad signature is never trusted.
A Code per Machine
A seat can carry several license codes, one per machine, each with its own label. The buyer issues and revokes them from the seat page; a revoked code stops at the app's next refresh.
Feature Gating
Unlock specific features per offering. Free and trial offerings sit beside paid ones, all enforced at the application level.
Cross-Platform SDK
The .NET SDK (netstandard2.1) for WPF, WinForms, MAUI and console apps on Windows, macOS and Linux, and the TypeScript client for Electron.
Trial & Expiration
Trials run 7 days and end on their own, with no auto-renewal. An expired, suspended or cancelled license comes back as a typed denial your app can explain to the user.
Sell From Inside the App
The app reads your catalog and checks the buyer out with their own Monaiq sign-in, in the system browser. The license code comes back to the app — nothing of yours to extract from the build.
Verification in a few lines of code
The SDK fetches, verifies and caches the authorization. Your code just asks.
protected override async Task OnStartup()
{
// Fetch and verify the license authorization
try
{
await licensingService.GetAuthorization(
LicensingServiceReference.ServiceReference, context);
}
catch (LicenseAuthorizationUnavailableException)
{
PromptForLicenseCode();
return;
}
// Check feature access
var canExport = await licensingService.AssertLicense(
LicensingServiceReference.ServiceReference, context,
ServiceAccessLicenseAssertion.Create("offline-export"));
ExportButton.IsEnabled = canExport;
}Supported platforms
Any platform that runs .NET or can call a REST API.