<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Duckdb on Mini Fish</title>
    <link>https://blog.minifish.org/tags/duckdb/</link>
    <description>Recent content in Duckdb on Mini Fish</description>
    <image>
      <title>Mini Fish</title>
      <url>https://blog.minifish.org/android-chrome-512x512.png</url>
      <link>https://blog.minifish.org/android-chrome-512x512.png</link>
    </image>
    <generator>Hugo -- 0.161.1</generator>
    <language>en-US</language>
    <copyright>Mini Fish 2014-present. Licensed under CC-BY-NC</copyright>
    <lastBuildDate>Fri, 29 May 2026 09:00:00 +0800</lastBuildDate>
    <atom:link href="https://blog.minifish.org/tags/duckdb/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>QuackLake: A DuckDB-WASM Analytics Prototype</title>
      <link>https://blog.minifish.org/posts/quacklake-wasm-analytics-prototype/</link>
      <pubDate>Fri, 29 May 2026 09:00:00 +0800</pubDate>
      <guid>https://blog.minifish.org/posts/quacklake-wasm-analytics-prototype/</guid>
      <description>A project note on QuackLake, a prototype combining DuckDB-WASM compute, MinIO object storage, a Rust API, and an HTTP range gateway.</description>
      <content:encoded><![CDATA[<p>QuackLake is a WASM-first analytics prototype. It combines DuckDB-WASM compute, MinIO object storage, a Rust control plane, and an HTTP range gateway.</p>
<p>The project is deliberately prototype-shaped. It asks what an analytics stack looks like when browser or WASM compute is treated as a real part of the system rather than only a demo surface.</p>
<h2 id="components">Components</h2>
<p>The local stack is split into small services:</p>
<ul>
<li>API control plane</li>
<li>HTTP range gateway over object storage</li>
<li>Node runner using DuckDB-WASM</li>
<li>browser query UI</li>
<li>MinIO for S3-compatible storage</li>
</ul>
<p>That separation makes the data flow easier to inspect:</p>
<ol>
<li>data lives in object storage</li>
<li>range requests expose only needed bytes</li>
<li>DuckDB-WASM runs queries</li>
<li>lineage or job metadata can be tracked by the control plane</li>
</ol>
<h2 id="why-duckdb-wasm">Why DuckDB-WASM</h2>
<p>DuckDB is already a strong fit for local analytics. DuckDB-WASM adds a different deployment shape: query execution can move closer to the browser, a worker, or a constrained runtime.</p>
<p>The attraction is not that every analytics job should run in the browser. The attraction is that the compute boundary becomes flexible.</p>
<h2 id="what-the-prototype-tests">What the prototype tests</h2>
<p>QuackLake is useful for testing system questions:</p>
<ul>
<li>how painful are range requests in practice?</li>
<li>where should metadata live?</li>
<li>what should the API own?</li>
<li>when does browser compute become awkward?</li>
<li>how much can object storage simplify the backend?</li>
</ul>
<p>These are architectural questions, not UI questions.</p>
<h2 id="what-i-learned">What I learned</h2>
<p>WASM analytics is promising, but the hard parts move around. Query execution can be surprisingly capable, while data access, file layout, caching, and observability become the real design surface.</p>
<p>The range gateway is a good example. It sounds like plumbing, but it shapes whether the system feels smooth or fragile.</p>
<h2 id="current-status">Current status</h2>
<p>QuackLake is private and experimental. I would not present it as a finished product. Its value is as a small lab for object-storage-first analytics and DuckDB-WASM deployment patterns.</p>
]]></content:encoded>
    </item>
  </channel>
</rss>
