[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)