NEWS

DuckDB 2.0 gains client/server mode and moves from embedded to the network

The analytics engine's preview brings a network daemon, a C API with stable ABI, and self-hosted extension repositories. GA is expected for the second half of 2026.

DuckDB 2.0 gains client/server mode and moves from embedded to the network
Image: Redação iMasters

DuckDB Labs published the official preview of DuckDB 2.0, code-named "Cyanoptera." According to the announcement reported by InfoQ, there have been more than 10,000 commits since version 1.5, and the milestone represents the biggest architectural evolution of the analytics engine since it gained traction as an embedded, in-process columnar database. General availability (GA) is expected for fall 2026 (spring here in the southern hemisphere), and preview binaries and nightly packages are already available across the main platforms and language clients.

The point that changes the perception of the project: DuckDB was born as the "SQLite of analytics," a single binary that runs inside your process. 2.0 keeps that single-file simplicity, but now also accepts operating as a network service, bringing the tool closer to territory that today belongs to data warehouses.

Native client/server mode

The highlight is a native client/server mode, enabled by the quack protocol extension and the new CONNECT SQL command. Instead of having to embed the engine directly or rely on verbose query wrappers, any DuckDB instance can now run as a daemon and accept connections over the network. It's possible to attach a remote DuckDB endpoint or even external relational engines like PostgreSQL and MySQL, routing queries with pushdown optimizations:

sql
CALL quack_serve(token = 'my_token');

ATTACH 'quack:server.example.com' AS qk (TOKEN 'my_token');
CONNECT qk;
SELECT count(*) FROM events;
DISCONNECT;

This network layer relies on DuckDB's multi-version concurrency control (MVCC) and multi-connection transactional isolation. To handle long-running multi-tenant deployments, the release also reworks the observability and metrics subsystem.

It's worth noting a caveat that came up in the community discussions cited by InfoQ: on r/programming, developers stressed that DuckDB is not a substitute for transactional OLTP with PostgreSQL. It remains a lightweight OLAP engine, built for batch reporting and ad-hoc SQL over remote CSV and Parquet files on S3.

Extensions, finally portable

Another structural change is the overhaul of extension portability. Until now, extensions were compiled against unstable internal C++ APIs, which forced binaries to be recompiled with every DuckDB release, a familiar pain for anyone maintaining bindings outside of C++.

2.0 introduces a versioned C API, with an explicit specification defined in YAML and stable ABI guarantees. There's also a high-level abstraction layer in C++ and Rust bindings on the way, allowing an extension to be built once and run across minor and patch updates. In the r/programming discussions reported by the source, this stable ABI was celebrated for solving long-standing problems with bindings outside of C++, such as CGO overhead in Go and concurrency monitoring.

In addition, organizations are no longer limited to official repositories. 2.0 allows defining, cryptographically pinning, and self-hosting their own extension repositories:

sql
SET allow_extension_repositories = 'allowed';
CREATE EXTENSION REPOSITORY private_repo FROM 'https://extensions.corp.internal';
INSTALL analytics_toolkit FROM private_repo;
LOAD private_repo/analytics_toolkit;

VARIANT, new parser, and performance gains

The release brings the VARIANT type to full maturity. The engine now detects semi-structured patterns and "shreds" JSON-style payloads into columnar representations, from disk to Parquet, allowing scans of nested fields without an explicit schema.

The PostgreSQL-derived parser was replaced with a custom PEG-based grammar, which lets extensions register custom SQL syntax and provides precise source location for diagnostics. Among the SQL additions are native BEFORE and AFTER triggers with transition tables, APPROX NEAREST similarity joins for vector workloads, and DML expressions inside CTEs.

On the performance side, new additions include asynchronous I/O over object stores like Amazon S3, partition-aware query planning, and optimized string compression with DICT_FSST dictionaries by default. The 2.0 storage format brings lazy loading of column metadata and incremental vacuuming of checkpoints for ART (Adaptive Radix Tree) indexes. DuckDB has also decoupled from its external ICU dependency, replacing timezone and collation logic with a native IANA-based subsystem that is more compact and faster at temporal conversions.

What changes for Brazilian teams

For those building analytics stacks in Brazil, the client/server mode touches on a common architecture decision: where to place DuckDB. Until now, the practical choice was to run it embedded in each job or notebook. With the network daemon, the same endpoint can be shared across multiple services, bringing the scenario closer to a mini data warehouse without the costs of a Redshift or BigQuery, a point engineers on Hacker News highlighted when talking about cutting cloud costs by running workloads larger than memory on consumer-grade hardware.

The stable ABI is the most anticipated news for those working outside the C++ ecosystem, and in Brazil that includes plenty of Go and Rust developers: less recompilation with every version means more durable integrations. Self-hosted extension repositories, meanwhile, give teams with compliance requirements room to maintain internal toolkits without depending on a public repository, something relevant in the context of the LGPD (Brazil's data protection law) and sensitive data.

What remains open is how the server mode behaves under real multi-tenant load and how the community will adopt the new C API in practice. Until GA in the second half of 2026, all of this is preview: it can be tested, but it's not for production yet.

Translated from the Brazilian Portuguese original · Read the original