Open-source project
tursodatabase/turso avatar
tursodatabase/turso

tursodatabase/turso: a Rust SQL database with SQLite compatibility and a Postgres frontend

A SQL database in Rust: SQLite-compatible, now also speaking Postgres (experimental). The LLVM of databases.

24,410 stars1,373 forksRustMIT

At a glance

What is it?
Turso is an in-process SQL engine written in Rust that compiles SQL to bytecode for its own VDBE, keeps SQLite as its primary dialect and file format, and is adding a Postgres frontend. It is a pre-1.0 project, so the useful question is which parts you can rely on now.
Who is it for?
Adopt Turso if you want an embeddable SQL engine in Rust with SQLite file-format compatibility, an MVCC concurrency mode, and bindings for Rust, Go, JavaScript, Java, .NET, Python and WebAssembly. Do not adopt it as a drop-in production replacement for SQLite's C library, and do not build on the Postgres frontend, encryption at rest, DBSP incremental computation, full-text search or multi-process WAL coordination, all of which the README lists as experimental.
Can I use it commercially?
Yes. MIT is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
Is it still maintained?
Yes. The repository last received commits 2 days ago.
What is it written in?
Mainly Rust, according to GitHub's language statistics.

Answers come from the project's GitHub data, last synced on September 27, 2026, and from our analysis. They are not legal advice.

Editorial analysis

The problem Turso solves, and who is meant to use it

SQLite is the default embedded SQL database, and its C implementation is the reason. That same implementation is also the constraint: the query planner, storage engine and virtual machine are one C codebase, so adding a second SQL dialect means either forking SQLite or writing a translator in front of it. Turso takes the other path. The README describes it as an in-process SQL database written in Rust, compatible with SQLite, and it states the design goal plainly: to be for databases what LLVM is to compilers, one core with many frontends compiled onto it.

The audience follows from that. Teams already embedding SQLite in a Rust, Go, Python, JavaScript, Java or .NET application, who want the SQLite dialect and file format but a codebase they can extend, are the primary fit. Teams that need a second dialect on the same storage engine are the second fit, and the Postgres frontend is the current proof that the architecture allows it.

It is not aimed at people who want a hosted database with a control plane. The README links to the Turso Database Manual under Getting Started and nothing else; there is no server deployment story in the project description beyond the experimental Postgres frontend, which the README lists under experimental features with its own compatibility reference.

One VDBE, two dialects: how the engine is put together

Turso compiles SQL into bytecode for a virtual machine it calls the VDBE, then runs that bytecode. This is the same shape as SQLite, and the README says so explicitly: like SQLite, it compiles SQL into bytecode for that machine, and then runs the bytecode. The difference is what that indirection buys. Because the frontend and the execution core are separate, one engine can host more than one SQL dialect. SQLite is the first frontend, and Postgres is now a frontend of its own, with its own dialect and wire protocol.

That is the whole architectural claim, and it is verifiable from the repository layout. The workspace in Cargo.toml has separate crates for sqlite/parser, postgres/parser, postgres/frontend, postgres/server and postgres/client, plus a core crate and a cli crate. Parsing, dialect handling and the server wire protocol live in distinct crates rather than inside one engine. The README also points at a turso-vdbe-doom-example repository as a demonstration of how general the core is, which is a fair way to describe a bytecode machine that is not tied to SQL semantics.

Concurrency is handled above the bytecode layer. BEGIN CONCURRENT is listed as a feature for improved write throughput using multi-version concurrency control, and it is listed under features rather than experimental features, which is a meaningful distinction in this README. Multi-process WAL coordination through a .tshm sidecar is listed under experimental, so cross-process readers and writers are the newer, less settled part.

Installing the Turso CLI and running a first query

The README gives an installer script for the latest turso release. It pipes a release artifact into a shell, so read the script first if that matters to you. The command as documented is:

bash
curl --proto '=https' --tlsv1.2 -LsSf \
  https://github.com/tursodatabase/turso/releases/latest/download/turso_cli-installer.sh | sh

After installation the binary is tursodb, not turso. Running it starts the interactive shell against a transient in-memory database, and the README shows this session:

