[HN Gopher] Show HN: Duck-UI - Browser-Based SQL IDE for DuckDB
___________________________________________________________________
Show HN: Duck-UI - Browser-Based SQL IDE for DuckDB
I built Duck-UI, a web-based SQL editor that runs DuckDB entirely
in your browser via WebAssembly. No backend required. The Problem:
Every time I needed to query csv, parquet, or even to play with
SQL, I had to either: (a) spin up a Jupyter notebook (b) use the
CLI (c) upload to a hosted service. Friction at every step (TOO
MUCH to load a csv or even to test some sql (study)... The
Solution: DuckDB's WASM runtime lets us run SQL analysis client-
side. Load CSV/JSON/Parquet files from disk or URL, write SQL, get
results instantly. Data stays on your machine. What It Does: SQL
editor with autocomplete & syntax highlighting Import CSV, JSON,
Parquet, Arrow (local or remote URLs) Query history, keyboard
shortcuts, theme toggle Persistent storage via OPFS (data survives
browser refresh) Optional: Connect to external DuckDB servers One-
liner Docker deployment or Node 20+ dev server Technical Details:
DuckDB compiled to WASM; query execution in-browser OPFS-backed
persistence Apache 2.0 licensed Runs on Chrome 88+, Firefox 79+,
Safari 14+ Use Cases: Learning SQL without setting up databases
Ad-hoc data exploration (CSV - SQL in seconds) Quick prototyping
before shipping to production Privacy-conscious workflows (no data
leaves your browser) GitHub: https://github.com/ibero-data/duck-ui
Live Demo: https://demo.duckui.com Quick Start: docker run -p
5522:5522 ghcr.io/ibero-data/duck-ui:latest Would love feedback
on: (1) Use cases I'm missing (2) Performance bottlenecks you hit
(3) Features that would make this your default SQL scratchpad.
Author : caioricciuti
Score : 171 points
Date : 2025-10-19 11:19 UTC (11 hours ago)
(HTM) web link (demo.duckui.com)
(TXT) w3m dump (demo.duckui.com)
| mgaunard wrote:
| doesn't work well on phones, run query button is not visible.
| caioricciuti wrote:
| Thank you for the feedback, adding to the roadmap right now!
| CSDude wrote:
| There is an embedded one in DuckDB for a while now and it's
| great. I get the apeal of yours but this one is much easier to
| use for same cases:
|
| https://duckdb.org/2025/03/12/duckdb-ui
| mrs6969 wrote:
| This is not a self hosted one though. You can not use default
| ui offline, you can not guarantee data safety
| nirav72 wrote:
| Anyone know if there is a similar selfhosted/run local
| option?
| Rhubarrbb wrote:
| `duckdb -ui` and you can launch a local server bound to
| 127.0.0.1
| jasonjmcghee wrote:
| It's very weird they don't offer it by default, but there are
| workarounds.
|
| (You can use it offline)
|
| https://github.com/duckdb/duckdb-ui/issues/62
| ludicrousdispla wrote:
| some of the comments on that thread are surprising. Are
| people not aware that software can be bundled in such a way
| as to run on machines not having internet access?
| dkdcio wrote:
| the background is this UI is the MotherDuck UI for their
| cloud SaaS app. MotherDuck is a VC-backed DuckDB SaaS
| company, not to be confused with DuckDB Labs or the
| DuckDB foundation
|
| MotherDuck decided to take their web app UI and make it a
| locally usable extension via DuckDB. however as noted in
| that thread, the architecture is a bit odd as the actual
| page loads once the extension is running from
| MotherDuck's servers (hence the online requirement)
|
| I don't think it's intentionally malicious or bad design
| or anything, just how this extension came about (and
| sounds like they're fixing it)
|
| disclaimer: I do know and actively work with the
| MotherDuck folks, I've also worked w/ DuckDB Labs in the
| past
| ludicrousdispla wrote:
| Thanks, any recommendations on where to find the best
| information reference/resource for DuckDB-Wasm?
| hamandcheese wrote:
| > MotherDuck is a VC-backed DuckDB SaaS company, not to
| be confused with DuckDB Labs or the DuckDB foundation
|
| Separate entities, but cooperative/comprised of many
| overlapping people, right?
| matsonj wrote:
| Afaik no overlapping people
| curtisblaine wrote:
| Doesn't do charts though (meaning: it does statistic histograms
| on your columns but no custom chart like OP's software does).
| chrisweekly wrote:
| I haven't had a chance to play w this yet, but thank you for
| building and sharing this -- great writeup, sounds v useful and
| compelling!
| gamerrk wrote:
| The autocomplete is really good, UI is snappy as well. Well done!
| caioricciuti wrote:
| Thanksss, happy you liked, thanks for trying it out!
| mritchie712 wrote:
| Really excited about the future of DuckDB:
|
| 1. DuckLake is the best datalake spec and their team is improving
| on the extension rapidly.
|
| 2. With DuckDB WASM, you can make apps that would normally have 2
| to 3 second latency for network calls work in < 200ms.
|
| We use it as our built-in datalake at Definite and couldn't be
| happier with it.
|
| 0 - https://ducklake.select/
|
| 1 - https://www.definite.app/blog/ducklake
| curiousgal wrote:
| I am curious is anyone using DuckDB in prod?
| mgaunard wrote:
| of course, why wouldn't you?
|
| I was using it even before it hit 1.0
| mritchie712 wrote:
| Yes, we run DuckDB + DuckLake in prod for
| https://www.definite.app/
| fluxkernel wrote:
| Is DuckLake compatible with Iceberg? I remember they create
| a new catalog.
| mlnj wrote:
| Yes, you can use
|
| INSTALL iceberg;
|
| to start working with iceberg https://duckdb.org/docs/sta
| ble/core_extensions/iceberg/overv...
| matsonj wrote:
| Sure - https://motherduck.com/blog/15-companies-duckdb-in-
| prod/
| jsight wrote:
| Agreed. I just wish that the vector support were fully
| supported. It has been experimental for a long time.
| geysersam wrote:
| I love duckdb but I don't understand your second point. How
| does duckdb wasm decrease the latency of network calls in your
| app?
| benrutter wrote:
| Not OP, but depending on your use case, client side
| operations _could_ be a big deal.
|
| Something like a dashboard app for instance, might have
| callbacks where it needs to run a new SQL query based on
| input, but be small enough to make loading all data onto
| menory and querying locally a mich faster option.
|
| Obviously ymmv and if you have a dashboard with a heavy data
| set under the hood, your gonna make a lot of users unhappy
| fast by doing that.
| adsharma wrote:
| Love the DuckLake spec. Now there is something similar for
| Graphs.
|
| https://adsharma.github.io/graph-archiving/
| https://adsharma.github.io/beating-the-CAP-theorem-for-graph...
|
| The catalog is based on the now archived kuzu graph db project.
| Development continuing here:
| https://github.com/LadybugDB/ladybug
| spooky_deep wrote:
| When DuckDB queries across multiple sources (say, Postgres and a
| CSV) does it first load all data into DuckDB or is it smart
| enough to only pull minimal data needed for the query on the fly?
| dav43 wrote:
| possible, seems this is done in other modes.
|
| quote - google ai mode:
|
| "DuckDB offers robust capabilities for querying data stored
| partially on S3, particularly when dealing with Parquet files.
| This is achieved through several optimization techniques:
|
| Predicate Pushdown: When you apply a WHERE clause to filter
| data, DuckDB can "push down" this filter directly into the
| Parquet file scan. If the Parquet file contains zonemaps
| (metadata about value ranges within columns), DuckDB can use
| this information to skip reading entire sections of the file
| that do not contain relevant data, significantly reducing the
| amount of data transferred from S3.
|
| Projection Pushdown: When you select only specific columns in
| your SELECT statement, DuckDB automatically reads only those
| required columns from the Parquet file. This means you avoid
| downloading and processing unnecessary data, leading to faster
| queries and reduced S3 transfer costs.
|
| HTTP Range Reads: DuckDB leverages HTTP range headers when
| interacting with S3 (or other object storage supporting range
| reads). This allows it to fetch only the necessary parts of the
| Parquet file, such as metadata or specific column chunks,
| rather than downloading the entire file."
| lolive wrote:
| << How does it handle [multi-source] joins ? >> is the
| obvious next question.
| VHRanger wrote:
| In memory, and if larger than memory it makes .duckdbtmp
| files to work from
| lolive wrote:
| So when you start doing crazy joins, a NVMe + big amount
| of RAM will really help DuckDB, in its work. Right?
| mosselman wrote:
| What is a duckdb server? I was under the impression there is no
| server in duckdb, just the client.
| caioricciuti wrote:
| In theory there's none... DuckDB is like Sqlite, it's a file,
| but in this case it's 100% wasm so theres zero interaction with
| any "server", it's all on Browser. One example of DuckDB in
| server is mother duck... It makes .duckdb files "available" on
| the cloud.
| joshmn wrote:
| This is cool, thanks. I use the embedded UI but I'm going to play
| around with yours too.
|
| DuckDB is the single-most impressive piece of software I've used
| in my career. I'm mangling terabytes of parquets daily and it
| just handles them effortlessly; the bindings also also well-
| written.
| caioricciuti wrote:
| TRUE! It's amazing and I have in other project too! The idea of
| of this app 100% in browser came from handling lots of CSV's
| from different people in my former company... Just to load in
| excel it took forever, then I came up with this, it made my
| life much easier, hope it makes yours too!
| alex_hirner wrote:
| I'd love to make it work with flightsql or HTTP endpoints
| returning arrow IPC [0]! Did you consider using perspective for
| last-mile charting [1]? Building your own seems like a huge chunk
| of work. Well done!
|
| [0]
| https://duckdb.org/docs/stable/clients/wasm/data_ingestion#a...
| [1] https://github.com/finos/perspective
| texodus wrote:
| Perspective is also getting direct support for DuckDB soon!
| https://github.com/finos/perspective/pull/3062
| cjonas wrote:
| I just leave 'duckdb --ui' running on my computer at all times.
| While the functionality is great, I'm really not happy that UI
| itself isn't open source and instead controlled by motherduck.
| There are many quick and easy improvements that will probably
| never get made, as motherduck has no real incentive to improve it
| at this point.
|
| Wonder if this work could be ported as a replacement to duckdb
| local UI?
| caioricciuti wrote:
| I would love for this to be the case... I'm also not a fan of
| mother's duck ui... Also I created this project like 2 weeks
| before they launch it (that's why it's named duckui...) I would
| choose another name but well I had bought the domain already
| hahaha... But SURE, I would like this to be the best UI ever
| for all of us... Just need some ideas/help to implement all
| missing parts...
| cjonas wrote:
| Curious how tricky it would be to connect this to a local
| instance of duckdb running in UI mode instead of browser
| WASM. (Or if that even aligns with your vision of this
| project). From what I can tell looking just looking at it on
| my phone your UI seems like a great start to replacing
| motherduck.
| cjonas wrote:
| Or it looks like that's basically already supported?!
| Sorry, I need to spend some time with this, but I'll
| definitely be testing it out and will provide feedback
| and/or contributing
| tonyhart7 wrote:
| do we have analytics product that build on top of duck db
| yet?????
| ludicrousdispla wrote:
| There are several that have started up in the past few years...
|
| https://observablehq.com/framework/lib/duckdb
| rustyconover wrote:
| There are so many!
|
| Rill Data - https://www.rilldata.com Summer - https://summer.io
| Hex - https://hex.tech Evidence - https://evidence.dev
| RyanHamilton wrote:
| If you want a desktop version check out qstudio:
| https://www.timestored.com/qstudio/help/duckdb-sql-editor it
| integrates duckdb functionality for parquet csv and to pivot data
| matsonj wrote:
| You're underselling this. Running it locally also gives you
| access to all cores and all RAM. Wasm is very limited
| comparatively - perf is not even close.
| ludicrousdispla wrote:
| Is the DuckDB Wasm that you are providing the same thing as the
| DuckDB Wasm provided by DuckDB?
|
| I ask because I am under the impression that the 'DuckDB Wasm'
| client provided by DuckDB doesn't yet support all of the DuckDB
| functions.
|
| So I am interested to know if this has implemented more, fewer,
| or the same set of functions.
| debazel wrote:
| Here's some quick issues and suggestions I found after about 5
| minutes of playing around with it. All test were done using
| Firefox FYI.
|
| 1. One of my favorite features from the built in DuckDB UI is the
| panel that automatically generates graphs for each column, both
| for the whole dataset itself and for the specific query you're
| running. I often find myself not even writing any queries because
| all I needed was something really simple already available in
| that panel. This would be my #1 reason for not using this GUI
| instead of the built in one.
|
| 2. I could not find any panel to show the currently selected
| value in the grid view. Ideally I would like this to also be able
| to auto-detect common formats like JSON and format them, etc.
|
| 3. The grid view can show a maximum of 200 rows. Finding a way to
| virtually render the rows in an infinite list would be much
| better IMO. I've found myself selecting up to 10k+ rows in the
| built in GUI and to copy all IDs, etc, several times (saves
| sometime compared to exporting a CSV and copying from there).
|
| 4. The column filter dropdown in the grid view has a search bar
| which is nice, but it is automatically deselected on each
| character entry, making it very annoying to use...
|
| 5. Additionally the dropdown filter menus are not automatically
| closed when you click outside or open another dropdown, which is
| a minor annoyance.
|
| 6. The right click menu in the grid viewer will close on "mouse
| out", however it does not close on "click outside" and the cursor
| does not start inside of the menu itself. This means the menu
| becomes permanently stuck until hover over it if you immediately
| move the mouse to the top-right on open.
|
| 7. The grid view resizer is behaving buggy sometimes after
| changing the number of page rows to display.
|
| 8. The transparent tooltip background in the chart viewer makes
| the light-gray text impossible to read in dark-mode when there is
| yellow behind it (from other the chart bars).
|
| 9. The explorer side panel seems to be sized based on a
| percentage of the window size. this is quite minor but it would
| behave nicer if it had a fixed size so changing the window size
| does not also resize the side panel. It is also overly large when
| you first load the site.
| caioricciuti wrote:
| THAT'S AMAZING! ALL NOTED, thank you very much for the time and
| for the feedback! You are awesome! I'll review all!
| rustyconover wrote:
| Thanks for building this!
|
| Using my textplot extension doesn't result in my expected output:
|
| ---
|
| install textplot from community;
|
| load textplot;
|
| select tp_bar(0.5)
|
| ---
| jeffbee wrote:
| This is not really a problem introduced by the thing in the
| article, but the "UI" for duckdb just kinda sucks. When I want to
| interactively explore some data, I want to easily add conditions
| and aggregates, but there's nothing in the Duck UI that actually
| does this. It will make a little table of the top 20 values of
| irritating_column_name but there's not a 1-click way to add
| `where irritating_column_name = 'incredibly inconvenient value'`
| to the query and re-run, which is an absolutely basic data
| exploration feature.
| cat-whisperer wrote:
| great timing, I am literally adding Clickhouse and DuckDB for my
| project. This is gonna be super handy for testing
| dsamy wrote:
| Have you considered adding support for visualizing query results
| directly within the interface?
___________________________________________________________________
(page generated 2025-10-19 23:00 UTC)