{"by":"harisamin","descendants":0,"id":49993045,"score":1,"text":"I&#x27;ve been using DuckDB as a swiss army knife for a while now.<p>I have a soft spot for pretty&#x2F;polished macOS apps. It bugged me there wasn&#x27;t one for DuckDB. TablePlus is my favorite multi-db client, I&#x27;m in it daily, but the DuckDB support is thin.<p>The other thing was paging. Every client gives you the first N rows and a &quot;load more&quot; button. I didn&#x27;t want that. DuckDB is the only place on my local machine where I actually am dealing, slicing&#x2F;dicing, and perusing large datasets.<p>So I built Datapuddle to fully embrace DuckDB for in a macOS friendly way :)<p>The grid:<p>- Whole result is in it. Not the first page. Rows never become objects, cells get read out of DuckDB&#x27;s columnar chunks at draw time and drawn with Core Text. Memory is flat at 40 rows or 41 million. Row 41,000,000 costs what row 40 costs.<p>- Numbers, on 20M rows x 30 cols out of an 11GB file: 119 fps average on a sustained fling, min-instantaneous 52-60, 2.8GB resident, jump to last row under a third of a millisecond.<p>- I tested this thoroughly on my M1 Max MacBook Pro with 64 GB RAM<p>Everything else:<p>- Column headers draw their own distribution, null share, distinct count.<p>- Query plans as a waterfall, or a tree, or raw JSON.<p>- History is local SQLite with FTS, so you can dig up last week&#x27;s query from a fragment.<p>- Completion knows your schema. Connections saved, secrets in the Keychain.<p>- Extensions are statically linked, so DuckDB&#x27;s reach is the app&#x27;s: Parquet, CSV, JSON, .duckdb, local or on S3. Postgres tables attach alongside, so you can join across them. Nothing downloads at runtime.<p>- Speaks Quack, so you can point it at your own DuckDB server. Want an extension I didn&#x27;t bundle? spatial, say. Load it there, query through it. Costs about 2x to pull the result across, then it&#x27;s identical.<p>- No Electron. No webviews. No bundled Chromium to draw a table.<p>- Sends nothing anywhere. There&#x27;s a build check that fails if anything linked in can open a socket.<p>$39.99 once, not a subscription, 7 day trial first. Apple Silicon, macOS 14+. Swift 6, AppKit. Around 3-4 months of work.<p>On AI, because someone always asks: couple of decades as an engineer, shipped native apps long before any of this existed. I used Claude throughout. Two places it really earned its keep: getting DuckDB and the extension set statically bundled and actually behaving, and the buffered Core Text grid. The rules were mine and enforcing them was most of the work. No DuckDB call on the main thread. Result rows never become objects. AppKit for anything that renders your data.<p>App Store: <a href=\"https:&#x2F;&#x2F;apps.apple.com&#x2F;app&#x2F;id6811235967\">https:&#x2F;&#x2F;apps.apple.com&#x2F;app&#x2F;id6811235967</a><p>Happy to go into any of it.","time":1791381815,"title":"Show HN: Datapuddle, a native macOS DuckDB client that doesn't page results","type":"story","url":"https://datapuddle.app/"}