Documentation · this section

Documentation — 09

One key, several devices, no account.

Last updated · 2026-05-13

Shelf Pro is sold through Stripe and unlocked by a single license key. There is no account, no password, no dashboard you log into to use the extension. The key is the credential — paste it once per device, keep it in your password manager, and you’re done. This page covers how that key works, what to do if you misplace it, and how to manage the devices it has unlocked.

What the license key is

After a Stripe checkout completes, our webhook signs a JSON Web Token (JWT) and emails it to you. The token is a single dotted string that begins with eyJ — three base64 segments separated by dots. It is signed with our private HMAC secret; nobody can forge one, and the extension does not need to ask a server what plan you bought because the token itself states it.

The token’s payload includes your Stripe customer id, the kind of license (subscription for Pro Monthly or Yearly, lifetime for Founder), the tier, and your email. The extension reads it locally to display the right state, then calls our /api/license/validate endpoint to register the device and confirm the subscription is still active in Stripe.

The key is stored on this browser inside chrome.storage.local under shelf:license. It does not sync to any other Chrome install — every device is activated independently, by you, by pasting the same key.

How activation works

Open Shelf’s Options page, scroll to Billing, paste the key, click Activate. The extension does three things, in order:

  1. Generates an installId — sixteen random hex characters, one per browser profile. Created on first activation, persisted in chrome.storage.local, never rotated.
  2. Calls /api/license/validate with the key and the installId. The server verifies the JWT signature, asks Stripe live for the subscription’s current status, and records this installId against the customer as one of their seats.
  3. Caches the result locally so the next call to isPro() doesn’t need the network. The cache stores the tier, the expiry, the seat count, and the timestamp of the last successful round-trip.

If activation succeeds the Pro-gated features turn on instantly. If it fails — wrong key, cancelled subscription, expired card — the error is shown inline. Your library, your collections, your destinations, and your settings are not affected either way; only the Pro layer toggles.

The seat cap

Every license has a device limit:

  • Pro Monthly and Pro Yearly — five active devices.
  • Founder Lifetime — ten active devices.

A device is one Chrome profile on one machine. Chrome on your laptop and Chrome on your desktop count as two. A second Chrome user profile on the same laptop also counts as two, because the installId is per profile, not per machine.

When you hit the cap, activation on the new device fails with a seat limit reached error. The Options page surfaces the message and a Manage devices link that opens /manage. Free up a seat there, then paste the same key again on the new device.

You don’t have to manage seats by hand for old machines. If an install does not check in with /api/license/validate for sixty days, its seat is auto-released and the next activation will simply take the freed slot. An old laptop you stopped using will drop off on its own.

The seven-day cache and thirty-day grace

The cached license is not consulted blindly. Every seven days the extension re-validates the key in the background — once via a chrome.alarms callback that fires weekly, and again opportunistically whenever isPro() is called and the cache is stale. The result is written back to storage and Pro stays on.

If the network is unreachable when a refresh is due — you’re on a plane, on a train, behind a corporate proxy — the extension keeps the existing tier for a thirty-day grace period before downgrading to free. You can be offline for a month without losing your features. Past thirty days of consecutive network failures, Pro reverts to free; a single successful re-validation brings it back.

A failed check is different from an offline check. If the server returns cancelled, expired, or revoked, Pro flips off immediately on the next successful round-trip — no grace.

Manage devices

www.shelf-extension.com/manage is the device manager. There is no password; access is by magic link.

  1. Enter the email on your Stripe receipt.
  2. We send a one-time link to that address. The link expires in fifteen minutes and works exactly once.
  3. The link opens to the list of devices currently using your license.

Each row shows a short device id, the rough age of its last check-in (today, 3 days ago, 2 weeks ago), and an optional hint when one is known. Revoke drops the device from the seat list immediately. The next time that device tries to validate, it will be told its seat was revoked, and Pro will flip off there. Re-activating the same key on the same device — assuming a seat is free — works fine.

The manager also shows the current count out of the cap (3 of 5 active devices) and the stale window (Inactive devices release their seat after 60 days).

Lost your key

www.shelf-extension.com/recover re-sends the key. Enter the email you bought Shelf with, click Re-send the key, and check your inbox. The response is intentionally generic — the page shows the same confirmation regardless of whether the address matched an existing customer. This is on purpose: it prevents anyone from using /recover to find out which email addresses have bought Shelf.

If your email has changed since the purchase, recovery cannot find you — the address on the Stripe receipt is the only key we can use to look up your record. Email support at shelf-extension dot com with proof of purchase (the Stripe receipt is enough) and we’ll re-issue the key to the new address.

The devices line in Billing

When Pro is active, the Billing card in the Options page shows a Devices N of M · Manage line under the activation date. The number is the seat count reported by the server on the last successful validation, not a live count — re-validate to refresh it. Manage opens /manage in a new tab.

Cancelling

Cancelling is a Stripe-side operation. There is no cancel button inside the extension because the extension is not where you bought it. Open the Stripe customer portal, enter the email you used at checkout, and Stripe will send a sign-in link. From there you can cancel the subscription in one click, change your payment method, or download invoices. The same link is included in every purchase email under Manage your subscription. If anything goes wrong, support@shelf-extension.com is always an option.

Cancelling stops future billing; Pro stays active until the end of the current period, then the next validation downgrades every device.

Your library and exports are not affected. They live in chrome.storage.local. The Pro-gated features turn off, but you keep everything you wrote.

A tip jar, for completeness

The Billing card has a Tip a coffee button at the bottom (visible from every state — free, mock-pro, or Pro-licensed), routed through Ko-fi. It is patronage — no tier, no perk, no follow-up. You can already buy Pro; if you want to leave something on top, the jar is there.