No connection pool
One HTTPS request per statement. No sockets to keep warm, no pool to size, no driver to install — which is what makes it usable from a serverless function that lives for 200 ms.
curl https://sql.vreelo.xyz/v1/databases/$DB/query \ -H "Authorization: Bearer $SQLITED_TOKEN" \ -H 'content-type: application/json' \ -d '{"sql":"INSERT INTO events (kind) VALUES (?)","params":["signup"]}'{ "columns": [], "rows": [], "rowsAffected": 1, "lastInsertRowid": 1, "epoch": 3, "txid": 412, "durability": "durable", "waitedMs": 118}"durability": "durable" is the whole product. It means the bytes covering that insert are in object
storage — not in a buffer, not on one machine’s disk, not replicated-eventually. If the server had
caught fire between your request and this response, you would have got an error instead.
No connection pool
One HTTPS request per statement. No sockets to keep warm, no pool to size, no driver to install — which is what makes it usable from a serverless function that lives for 200 ms.
Real SQLite
Actual SQLite, not a wire-compatible reimplementation. Your indexes, RETURNING, window
functions, CTEs, and foreign keys all behave the way the SQLite documentation says.
Honest about latency
A durable write costs about 120 ms, because it is two sequential round trips to object storage. Reads served from the owning worker are sub-millisecond. Why.
Honest about failure
There is exactly one ambiguous outcome in the whole API, and it is named rather than hidden behind a retry.
Good fit. Read-heavy workloads with modest write rates. Per-tenant or per-user databases. Edge and serverless applications that cannot hold a connection. Anything where you want SQL and a durability story you can actually explain to an auditor.
Bad fit, today. Write-heavy workloads that need sub-10 ms commits — the two round trips to object storage are a floor, not a tuning problem. Anything needing interactive transactions held open across requests; the atomic unit here is one batch. Anything needing more than one writer per database, which is a correctness boundary rather than a limit we have not got round to raising.
Read Durability before you build on this. It is short, and it is the only page where the guarantees are stated precisely enough to design against.