<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Md Ayan bag</title>
    <description>The latest articles on DEV Community by Md Ayan bag (@md_ayanbag_03a42545b17ac).</description>
    <link>https://dev.to/md_ayanbag_03a42545b17ac</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4143492%2Fbddf5d60-b010-4296-b3ed-f130b4fa3c68.png</url>
      <title>DEV Community: Md Ayan bag</title>
      <link>https://dev.to/md_ayanbag_03a42545b17ac</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/md_ayanbag_03a42545b17ac"/>
    <language>en</language>
    <item>
      <title>du Said Chrome Was Using 67 GB on My Mac. APFS Said 2. Here's a Script to Tell the Difference</title>
      <dc:creator>Md Ayan bag</dc:creator>
      <pubDate>Sun, 18 Oct 2026 04:36:25 +0000</pubDate>
      <link>https://dev.to/md_ayanbag_03a42545b17ac/du-said-chrome-was-using-67-gb-on-my-mac-apfs-said-2-heres-a-script-to-tell-the-difference-597e</link>
      <guid>https://dev.to/md_ayanbag_03a42545b17ac/du-said-chrome-was-using-67-gb-on-my-mac-apfs-said-2-heres-a-script-to-tell-the-difference-597e</guid>
      <description>&lt;p&gt;My MacBook Air was down to 18 GB free, so I went hunting. The biggest folder on the whole disk, according to &lt;code&gt;du&lt;/code&gt;, was this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/private/var/folders/…/X/com.google.Chrome.code_sign_clone   67G
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Inside: &lt;strong&gt;48 full copies of Google Chrome&lt;/strong&gt;. None of them the version I actually have installed.&lt;/p&gt;

&lt;p&gt;Then I measured it the way APFS actually stores it, and the 67 GB turned into about 2. Here's the folder, the trap, and a 30-line Swift script that measures any folder the same way.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;(Written with help from an AI assistant. Every number and command was run on my own Mac.)&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Check yours (read-only)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;getconf DARWIN_USER_TEMP_DIR&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;/../X/com.google.Chrome.code_sign_clone"&lt;/span&gt; | &lt;span class="nb"&gt;wc&lt;/span&gt; &lt;span class="nt"&gt;-l&lt;/span&gt;
&lt;span class="nb"&gt;du&lt;/span&gt; &lt;span class="nt"&gt;-sh&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;getconf DARWIN_USER_TEMP_DIR&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;/../X/"&lt;/span&gt;&lt;span class="k"&gt;*&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Mine printed &lt;code&gt;48&lt;/code&gt; and &lt;code&gt;67G&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;From what I can tell, Chrome makes one of these each time it launches after an update. The running browser keeps a validly signed copy of itself while the new version is swapped in underneath. They're meant to be temporary. On my Mac they weren't: 3 copies of Chrome 154 and 45 of 155.0.8059.40, while &lt;code&gt;/Applications&lt;/code&gt; has 155.0.8059.80.&lt;/p&gt;

&lt;h2&gt;
  
  
  The trap: &lt;code&gt;du&lt;/code&gt; doesn't understand clones
&lt;/h2&gt;

&lt;p&gt;APFS can &lt;em&gt;clone&lt;/em&gt; a file. The clone looks like a full copy to every tool, but it shares blocks with the original until one side changes. Chrome makes its copies as clones.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;du&lt;/code&gt;, Finder's Get Info and most disk-map apps add every clone up at full size. 48 × ~1.4 GB = 67 GB that mostly doesn't exist.&lt;/p&gt;

&lt;p&gt;APFS will tell you the truth, you just have to ask through &lt;code&gt;getattrlist&lt;/code&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;ATTR_CMNEXT_CLONEID&lt;/code&gt;: which clone family a file belongs to&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ATTR_CMNEXT_EXT_FLAGS&lt;/code&gt;: bit 0 means "may share blocks"&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ATTR_CMNEXT_PRIVATESIZE&lt;/code&gt;: bytes that belong only to this file&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So: for each clone, count its private bytes, and count the shared part once per family.&lt;/p&gt;

&lt;h2&gt;
  
  
  The script
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight swift"&gt;&lt;code&gt;&lt;span class="kd"&gt;import&lt;/span&gt; &lt;span class="kt"&gt;Foundation&lt;/span&gt;

