Turso vs Cloudflare D1 for Indie Developers (2026)

Turso and Cloudflare D1 both give you managed SQLite, but they are built for different apps. D1 is a Workers binding with per-day free caps, a $5/mo Workers Paid plan and 30 days of Time Travel. Turso Cloud is reachable from any runtime, has a monthly free tier with 100 databases, embedded replicas and a new Rust engine with local-first sync. Here is how to pick, from both vendors' own pages checked on 15 Nov 2026.

Editorial title card reading "Turso vs Cloudflare D1 for Indie Developers (2026)" beside the orange ZeroRaised mark.

Key takeaways

  • D1 lives inside Cloudflare Workers. Workers Paid starts at $5/mo per account and includes 25 billion rows read, 50 million rows written and 5 GB of D1 storage each month.
  • Each D1 database is single-threaded and processes queries one at a time, with a 10 GB maximum size on Workers Paid (500 MB on Free). Cloudflare designs it for many small databases, not one big one.
  • Turso's Free plan gives 100 databases, 5GB storage, 500 million rows read and 10 million rows written per month. Developer is $5.99/mo ($4.99/mo billed yearly) with unlimited databases.
  • Backups: D1 Time Travel is always on, free and covers 7 days (Free) or 30 days (Paid). Turso point-in-time restore is 1 day on Free, 10 on Developer, 30 on Scaler and 90 on Pro.
  • Our pick: D1 if your app already runs on Workers; Turso if you deploy anywhere else, need embedded or offline replicas, or want thousands of tenant databases without being tied to one runtime.
On this page 22
  1. TL;DR
  2. How this differs from our free database roundup
  3. Architecture: a binding vs a database you dial
  4. Cloudflare D1
  5. Turso
  6. Plans and limits side by side
  7. Cloudflare D1
  8. Turso
  9. Backups, regions and jurisdiction
  10. Developer experience
  11. Lock-in and getting your data out
  12. What it costs: three illustrative examples (ours)
  13. Decision table
  14. Our pick
  15. Frequently asked questions
  16. Is Cloudflare D1 free?
  17. Is Turso free?
  18. Can I use Cloudflare D1 outside of Cloudflare Workers?
  19. Does Drizzle ORM work with both Turso and D1?
  20. Which is cheaper for a small SaaS, Turso or D1?
  21. Ship it, then launch it
  22. Sources

Verdict: If your app already runs on Cloudflare Workers, use D1: it is a binding, not a connection string, it costs nothing beyond the $5/mo Workers Paid plan at indie scale, and Time Travel backups are always on. If your app runs anywhere else, needs a database on the device, or will create a database per customer across runtimes, use Turso. Both are SQLite underneath, so the bigger decision is which runtime you are committing to.

Every price and limit below comes from Cloudflare's and Turso's own pages, checked on 15 Nov 2026. The opinions in between are ours and are marked.

TL;DR#

  • D1 is part of Workers. Free gives 5 million rows read and 100,000 rows written per day; Workers Paid is "a minimum charge of $5 USD per month" and includes 25 billion reads and 50 million writes a month (D1 pricing, Workers pricing).
  • D1 scales out, not up. "Each individual D1 database is inherently single-threaded, and processes queries one at a time", capped at 10 GB on Paid (D1 limits).
  • Turso is runtime-agnostic. Free has 100 databases and 500 million rows read a month; Developer is $5.99/mo, or $4.99/mo billed yearly (Turso pricing).
  • Turso can live on the device. Embedded replicas and the newer Turso Sync put a SQLite file next to your code (embedded replicas).
  • Write-heavy apps favour Turso on list price; read-heavy Workers apps favour D1.

Disclosure: ZeroRaised publishes this comparison and is a launch site for bootstrapped products. ZeroRaised has no commercial relationship with Cloudflare or Turso and earns nothing if you sign up for either. Facts come from the linked sources as checked on 15 Nov 2026.

How this differs from our free database roundup#

Our free database hosting guide already lines up the free tiers of both, side by side with eight other vendors. This post goes past the free tier: paid plans, architecture, backups, regions, local dev, lock-in and what each costs once you have customers. If you are still choosing between SQLite and Postgres at all, start with our free Postgres database guide or PocketBase vs Supabase instead.

Architecture: a binding vs a database you dial#

Cloudflare D1#

D1 is reached from a Worker through a binding in your Wrangler config. Cloudflare lists three ways to query it: the Workers Binding API, the REST API and Wrangler commands, and notes that the "REST API primarily interacts with the control plane" (Query D1). In practice your app code runs in a Worker.

