Hoq DB
SQLite databases over HTTP, libSQL and Redis, with 30 days of history.
What it does
Hoq DB holds SQLite databases and runs your SQL against them over HTTPS. You send a statement or a batch; a batch is one transaction that commits or rolls back as a whole. The libSQL clients (@libsql/client, Drizzle, and the Python, Go and Rust libsql clients) connect without changes, and any Redis client can reach the same database on port 6380 over TLS.
A write is answered once two servers have it on disk. Every committed change is also written to an append-only log in Cloudflare R2, each segment written create-only, so two servers can never both claim the same position. The local file is a cache rebuilt from that log on every open. A quiet database is also copied into your Hoq Storage drive as Databases/<name>.db.
Keys can be read-only or limited to named tables, and SQLite's own authorizer enforces both. Agents connect through an MCP endpoint at /mcp. You can fork any database as it was at any change or moment in the last 30 days.
In numbers
Specifications
| Protocols | JSON over HTTPS, libSQL (Hrana over HTTP), Redis RESP2 over TLS on port 6380, and MCP (streamable HTTP). |
|---|---|
| When a write is acknowledged | By default, once a second server has fsynced it. Per database you can choose to be answered only after the change is stored in the R2 log, or at once. |
| Where data lives | An append-only log of whole-page segments and periodic full copies in Cloudflare R2. A quiet database is also copied to your Hoq Storage drive as Databases/<name>.db. |
| Ordering guarantee | Log segment n is written create-only (If-None-Match). The first writer owns it, so a replaced server refuses writes instead of forking the history. |
| Failover | Two servers, one active by a lease held in the bucket. A planned handover takes about 0.2 s and refuses no requests; if the active server dies, the standby takes over after 20 s without a lease renewal. |
| History | Fork a database as it was at any log position or moment within the retention window (30 days by default). |
| Access control | Keys are read-only or read-write, reach chosen databases, and can be limited to named tables. SQLite's authorizer refuses everything else, including ATTACH and load_extension. |
| Per-request limits | 5 s per statement, 100 statements per batch, 999 parameters, 10,000 rows or 8 MiB per response, 4 MiB per value. |
| Extensions built in | FTS5 full-text search, R*Tree, and sqlite-vec vector search (vec0 tables, cosine and L2 distance). |
| Change feed | Committed inserts, updates and deletes on chosen tables, followed by long-poll, Server-Sent Events or MCP. Rolled-back work never appears. |
Features
16 features, all shipped. Listed from the product's code and documentation; each row shows the day it was last checked.
| Query and batch | Run one statement or an all-or-nothing batch, with positional or named parameters. | |
| libSQL clients | Point @libsql/client or Drizzle at https://db.hoq.app/db/<key>/ and they work unchanged. | |
| Redis protocol | Strings, counters, expiry, hashes, lists, sets, sorted sets, MULTI/EXEC and pub/sub, stored in tables of the same SQLite file. | |
| Full-text search | FTS5 tables with snippets and bm25 ranking. | |
| Vector search | sqlite-vec is compiled in: store embeddings in vec0 tables and search by distance in SQL. |
| Second copy | A write is answered once a second server has it on disk, and the bucket upload follows. | |
| Upload gap | Choose how often a database uploads to the bucket, from 1 s to 300 s, trading storage write cost against latency. | |
| Fork in time | Make a new database from any earlier log position or moment. | |
| Drive copy | A quiet database's newest full copy is saved into your Hoq Storage drive as Databases/<name>.db. | |
| Failover | Two servers share one address; the standby forwards requests and takes over when the active one stops renewing its lease. |
| Database keys | Keys that reach chosen databases, read-only or read-write, optionally limited to named tables. | |
| MCP for agents | List databases, read schema, query, execute, batch, follow changes and create databases from an MCP client. | |
| Change feed | Follow committed changes to chosen tables by long-poll or Server-Sent Events, resuming from the last id. |
| Table browser and query editor | Browse tables, run queries and read the schema in the browser, signed in with Hoq ID. | |
| Keys and snippets | Make keys with table limits and copy ready-made connection snippets. | |
| Download | Download the whole database as a SQLite file. |
Works with
- Hoq StorageA quiet database's newest full copy lands in your drive as Databases/<name>.db.
- Hoq AgentsAgents read and write tables through the MCP endpoint with a key you limit to chosen tables.
- GrimasteYour agent connects to /mcp with its own key, read-only or table-limited.
Your data
| Where it is kept | An append-only change log and full copies in Cloudflare R2, a second copy on a second server until the log has each change, and a copy in your own Hoq Storage drive. |
|---|---|
| Getting it out | GET /v1/db/{db}/export returns the whole database as a standard SQLite file (up to 512 MB); the console has a Download button. |
| If you leave | not published |
APIs and standards
- JSON API: POST /v1/db/{db}/query and /v1/db/{db}/batch with a Bearer key
- libSQL (Hrana over HTTP): https://db.hoq.app/db/<key>/
- Redis RESP2 over TLS: rediss://<database>:<key>@db.hoq.app:6380
- MCP server: https://db.hoq.app/mcp, 7 tools
- Change feed: long-poll and Server-Sent Events
- Web console at db.hoq.app
- Standard: SQLite
- Standard: libSQL Hrana
- Standard: Redis RESP2
- Standard: Model Context Protocol
- Standard: Server-Sent Events
Compared
| Checked 2026-11-01 | Hoq DB | Cloudflare D1 | Turso |
|---|---|---|---|
| Engine | SQLite | SQLite1 | libSQL (a SQLite fork)2 |
| Point-in-time history | 30 days, fork to a new database | 30 days (Workers Paid), 7 days (Free)3 | 1 day (Free) to 90 days (Pro)4 |
| Maximum database size | 1 GiB (default page limit) | 10 GB (Workers Paid), 500 MB (Free)3 | not published4 |
| Maximum query duration | 5 s per statement | 30 s3 | not published4 |
| Bound parameters per query | 999 | 1003 | not published4 |
| Vector search in SQL | sqlite-vec (vec0) compiled in | not published (separate Vectorize product)5 | Native vector types and search2 |
| Export | Whole SQLite file over the API, up to 512 MB | SQL file via wrangler d1 export; databases with virtual tables (including FTS5) cannot be exported6 | not published4 |
| Free tier | not published | 10 databases, 5 GB, 5 million rows read and 100,000 written per day7 | $0: 100 databases, 5 GB, 500 million rows read, 10 million written a month4 |
- https://developers.cloudflare.com/d1/
- https://docs.turso.tech/features/ai-and-embeddings
- https://developers.cloudflare.com/d1/platform/limits/
- https://turso.tech/pricing
- https://developers.cloudflare.com/vectorize/
- https://developers.cloudflare.com/d1/best-practices/import-export-data/
- https://developers.cloudflare.com/d1/platform/pricing/