Licensing

Plans, seats, sessions, instances, domains, check-ins, grace periods, offline license files, every license state the bridge can be in, and how to fix each one.

A SQLly Embedded license says how many people can use SQLly at once, from which domain, on how many bridges, and until when. The bridge enforces it from a grant signed by sqlly.app. This page covers the rules, then every state a bridge can be in and what to do about each one.

Plans

PlanSeatsTabs per seatBridgesChecks inPer year
SQLly Embedded trial111yesfree for 3 months
SQLly Embedded 5541yes$200
SQLly Embedded 252541yes$500
SQLly Embedded 10010041yes$2000
SQLly Embedded Offline 554no limitnever (license file)$500
SQLly Embedded Offline 25254no limitnever (license file)$1000
SQLly Embedded Offline 1001004no limitnever (license file)$5000
SQLly Embedded 5 (with Lifetime)541yesincluded with SQLly Lifetime, never expires

Every sqlly.app account gets the trial automatically. Buy plans on the SQLly Embedded page and manage them on your Embedded page. Need different terms, such as more seats, more bridges, a fixed end date or a longer grace period? We can issue a custom license with its own terms. Ask us.

The rules

Seats

Seats are concurrent users across every bridge on the license. A user holds a seat while they have SQLly open or an unexpired launch token, and it frees the moment both are gone. Each seat may have several tabs open at once (see the table). Your app passes the user id when it mints a token, so you decide what counts as "one user".

Domain

One domain per license, and every subdomain of it is included (example.com covers app.example.com and eu.app.example.com). The bridge only accepts browsers whose Origin matches, plus localhost while --allow-localhost-origins is on. Set the domain on your Embedded page at any time, or let the first check-in from a bridge started with --domain bind it. A license without a domain works on localhost only, which is enough for development.

Bridges (instances)

A connected license runs a set number of bridge processes at once, one on standard plans. A second bridge with the same license is told it isn't admitted while the first keeps checking in. The slot frees immediately when a bridge stops cleanly (Ctrl-C or a service stop), or 40 minutes after a bridge stops checking in. Offline licenses don't count bridges.

Check-ins (connected licenses)

  • At startup and every 20 minutes the bridge checks in and receives a fresh signed grant, good for 40 minutes.
  • If check-ins fail (sqlly.app or your outbound network is down), the bridge keeps serving until 40 minutes after its last good grant, then goes stale and pauses queries. The next successful check-in resumes work without a restart or page reload.
  • The admin's Check in now (POST /manage/license/checkin) retries immediately.

Expiry and grace

Every license keeps working for 15 days after its period ends (custom licenses can set their own grace). During the grace period every SQLly user sees "The SQLly Embedded license for this site expires in N days. Ask your administrator to renew it." After it, queries stop with "…has expired." Renewing (the yearly payment for connected plans, a new license file for offline plans) brings the bridge back without a restart: connected bridges learn at their next check-in, offline bridges within a minute.

Offline license files

Offline plans are for servers that must never contact SQLly. Set the domain on your Embedded page first (the file carries it), then Download license file and start the bridge with --license-file. The bridge re-reads the file every minute, so renewing is replacing the file. A damaged or missing file after a good start keeps the last good license and logs a warning. At startup it's fatal, so you notice.

Keys and linked installs

A connected license has one page key you generate on your Embedded page (regenerating it disconnects bridges using the old one), plus any number of linked keys, one per install linked through the link flow. Each linked install is listed under the license, where you can revoke it without affecting the others.

License states

GET /manage/status reports the state as license.state. Only ok and grace serve queries and mint launch tokens.

StateServes?What it meansWhat to do
okyesVerified recently; everything works.Nothing.
graceyesThe period ended less than the grace days ago. Users see a countdown.Renew, or replace the offline license file.
stalenoNo successful check-in for 40 minutes.Check outbound HTTPS from the bridge host to sqlly.app and the host clock (NTP), then Check in now.
not_admittednoAnother bridge holds the license's instance slot.Stop the other bridge, or wait 40 minutes after it stopped checking in.
expirednoThe grace period is over.Renew or buy a plan; offline: download and replace the file.
revokednoThe key was regenerated, the install was unlinked, or the license was revoked.Use the current key from your Embedded page, or link the install again.
domain_mismatchnoThe bridge was started with a --domain the license isn't bound to.Change SQLLY_EMBEDDED_DOMAIN or the domain on your Embedded page so they agree.
unlicensednoStarted with no key or file and not linked yet. Profiles can still be set up and tested.Link from your admin app, or restart with a key or file.

In a refusing state, open SQLly tabs stay connected and every request gets the explanation, which SQLly shows in its status line and as a notification. New tabs get HTTP 503, and launch tokens 503 license_not_ok with the same sentence in message.

Troubleshooting

SymptomCause and fix
The bridge exits at startup with unknown license keyThe key was regenerated or mistyped. Copy the current key from your Embedded page.
The bridge exits with a license-file errorThe file is missing, damaged, past its hard stop, or signed for another key. Download it again.
Browser gets HTTP 403 on the WebSocketThe page's origin isn't the licensed domain, a subdomain, or localhost. Bind the domain, or check --allow-localhost-origins.
Launch fails with seat_limitEvery seat is in use. Release one (DELETE /manage/seats/{user}) or move to a larger plan.
A new tab says the user has the maximum number of sessions openThe user already has as many tabs as their seat allows. Close one.
SQLly says the proxy session isn't connectedThe bridge restarted or the token expired. Reload the page; your app mints a new token.
Status shows fromCache: trueThe bridge started while sqlly.app was unreachable and is running on its cached grant. It needs a successful check-in within 40 minutes of that grant.