Atlas

Build

Floating licenses

Share a pool of seats between machines: a seat is held while the app runs and freed when it stops.

How floating seats work#

A normal license keeps a device activated until someone releases it. A floating license treats its activation limit as a pool: a running app holds a seat by sending heartbeats, and Atlas frees the seat once heartbeats stop for longer than the timeout. A team with 5 seats can install your app on 50 machines and run it on any 5 at once.

  1. Open Policies, turn on Floating seats, and choose a heartbeat timeout between 2 minutes and 24 hours.
  2. Issue licenses from that policy (or set the same fields on a single license).
  3. In your app, license the device as usual, then send a heartbeat every license.heartbeat_interval_seconds (a third of the timeout).
  4. Release the seat on quit with deactivate, so the next person doesn't wait.

In your app#

ts
const result = await atlas.license(userKey);
if (!result.valid) return showError(result.message);

// Sends heartbeats in the background; the callback runs if the seat is lost.
const beats = atlas.startHeartbeat((lost) => showError(lost.message));

app.on("quit", async () => {
  beats.stop();
  await atlas.deactivate(userKey);
});

Every SDK has the same pair: heartbeat(key) for one beat and start_heartbeat(on_lost) to run them on a background thread or task. Over HTTP, send POST /v1/runtime/heartbeat with the same body as validate.

When every seat is taken

Activation fails with activation_limit_reached until a seat frees up. Stale seats are released the moment someone else activates, so there's no background job to wait for.