Skip to content

libSQL / SQLite

Tested with: libsql-server (sqld) 0.24 on Databasezy · zb CLI 0.1

libSQL is an open-source fork of SQLite that adds a network server. On Databasezy each instance runs libsql-server (sqld), so you get SQLite semantics with a URL and a password.

Clients talk to the instance with the Hrana protocol over HTTPS or WebSockets. The certificate is publicly trusted, so there is no CA bundle to download. SQLite rules still apply: one writer at a time, unlimited readers.

libSQL / SQLite at a glance, from the engine catalogue
Status Available
CategoryEmbedded SQL
Versions0.24 (newest is the default)
Protocol and port HTTPS on 443
RuntimeSingle-node engine (ghcr.io/tursodatabase/libsql-server)
BackupsSQLite snapshot + WAL file per backup
Point-in-time recoveryNo
PauseScale to zero
Free planYes (size f0)
LicenceMIT
  1. Open the portal and choose New instance.
  2. Pick libSQL / SQLite and a version (0.24).
  3. Choose a size and region. On the Free plan the size is f0. Secure placement is listed only after your organization has signed the BAA.
  4. Check the hourly price and monthly estimate, then confirm. The Connect tab fills in when the instance is ready.

The instance uses HTTP basic authentication: the user app and a generated password, shown once like any credential and rotated the same way. Send Authorization: Basic base64(app:password) with each Hrana request (for example POST /v2/pipeline). Turso-style auth tokens (JWTs passed as authToken, sent as a Bearer header) are not accepted by this server.

libSQL / SQLite listens on port 443 (HTTPS). Versions: 0.24. Replace the example host with the one on your instance's Connect tab; credentials are shown once at creation.

Connection URI
libsql://libsql-7f3k.us-east.databasezy.com?authToken=<token>
db.js
import { createClient } from "@libsql/client";
export const db = createClient({
url: "libsql://libsql-7f3k.us-east.databasezy.com", // TLS with a publicly trusted certificate
authToken: process.env.ZB_TOKEN,
});
const rs = await db.execute("select sqlite_version() as v");
console.log(rs.rows[0].v);

Tested with: libSQL / SQLite 0.24 · @libsql/client 0.14

Embedded replicas, which keep a local SQLite file in sync, need sqld’s replication endpoint, which Databasezy does not expose, so they are not available. The libSQL connection guide has more on clients.

See Connecting to Databasezy for host names, the CA bundle and the allow-list, which work the same for every engine.

You can bring an existing libSQL / SQLite database in from these sources. Each links to a step-by-step guide.

Where you can migrate a libSQL / SQLite database from, how, and whether continuous sync is available
Source How Continuous sync Guide status
Turso Connection string, File upload No Available
Cloudflare D1 File upload No Coming soon · phase 2
Local files and dumps File upload, Local tools (zb migrate --from local) No Available
Another Databasezy instance Instance to instance No Coming soon · phase 2

Plain SQLite files (.sqlite, .db) upload as they are; WAL-mode files are checkpointed on upload. There is no continuous sync, so take the dump during a short write freeze for busy databases.

How migrations work explains preflight, verification and cutover.

Each backup is a consistent snapshot of the database file, taken with SQLite’s backup API, plus the write-ahead log file as it was at that moment, both uploaded to object storage. The log is not streamed continuously, so there is no point-in-time recovery: a restore returns the database as it was when a backup ran.

libSQL / SQLite backups use SQLite snapshot + WAL file per backup. They run inside the instance's namespace, stream straight to the cell's object storage and are checksummed on upload. How often they run and how long they are kept follows your plan's backup policy. A backup is always taken before a resize or a version upgrade.

Point-in-time recovery is not available for libSQL / SQLite. A restore returns the data as of a scheduled or manual backup. Restores create a new instance by default and leave the original untouched; an in-place restore asks you to type the instance name and takes a pre-change backup first.

shell
zb backups create libsql-demo --label before-release # manual snapshot
zb backups list libsql-demo
zb backups restore libsql-demo <backup-id> --name libsql-demo-restore

libSQL / SQLite can scale to zero. A paused instance has no running pods and bills no compute; its storage and backups are kept and billed as usual. Connections are refused until you resume it. On the Free plan an instance pauses by itself after 15 minutes without connections and wakes on the next one; the gateway holds that connection for up to 30 seconds while it starts.

shell
zb instances pause libsql-demo
zb instances resume libsql-demo

See Pause and resume for schedules, wake times and billing while paused.

libSQL / SQLite runs on every size, including the Free plan's f0. The size sets the CPU, memory, storage ceiling and connection limit; the gateway refuses connections over the limit with a protocol error. Storage grows in steps up to the ceiling, and you can resize at any time.

Sizes available for libSQL / SQLite: vCPU, memory, storage ceiling, connection limit and monthly price
Size vCPU Memory Max storage Max connections ≈ $ / month
f0 0.063 512 MiB 1 GB 20 Free
s0 0.25 1 GiB 20 GB 60 $10
s1 0.5 2 GiB 50 GB 100 $15
s2 1 4 GiB 200 GB 200 $60
m2 2 8 GiB 500 GB 400 $110
m4 4 16 GiB 1 TB 800 $210
l8 8 32 GiB 4 TB 1,500 $410
l16 16 64 GiB 8 TB 3,000 $960
xl32 32 128 GiB 16 TB 5,000 $1,870

Full details, including hourly prices and burst CPU, are in the size catalogue; plan quotas are in limits and quotas.

Treat the password like any secret: it travels in an HTTP header on every request. Do not ship it in a browser bundle or a mobile app; put a server or a serverless function in front.

  • TLS on every connection. TLS 1.2 is the minimum and TLS 1.3 is preferred; plaintext is never offered. Verify the server, not just the encryption: use HTTPS with certificate verification. See TLS and the CA bundle.
  • IP allow-list. The gateway checks the client address before authentication, on every plan. Manage it under Network → Allow-list in the portal or with PUT /v1/orgs/{org}/instances/{id}/network.
  • Credentials. Generated inside the cell, shown once, never stored by the control plane. Rotate them with an overlap window so nothing breaks.
  • Secure hosting. Secure placement (HIPAA-ready) is a per-instance option once your organization has signed the BAA: dedicated nodes, customer-managed keys and immutable backups. See Secure hosting and the BAA.
  • Staff access. Databasezy staff cannot read your data without a grant you issue. See data confidentiality.

Can I open the database with the sqlite3 command-line tool?

Section titled “Can I open the database with the sqlite3 command-line tool?”

Not over the network, and zb connect has no shell for HTTP engines. Run zb connect <id> --print for the endpoint and use a libSQL client library or the HTTP pipeline API.

No. Embedded replicas (a client mode that keeps a local SQLite file in sync) need sqld’s replication endpoint, which Databasezy does not expose. Read through the HTTP API instead.

One write transaction at a time, as with any SQLite database. Keep write transactions short; readers are not blocked.