Documentation
Versions and limitations
The DuckDB version we run, what Quack cannot do yet, and what to expect from DuckDB 2.0.
DuckHouse is built on a part of DuckDB that is new. We would rather tell you exactly where the edges are than have you find them.
Versions
| DuckDB on your database | 1.5.5 |
| Oldest client that can connect | 1.5.3, the first release with Quack |
| Recommended client | 1.5.5, the same as the server |
Quack, the protocol between your DuckDB and ours, is marked experimental by the DuckDB project until DuckDB 2.0, and until then there is no promise that different versions can talk to each other. In practice that means:
- We pin the DuckDB version of every database. It never changes underneath you; upgrades are deliberate.
- If a client on a different version behaves strangely, try the matching version before anything else.
- When DuckDB 2.0 arrives we will offer it for new databases first, and publish what changes before any existing database moves.
What an attached client cannot do yet
Verified on DuckDB 1.5.5, with client and server on the same version. Every item has a working alternative, shown in Querying and loading data.
| Through an attachment | Status |
|---|---|
| SELECT, INSERT, CREATE TABLE, CREATE TABLE AS, DROP TABLE | Works |
| Loading local files in, exporting to local files | Works |
| Joining a remote table to a local one | Works |
| UPDATE and DELETE | Fails. Use wh.query(). |
| SHOW TABLES, information_schema, duckdb_tables() | Return nothing. Use wh.query('SHOW ALL TABLES'). |
Tables outside the main schema | Not reachable by name. Use wh.query(). |
| Joining two remote tables in one local query | Fails. Put the join inside wh.query(). |
| CREATE SCHEMA | Fails. Use wh.query(). |
These are limits of DuckDB's Quack client, not of DuckHouse. The REST API, MCP and the dashboard's query console run SQL on the server, where none of them apply.
Access control
- Database tokens are all-or-nothing. Quack has no users or roles yet, so every token has full access to its database. Read-only access is available through read-scoped API keys, which the REST API and MCP enforce.
- Isolation is per database. Each database is its own machine, disk and storage bucket. To keep two sets of data apart, put them in two databases.
Databases
- One machine per database. There are no read replicas, and a database does not move between regions; to move one, restore a backup into a new database in the region you want.
- Changing tokens or resizing restarts the database, which makes it unreachable for a few seconds. Open connections are dropped; attach again.
- Snapshots guard against hardware failure; they are not a browsable history. There is no point-in-time restore yet. See how your data is kept safe.
- A database is bounded by its machine: data on its disk, and working memory by its size. Queries larger than memory spill to disk, and are slower.