Desktop apps

License your Electron and Tauri apps

Lock each license to a machine. A single check when your app launches confirms it is valid. Works with Electron, Tauri, or any desktop framework that can connect to the internet.

TypeScript
// main.ts, validate on app ready
import { app } from 'electron';
import { machineIdSync } from 'node-machine-id';

app.whenReady().then(async () => {
  const res = await fetch('https://api.licensr.app/v1/license/validate', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
      Authorization: `Bearer ${PLUGIN_API_KEY}`,
    },
    body: JSON.stringify({
      license_key: store.get('licenseKey'),
      plugin_slug: 'my-desktop-app',
    }),
  });

  const { valid, seats_in_use, max_seats } = await res.json();
  if (!valid) {
    showActivationWindow();
  }
});

Works with any desktop framework

Electron (JS/TS)
Tauri (Rust)
NW.js
.NET WPF/WinUI
Qt (C++)
SwiftUI / AppKit

Why Licensr for desktop apps

Machine-locked seats

Each activation binds to a machine identifier (hostname, hardware UUID, or a custom fingerprint you generate). Key sharing across machines hits the seat cap.

Built-in buy page

Your customers purchase at /buy/your-slug. The license key is issued and emailed automatically via Stripe. No manual fulfillment.

Branded customer portal

Users sign in on a branded page with your logo, then view active seats, deactivate old machines, and manage billing, all carrying your accent colour.

Subscription or lifetime

Sell monthly or annual subscriptions or one-time perpetual licenses. The API returns expiry info so your app can show renewal prompts.

Graceful offline fallback

Verify a signed license token locally at startup so the app works with no network. Pair it with the per-plan perpetual-fallback option to keep core features running even after a license lapses.

Official SDK

Official JS/TS SDK: one import for Electron and Tauri

npm install @licensr/sdk. Validation, seat activation, offline EdDSA tokens, and hosted checkout, with dual ESM/CJS and bundled types. Works from the main process or a preload bridge.

validate.ts
$ npm install @licensr/sdk
import {LicensrClient} from '@licensr/sdk';

const client = new LicensrClient({
  apiKey: 'pk_live_...',
  pluginSlug: 'my-synth',
});

const {valid, entitlement, featureFlags}
  = await client.validate({licenseKey: userKey});

// → { valid: true, entitlement: 'full',
//      featureFlags: { auto_backup: true } }

Ready to license your desktop app?

Free tier available. From signup to a working validate call in 15 minutes.