Local Data Playground

Import local CSV, JSON, JSONL or Parquet files and query them with DuckDB SQL entirely in your browser.

Your inputs and files stay in your browser

Import local data

Drop a data file here

CSV, TSV, JSON, JSONL, NDJSON or Parquet. Import more files to join tables.

The name is quoted in generated examples, so spaces and non-Latin characters are supported.

Files stay on this device. DuckDB runs in a dedicated Web Worker from self-hosted assets; SQL cannot read URLs or other browser files.

Limits: 1 GiB per input, 128 MiB when text transcoding is required, 512 MiB DuckDB memory, 100,000 preview rows (up to 1,000,000 for an explicit bounded API query), 500 rows per rendered page, and 512 MiB for an in-memory download fallback or buffered Parquet. JSON/JSONL is decoded as a complete in-memory flat-record set, not in chunks. Canceling hard-stops the worker and releases every imported table.

Imported tables

No tables imported yet.

    SQL query

    Press Ctrl or Cmd + Enter to run. Only one local read-only SELECT or WITH statement is allowed.

    Results are materialized inside the worker, then read in bounded pages.
    Query result

    Import a table and run a query to browse its result.

    On this page

    Local Data Playground runs DuckDB-WASM in your browser so you can query CSV, JSON, JSONL and Parquet without uploading a dataset. Each file receives the SQL table name you choose, and several imported files can be joined in one query.

    Detailed Functionality

    The DuckDB engine and its Web Worker are bundled with MyDevTools and load only when you first import data. No SharedArrayBuffer, cross-origin isolation, server process or remote CDN is required. Imported files are registered with the worker and remain local to the current page session. External access, extension installation, URL readers and database-changing SQL are disabled for user queries.

    The editor supports DuckDB SELECT and WITH queries, including filters, grouping, aggregates, ordering and joins. Results are materialized in the worker under an explicit 100,000-row playground preview bound. The visible table requests at most 500 rows at a time and keeps a bounded DOM window, so it does not render one element per result row. Integer and decimal values are converted to display text without JavaScript number coercion.

    CSV, JSON and JSONL exports scan the complete materialized result in bounded pages and write awaited chunks to the browser file destination when the File System Access API is available. Parquet is written by DuckDB and must be held in one buffer before saving. All fallback downloads and Parquet buffers are capped at 512 MiB.

    Practical Examples

    SELECT: import orders.csv as orders, then run SELECT * FROM "orders" LIMIT 100.

    WHERE: use SELECT * FROM "orders" WHERE "status" = 'paid' to filter locally.

    GROUP BY: summarize with SELECT "country", SUM("amount") FROM "orders" GROUP BY "country".

    JOIN: import customers.parquet as a second table and join on a shared key. The JOIN example button generates a quoted starting query from the first columns of both tables.

    How to Use This Tool

    1. Import one or more files

      Choose a format or detect it from the extension, enter a SQL table name and import. CSV imports also expose separator, header and encoding settings.

    2. Write local SQL

      Choose a SELECT, WHERE, GROUP BY or JOIN example, then edit it. Press Ctrl or Cmd + Enter to run.

    3. Browse bounded results

      Scroll the virtualized result. Only a small page of cells is transferred from the worker and rendered at once.

    4. Export or restart

      Export the result as CSV, JSON, JSONL or Parquet. Canceling or restarting terminates the worker and releases all file handles and in-memory tables.

    Tips and Best Practices

    • Quote table and column names with double quotes; generated examples do this automatically.
    • Use LIMIT and selective WHERE clauses while exploring wide or very large files.
    • CSV type inference is convenient for analysis; values such as leading-zero identifiers may be interpreted as numbers. Use Data Format Converter when source-text preservation and explicit casts are required.
    • Numeric display never routes through a JavaScript Number, so BIGINT and DECIMAL spelling is not rounded by the UI.
    • Cancel is a hard privacy and resource boundary: it terminates the worker and clears every table, so files must be imported again.
    • CSV/JSON/JSONL can stream to a selected destination. Parquet generation is buffered and limited to 512 MiB.

    Help shape what comes next

    What should we improve next?

    Choose one suggestion. These are ideas, not promised features.

    Choose one option

    The vote sends only the selected choice as an anonymous count. It contains no input, file data, URL, cookie or identifier and is not stored in this browser. Reloading the page allows another vote.