DuckDB has always had a shape that makes it awkward to point a BI tool at. It is an in-process engine. There is no port, no connection string, no server waiting for you — it lives inside whatever program opened it, and a file on someone's laptop is not something a dashboard can query.
The usual workaround is to put something in front of it. MotherDuck does this, and we have supported MotherDuck for a while. But that means a hosted service in the path, which is not what you want if the whole appeal of DuckDB was that it is a single file and a fast engine you control.
DuckDB's quack protocol removes the workaround. An instance can listen on a port and answer queries from other DuckDB clients over HTTP. The database you were already running becomes a database you can connect to.
Tractorscope now connects to one directly.
Three fields
Pick DuckDB (Quack) as the database type and fill in:
- Quack Host — duckdb-f70db505b7.fly.dev, say. Noquack:prefix.
- Quack Token — whatever token the server was started with.
- SSL — on, unless you are deliberately serving plain HTTP.
That is the whole form. There is no database name, no user, no password.
The missing database name is the part people ask about, so it is worth saying why. A quack connection points at a server, not at a single catalog. The server already knows what it is holding, and it names itself — an in-memory instance genuinely calls itself
Starting a server to connect to
On the DuckDB instance you want to expose:
INSTALL quack; LOAD quack; CALL quack_serve('quack:0.0.0.0:443', token = 'your-token');INSTALL quack; LOAD quack; CALL quack_serve('quack:0.0.0.0:443', token = 'your-token');
Leave
One thing that will waste your afternoon
If
The quack remote protocol landed in DuckDB 1.5. On 1.4 and earlier,
So the failure does not look like a version problem. It looks like a syntax error, or a bad catalog, or a broken install — because the extension loaded fine, it was just the wrong extension wearing the same name. The quickest way to tell:
SELECT function_name FROM duckdb_functions() WHERE function_name ILIKE '%quack%';SELECT function_name FROM duckdb_functions() WHERE function_name ILIKE '%quack%';
If that returns two rows, you are on the demo. If it returns a dozen —
We found this the direct way: by installing it, watching it succeed, and then wondering for a while why a function in the documentation did not exist.
How your tables show up
Tables are listed as
Each query goes to the server as a single statement, so skip the trailing semicolon and do not stack several statements in one chart.
Read only, as usual
Nothing changes about how we treat your data. The connection is used for queries, listing tables, and counting rows. Write statements are rejected before they are sent.
The token is encrypted before it is stored and is never handed back to the browser. It is also kept out of error messages, which took a small amount of care: DuckDB helpfully quotes the statement it choked on, that statement carries the token, and it truncates the quote at around eighty characters — which is more than enough to expose a token on a short query. Anything that comes back from a failed query has it stripped out.
Where to find it
Settings → Databases → Add database, then choose DuckDB (Quack) as the type.
If you are already running DuckDB somewhere — a Fly machine, a box in a cupboard, a container next to your API — it is three fields away from being a dashboard.