bash
tursodb
console
Turso
Enter ".help" for usage hints.
Connected to a transient in-memory database.
Use ".open FILENAME" to reopen on a persistent database
turso> CREATE TABLE users (id INT, username TEXT);
turso> INSERT INTO users VALUES (1, 'alice');
turso> INSERT INTO users VALUES (2, 'bob');
turso> SELECT * FROM users;
1|alice
2|bob

Two things are worth noticing. The prompt is turso>, and the banner states that the default database is transient and in memory, so anything you create disappears when the shell exits unless you run .open FILENAME first. The output format is pipe-separated rows with no header, which is what you would script against.

If you would rather not install a binary, the README offers two alternatives. From a checkout of the repository, cargo run builds and starts the development version. With Docker, running make docker-cli-build followed by make docker-cli-run in the repository root builds and starts the CLI container. The Makefile sets MINIMUM_RUST_VERSION to 1.73.0 and its check-rust-version target updates stable through rustup if the installed toolchain is older, so a source build has a real floor.

For application code, the README documents package names per language: cargo add turso for Rust, npm i @tursodatabase/database for JavaScript, uv pip install pyturso for Python, and go get turso.tech/database/tursogo for Go. The Python example is short enough to reproduce in full:

python
import turso

con = turso.connect("sqlite.db")
cur = con.cursor()
res = cur.execute("SELECT * FROM users")
print(res.fetchone())

The module is imported as turso while the package is installed as pyturso, which is the kind of detail that costs ten minutes if you assume they match.

Where Turso is the wrong choice

The README is unusually direct about maturity: the current release line is v0.8.0-pre, and the FAQ section it points to covers where the project stands on its way to 1.0. A pre-release version number is not a marketing label. It means the file format, the C API surface and the SQL surface can still move, and the README's compatibility claim is framed as tracking SQLite version 3.50.4 with a separate COMPAT.md document for details rather than as full equivalence.

If your application links against SQLite's C library and depends on a specific extension, a specific pragma, or an exact query plan, the compatibility document is the first thing to read and the answer may be no. Turso is a reimplementation, not a wrapper.

Several capabilities that would otherwise justify the switch are explicitly experimental. Encryption at rest, DBSP-based incremental computation for view maintenance and query subscriptions, full-text search via tantivy, and multi-process WAL coordination through the .tshm sidecar are all in the experimental list, as is the Postgres frontend. Vector indexing for approximate search is not experimental because it does not exist yet; the README places it on the roadmap, alongside a reference to libSQL vector search.

There is also a scope warning in the bindings. The README lists React Native under examples and WebAssembly under JavaScript bindings, but a browser or React Native target changes what the engine can assume about the filesystem and about io_uring, which the README lists as Linux-only asynchronous I/O support. Do not assume the async I/O path is available everywhere the bindings are.

Turso compared with SQLite and with libSQL

The obvious alternative is SQLite itself, and the difference is not speed, it is extensibility. SQLite is a C library with a stable file format and a decades-long compatibility record; Turso is a Rust engine that reads the same format and compiles the same dialect, with the bytecode layer exposed as a place to attach other frontends. If you need the guarantee that a database file written today opens in five years on an unmodified SQLite build, SQLite is the safer choice, and Turso's own README frames compatibility as something it tracks rather than something it owns.

libSQL is the closer comparison, and the README makes the relationship visible. The roadmap entry for vector indexing points at libSQL vector search as the reference, and the repository carries sync/engine and sync/sdk-kit crates alongside a serverless directory. That suggests the project is not positioning itself purely as an embedded engine. The practical difference is where the SQL work happens: libSQL extends SQLite, while Turso replaces the engine and treats SQLite as one frontend among several, which is why a Postgres wire protocol can exist here at all.

For a hosted database with a managed control plane, neither is the comparison. That is a different product category, and the README does not describe one.

Licence, maintenance and what an upgrade costs

