Skip to main content
Get Started
Product4 min

DuckDB grew a server, so we connected to it

By Tractorscope Team on September 20, 2026

DuckDB has always been the database you run beside your code, not one you point anything at. The quack protocol changes that, and Tractorscope now speaks it: host, token, SSL, done.

DuckDB grew a server, so we connected to it

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. No
    quack:
    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

memory
. Asking you to type that would be asking you to guess a value you have no way of knowing, so we do not ask. Tractorscope lists whatever tables the server exposes.

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

token
unset and DuckDB will generate one and print it. That token is the entire authentication story, so treat it like a password: scope it to what you want visible, and rotate it by updating the connection in Tractorscope.

One thing that will waste your afternoon

If

quack_serve
comes back as an unknown function, check your DuckDB version before you check anything else.

The quack remote protocol landed in DuckDB 1.5. On 1.4 and earlier,

INSTALL quack; LOAD quack;
succeeds — and installs something else entirely. There is a long-standing DuckDB extension template that happens to be named quack, and what you get is its demo: a single scalar function that turns
quack('hello')
into
Quack hello 🐥
. No
quack_serve
. No
quack_query
. No secret type.

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 —

quack_serve
,
quack_query
,
quack_server_list
and friends — you are on the real thing.

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

schema.table
main.orders
,
sales.invoices
— and that is how to reference them in a chart query. The data browser shows the qualified name, so copying from there always works.

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.

Related posts

Shared links that expire, and number charts you don't have to style

Two things you asked for on share links — a password and an expiry — plus five ready-made looks for number charts. All three are the same idea: the boring part should already be done.

Ask, Interact, and Connect: The Big AI Release

Three big things landed at once: an Ask button on every dashboard, an Interact tab in the chart editor, and a 30-tool MCP server you sign into. Every plan now includes a monthly AI token allowance, and we never bill you past it.

Tractorscope Update: Sail Smoothly Through Data Seas!

A SQL error helper that suggests the fix, an AI Query Assistant that stops handing you markdown, a data explorer in the schema sidebar, and number overlays on line and bar charts.