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.
- Open Policies, turn on Floating seats, and choose a heartbeat timeout between 2 minutes and 24 hours.
- Issue licenses from that policy (or set the same fields on a single license).
- In your app, license the device as usual, then send a heartbeat every
license.heartbeat_interval_seconds(a third of the timeout). - 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.