duckdb-wasm is a free, open source marketing & customer engagement project written in TypeScript and released under MIT. It has 2,161 GitHub stars, 240 forks and 189 open issues, and was last pushed 11 hours ago. On this registry it ranks #48 of 76 tracked projects in Marketing & Customer Engagement, with 5 head-to-head comparisons available. It gained 30 stars over the last 30 tracked days.

What is duckdb-wasm?

DuckDB-Wasm is the WebAssembly build of DuckDB, an in-process SQL OLAP database management system, that runs analytical SQL queries entirely inside a web browser or a Node.js process — built for front-end developers and data engineers who want full OLAP query power on data that already sits on the client, without standing up a server.

What it is

DuckDB itself is an in-process SQL OLAP database management system: an analytical engine that runs inside the host process rather than as a separate server. DuckDB-Wasm is that same engine compiled to WebAssembly, so the database binary ships to the client and executes there. The port is currently based on DuckDB v1.5.4 and is tested on Chrome, Firefox, Safari and Node.js. It speaks Arrow fluently, reads Parquet, CSV and JSON files backed by filesystem APIs or HTTP requests, and lives in the analytics, browser, database, javascript, node, olap, sql, typescript and webassembly space. The project is written in C++ and released under the MIT licence, with a hosted shell at shell.duckdb.org and a visualiser at duckdb.org/visualizer.

The concrete problem it solves is the round trip. Querying a Parquet or CSV file that a browser already has access to normally means uploading it to a backend, running the query in a remote OLAP service, and streaming results back — or reimplementing a SQL engine in JavaScript. DuckDB-Wasm replaces both: it attaches database files and reads columnar files directly by URL, so the query engine travels to the data instead of the data travelling to the engine. Because DuckDB database files stay compatible, remote files can be mounted as simply as ATTACH 'https://blobs.duckdb.org/data/test.db'; FROM db.t;.

Key capabilities

  • Runs DuckDB SQL inside the browser across Chrome, Firefox, Safari and Node.js, using the same query surface as the native engine.
  • Reads Parquet, CSV and JSON over HTTP requests or filesystem APIs, and speaks Arrow fluently for zero-copy-shaped interchange with JavaScript.
  • Attaches remote DuckDB database files directly by URL, with full read compatibility against files written by native DuckDB.
  • Supports the extension model: INSTALL h3 FROM community;, INSTALL sqlite_scanner FROM 'https://extensions.duckdb.org';, then LOAD; install is lazy, deferring the fetch until the first LOAD extension_name;.
  • Autoloads core extensions such as autocomplete, JSON, Parquet and ICU at runtime instead of bundling them, because the builds are optimised for download speed.
  • Provides geospatial support through INSTALL spatial; LOAD spatial;, including functions such as ST_Point and ST_Distance in SQL.
  • Offers LOAD httpfs to opt into the native-style HTTP path, re-implemented in JavaScript, with all requests upgraded to HTTPS and cross-origin access required on the resource.

Who uses it and how

  • Analysts and developers exploring data interactively use the hosted shell at shell.duckdb.org or the visualiser at duckdb.org/visualizer as a serverless SQL workbench.
  • Web application teams embed it in front-end apps so users can query their own files locally; the duckdb-wasm-examples repository collects working web-app examples, and third-party embeddings are catalogued by the DuckDB community.
  • Node.js services and build pipelines run the same WebAssembly build where a native binary cannot be installed, covering batch or request-scoped analytics.
  • Geospatial teams query station or point data straight from HTTP and S3-hosted Parquet files, computing distances in SQL without an ETL copy.
  • Data platforms that publish Parquet or DuckDB files over HTTP let clients attach and query those files by URL, keeping the data resident on object storage.

Getting started

Install and API instructions live in the module documentation at shell.duckdb.org/docs/modules/index.html, alongside runnable examples in the duckdb-wasm-examples repository. The quickest way to evaluate it is the hosted shell at shell.duckdb.org or the visualiser at duckdb.org/visualizer.

How it compares

No comparable browser-embedded OLAP SQL engine is named in these facts, so DuckDB-Wasm stands alone in this registry. Its nearest reference point is native DuckDB, from which it differs in its default HTTP stack, runtime extension autoloading, sandboxing and single-threaded default, while keeping file-level and SQL compatibility.

When to use it — and when not to

Choose it when the data already lives in the browser, on the client filesystem, or at an HTTP or S3 URL, and when an in-client analytical engine beats a backend round trip. Avoid it for workloads that need out-of-core operation or broad filesystem access, since the WebAssembly build is sandboxed and supports less of both; native DuckDB is the better tool there. Also note the honest edges: the default mode is single-threaded and multithreading remains experimental, ICU autoloading does not work in all cases so an explicit LOAD icu; may be required, extension coverage is a growing subset rather than the whole catalogue, and the repository carries a substantial backlog of open issues.

