Skip to main content
Arrow Flight SQL gateway

DuckDB and DuckLake,
as a governed service.

Quack on Demand puts one multi-tenant, access-controlled, horizontally-scaled SQL endpoint in front of many DuckDB engines sharing DuckLake catalogs.

client.py
# One endpoint, JDBC / ADBC / ODBC / PyArrow
conn = flight_sql.connect(
    "grpc+tls://gateway:31338",
    db_kwargs={
      "username": "alice", "password": "•••",
      tenant: "acme", pool: "analytics"})

# routed to the least-loaded node for the tenant
cur = conn.cursor()
cur.execute("SELECT count(*) FROM orders")
cur.fetchone()
(1500000,)

What the gateway adds to DuckDB

01

Multi-tenant by design

Tenants own databases and pools of DuckDB nodes. Each tenant gets its own catalog, users, and auth provider, isolated by storage layout and by access control.

02

Access control on every query

Authentication via database, JWT, or OIDC, plus role-based, per-statement table permissions. A statement is authorized before it ever reaches a node.

03

Horizontal scale, one endpoint

Statements are classified read or write and routed to the least-loaded node that can serve them, with transaction pinning and retry-on-failure, all behind a single Flight SQL endpoint.

04

DuckLake catalogs

Nodes read and write Parquet through shared DuckLake catalogs on a filesystem or S3-compatible object store, so a pool presents one consistent view.

05

Federation, same ACL

Attach external catalogs, Postgres, S3, Iceberg, anything DuckDB can ATTACH, under the same SQL surface and the same role-based access control.

06

Built to operate

Prometheus and cloud metrics, a config manifest for backup and restore, and an admin UI for tenants, pools, users, and grants.

Reach for it when sharing matters.

Many users on shared DuckDB/DuckLake data, access control on every query, horizontal scale, tenant isolation, or federation. Querying one local file? Use DuckDB directly.