A Flight SQL server for DuckDB: JDBC, ODBC and ADBC
DuckDB does not ship a server: it is a library, and its bindings open a database inside your process. Quack on Demand is an Arrow Flight SQL server for DuckDB and DuckLake, which means every tool that carries a Flight SQL driver, JDBC, ODBC or ADBC, connects to shared DuckDB data the way it connects to any warehouse.
The problem
BI tools, SQL editors and services on other machines need a network endpoint and a standard driver. Serving a DuckDB file over HTTP or a filesystem share gives you neither: each client still runs its own engine, sees a stale or locked file, and carries no identity. You want one endpoint, one identity model, and drivers your tools already have.
How Quack on Demand does it
One command boots the manager, the Flight SQL edge on :31338, DuckDB's native Quack listener on :9494 and the admin UI, then prints ready-to-paste connection strings for every driver family:
uvx qod@latest serve ./sales.duckdb
# JDBC : jdbc:arrow-flight-sql://localhost:31338/?tenant=<tenant>&pool=<pool>&user=<user>&useEncryption=true&disableCertificateVerification=true
# ADBC : uri=grpc+tls://localhost:31338 (adbc_driver_flightsql)
# ODBC : Driver={Arrow Flight SQL ODBC Driver};Host=localhost;Port=31338;...
The JDBC driver is the Apache Arrow Flight SQL JDBC driver from Maven Central, which DBeaver, Tableau and Spark load directly. ADBC uses the Flight SQL ADBC driver (adbc_driver_flightsql), which Power BI also ships in-box. ODBC uses any third-party Flight SQL ODBC driver. Behind the edge, statements are classified read or write and routed to the least-loaded DuckDB node in the pool, with transactions pinned to one node. TLS is on by default. Quack on Demand runs as a single Docker container on one node, or on Kubernetes for multi-host fleets.
Go deeper
- Connecting clients: the connection target, JDBC, Python, Go and ODBC recipes.
- DBeaver, Tableau, Power BI: per-tool walkthroughs.
- DuckDB (native Quack): the driverless path for DuckDB itself.
- Routing and statement classification: how a statement picks a node.
- Quickstart: boot, connect, query.