Skip to content

License Management

import { Aside } from ‘@astrojs/starlight/components’;

Fantommind uses Polar as the licensing backend. Each license key is tied to one machine at a time via a hardware fingerprint computed at every startup.

  1. Polar activations.limit=1 — Polar’s API rejects a second activation for the same key if one is already active.
  2. Sidecar fingerprint — the Python sidecar recomputes the hardware fingerprint at every boot and rejects if it doesn’t match the stored activation.
  3. HMAC-signed cache — the cached activation response is signed; tampering invalidates the session.
  4. Polar webhook push — if a key is revoked via the Polar dashboard, the CF Worker receives the event and the app locks on next startup.

Fantommind requires an internet connection at startup to validate your license with Polar. This is by design: it prevents license sharing and keeps the 1-machine guarantee strong.

  • If Polar’s API is unreachable but your general internet works → app locks immediately.
  • If both Polar and general internet are unreachable → app allows a limited session (up to 6 hours) to avoid punishing legitimate users during outages, then locks.
  1. Open the customer portal in your browser.
  2. Find your license key under Purchases → License Keys.
  3. Click Deactivate next to the current machine.
  4. On the new machine, open Fantommind → Settings → License → paste the key → Activate.

If you can no longer access the machine (e.g., it was lost or destroyed):

  1. Go to the customer portal.
  2. Under your license, click Revoke machine activation.
  3. The key is immediately available to activate on a new machine.

In the app: Settings → License

You’ll see:

  • License key (partially masked)
  • Activation status (Active / Expired / Revoked)
  • Machine fingerprint hash
  • Next validation timestamp

Cancel from the customer portal. Your license stays active until the end of the current billing period. After that, the app will show License Expired at next startup.

Your local data (profiles, runs, schedules) is never deleted — it stays in the local SQLite database. You can re-subscribe and resume where you left off.