Three design facts shape everything else (D1 limits):

  • One query at a time per database. "Your maximum throughput is directly related to the duration of your queries." A slow, unindexed query blocks the rest.
  • Small databases. The cap is 10 GB on Workers Paid and 500 MB on Free. Cloudflare says D1 "is designed for horizontal scale out across multiple, smaller (10 GB) databases, such as per-user, per-tenant or per-entity databases."
  • Lots of them. Workers Paid allows 1,000,000 databases per account, the first 100,000 included; Free allows 10.

Read replication. D1 can create read-only copies "in every supported region" (ENAM, WNAM, WEUR, EEUR, APAC, OC), with no extra storage or compute charge. You must use the Sessions API (withSession()), which gives "sequential consistency for all queries in a session" through bookmarks, and Cloudflare notes it "is only available via the D1 Worker Binding and not yet available via the REST API" (read replication).

Turso#

Turso now has two parts, and the naming confuses people:

  • Turso Cloud is the "Fully managed platform for Turso and libSQL databases, with branching, analytics, backups, and more" (Turso docs). You connect over the network from any runtime with a URL and auth token.
  • libSQL is the open source SQLite fork behind the original service. Its README says it "is actively maintained, but new features are being developed in Turso" and "If you're starting a new project, you probably want to look into Turso" (libSQL on GitHub).
  • Turso Database is the new engine, "A SQL database in Rust: SQLite-compatible", with BEGIN CONCURRENT for MVCC concurrent writes. Its FAQ says "we have not yet reached 1.0", that it "powers production applications today at multiple organizations", and advises keeping independent backups until 1.0 (Turso on GitHub).

Our read: libSQL plus Turso Cloud is the mature path today. Turso Database is promising, especially for concurrent writes, but treat it as pre-1.0 and keep your own backups, as Turso itself advises.

Storage. On AWS regions Turso uses "a diskless architecture where data is backed by a combination of S3-Express One Zone and S3", and "Commits are only acknowledged once data is safely stored" (Turso durability).

Embedded replicas and sync. This is Turso's biggest difference. "Embedded Replicas keep a local read replica of a Turso Cloud database", so reads come from a local file. Writes go to the remote primary, and the writing replica sees its own write immediately. They do not work in "serverless environments without a filesystem" (embedded replicas). For new projects Turso recommends Turso Sync, where reads and writes happen locally and you call push() and pull(); on conflicts "the strategy is "last push wins"" (Turso Sync usage).

Database per tenant or per agent. Turso pitches one database per AI agent for "Complete isolation between agents, independent scaling per agent, improved security" (agent databases). Note that the shared-schema feature, Multi-DB Schemas, "is now deprecated for all new users" (multi-db schemas), so you run migrations across tenant databases yourself.

Plans and limits side by side#

Cloudflare D1#

Workers FreeWorkers Paid ($5/mo minimum)
Rows read5 million / dayFirst 25 billion / month, then $0.001 / million rows
Rows written100,000 / dayFirst 50 million / month, then $1.00 / million rows
Storage5 GB totalFirst 5 GB, then $0.75 / GB-mo
Databases10First 100,000, then $0.10 per database per month
Max database size500 MB10 GB
Max storage per account5 GB1 TB
Time Travel7 days30 days
Queries per Worker invocation501000

Sources: D1 pricing, D1 limits, Workers pricing. Free caps reset at 00:00 UTC. D1 charges no egress ("No."), and "If you are not running queries against your database, you are not billed for compute." Workers Paid also includes 10 million requests and 30 million CPU milliseconds a month; Free allows 100,000 requests per day. Other limits worth knowing: 30 second maximum query duration, 100 bound parameters per query and 2 MB maximum row size.

Turso#

FreeDeveloperScalerPro
Price$0$5.99/mo ($4.99 yearly)$29/mo ($24.92 yearly)$499/mo ($416.58 yearly)
Databases100UnlimitedUnlimitedUnlimited
Storage5GB9GB, +$0.75/GB24GB, +$0.50/GB50GB, +$0.45/GB
Rows read / month500 Million2.5 Billion, +$1/Billion100 Billion, +$0.80/Billion250 Billion, +$0.75/Billion
Rows written / month10 Million25 Million, +$1/Million100 Million, +$0.80/Million250 Million, +$0.75/Million
Syncs / month3GB10GB, +$0.35/GB24GB, +$0.25/GB100GB, +$0.15/GB
Point-in-time restore1 day10 days30 days90 days
SupportCommunityCommunityCommunityPriority Email + Slack

Source: Turso pricing. Monthly prices are from the page's structured price data; yearly figures are the per-month prices it shows with annual billing. Enterprise is custom pricing.

The rule that bites: on Free, or a paid plan without overages enabled, "Once you exceed the limit on any single metric (storage, rows read, rows written, or syncs), your databases are blocked, even if the other metrics are still well under quota." Paid plans can turn on overages. "Idle databases cost only storage." And on deleted databases: "Only databases that were deleted while you were on a paid plan are guaranteed to be restorable" (Turso pricing).

