<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Concurrent Writes on DuckDB Lab</title><link>https://duckdblab.org/en/tags/concurrent-writes/</link><description>Recent content in Concurrent Writes on DuckDB Lab</description><generator>Hugo -- gohugo.io</generator><language>en-US</language><lastBuildDate>Wed, 13 May 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://duckdblab.org/en/tags/concurrent-writes/index.xml" rel="self" type="application/rss+xml"/><item><title>DuckDB Quack Protocol: DuckDB Can Now Run as a Server</title><link>https://duckdblab.org/en/post/duckdb-quack-remote-protocol/</link><pubDate>Wed, 13 May 2026 00:00:00 +0000</pubDate><guid>https://duckdblab.org/en/post/duckdb-quack-remote-protocol/</guid><description>&lt;h2 id="wait-isnt-duckdb-embedded"&gt;Wait, Isn&amp;rsquo;t DuckDB &amp;ldquo;Embedded&amp;rdquo;?
&lt;/h2&gt;&lt;p&gt;Yes. Since its launch in 2019, DuckDB has prided itself on its &lt;strong&gt;in-process architecture&lt;/strong&gt; — no client, no server, no communication protocol, just direct API calls. It&amp;rsquo;s perfect for data science, Python notebooks, and embedded analytics.&lt;/p&gt;
&lt;p&gt;But there&amp;rsquo;s been one pain point: &lt;strong&gt;what happens when multiple processes want to write to the same database file?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Think about:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Multiple telemetry collectors inserting into the same DuckDB&lt;/li&gt;
&lt;li&gt;A dashboard querying the same tables simultaneously&lt;/li&gt;
&lt;li&gt;Two processes writing at once → 💥&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Before Quack, your options were: build a custom RPC service, use the Arrow Flight SQL protocol, migrate to MotherDuck, or (sigh) switch to PostgreSQL.&lt;/p&gt;
&lt;p&gt;On May 12, 2026, DuckDB finally solved this. &lt;strong&gt;Meet Quack.&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="what-is-quack"&gt;What is Quack?
&lt;/h2&gt;&lt;p&gt;Quack is the communication protocol between DuckDB instances. What do two (or more) ducks do when they want to talk? They quack! So naturally, the protocol DuckDB instances use to talk to each other is called&amp;hellip; Quack 😄&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;&lt;strong&gt;In a nutshell&lt;/strong&gt;: DuckDB now runs as a server, and other DuckDB instances connect as clients to read and write data.&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;Key features:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;HTTP-based&lt;/strong&gt; — no proprietary protocols, firewall-friendly&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Multi-client concurrent writes&lt;/strong&gt; — finally solves the long-standing pain point&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Token-based authentication&lt;/strong&gt; — simple but effective&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Arrow data format&lt;/strong&gt; — zero-copy, high performance&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Full query and DML support&lt;/strong&gt; — not just read-only&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="quick-start"&gt;Quick Start
&lt;/h2&gt;&lt;p&gt;You need two DuckDB instances (v1.5.2+) with the Quack extension:&lt;/p&gt;
&lt;h3 id="server-duckdb-1"&gt;Server (DuckDB #1)
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;INSTALL&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;quack&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;core_nightly&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;LOAD&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;quack&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;CALL&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;quack_serve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;quack:localhost&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;token&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;super_secret&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;TABLE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;hello&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;AS&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;VALUES&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;world&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Three lines. DuckDB is now a server, listening on &lt;code&gt;quack:localhost&lt;/code&gt;, ready for clients.&lt;/p&gt;
&lt;h3 id="client-duckdb-2"&gt;Client (DuckDB #2)
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;INSTALL&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;quack&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;core_nightly&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;LOAD&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;quack&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;SECRET&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;TYPE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;quack&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;TOKEN&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;super_secret&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ATTACH&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;quack:localhost&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;AS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;remote&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;remote&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;hello&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Output:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;world
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;The client queries the server&amp;rsquo;s table as naturally as a local table.&lt;/p&gt;
&lt;h2 id="more-than-queries--writes-ddl-everything"&gt;More Than Queries — Writes, DDL, Everything
&lt;/h2&gt;&lt;p&gt;Quack isn&amp;rsquo;t read-only. Clients can write too:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;-- Write to remote
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;TABLE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;remote&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;hello2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;AS&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;VALUES&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;world2&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;-- Verify
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;remote&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;hello2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Output:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;world2
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Full CRUD, DDL, and transactions — everything works over Quack.&lt;/p&gt;
&lt;h2 id="who-should-use-this"&gt;Who Should Use This?
&lt;/h2&gt;&lt;p&gt;Quack unlocks use cases that were previously impossible with DuckDB:&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th style="text-align: left"&gt;Scenario&lt;/th&gt;
 &lt;th style="text-align: left"&gt;Before&lt;/th&gt;
 &lt;th style="text-align: left"&gt;After&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;Multi-process writes to same DB&lt;/td&gt;
 &lt;td style="text-align: left"&gt;❌ Crash&lt;/td&gt;
 &lt;td style="text-align: left"&gt;✅ Quack server + concurrent clients&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;Live dashboard + background writes&lt;/td&gt;
 &lt;td style="text-align: left"&gt;❌ Single process only&lt;/td&gt;
 &lt;td style="text-align: left"&gt;✅ One Quack server, N clients&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;Shared data across microservices&lt;/td&gt;
 &lt;td style="text-align: left"&gt;Custom RPC needed&lt;/td&gt;
 &lt;td style="text-align: left"&gt;✅ Native ATTACH syntax&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;Remote data analysis&lt;/td&gt;
 &lt;td style="text-align: left"&gt;SCP files around&lt;/td&gt;
 &lt;td style="text-align: left"&gt;✅ ATTACH remote instance directly&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;Centralized ingestion from edge devices&lt;/td&gt;
 &lt;td style="text-align: left"&gt;One file at a time&lt;/td&gt;
 &lt;td style="text-align: left"&gt;✅ Batch INSERT to one Quack server&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="how-it-works-under-the-hood"&gt;How It Works Under the Hood
&lt;/h2&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;Client Server
 │ │
 │── HTTP POST ─────────→ │ (Query request, Arrow format)
 │ │
 │←── Arrow Stream ────── │ (Streaming response)
 │ │
 │── HTTP POST ─────────→ │ (Write request)
 │←── Affected Rows ──── │ (Row count)
&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Transport&lt;/strong&gt;: HTTP + Arrow — not sockets, not binary protocols&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Data format&lt;/strong&gt;: Arrow — zero-copy, high performance&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Auth&lt;/strong&gt;: Simple secret token&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Addressing&lt;/strong&gt;: &lt;code&gt;quack:host:port&lt;/code&gt; format&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Compared to PostgreSQL&amp;rsquo;s wire protocol, Quack is lighter. Compared to Arrow Flight SQL, Quack feels more like DuckDB-native SQL.&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: Quack is currently in the &lt;code&gt;core_nightly&lt;/code&gt; repository, not a default extension yet. The DuckDB team calls this a &amp;ldquo;first version&amp;rdquo; with ongoing improvements.&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h2 id="try-it-yourself"&gt;Try It Yourself
&lt;/h2&gt;&lt;p&gt;Install DuckDB v1.5.2 and open two terminals:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Terminal 1 (Server)&lt;/strong&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;duckdb -c &lt;span class="s2"&gt;&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;INSTALL quack FROM core_nightly;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;LOAD quack;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;CALL quack_serve(&amp;#39;quack:localhost&amp;#39;, token = &amp;#39;my_token&amp;#39;);
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;CREATE TABLE events AS SELECT 1 AS id, &amp;#39;test&amp;#39; AS name;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;SELECT &amp;#39;Server ready!&amp;#39; AS status;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Terminal 2 (Client)&lt;/strong&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;duckdb -c &lt;span class="s2"&gt;&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;INSTALL quack FROM core_nightly;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;LOAD quack;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;CREATE SECRET (TYPE quack, TOKEN &amp;#39;my_token&amp;#39;);
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;ATTACH &amp;#39;quack:localhost&amp;#39; AS remote;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;FROM remote.events;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;If you see &lt;code&gt;1│test&lt;/code&gt;, congratulations — your two DuckDB instances just talked to each other via Quack!&lt;/p&gt;
&lt;h2 id="summary"&gt;Summary
&lt;/h2&gt;&lt;p&gt;Quack is a major milestone for DuckDB. It doesn&amp;rsquo;t negate the in-process architecture — for single-machine data analysis, that&amp;rsquo;s still DuckDB&amp;rsquo;s superpower. But when you need multi-process collaboration, remote access, or shared real-time data, Quack provides an elegant, native solution.&lt;/p&gt;
&lt;p&gt;Simple to install. Feels like DuckDB. Powered by Arrow for speed. &lt;strong&gt;Fast when you need it, connected when you need it.&lt;/strong&gt;&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;Original article: &lt;a class="link" href="https://duckdb.org/2026/05/12/quack-remote-protocol" target="_blank" rel="noopener"
 &gt;https://duckdb.org/2026/05/12/quack-remote-protocol&lt;/a&gt;&lt;/p&gt;

 &lt;/blockquote&gt;</description></item></channel></rss>