project readme (upstream, from github) — read inline
The DuckDB WASM logo.

DuckDB-Wasm

duckdb-wasm package on NPM Github Actions Badge Join Discord Latest DuckDB Release jsdeliver stats

DuckDB is an in-process SQL OLAP Database Management System.

DuckDB-Wasm brings DuckDB to every browser thanks to WebAssembly.

Duckdb-Wasm speaks Arrow fluently, reads Parquet, CSV and JSON files backed by Filesystem APIs or HTTP requests and has been tested with Chrome, Firefox, Safari and Node.js. Learn more about DuckDB-Wasm from our VLDB publication or the recorded talk.

Try it out at shell.duckdb.org or at duckdb.org/visualizer. External third party embedding of DuckDB-Wasm, read the API documentation, check out the web-app examples, and chat with us on Discord.

DuckDB and DuckDB-Wasm

DuckDB-Wasm is currently based on DuckDB v1.5.4.

Relevant differences:

  • Default HTTP stack is different between native and Wasm versions of DuckDB
  • LOAD httpfs will opt-in to using the same HTTP logic, but re-implemented in JavaScript
  • Notable differences in network interactions:
    • Requests are always upgraded to HTTPS
    • Requests needs server to allow Cross Origin access on a given resource
  • Extension install is lazy, meaning that INSTALL extension_name FROM 'https://repository.endpoint.org'; defer fetching the extension to the first LOAD extension_name; instruction. INSTALL x FROM community; shorthands are also supported.
  • DuckDB-Wasm builds are optimized for download speed. Core extensions like autocomplete, JSON, Parquet and ICU are usually bundled DuckDB binaries, while in duckdb-wasm they are autoloaded (including fetching them) at runtime. In particular for ICU autoloading do not work corrently in all cases, explicit LOAD icu; might be needed to reproduce same behaviour.
  • DuckDB-Wasm is sandboxed and migth not have the same level of support for out-of-core operations and access to file system
  • DuckDB-Wasm default mode is single threaded. Multithreading is at the moment still experimental.

Supported DuckDB features:

  • DuckDB databases files are compatible to be read from DuckDB-Wasm.
  • Databases files can be made available as simple as: ATTACH 'https://blobs.duckdb.org/data/test.db'; FROM db.t; demo
  • Spatial support via LOAD spatial spatial demo
  • A growing subset of extensions, either core, community or external, are supported for DuckDB-Wasm
  • Multithreading work but it's still experimental and by default not enabled

DuckDB-Wasm and DuckDB Extension

DuckDB is extensible and this allows to delegate functionality to extensions.

Core extensions are available at https://extensions.duckdb.org, and community extensions are available at https://community-extensions.duckdb.org.

--- Excplicitly load extensions
LOAD icu;

--- Or have them autoloaded when using relevant functions or settings
DESCRIBE FROM read_parquet('https://blobs.duckdb.org/stations.parquet');  -- (this autoloads JSON)

--- Or register extensions
INSTALL h3 FROM community;
INSTALL sqlite_scanner FROM 'https://extensions.duckdb.org';
INSTALL quack FROM 'https://community-extensions.duckdb.org';

--- And then load them
LOAD h3;
LOAD sqlite_scanner;
LOAD quack;
FROM duckdb_extensions() WHERE loaded;

Will show that h3, icu, parquet, quack and sqlite_scanner have been loaded.

You can try the Shell demo with loading of extensions but this do require about 3.2 MB of compressed Wasm files to be transfered over the network (on first visit, caching might help).

Extension sizes will vary depending, among other things, on provided functionality or toolchain used.

Build from source

git clone https://github.com/duckdb/duckdb-wasm.git
cd duckdb-wasm
git submodule init
git submodule update
make apply_patches
make serve

Repository Structure

Subproject Description Language
duckdb_wasm Wasm Library C++
@duckdb/duckdb-wasm Typescript API Typescript
@duckdb/duckdb-wasm-shell SQL Shell Rust
@duckdb/duckdb-wasm-app GitHub Page Typescript
@duckdb/react-duckdb React Hooks Typescript

Frequently asked questions

Is duckdb-wasm free to use?

duckdb-wasm is open source under the MIT licence. There is no licence fee and no seat count — you can self-host it or, where the project offers one, pay a vendor for a managed version instead.

What does duckdb-wasm do?

WebAssembly version of DuckDB

What is duckdb-wasm written in?

duckdb-wasm is primarily written in TypeScript. Its source is publicly available at https://github.com/duckdb/duckdb-wasm, and it has 2,161 GitHub stars.