&lt;span class="c1"&gt;// Usage: swift realsize.swift &amp;lt;folder&amp;gt;&lt;/span&gt;
&lt;span class="c1"&gt;// Counts APFS clones once: each clone adds only its private bytes,&lt;/span&gt;
&lt;span class="c1"&gt;// and the shared blocks are counted once per clone family.&lt;/span&gt;
&lt;span class="kd"&gt;func&lt;/span&gt; &lt;span class="nf"&gt;attrs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="nv"&gt;path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;String&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="nv"&gt;bits&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;UInt32&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="nv"&gt;n&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;Int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="kt"&gt;UInt64&lt;/span&gt;&lt;span class="p"&gt;]?&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="nv"&gt;al&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;attrlist&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="n"&gt;al&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;bitmapcount&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;u_short&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;ATTR_BIT_MAP_COUNT&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="n"&gt;al&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;forkattr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;bits&lt;/span&gt;
    &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="nv"&gt;buf&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="kt"&gt;UInt8&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="nv"&gt;repeating&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;count&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;buf&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;withUnsafeMutableBytes&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt;
        &lt;span class="k"&gt;guard&lt;/span&gt; &lt;span class="nf"&gt;getattrlist&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;al&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;baseAddress&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;count&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mh"&gt;0x21&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;nil&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="nf"&gt;return&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;..&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;map&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;loadUnaligned&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;fromByteOffset&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nv"&gt;$0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;as&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;UInt64&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;root&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;CommandLine&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;arguments&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="nv"&gt;naive&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;Int64&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;real&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;Int64&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;families&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;Set&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;UInt64&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;e&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;FileManager&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="k"&gt;default&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;enumerator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;atPath&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;
&lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;rel&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;nextObject&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;as?&lt;/span&gt; &lt;span class="kt"&gt;String&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;p&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;root&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s"&gt;"/"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;rel&lt;/span&gt;
    &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="nv"&gt;st&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;stat&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="k"&gt;guard&lt;/span&gt; &lt;span class="nf"&gt;lstat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;st&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;st&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;st_mode&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="kt"&gt;S_IFMT&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="kt"&gt;S_IFREG&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;continue&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;full&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;Int64&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;st&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;st_blocks&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;512&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;naive&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;full&lt;/span&gt;
    &lt;span class="c1"&gt;// ATTR_CMNEXT_CLONEID | ATTR_CMNEXT_EXT_FLAGS; flag 1 = may share blocks&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;c&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;attrs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mh"&gt;0x100&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="mh"&gt;0x200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;priv&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;attrs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mh"&gt;0x8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)?[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;real&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="kt"&gt;Int64&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;priv&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;families&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;insert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;inserted&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;real&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;full&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="kt"&gt;Int64&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;priv&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;  &lt;span class="c1"&gt;// shared part, once&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;real&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;full&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;g&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;1_073_741_824.0&lt;/span&gt;  &lt;span class="c1"&gt;// GiB, same unit as du -h&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;String&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;format&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"du-style: %.1fG   on disk: %.1fG"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;Double&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;naive&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;Double&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;real&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;0x21&lt;/code&gt; is &lt;code&gt;FSOPT_ATTR_CMN_EXTENDED | FSOPT_NOFOLLOW&lt;/code&gt;. You need Xcode's command line tools for &lt;code&gt;swift&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;On the Chrome folder:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;swift realsize.swift &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;getconf DARWIN_USER_TEMP_DIR&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;/../X/com.google.Chrome.code_sign_clone"&lt;/span&gt;