Backups, regions and jurisdiction#

D1 Time Travel is "always on", restores to any minute in the window, and "Database history and restoring a database incur no additional costs." Restores are destructive: they overwrite the database in place and cancel in-flight queries. It "does not yet allow you to clone or fork an existing database to a new copy" (Time Travel).

Turso point-in-time restore runs from 1 day on Free to 90 days on Pro, as above.

D1 location. You can set a jurisdiction (eu, fedramp, or us) or a location hint (wnam, enam, weur, eeur, apac, oc). "Jurisdictions can only be set on database creation and cannot be added or updated after the database exists", and D1 runs no databases in South America, Africa or the Middle East (data location).

Turso regions. Turso Cloud "now runs in twelve regions" on AWS, as of 4 Nov 2026: Virginia, Ohio, Oregon, Canada Central, São Paulo, Dublin, Frankfurt, Stockholm, Mumbai, Singapore, Tokyo and Sydney (Turso blog).

Our read: if you sell to EU customers who ask where data sits, D1's eu jurisdiction is a one-line answer, but you must choose it on day one. Turso gives you named AWS regions (Dublin, Frankfurt, Stockholm), which some buyers find easier to put in a DPA.

Developer experience#

ORMs. Drizzle lists connectors for "Turso Cloud, Turso Database, Turso Database Serverless, Turso Database Sync" and "Cloudflare D1" (Drizzle SQLite), and says it "fully supports the Cloudflare D1 database and Cloudflare Workers environment" (Drizzle D1). If you have not picked an ORM yet, our Drizzle vs Prisma comparison covers the trade-offs.

Local dev. Cloudflare says wrangler dev now runs in local mode by default, powered by Miniflare and workerd; local and production data are separated, and data persists between runs. You can point a binding at production with "remote": true, but "Any changes you make when running against a remote database cannot be undone" (D1 local development). Turso recommends opening a local SQLite file with its SDK, or running turso dev, which "will start a local libSQL server"; without --db-file, "Changes will be lost when you stop the server" (Turso local development).

Lock-in and getting your data out#

Both are SQLite, which is the best lock-in insurance you can get: your schema and queries move.

  • D1 export: npx wrangler d1 export <database_name> --remote --output=./database.sql writes schema and data to a .sql file. Virtual tables are not supported, and "A running export will block other database requests" (import and export).
  • Turso export: turso db export <database> writes a snapshot to a local SQLite file, though "the exported file may not contain the latest changes" (turso db export).

The real lock-in is the runtime. D1 code calls env.DB.prepare() inside a Worker; moving off Cloudflare means rewriting your data layer and your hosting at once. Turso code uses a client you can run on Node, Bun, Deno, a VPS or a phone.

Licences (GitHub, checked today): libSQL and Turso Database are MIT licensed. Cloudflare's runtime, workerd, is Apache-2.0, but D1 itself is a managed service, not something you self-host (libSQL, Turso, workerd).

What it costs: three illustrative examples (ours)#

These are our own sums from the list prices above. They ignore Workers request and CPU charges beyond the included amounts and assume both vendors measure storage the same way, which you should check.

Example appCloudflare D1Turso
A. Read-heavy SaaS: 3 GB, 300M rows read, 5M rows written per month$5 (Workers Paid; all inside included D1 usage)$0 on Free (inside every cap), or $5.99 on Developer for headroom
B. Per-tenant SaaS: 500 databases, 10 GB total, 1B reads, 10M writes$5 + 5 GB x $0.75 = $8.75Developer $5.99 + 1 GB x $0.75 = $6.74
C. Write-heavy app: 8 GB, 2B reads, 100M rows written$5 + 3 GB x $0.75 + 50M x $1.00/M = $57.25Scaler $29 (inside 24GB, 100B reads, 100M writes)

Our read: at indie scale both are cheap, and the difference is a few dollars. Writes are where prices split: D1 charges $1.00 per million rows written past 50 million, while Turso Scaler includes 100 million. Remember that a missing index multiplies rows read on both.

Decision table#

This is our editorial advice based on the facts above.

Your situationOur pickWhy
App runs on Cloudflare Workers or PagesD1Binding, no connection management, free Time Travel
App on Vercel, Fly, Railway, a VPS or several cloudsTursoWorks from any runtime; D1 is Workers-first
Per-tenant SaaS on WorkersD1100,000 databases included on Paid
Per-tenant SaaS elsewhereTursoUnlimited databases from Developer; idle ones cost only storage
Offline-first or mobile appTursoEmbedded replicas and Turso Sync keep a local file
AI agents that each need a scratch databaseTurso, or D1 if agents run in WorkersTurso documents database-per-agent; D1 scales out the same way
Heavy concurrent writes to one databaseTurso (and test it)D1 is single-threaded per database; Turso Database adds MVCC but is pre-1.0
EU data residency on day oneD1 with eu jurisdiction, or Turso in Dublin, Frankfurt or StockholmBoth can, D1 must be set at creation
Budget is strictly $0Either, carefullyD1 caps per day; Turso blocks if any monthly metric is exceeded

