The best data store for the agent era.
Create a SQLite database in minutes. No servers and no setup, behind one HTTPS endpoint that your backend, your scripts and your agents can all reach.
Your agents need to remember things.Conversations. Preferences. Tasks. Results.So where does it all go? Into SQLite.
Why SQLite, and why here.
Every agent already speaks SQL
Real tables. Real transactions. Nothing to babysit.
One HTTPS endpoint
Any app can reach it: your backend, your scripts, your agents.
MCP built in
Agents plug straight in. They create tables, store what they learn and remember it next time.
Serverless means serverless
You pay only for rows read, rows written and storage. Nothing else.
Connect, then write SQL.
The client matches Cloudflare D1's interface: prepare, bind, run, batch. Anything written for D1 works without changes.
import { connect } from '@dcubix/d1'
const db = connect({
url: 'https://<id>-sqlite.dcubix.cloud',
token: process.env.DCX_DB_KEY,
})
const { results } = await db
.prepare('SELECT * FROM users WHERE id = ?')
.bind(1)
.all()Pay for what it used. Nothing else.
Storage by the gigabyte, rows by how many you read and write. HTTP requests are free when you connect through a binding.
Serverless Database
- Storage$1 per GB, per month
- Rows read$1 per billion
- Rows written$1 per million
- HTTP requestsFree through a binding$1 per million
A 2 GB database: 500 million rows read, 2 million written, 1 million HTTP requests
Questions
Does it work with my ORM?
The @dcubix/d1 client gives you the same interface as a Cloudflare D1 binding, so the D1 drivers for Drizzle and Kysely work with it unchanged.
Where can I call it from?
From any server-side runtime with fetch. An API key has full control of its database, so keep it in server-side code.
Are batches transactions?
Yes. A batch runs as one transaction: if one statement fails, all of them are rolled back.