du-style: 67.3G   on disk: 2.1G
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;67 GB on paper, about 2 GB on disk.&lt;/strong&gt; Still waste (those clones keep old Chrome versions' blocks alive), but a 30× smaller problem.&lt;/p&gt;

&lt;p&gt;It's a simplification: a file's "shared" part can be shared with files outside the folder, so treat the result as "roughly what deleting this folder gives back". (My app's stricter version credits those blocks to whichever file owns them, and lands on 1.8 GB for the same folder.) The honest final check is always &lt;code&gt;df -h /&lt;/code&gt; before and after (and empty the Trash).&lt;/p&gt;

&lt;h2&gt;
  
  
  Should you delete them?
&lt;/h2&gt;

&lt;p&gt;Probably fine, with two rules: quit Chrome completely first (Cmd-Q), and expect them back after the next update. Open the folder with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;open &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;getconf DARWIN_USER_TEMP_DIR&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;/../X"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;…and drag &lt;code&gt;com.google.Chrome.code_sign_clone&lt;/code&gt; to the Trash. Expect a GB or two back, not 67.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I care
&lt;/h2&gt;

&lt;p&gt;Clones are everywhere now: Finder's Duplicate, pnpm's store, Chrome's copies. Any disk tool that sums file sizes will show you folders bigger than your drive, and you'll delete things expecting space you never get.&lt;/p&gt;

&lt;p&gt;I ran into this while building &lt;a href="https://tidymac.space/?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=chrome-clones" rel="noopener noreferrer"&gt;Tidy Mac&lt;/a&gt;, a Mac cleaner. Full disclosure: it's mine. It counts clones once like the script above, labels what's safe to clear, and moves everything to the Trash first.&lt;/p&gt;

&lt;p&gt;How many copies did your Mac have? Post your &lt;code&gt;ls | wc -l&lt;/code&gt; in the comments. I'm curious if anyone beats 48.&lt;/p&gt;

</description>
      <category>macos</category>
      <category>swift</category>
      <category>apple</category>
      <category>productivity</category>
    </item>
    <item>
      <title>'It Was Bad.' 'Bad How?' — What Happens When You Let a Form Ask a Follow-Up Question</title>
      <dc:creator>Md Ayan bag</dc:creator>
      <pubDate>Thu, 01 Oct 2026 17:40:44 +0000</pubDate>
      <link>https://dev.to/md_ayanbag_03a42545b17ac/it-was-bad-bad-how-what-happens-when-you-let-a-form-ask-a-follow-up-question-4e9l</link>
      <guid>https://dev.to/md_ayanbag_03a42545b17ac/it-was-bad-bad-how-what-happens-when-you-let-a-form-ask-a-follow-up-question-4e9l</guid>
      <description>&lt;p&gt;Every form you've ever built has shipped with the same silent bug: it accepts whatever someone types and moves on.&lt;/p&gt;

&lt;p&gt;Someone writes "it was bad" in a feedback field, and your form says, in effect, &lt;em&gt;great, thanks&lt;/em&gt; — and stores three useless words forever. Nobody follows up. Nobody asks "bad how — the price, or something it couldn't do?" The person who typed that answer probably &lt;em&gt;has&lt;/em&gt; a clear reason. Your form just never asked for it.&lt;/p&gt;

&lt;p&gt;That's not a UX nitpick. It's a data quality problem that gets worse the more forms you ship, and it's the specific thing we set out to fix with &lt;a href="https://chatform.in/" rel="noopener noreferrer"&gt;Chatform&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The gap isn't completion rate, it's answer quality
&lt;/h2&gt;

&lt;p&gt;Most form-builder benchmarking obsesses over completion rate: did the person finish all the fields? That's measurable, so it's what gets optimized. But a 100%-complete form full of one-word non-answers is not a win — it's a worse failure mode than abandonment, because it &lt;em&gt;looks&lt;/em&gt; like success in your dashboard.&lt;/p&gt;

&lt;p&gt;There's actual research behind this, not just a hunch:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Xiao et al. (ACM Transactions on Computer-Human Interaction, 27(3), 2020) found that conversational, one-question-at-a-time interfaces produce meaningfully higher-quality open-ended answers than static multi-field forms — people elaborate more when they're asked, not just prompted.&lt;/li&gt;
&lt;li&gt;Sauermann &amp;amp; Roach (Research Policy, 42(1), 2013) showed that follow-up contact (not just the initial ask) is what recovers a huge share of otherwise-lost survey responses — the first send is never the whole story.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Put those together and you get the actual shape of the problem: forms lose good data twice — once when an answer is too thin to be useful, and again when the person leaves before finishing at all. Static forms have no mechanism for either.&lt;/p&gt;

&lt;h2&gt;
  
  
  What "asking a follow-up" actually requires
&lt;/h2&gt;

&lt;p&gt;This is the part that's interesting as a builder, not just as a marketer. Making a form ask a good follow-up question isn't "add a chatbot wrapper around your fields." A few concrete problems you have to solve:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Deciding what counts as "thin."&lt;/strong&gt; A one-word answer to "what's your name?" is correct. A one-word answer to "what went wrong?" is not. You can't apply a single length heuristic — the bar for "sufficient" depends on the question itself, so the system needs context on what each question is actually trying to learn, not just a character count.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Knowing when to stop.&lt;/strong&gt; A follow-up engine that always asks "can you say more?" is worse than no follow-up at all — it's just friction with extra steps. The harder (and more important) problem is recognizing a &lt;em&gt;good&lt;/em&gt; answer immediately and moving on without asking twice.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Staying grounded instead of hallucinating next steps.&lt;/strong&gt; If someone asks the form a question mid-flow — "wait, who sees my answers?" — the honest answer has to come from something the form owner actually wrote, not a plausible-sounding guess. That's why Chatform's follow-up and Q&amp;amp;A layer is grounded in a knowledge base you provide, not freeform generation: the form can say "Only the Northwind team. Nothing is shared outside it." because that's literally in the docs it was given, not because it sounds reasonable.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Following up after they leave, not just while they're there.&lt;/strong&gt; The Sauermann &amp;amp; Roach finding above is why abandonment recovery can't just be a "continue where you left off" link — it has to be timed (a few hours, then a day, then a few days later tends to outperform a single nag) and it has to resume at the exact question they stopped on, not the start.&lt;/p&gt;

&lt;p&gt;None of these are exotic AI problems, but they're also not "just add GPT to a textarea" — they're closer to interview design translated into a state machine, which is why most form builders that bolt on "AI" do a single rewrite pass on the question text and call it done.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this looks like end to end
&lt;/h2&gt;

&lt;p&gt;Concretely, in Chatform a form is built from: a &lt;strong&gt;persona&lt;/strong&gt; (who's asking), a &lt;strong&gt;goal&lt;/strong&gt; (what the conversation needs to get to), and an optional &lt;strong&gt;knowledge base&lt;/strong&gt; (what it's allowed to answer from). From there:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Thin answers get a specific, context-aware follow-up — not a generic "could you elaborate?"&lt;/li&gt;
&lt;li&gt;Questions mid-form get answered from your docs, then the conversation picks back up exactly where it left off&lt;/li&gt;
&lt;li&gt;People who abandon get an email that returns them to their unfinished question, not the top of the form&lt;/li&gt;
&lt;li&gt;Everything still exports to the structured fields you'd expect — short text, email, number, address, scored fields — the conversation is the interface, not the data model&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And because most teams don't start from zero, you can point it at an existing Typeform, Google Forms, Tally, Jotform or Youform link and it rebuilds the same questions and logic as a conversation, so switching isn't a rebuild-from-scratch decision.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where this doesn't matter
&lt;/h2&gt;

&lt;p&gt;Worth being honest about the edges: if your form is three fields and none of them are open-ended ("email," "company size," "yes/no"), a follow-up layer buys you nothing — there's no thin answer to catch. This is specifically a tool for forms where the &lt;em&gt;value is in the free-text answer&lt;/em&gt;: qualification, applications, research, onboarding, feedback. If every field on your form is a dropdown, stick with whatever you're using.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;p&gt;Free tier is actually free — unlimited responses, 200 AI conversations a month, 100 forms, no card required: &lt;a href="https://chatform.in/" rel="noopener noreferrer"&gt;chatform.in&lt;/a&gt;. There's a live demo form on the homepage if you want to see the follow-up behavior before building anything.&lt;/p&gt;

&lt;p&gt;Curious what this community has run into on the data-quality side specifically — not completion rate, but the "technically answered, but useless" problem. Anyone handled this a different way (progressive profiling, mandatory minimum character counts, human follow-up calls)? Genuinely want to hear what's worked and what hasn't.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>saas</category>
      <category>ux</category>
    </item>
    <item>
      <title>Is There a Better Form Builder Than Jotform in 2026?</title>
      <dc:creator>Md Ayan bag</dc:creator>
      <pubDate>Thu, 01 Oct 2026 01:10:28 +0000</pubDate>
      <link>https://dev.to/md_ayanbag_03a42545b17ac/is-there-a-better-form-builder-than-jotform-in-2026-kfh</link>
      <guid>https://dev.to/md_ayanbag_03a42545b17ac/is-there-a-better-form-builder-than-jotform-in-2026-kfh</guid>
      <description>&lt;p&gt;Every few months a "best form builder" thread pops up, and the answers are always the same five names: Jotform, Typeform, Google Forms, Tally, SurveyMonkey. That's not wrong — they're all solid — but the question itself is usually too broad. "Best form builder" depends on what you're actually trying to do with the data you collect. Here's a practical breakdown across the five variations of that question I keep seeing.&lt;/p&gt;

&lt;h2&gt;
  
  
  "Is there a better form builder than Jotform?"
&lt;/h2&gt;

&lt;p&gt;Depends on what "better" means for you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;More templates / payment integrations&lt;/strong&gt; → Jotform still wins. 20,000+ templates, 40+ payment processors.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Higher completion rates on short forms&lt;/strong&gt; → Typeform's one-question-at-a-time flow usually beats Jotform's single-page layout.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Free forever, no caps that bite you later&lt;/strong&gt; → Tally or Google Forms.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;You care about response &lt;em&gt;quality&lt;/em&gt;, not just completion&lt;/strong&gt; → this is where all of the above fall short. Static forms accept "it was bad" as a finished answer. Nobody asks "bad how?" That's the gap conversational form tools (Chatform is one of them) are built to close — the form follows up on thin answers instead of silently accepting them.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There's no single "better," just a better fit for your use case.&lt;/p&gt;

&lt;h2&gt;
  
  
  "What are the best form builder services?"
&lt;/h2&gt;

&lt;p&gt;If you're evaluating broadly, the honest shortlist in 2026 looks like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Jotform&lt;/strong&gt; — breadth of templates, payments, integrations.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Typeform&lt;/strong&gt; — conversational, high-polish UX, best completion rates for short forms.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tally&lt;/strong&gt; — best free tier, no seat limits.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Google Forms&lt;/strong&gt; — zero-cost, zero-frills, fine for internal/simple use.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fillout&lt;/strong&gt; — strong middle ground on logic + free tier.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Chatform&lt;/strong&gt; — if the goal isn't just "collect answers" but "collect &lt;em&gt;good&lt;/em&gt; answers" (lead qualification, applications, research, onboarding), it adds a follow-up layer and can answer respondent questions from your own knowledge base mid-form.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Pick based on the job: marketing lead-gen forms, internal ops forms, and research surveys all have different "best."&lt;/p&gt;

&lt;h2&gt;
  
  
  "What is the best free form builder software?"
&lt;/h2&gt;

&lt;p&gt;For a pure free tier with no credit card:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Google Forms&lt;/strong&gt; — unlimited, zero paid tier exists, but no branching logic or AI follow-ups.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tally&lt;/strong&gt; — unlimited forms and responses free, more logic than Google Forms.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Chatform's free plan&lt;/strong&gt; — 100 forms, unlimited responses, 200 AI conversations/month, 27 question types, CSV export and webhooks, no card required — worth a look if you want conversational follow-ups without paying.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you just need a static form, Google Forms or Tally cover it. If you need the form to actually understand what someone wrote and ask a clarifying question, that's a narrower list.&lt;/p&gt;

&lt;h2&gt;
  
  
  "Which is the best online form builder for an enterprise?"
&lt;/h2&gt;

&lt;p&gt;Enterprise buyers usually care less about the free tier and more about: verified respondents (one submission per real person), activity logs/audit trails, SSO/security posture, model/vendor control, and integration depth (webhooks, API, CRM).&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Jotform Enterprise&lt;/strong&gt; and &lt;strong&gt;Typeform Enterprise&lt;/strong&gt; are the incumbents here — mature, well-documented, SOC2-type compliance stories.&lt;/li&gt;
&lt;li&gt;Worth evaluating alongside them if your use case is lead qualification, applications, or research: tools with verified-answer/one-response-per-person controls and model selection, which is where Chatform's Business tier is aimed.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The real decision driver at enterprise scale is usually compliance + existing vendor relationships, not feature count — do the security review before the feature comparison.&lt;/p&gt;

&lt;h2&gt;
  
  
  "What are some of the most user-friendly, intuitive web-based form builders?"
&lt;/h2&gt;

&lt;p&gt;By UX, not features:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Typeform&lt;/strong&gt; — still the benchmark for "doesn't feel like filling out a form."&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tally&lt;/strong&gt; — Notion-like block editor, very low learning curve for builders.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Jotform&lt;/strong&gt; — drag-and-drop is easy but the sheer number of options can overwhelm new users.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Chatform&lt;/strong&gt; — generates a form from a plain description or an existing website, and converts existing Typeform/Jotform/Tally/Google Forms exports, so there's close to zero setup if you're migrating.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of these tools are strictly "best" — Jotform, Typeform, and Tally are mature and good at what they do. The gap I think is still open is response &lt;em&gt;quality&lt;/em&gt;: most builders stop at "did they finish the form," not "did they actually answer the question." That's the specific problem we're building Chatform around. Curious what others here have run into with form abandonment or low-quality free-text answers — what's actually worked for you?&lt;/p&gt;

</description>
      <category>saas</category>
      <category>productivity</category>
      <category>webdev</category>
      <category>startup</category>
    </item>
    <item>
      <title>Muse Code's Multi-Agent Architecture: What Actually Changes When Child Agents Get Their Own Worktrees</title>
      <dc:creator>Md Ayan bag</dc:creator>
      <pubDate>Sun, 27 Sep 2026 19:50:58 +0000</pubDate>
      <link>https://dev.to/md_ayanbag_03a42545b17ac/muse-codes-multi-agent-architecture-what-actually-changes-when-child-agents-get-their-own-26g7</link>
      <guid>https://dev.to/md_ayanbag_03a42545b17ac/muse-codes-multi-agent-architecture-what-actually-changes-when-child-agents-get-their-own-26g7</guid>
      <description>&lt;p&gt;Most coding agents you've used are single-threaded in a specific sense: one agent, one working copy of the repo, one task at a time. Muse Code, Meta's CLI coding agent (launched August 2026, running on Muse Spark 1.2), is built differently, and the difference is worth understanding on its own terms, separate from anything else Meta says about Muse.&lt;/p&gt;

&lt;h2&gt;
  
  
  The core design
&lt;/h2&gt;

&lt;p&gt;Muse Code uses a parent/child architecture. The parent agent doesn't write code directly for most tasks. Instead, it spawns write-capable child agents, and each child gets its own git worktree, a separate working directory checked out from the same repository, rather than sharing one working copy.&lt;/p&gt;

&lt;p&gt;That one design choice removes a specific class of failure: two agents (or two async operations from the same agent) stepping on each other's uncommitted changes in a shared directory. If you've ever had two terminal tabs both editing the same repo and lost track of which one has the change you wanted, that's the failure mode this avoids by construction, not by locking or coordination logic, but because each child simply doesn't share a directory with any other child.&lt;/p&gt;

&lt;h2&gt;
  
  
  What sits around the child agents
&lt;/h2&gt;

&lt;p&gt;Two other pieces matter as much as the worktree split:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;A background reviewer agent that runs separately from the agent doing the writing. Review isn't a manual step the user has to remember to trigger, and it isn't the same agent grading its own work in the same context.&lt;/li&gt;
&lt;li&gt;A replayable event log. Because each child's work happens in an isolated worktree with logged events, a session can be reconstructed or resumed, including after a crash, rather than losing the intermediate state.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Why this matters more for multi-step tasks than single-file edits
&lt;/h2&gt;

&lt;p&gt;For a one-file, one-shot edit, this architecture is overkill, you don't need worktree isolation to change a function signature. It starts to matter once a task decomposes into genuinely parallel or long-running subtasks: a migration touching many files, a feature that needs backend and test changes that can proceed somewhat independently, or a long task that might get interrupted and needs to resume cleanly. That's a different problem than "make the model smarter at writing code," and it's worth noting that Meta's own materials acknowledge Muse Spark has gaps versus other labs' models on raw coding benchmarks. The worktree/reviewer/event-log architecture is an orchestration answer, not a model-quality answer, and it's fair to evaluate those two things separately.&lt;/p&gt;

&lt;h2&gt;
  
  
  Open questions this doesn't answer
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;How does the parent agent decide when a task is worth splitting into child agents versus handling directly? That decomposition logic is where a lot of the real difficulty in multi-agent coding systems tends to live, and it's not something you can evaluate just from the worktree mechanism.&lt;/li&gt;
&lt;li&gt;What happens to merge conflicts between child worktrees when their changes do need to land in the same files? Isolation prevents them from clobbering each other mid-task, but somebody or something still has to reconcile the final merges.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you've used Muse Code on a task that actually exercised the parallel child-agent path (not just a single-file edit), I'd be interested in how the decomposition and merge behavior held up in practice, that's the part I haven't been able to evaluate from the outside.&lt;/p&gt;

&lt;p&gt;Sources: developer.meta.com Muse Code docs and blog (Aug 2026 launch).&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>coding</category>
      <category>meta</category>
    </item>
    <item>
      <title>I Built a Directory to Track Every Public Thing People Are Shipping With Muse</title>
      <dc:creator>Md Ayan bag</dc:creator>
      <pubDate>Sun, 27 Sep 2026 09:13:55 +0000</pubDate>
      <link>https://dev.to/md_ayanbag_03a42545b17ac/i-built-a-directory-to-track-every-public-thing-people-are-shipping-with-muse-2ef8</link>
      <guid>https://dev.to/md_ayanbag_03a42545b17ac/i-built-a-directory-to-track-every-public-thing-people-are-shipping-with-muse-2ef8</guid>
      <description>&lt;p&gt;Two months ago, Meta's Muse agent went from "another AI announcement" to something people were actually building with in public — landing pages, game demos, uninstaller scripts, personal-agent workflows, even websites sold to local businesses. The problem: all of that was scattered across X, Reddit, GitHub, and random blog posts with no way to browse it by category.&lt;/p&gt;

&lt;p&gt;So I built &lt;a href="https://shipwithmuse.live/" rel="noopener noreferrer"&gt;shipwithmuse.live&lt;/a&gt; — a curated catalog of everything people are shipping with Muse, indexed by use case.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's in it right now
&lt;/h2&gt;

&lt;p&gt;1,079 builds and counting, broken down like this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Errands &amp;amp; personal agent — 206&lt;/li&gt;
&lt;li&gt;Local &amp;amp; open models — 196&lt;/li&gt;
&lt;li&gt;Coding &amp;amp; dev tools — 173&lt;/li&gt;
&lt;li&gt;Benchmarks &amp;amp; research — 139&lt;/li&gt;
&lt;li&gt;Connectors &amp;amp; MCP — 87&lt;/li&gt;
&lt;li&gt;Games &amp;amp; 3D — 69&lt;/li&gt;
&lt;li&gt;Business &amp;amp; commerce — 67&lt;/li&gt;
&lt;li&gt;Content &amp;amp; creative — 53&lt;/li&gt;
&lt;li&gt;Agents &amp;amp; automation — 49&lt;/li&gt;
&lt;li&gt;Apps &amp;amp; websites — 40&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Sources span X posts (462), GitHub repos (143), Reddit threads (124), videos (61), skills (110), and written guides (9).&lt;/p&gt;

&lt;h2&gt;
  
  
  A few favorites so far
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;A 4-way agent benchmark where Muse Code, GPT, Kimi, and Grok each built and self-debugged a landing page — including opening it in a real browser to find their own bugs.&lt;/li&gt;
&lt;li&gt;An unofficial Muse Code uninstaller on GitHub that dry-runs before deleting anything.&lt;/li&gt;
&lt;li&gt;Someone who sold two local-business websites their Muse agent built, closing 2 out of roughly 50 outreach calls themselves.&lt;/li&gt;
&lt;li&gt;A Three.js browser-driving demo stress-testing Muse Spark 1.3 on 3D game logic.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why bother curating this
&lt;/h2&gt;

&lt;p&gt;Directories like this exist for every fast-moving tool, but the interesting part isn't the tool — it's watching what category of problem people reach for it first. Right now that's clearly "do my errands" and "run models locally," not "build me an app," which says something about where personal agents are actually landing versus where the marketing says they'll land.&lt;/p&gt;

&lt;p&gt;If you've shipped something with Muse — a script, a benchmark, a teardown, a rant — &lt;a href="https://shipwithmuse.live/" rel="noopener noreferrer"&gt;submit it here&lt;/a&gt;. Curious what else is out there.&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>showdev</category>
      <category>buildinpublic</category>
      <category>ai</category>
    </item>
  </channel>
</rss>