If you are still choosing a host, our Vercel vs Cloudflare Pages comparison usually settles this question for you.

Our pick#

  • Already on Workers: D1. Pay the $5, enable read replication with the Sessions API when you have global users, and keep queries short because each database runs one at a time.
  • Anywhere else: Turso Cloud on libSQL, starting on Free and moving to Developer before launch so a spike cannot block your databases.
  • Local-first or mobile: Turso, with Turso Sync for new projects, after testing the "last push wins" conflict model against your data.
  • Not sure yet: Use Drizzle and plain SQLite SQL so you can move between them later.

Frequently asked questions#

Is Cloudflare D1 free?#

Yes, on the Workers Free plan D1 gives you 5 million rows read and 100,000 rows written per day, 5 GB of total storage and 10 databases, with a 500 MB maximum per database. The caps reset at 00:00 UTC. For production most people move to Workers Paid, which costs a minimum of $5 per month per account and includes far larger monthly D1 allowances.

Is Turso free?#

Turso's Free plan is $0 per month with 100 databases, 5GB of storage, 500 million rows read, 10 million rows written and 3GB of syncs each month, plus 1 day of point-in-time restore. If you exceed any single metric on Free, your databases are blocked until you upgrade, even if the other metrics are under quota.

Can I use Cloudflare D1 outside of Cloudflare Workers?#

Only in a limited way. D1 can be queried through the Workers binding, the REST API or Wrangler, but Cloudflare says the REST API primarily interacts with the control plane, and the Sessions API needed for read replication is only available through the Worker binding. If your app runs on Vercel, Fly, a VPS or a phone, Turso is the more natural fit.

Does Drizzle ORM work with both Turso and D1?#

Yes. Drizzle's docs list connectors for Turso Cloud, Turso Database, Turso Database Sync and Cloudflare D1, and say Drizzle fully supports D1 and the Workers environment through drizzle-orm/d1. That makes Drizzle a reasonable way to keep your schema portable between the two.

Which is cheaper for a small SaaS, Turso or D1?#

It depends on your write volume. In our illustrative examples, a read-heavy app fits inside Turso Free or D1 for the $5 Workers Paid minimum, while an app writing 100 million rows a month (with 8 GB stored) costs about $57 on D1 versus $29 on Turso Scaler, because D1 charges $1.00 per million rows written above 50 million. Run your own numbers on both pricing pages.

Ship it, then launch it#

Whichever database you pick, the next job is getting users. Work through our product launch checklist for bootstrapped makers, then submit your product to ZeroRaised for free. For more no-VC build guides and comparisons, join the ZeroRaised newsletter.

Sources#

Frequently asked questions

Is Cloudflare D1 free?

Yes, on the Workers Free plan D1 gives you 5 million rows read and 100,000 rows written per day, 5 GB of total storage and 10 databases, with a 500 MB maximum per database. The caps reset at 00:00 UTC. For production most people move to Workers Paid, which costs a minimum of $5 per month per account and includes far larger monthly D1 allowances.

Is Turso free?

Turso's Free plan is $0 per month with 100 databases, 5GB of storage, 500 million rows read, 10 million rows written and 3GB of syncs each month, plus 1 day of point-in-time restore. If you exceed any single metric on Free, your databases are blocked until you upgrade, even if the other metrics are under quota.

Can I use Cloudflare D1 outside of Cloudflare Workers?

Only in a limited way. D1 can be queried through the Workers binding, the REST API or Wrangler, but Cloudflare says the REST API primarily interacts with the control plane, and the Sessions API needed for read replication is only available through the Worker binding. If your app runs on Vercel, Fly, a VPS or a phone, Turso is the more natural fit.

Does Drizzle ORM work with both Turso and D1?

Yes. Drizzle's docs list connectors for Turso Cloud, Turso Database, Turso Database Sync and Cloudflare D1, and say Drizzle fully supports D1 and the Workers environment through drizzle-orm/d1. That makes Drizzle a reasonable way to keep your schema portable between the two.

Which is cheaper for a small SaaS, Turso or D1?

It depends on your write volume. In our illustrative examples, a read-heavy app fits inside Turso Free or D1 for the $5 Workers Paid minimum, while an app writing 100 million rows a month (with 8 GB stored) costs about $57 on D1 versus $29 on Turso Scaler, because D1 charges $1.00 per million rows written above 50 million. Run your own numbers on both pricing pages.