SQL in your browser.
DataFrames without the server.

A framework-agnostic in-browser analytics stack built on DuckDB-wasm. Query engine, notebook, DataFrame API — no server, no framework lock-in.

Try the live playground →

MIT · zero backend · runs 100% client-side · current version 0.5.0

Four layers. Use any one of them.

Each layer stands on its own. Start at the top and get a query engine; keep going and get a DataFrame API with a notebook UI on top.

Database

NuDuckDb

Connection + catalog + SQL execution. Load tables from JSON, URLs, files, or Arrow. Create views. Run prepared statements. Export to CSV/JSON. Catalog persists to localStorage. Optional remote-DuckDB HTTP routing.

Table metadata

NuTable

Lightweight wrapper for a single table or view — columns, row count, summarize(), sample(), source tracking.

Notebook

NuWorkbook

Markdown / SQL / JS cells. Persist to localStorage. Export + import. Linked tables rehydrate from their original sources on fresh databases.

DataFrame

NuDataFrame

Lazy, immutable, chainable. Compiles to readable DuckDB SQL — one CTE per step. Full extensions surface: EXCLUDE, REPLACE, QUALIFY, PIVOT, ASOF JOIN, SUMMARIZE.

Chain. Inspect. Collect.

Every DataFrame chain exposes compileSql(). Review the SQL before you run it, lift it into your SQL tool, paste it into a bug report.

import { setup } from '@nudata/nu-duck-df'

const db = await setup()
await db.addTableFromUrl('orders', '/data/orders.parquet')

const top = await db
  .table('orders')
  .filter("status = 'paid'")
  .groupBy('region')
  .agg({ total: 'sum(amount)', n: 'count(*)' })
  .orderBy('total desc')
  .limit(10)
  .collect()

Why it earns its slot

No server

DuckDB compiled to WebAssembly, running inside the user's tab. No API to deploy. No per-query cost. Data that never leaves the browser.

Framework-agnostic UI

The display container is plain DOM. Mount it anywhere — React useEffect, Vue onMounted, Svelte onMount, or a bare <div>.

Readable SQL you can audit

No opaque query planner. The DataFrame compiles to a CTE per step. What you see is what DuckDB runs.

Full DuckDB power

QUALIFY, PIVOT, UNPIVOT, ASOF JOIN, EXCLUDE/REPLACE — all first-class, not escape hatches.

Portable workbooks

Notebooks export to JSON. Linked tables rehydrate from their sources on a fresh database. Share analyses as files, not URLs.

Three distributions

ES module for bundlers. UMD for CommonJS. IIFE for a bare <script> tag via jsDelivr — zero toolchain integration path.

Install

Via npm

Via CDN (no bundler)

IIFE build exposes everything on window.nu_df. ES & UMD builds export the full API from the package root. See the README for the public surface.