D1 moves to open beta with bigger databases and point-in-time recovery
Cloudflare has moved D1, its serverless SQL database for the Workers platform, into open beta. The headline change is scale: developers on the paid Workers plan can now grow individual databases up to 2GB and create up to 50,000 databases per account, up from the previous 500MB and 10 databases. Existing D1 databases on paid plans have been upgraded automatically. Those on the free Workers plan keep their ten 500MB databases.
The larger per-database limit is one step toward what Cloudflare acknowledges is a longer-term goal: databases in the double-digit-gigabyte range. The constraint there is performance, not storage cost. Loading a very large database into a ready state must be fast, and a multi-second cold start on a 10GB or 20GB database would be unacceptable. The team says it will continue raising limits over the coming months, with changes published on the D1 changelog.
Time Travel restores databases to any minute in the last 30 days
Time Travel, D1's built-in point-in-time recovery, is now enabled by default on every database. It carries no additional cost and does not consume storage. Introduced earlier this year and made available to all D1 users in July, the feature works by maintaining a "bookmark" for each database — effectively an append-only log representing database state at a specific point in time. Point-in-time recovery converts a timestamp into a bookmark, then restores the database to that state. Importantly, restoring does not prevent rolling back further.
The feature handles the kind of mistake database operators make eventually. Say an UPDATE query is run against an Order table without the intended WHERE clause, changing ShipAddress for every order instead of one. With Time Travel, the fix is a quick rollback:
# Let's go back in time.
➜ wrangler d1 time-travel restore northwind --timestamp="2023-09-23T14:20:00Z"
🚧 Restoring database northwind from bookmark 0000000b-00000002-00004ca7-9f3dba64bda132e1c1706a4b9d44c3c9
✔ OK to proceed (y/N) … yes
⚡️ Time travel in progress...
✅ Database dash-db restored back to bookmark 00000000-00000004-00004ca7-97a8857d35583887de16219c766c0785
↩️ To undo this operation, you can restore to the previous bookmark: 00000013-ffffffff-00004ca7-90b029f26ab5bd88843c55c87b26f497
Verifying the restore:
# Phew. We're good.
➜ wrangler d1 execute northwind --command "SELECT count(distinct ShipAddress) FROM [Order]"
┌──────────┐
│ count(*) │
├──────────┤
│ 89185 │
└──────────┘
Cloudflare sees particular value in Time Travel combined with the database-per-user model the higher limits enable. A restore operation is scoped to a single tenant, reducing the blast radius compared with a monolithic shared database. Future work will add the ability to fork a database from a point in time and to overwrite an existing database, supporting use cases like testing migrations against real data.
Pricing moves to row-based units
D1's pricing model, first announced in May, has been revised from byte-based to row-based billing. The change, published in August, makes usage easier to predict: a write costs the same whether the row is 1KB or 1MB, and reads that filter on an indexed column cost less.

Pricing still includes no charges for "database hours," the number of databases, or Time Travel. Users pay for reads, writes, and storage only. D1 also returns a count of rows read and written for each query so developers can see what any given statement costs. That data is also exposed through the Cloudflare dashboard and the GraphQL analytics API.
The difference an index makes is immediately visible in row counts. A query filtering orders by date without an index might scan 16,800 rows:
SELECT * FROM [Order] WHERE ShippedDate > '2016-01-22'"
[
{
"results": [],
"success": true,
"meta": {
"duration": 5.032,
"size_after": 33067008,
"rows_read": 16818,
"rows_written": 0
}
}
]
Even unoptimized, the paid Workers plan includes 25 billion free queries per month — that query could run 1.4 million times a month before incurring extra cost. Adding an index on the filtered column changes the picture:
CREATE INDEX IF NOT EXISTS idx_orders_date ON [Order](ShippedDate)
The same query now reads 417 rows:
SELECT * FROM [Order] WHERE ShippedDate > '2016-01-22'"
[
{
"results": [],
"success": true,
"meta": {
"duration": 3.793,
"size_after": 33067008,
"rows_read": 417,
"rows_written": 0
}
}
]
The query runs faster and costs less — about 59 million executions per month on the same plan.
Instances for platform builders
D1's design has emphasized horizontal scaling from the start: deploying a separate database per customer to isolate data. That approach fits the Workers for Platforms model. RONIN, an early adopter, builds an edge-first content platform backed by a dedicated D1 database per customer.
Support for such platforms includes no effectively hard cap — Cloudflare says Workers for Platforms users can create more than 100,000 databases — on top of the 50,000 already available per account. Pricing does not penalize many small, often idle databases, since there are no "database hours." Databases can be created programmatically via the HTTP API and attached to a Worker without redeployment, with no provisioning delay.
On the road to GA
Cloudflare's stated target is general availability in Q1 2024. Between now and then, the priorities are reliability and performance, with a focus on a major remaining feature: global read replication. That capability was previously discussed as a bullet point; the current memo confirms replication will be free, will not multiply storage consumption, and will preserve read-your-writes consistency.
Other items on the road map include expanding Time Travel to support branching and cloning a database from a specific point in time, and further raising per-database storage and per-account database limits throughout the remainder of the year.



