WebDuck

DuckDB as a Service

Fast, simple DuckDB-as-a-Service with REST API and Web UI. Install via pip, deploy with Docker, query your data in seconds.

Web UI

Dashboard

WebDuck Dashboard

Projects

WebDuck Projects View

Browse View

WebDuck Browse View

Quickstart

pip

pip install webduck# Unix
pipx install webduck# macOS

Docker

docker run --name webduck
-p 8998:8998
-v webduck_data:/app/data
-e WEBDUCK_ADMIN_USER=admin
-e WEBDUCK_ADMIN_PASS=secret
autumoswitzerland/webduck
Terminal
$  

Features

REST API

Full REST API with JWT auth, optional DB passwords, and project management.

Dashboard

Live traffic monitor with queries per second and active sessions, plus a storage overview including trash usage.

DuckDB Engine

Built on DuckDB with file-locking for safe concurrent access and fast analytics.

Projects & Data Browser

Organize databases into projects, browse tables with infinite scroll, and edit cells in place.

Import/Export

CSV, Parquet and JSON import via drag & drop, one-click export with browser download.

SQL Editor

Multi-statement SQL editor with query history and SQL file upload, sequential execution.

Compress & Optimize

Database size and fragmentation indicators, with compact support to reclaim disk space.

Trash

Delete to trash instead of permanently — restore projects and databases with one click.

i18n

English + German out of the box, extensible via PO/Gettext.

API Examples

Query your data from any language

# Login - get JWT token
TOKEN=$(curl -s -X POST http://localhost:8998/admin/login \
  -H "Content-Type: application/json" \
  -d '{"username": "admin", "password": "secret"}' | jq -r '.token')

# Create a project
curl -X POST http://localhost:8998/admin/projects \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"name": "myproject"}'

# Create a database
curl -X POST http://localhost:8998/admin/projects/myproject/databases \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"name": "mydb"}'

# Query data — no password = open
curl -X POST http://localhost:8998/db/projects/myproject/databases/mydb/query \
  -H "Content-Type: application/json" \
  -d '{"sql": "SELECT * FROM users LIMIT 10"}'

# Set DB password (optional — without it, API is open)
curl -X PUT http://localhost:8998/admin/projects/myproject/databases/mydb/password \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"password":"dbpass","access_level":"write"}'

# Query with DB password set
curl -X POST http://localhost:8998/db/projects/myproject/databases/mydb/query \
  -H "Content-Type: application/json" \
  -H "X-Project-Key: myproject:dbpass" \
  -d '{"sql": "SELECT * FROM users LIMIT 10"}'