Turso is MIT licensed. The LICENSE.md file is at the repository root, Cargo.toml carries the line Copyright 2023-2026 the Turso authors. All rights reserved. MIT license, and there is a separate NOTICE.md and a licenses/ directory. Those two facts together are the normal pattern for a permissively licensed project that vendors or derives from other code, so read NOTICE.md if you redistribute binaries rather than just linking the crates. The README also credits tantivy for full-text search, which is a separate dependency with its own licence. This is a description of what the repository contains, not legal advice.

The repository is not archived, and the last push was on 2026-08-21, which is the same timestamp as the v0.8.0-pre.7 release. v0.8.0-pre.6 and v0.8.0-pre.5 both landed on 2026-08-19. Three pre-releases inside three days is a fast cadence, and it also tells you what an upgrade looks like: patch-level pre-releases arriving close together, with a CHANGELOG.md at the root as the place to check before bumping.

The maintenance cost sits mostly on the compatibility boundary. Turso tracks SQLite 3.50.4, and that tracking has to continue as SQLite moves. Your own testing burden is therefore not just your queries; it is the subset of SQLite behaviour you depend on, checked against COMPAT.md each time you take a new release. The Makefile reflects this: the test target chains test-compat, test-sqlite3, test-shell, test-memory, test-write, test-update, test-constraint, test-collate and test-extensions, and SQLITE_EXEC defaults to scripts/limbo-sqlite3. If you build from source, expect to run the compatibility suite rather than a single unit test command.

Finally, the repository layout is worth a glance before you adopt anything. Top-level entries include AGENTS.md, CLAUDE.md, .claude/, .codex/ and .agents/, and the Python project file pyproject.toml still carries name = "limbo" and a requires-python of >=3.13. That naming residue is a reminder that this codebase has been renamed and restructured, and that not every file has caught up.

Editorial conclusion

Adopt Turso if you want an embeddable SQL engine in Rust with SQLite file-format compatibility, an MVCC concurrency mode, and bindings for Rust, Go, JavaScript, Java, .NET, Python and WebAssembly. Do not adopt it as a drop-in production replacement for SQLite's C library, and do not build on the Postgres frontend, encryption at rest, DBSP incremental computation, full-text search or multi-process WAL coordination, all of which the README lists as experimental. Before committing, read COMPAT.md and postgres/COMPAT.md for the exact gaps, and check the release notes for the v0.8.0-pre line to see which features have moved out of preview.

Frequently asked questions

What is Turso used for?

Turso is an in-process SQL database that runs inside your application, compatible with SQLite in dialect, file format and the C API. The README also describes it as a virtual machine that compiles SQL to bytecode for its VDBE, which lets it host more than one dialect, with Postgres now available as an experimental frontend.

Is Turso open source?

Yes. The repository is MIT licensed, with LICENSE.md at the root, a NOTICE.md and a licenses/ directory. The README lists bindings for Go, JavaScript, Java, .NET, Python, Rust and WebAssembly.

How to install the Turso CLI?

The README gives an installer script fetched from the latest release, which installs the CLI. The binary is named tursodb, and running it opens an interactive shell connected to a transient in-memory database by default. You can also build from source with cargo run, or use the Docker targets make docker-cli-build and make docker-cli-run.

Is Turso faster than SQLite?

The README does not make a performance comparison against SQLite. It lists BEGIN CONCURRENT for improved write throughput using multi-version concurrency control, and asynchronous I/O support on Linux with io_uring, but it gives no benchmark numbers.

What is Turso DB?

It is a SQL database written in Rust that runs in-process rather than as a separate server, and it is compatible with SQLite. The README states it runs in production today at multiple organizations, while the current release line, v0.8.0-pre, and the FAQ it links to describe the project as still on its way to 1.0.

Is Turso free to use?

The database itself is MIT licensed, so the source and the published bindings are available under that licence. The README does not describe pricing for any hosted service, so anything beyond the open source project is outside what the material covers.

Official sources

  1. Official README
  2. Project repository
  3. Release notes
Add this badge to your README

If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.

Add this badge to your README

markdown
[![Hysen Labs](https://hysenlabs.com/badge/tursodatabase-turso.svg)](https://hysenlabs.com/projects/tursodatabase-turso)