License your software.
Keep your cool.
CoolBeans issues your license keys, tracks seats, and meters usage, all wired to Stripe. Self host it or run it on our cloud. Either way, you own the whole layer, source and all.
From "they paid" to "it's unlocked"
Issuance, seats, metering, refunds. The whole path from a Stripe payment to a working app, without the glue code.
Issue keys instantly
Signed keys the moment someone pays. Per-product prefixes, tiers, and expiry baked in, no cron jobs.
Seats & activations
Node-locked or floating leases. Customers free a seat themselves. The support ticket never gets filed.
Metered usage
Atomic counters in single guarded statements. Set a cap and you'll never get oversold, even under a thundering herd.
Payments, wired
Checkout, refund, cancel. Stripe and PayPal webhooks issue and revoke keys automatically, signatures verified.
Works offline
Signed ed25519 tokens verify locally, so your app opens with no network at all. Rotate signing keys without downtime.
Self-host or cloud
Run one docker compose up against your Postgres, or let us operate it. The core is open source, so your keys and data stay yours.
Built for people who'd rather be shipping
You've built something worth paying for. Deciding who can use it shouldn't take months of webhook plumbing, or a per-seat bill from a licensing platform.
Selling a desktop app, a CLI, or an Electron/Tauri build? Keys, activation limits, and trials are one open() call, so you ship the product, not the licensing.
The Swift SDK speaks the same contract: Keychain storage, CryptoKit signatures, and offline tokens for laptops that leave the network.
Concurrent seats with heartbeat leases. A crashed client frees its own seat, and customers release a lost machine themselves in the portal.
Selling by usage? Atomic per-licence quotas enforced at the edge, so a cap is a cap even under a thundering herd of retries.
One call. One decision.
Call open() on launch and branch on the decision, nothing else. Activation, offline tokens, seats, and renewals all happen behind that one call, online or not.
import { CoolBeans } from '@coolbeans/sdk' const cb = new CoolBeans({ product: 'acme', storage }) const state = await cb.open(licenseKey) if (state.decision === 'deny') lockApp(state.reason)
import CoolBeans let cb = CoolBeans(configuration: .init(product: "acme")) let state = await cb.open(licenseKey: key) if state.decision == .deny { lockApp(state.reason) }
curl https://app.coolbeans.tools/v1/validate \ -H 'Content-Type: application/json' \ -d '{"license_key":"ACME-A2B3-C4D5-E6F7","instance_id":"'"$MACHINE_ID"'"}' # → { "valid": true, "license": { "kind": "subscription", "plan": "Yearly" } }
Two SDKs. One contract.
The TypeScript and Swift SDKs run the same decision table, a shared fixture file both test suites execute, so an app on either platform makes identical allow/deny calls.
Zero runtime dependencies. One class, one open() call, works in the browser, Electron, Tauri, and Node. Verifies signed tokens locally with WebCrypto.
SwiftPM package for macOS 11+ and iOS 14+. CryptoKit signatures, Keychain storage with iCloud sync, and the same one-call surface as TypeScript.
Products, keys, extensions, and Stripe wiring from the terminal. Everything the console does, scriptable with --json.
Plays well with your stack
Money comes in through the processors you already use. Events go out to whatever you build next.
Stripe
paymentsSelf-host wires your own Stripe account; the cloud connects yours through Stripe Connect. Checkout, refunds, cancellations, and disputes all issue and revoke keys automatically.
PayPal
paymentsSame lifecycle, second rail. PayPal orders and subscription events flow through the identical verified, exactly-once pipeline.
LemonSqueezy compatibility
migrationBuilt against LS licence keys? The /v1/licenses/* parity routes accept the same calls, so migrating is repointing a base URL, not a rewrite.
Outbound webhooks
events outWe call your URL when licences are issued, revoked, extended, or seats change. HMAC-signed, retried with backoff, with a per-delivery log.
Key delivery and recovery emails through Resend or your own SMTP, branded with your product icon.
Coding agents
ai-readyEvery instance hosts an agent-readable integration guide (/v1/llms.txt) and a per-product brief. Point Claude Code or Cursor at it and the integration writes itself.
Built to be relied on
Signed offline tokens keep paying customers unlocked even with no network at all. An unknown answer never locks anyone out. Only an explicit revocation does.
Own your licensing. Literally.
Your license layer should not be a black box you rent. CoolBeans is open source, so you can read the code, run it on your own box, and keep every key and customer record on infrastructure you control.
Your growth is not our upsell
We don’t charge per licence. Sell ten keys or ten thousand on the same flat price, or run the whole thing yourself for nothing.
- Every feature, no caps
- Your Postgres, your keys, your data
- One docker compose up
- Community support on GitHub
- 1 product
- 500 active licences
- Unlimited validations
- Hitting a cap never disables an issued licence
- Unlimited products and licences
- No per-seat, per-licence, or percentage fees
- Same flat price at any scale
- Email support
Ready to ship licensing?
Free while you're small. No card to start. Pick the path that fits how you like to run things.
Start on the cloud
Create a product, connect Stripe, and issue your first key in ten minutes. We run it for you.
Start freeSelf-host it
One compose file and a Postgres URL. Your keys and customer data never leave your infrastructure.
Read the guide