<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Disk Whisk blog</title>
    <link>https://diskwhisk.com/blog/</link>
    <atom:link href="https://diskwhisk.com/blog/rss.xml" rel="self" type="application/rss+xml" />
    <description>Measurements, methods and plain guides to what fills a Mac and what’s safe to clear.</description>
    <language>en</language>
    <lastBuildDate>Tue, 20 Oct 2026 00:00:00 GMT</lastBuildDate>
    <item>
      <title>A developer’s Mac disk audit: Xcode, Docker, node_modules, Rust, Gradle and Homebrew</title>
      <link>https://diskwhisk.com/blog/mac-developer-disk-space-checklist/</link>
      <guid isPermaLink="true">https://diskwhisk.com/blog/mac-developer-disk-space-checklist/</guid>
      <pubDate>Tue, 20 Oct 2026 00:00:00 GMT</pubDate>
      <description>Where Xcode, Docker, Node, Rust, Gradle and Homebrew keep their gigabytes on a Mac, how to clean each one safely, and a read-only script that sizes them all.</description>
      <content:encoded><![CDATA[<p>A Mac used for development fills up in places Finder doesn’t show: build folders in every project, package caches in hidden folders, and container disk images whose reported size isn’t what they use. Most of it rebuilds itself. Some of it doesn’t.</p>
<p>Below is each of those places: where it lives, how to measure it, what’s safe to delete and the tool’s own cleanup command. First, though, a short read-only script that measures all of them at once, so you clean what’s big on your Mac rather than what a generic guide lists.</p>
<h2 id="the-checklist">The checklist</h2>
<div class="post-table"><table>
<thead>
<tr>
<th>What</th>
<th>Where</th>
<th>Comes back?</th>
<th>Clean up with</th>
</tr>
</thead>
<tbody><tr>
<td>Xcode build data</td>
<td><code>~/Library/Developer/Xcode/DerivedData</code></td>
<td>Yes, next build</td>
<td>Delete a project’s folder</td>
</tr>
<tr>
<td>Xcode archives</td>
<td><code>~/Library/Developer/Xcode/Archives</code></td>
<td>No</td>
<td>Window &gt; Organizer</td>
</tr>
<tr>
<td>Device symbols</td>
<td><code>~/Library/Developer/Xcode/iOS DeviceSupport</code></td>
<td>Yes, on reconnect</td>
<td>Delete old OS versions</td>
</tr>
<tr>
<td>Simulators</td>
<td><code>~/Library/Developer/CoreSimulator/Devices</code></td>
<td>No</td>
<td><code>xcrun simctl delete unavailable</code></td>
</tr>
<tr>
<td>Simulator runtimes</td>
<td>Outside your home folder</td>
<td>Re-downloadable</td>
<td>Xcode &gt; Settings &gt; Components</td>
</tr>
<tr>
<td>Docker Desktop</td>
<td><code>~/Library/Containers/com.docker.docker</code></td>
<td>Images yes, volumes no</td>
<td><code>docker system prune</code></td>
</tr>
<tr>
<td>OrbStack</td>
<td><code>~/Library/Group Containers/HUAQ24HBR6.dev.orbstack</code></td>
<td>Images yes, volumes no</td>
<td>The same <code>docker</code> commands</td>
</tr>
<tr>
<td>node_modules</td>
<td>Every JavaScript project</td>
<td>Yes, on install</td>
<td>Delete, then <code>npm ci</code></td>
</tr>
<tr>
<td>npm, Yarn, pnpm</td>
<td><code>~/.npm</code>, <code>~/Library/Caches/Yarn</code>, <code>~/.yarn/berry</code>, <code>~/Library/pnpm/store</code></td>
<td>Re-downloaded</td>
<td><code>npm cache clean --force</code>, <code>yarn cache clean</code>, <code>pnpm store prune</code></td>
</tr>
<tr>
<td>Rust builds</td>
<td><code>target</code> in every Rust project</td>
<td>Yes, next build</td>
<td><code>cargo clean</code></td>
</tr>
<tr>
<td>Cargo downloads</td>
<td><code>~/.cargo/registry</code>, <code>~/.cargo/git</code></td>
<td>Re-downloaded</td>
<td>Automatic since Rust 1.88</td>
</tr>
<tr>
<td>Rust toolchains</td>
<td><code>~/.rustup/toolchains</code></td>
<td>Reinstallable</td>
<td><code>rustup toolchain uninstall</code></td>
</tr>
<tr>
<td>Gradle</td>
<td><code>~/.gradle/caches</code>, <code>~/.gradle/wrapper/dists</code></td>
<td>Re-downloaded</td>
<td>Automatic, or delete with daemons stopped</td>
</tr>
<tr>
<td>Android emulators</td>
<td><code>~/Library/Android/sdk/system-images</code>, <code>~/.android/avd</code></td>
<td>Images yes, emulator data no</td>
<td>SDK Manager, Device Manager</td>
</tr>
<tr>
<td>Homebrew</td>
<td><code>~/Library/Caches/Homebrew</code>, old versions</td>
<td>Downloads yes</td>
<td><code>brew cleanup</code></td>
</tr>
<tr>
<td>CocoaPods, pip, uv, Go</td>
<td>See the last section</td>
<td>Re-downloaded</td>
<td>Each tool’s cache command</td>
</tr>
</tbody></table></div>
<p>“Comes back” means the tool recreates it when it next needs it, at the cost of time and bandwidth. “No” means deleting it loses something for good.</p>
<h2 id="measure-first-with-one-read-only-script">Measure first with one read-only script</h2>
<p>Save this as <code>dev-disk-audit.sh</code>:</p>
<pre><code class="language-sh">#!/bin/bash
# dev-disk-audit.sh: size the usual developer storage on a Mac, largest first.
# Read-only: it sizes things with du, find and test, and changes nothing.
#
#   bash dev-disk-audit.sh [projects folder]     (zsh dev-disk-audit.sh works too)
#
# The projects folder (default: your home folder) is searched for node_modules
# and Cargo target folders. Hidden folders, ~/Library and ~/go/pkg are skipped
# there. Sizes are space allocated on disk, in decimal GB and MB like Finder.

root=${1:-$HOME}
L=$HOME/Library

# Print &quot;KB&lt;tab&gt;label&lt;tab&gt;path&quot; if the path exists; stay silent if it doesn&#39;t.
measure() {
  if [ -e &quot;$2&quot; ]; then
    printf &#39;%s\t%s\t%s\n&#39; &quot;$(du -sk &quot;$2&quot; 2&gt;/dev/null | cut -f1)&quot; &quot;$1&quot; &quot;$2&quot;
  fi
}

# One &quot;KB&lt;tab&gt;path&quot; line per node_modules folder, and per target folder that
# Cargo has tagged with CACHEDIR.TAG (other tools&#39; target folders are left out).
projects=$(find &quot;$root&quot; -mindepth 1 \
  \( -name &#39;.*&#39; -o -path &quot;$L&quot; -o -path &quot;$HOME/go/pkg&quot; \) -prune -o \
  -type d -name node_modules -prune -exec du -sk {} + -o \
  -type d -name target -prune -exec test -f {}/CACHEDIR.TAG \; -exec du -sk {} + \
  2&gt;/dev/null)

# Print size lines as a table: &quot;KB&lt;tab&gt;label&lt;tab&gt;path&quot; or &quot;KB&lt;tab&gt;path&quot;.
table=&#39;function size(k) { b = k * 1024
    return b &gt;= 1e9 ? sprintf(&quot;%7.1f GB&quot;, b / 1e9) : sprintf(&quot;%7.1f MB&quot;, b / 1e6) }
  function short(p) { return index(p, home) == 1 ? &quot;~&quot; substr(p, length(home) + 1) : p }
  NF &lt; 2 { next }
  { sum += $1
    if (NF == 2) printf &quot;%s  %s\n&quot;, size($1), short($2)
    else printf &quot;%s  %-28s %s\n&quot;, size($1), $2, short($3) }
  END { if (total) printf &quot;%s  Total measured\n&quot;, size(sum) }&#39;

printf &#39;Developer storage, largest first\n\n&#39;
{
  measure &quot;Xcode DerivedData&quot;          &quot;$L/Developer/Xcode/DerivedData&quot;
  measure &quot;Xcode Archives&quot;             &quot;$L/Developer/Xcode/Archives&quot;
  measure &quot;iOS device support&quot;         &quot;$L/Developer/Xcode/iOS DeviceSupport&quot;
  measure &quot;watchOS device support&quot;     &quot;$L/Developer/Xcode/watchOS DeviceSupport&quot;
  measure &quot;Simulator devices&quot;          &quot;$L/Developer/CoreSimulator/Devices&quot;
  measure &quot;Simulator caches&quot;           &quot;$L/Developer/CoreSimulator/Caches&quot;
  measure &quot;Docker Desktop disk image&quot;  &quot;$L/Containers/com.docker.docker/Data/vms/0/data/Docker.raw&quot;
  measure &quot;OrbStack disk image&quot;        &quot;$L/Group Containers/HUAQ24HBR6.dev.orbstack/data/data.img&quot;
  measure &quot;OrbStack disk image&quot;        &quot;$L/Group Containers/HUAQ24HBR6.dev.orbstack/data/data.img.raw&quot;
  measure &quot;npm cache&quot;                  &quot;$HOME/.npm&quot;
  measure &quot;Yarn 1 cache&quot;               &quot;$L/Caches/Yarn&quot;
  measure &quot;Yarn 2+ global cache&quot;       &quot;$HOME/.yarn/berry/cache&quot;
  measure &quot;pnpm store&quot;                 &quot;$L/pnpm/store&quot;
  measure &quot;Cargo registry&quot;             &quot;$HOME/.cargo/registry&quot;
  measure &quot;Cargo git dependencies&quot;     &quot;$HOME/.cargo/git&quot;
  measure &quot;Rust toolchains&quot;            &quot;$HOME/.rustup/toolchains&quot;
  measure &quot;Gradle caches&quot;              &quot;$HOME/.gradle/caches&quot;
  measure &quot;Gradle wrapper downloads&quot;   &quot;$HOME/.gradle/wrapper/dists&quot;
  measure &quot;Android system images&quot;      &quot;$L/Android/sdk/system-images&quot;
  measure &quot;Android emulators (AVDs)&quot;   &quot;$HOME/.android/avd&quot;
  measure &quot;Homebrew downloads&quot;         &quot;$L/Caches/Homebrew&quot;
  measure &quot;Homebrew packages&quot;          &quot;/opt/homebrew/Cellar&quot;
  measure &quot;Homebrew packages&quot;          &quot;/usr/local/Cellar&quot;
  measure &quot;CocoaPods cache&quot;            &quot;$L/Caches/CocoaPods&quot;
  measure &quot;pip cache&quot;                  &quot;$L/Caches/pip&quot;
  measure &quot;uv cache&quot;                   &quot;$HOME/.cache/uv&quot;
  measure &quot;Go module cache&quot;            &quot;$HOME/go/pkg/mod&quot;
  measure &quot;Go build cache&quot;             &quot;$L/Caches/go-build&quot;
  printf &#39;%s\n&#39; &quot;$projects&quot; | awk -F&#39;\t&#39; -v r=&quot;$root&quot; &#39;
    $2 ~ /\/node_modules$/ { n += $1; nc++ }
    $2 ~ /\/target$/       { t += $1; tc++ }
    END { if (nc) printf &quot;%.0f\tnode_modules folders (%d)\t%s\n&quot;, n, nc, r
          if (tc) printf &quot;%.0f\tRust target folders (%d)\t%s\n&quot;, t, tc, r }&#39;
} | sort -rn | awk -F&#39;\t&#39; -v home=&quot;$HOME&quot; -v total=1 &quot;$table&quot;

if [ -n &quot;$projects&quot; ]; then
  printf &#39;\nLargest project folders\n\n&#39;
  printf &#39;%s\n&#39; &quot;$projects&quot; | sort -rn | head -n 10 |
    awk -F&#39;\t&#39; -v home=&quot;$HOME&quot; -v total=0 &quot;$table&quot;
fi
</code></pre>
<p>Then run it with the folder that holds your projects:</p>
<pre><code class="language-sh">bash dev-disk-audit.sh ~/code
</code></pre>
<p>It runs under the zsh and bash 3.2 that come with macOS, installs nothing and only reads: <code>du</code>, <code>find</code> and <code>test</code> look at your files, and <code>sort</code> and <code>awk</code> print the table. Paths that don’t exist are skipped. Without a folder argument it searches your whole home folder, which is slower, and macOS may ask before Terminal reads Desktop, Documents or Downloads.</p>
<p>Some choices in it are deliberate:</p>
<ul>
<li><strong>Allocated space, not apparent size.</strong> Docker’s and OrbStack’s disk images are sparse files: <code>ls -l</code> shows what they could grow to, <code>du</code> shows what they occupy.</li>
<li><strong>A <code>target</code> folder counts only if Cargo tagged it</strong> with <code>CACHEDIR.TAG</code>, a cross-tool convention meaning “everything in here can be regenerated”. Maven builds into <code>target</code> folders too, and those stay out of the Rust total.</li>
<li><strong>OrbStack’s disk image is sized as a file</strong>, not by listing its folder. On macOS 15 and later, reading inside another app’s group container can trigger a permission prompt.</li>
</ul>
<p>Two caveats. <code>du</code> counts a hard-linked file once per run but counts every APFS clone in full, and on macOS pnpm clones files from its store into node_modules by default, so read the total as an upper bound. And simulator runtimes live outside your home folder; the next section shows how to size them.</p>
<h2 id="xcode">Xcode</h2>
<h3 id="deriveddata">DerivedData</h3>
<p><code>~/Library/Developer/Xcode/DerivedData</code> holds build products, intermediate files and logs, mostly one folder per project. Deleting a project’s folder costs a full rebuild and nothing else. Quit Xcode first. If you’ve moved it, Xcode &gt; Settings &gt; Locations shows where.</p>
<h3 id="archives">Archives</h3>
<p>Product &gt; Archive saves to <code>~/Library/Developer/Xcode/Archives</code>, and nothing recreates an archive once it’s gone. Each one holds your app’s binaries and their <code>dSYM</code> files, and Apple’s documentation says to keep the archive for every build you distribute, or you may not be able to diagnose its crash reports. Review them in Window &gt; Organizer, delete archives for builds that never shipped, and move the rest to another disk if you need the space.</p>
<h3 id="device-support">Device support</h3>
<p>When you connect an iPhone, iPad or Apple Watch, Xcode copies its system symbols into <code>~/Library/Developer/Xcode/iOS DeviceSupport</code> (or <code>watchOS DeviceSupport</code>, and so on) so it can symbolicate system frameworks in crash reports. Each OS release and device model gets its own set.</p>
<p>Sets for versions you no longer test against are reasonable to delete. Xcode copies them again when a device on that version connects, and <code>xcodebuild -prepareDeviceSupport</code> can fetch them on request. Keep any you need for symbolicating your users’ crash reports.</p>
<h3 id="simulators-and-runtimes">Simulators and runtimes</h3>
<p>Each simulator keeps its installed apps and data in <code>~/Library/Developer/CoreSimulator/Devices</code>, and deleting a simulator deletes everything in it. List first:</p>
<pre><code class="language-sh">xcrun simctl list devices
xcrun simctl delete unavailable
</code></pre>
<p>The second command removes only the simulators your current Xcode SDK doesn’t support.</p>
<p>Runtimes, the system images that simulators boot, are stored outside your home folder, so ask <code>simctl</code> about them:</p>
<pre><code class="language-sh">xcrun simctl runtime list
xcrun simctl runtime delete &lt;identifier&gt;
</code></pre>
<p><code>list</code> ends with their total size. Xcode &gt; Settings &gt; Components does the same job (click the info button next to a runtime, then Delete) and can download older runtimes again. Run <code>xcrun simctl runtime</code> on its own to see what your Xcode version supports; current versions can preview a cleanup with <code>delete --notUsedSinceDays &lt;days&gt; --dry-run</code>.</p>
<h2 id="docker-desktop-and-orbstack">Docker Desktop and OrbStack</h2>
<p>Start with Docker’s own accounting:</p>
<pre><code class="language-sh">docker system df
docker system df -v
</code></pre>
<p>It splits usage into images, containers, local volumes and build cache, with a RECLAIMABLE column for space nothing is using; <code>-v</code> lists every item. Then prune, narrowest first: <code>docker builder prune</code> removes only the build cache, <code>docker image prune -a</code> removes every image no container uses, and <code>docker system prune</code> removes stopped containers, unused networks, dangling images and the build cache. Each asks for confirmation unless you add <code>-f</code>:</p>
<pre><code class="language-sh">docker builder prune
docker image prune -a
docker system prune
</code></pre>
<p>Images and build cache come back when you pull or build again. Stopped containers don’t, and neither does anything you changed inside them. Volumes are the real risk: they hold databases and other container state, and removing them is permanent. The commands above leave volumes alone, but <code>docker system prune --volumes</code> adds anonymous volumes, and <code>docker volume prune -a</code> also removes named volumes that no container is using. Check <code>docker volume ls</code> first.</p>
<h3 id="docker-desktop-s-disk-image">Docker Desktop’s disk image</h3>
<p>Docker Desktop keeps all of this in one sparse file, <code>Docker.raw</code>, in <code>~/Library/Containers/com.docker.docker/Data/vms/0/data</code>. Settings &gt; Resources &gt; Advanced shows its location, its maximum size and what it actually uses, while some tools report only the maximum. In Terminal:</p>
<pre><code class="language-sh">ls -klsh ~/Library/Containers/com.docker.docker/Data/vms/0/data/Docker.raw
</code></pre>
<p>The first column is the space it occupies; the size column further along is the maximum.</p>
<p>Does it shrink? Docker’s current documentation says deleting images frees space on your Mac, though it can take a few minutes to show, while deleting files inside a running container doesn’t free it automatically. To reclaim space on demand, Docker documents this command:</p>
<pre><code class="language-sh">docker run --privileged --pid=host docker/desktop-reclaim-space
</code></pre>
<p>Don’t move or delete <code>Docker.raw</code> in Finder, because Docker Desktop can lose track of it; change its location in Settings instead. And lowering the Disk image size slider deletes the current image, with every container and image inside.</p>
<h3 id="orbstack">OrbStack</h3>
<p>OrbStack keeps images, containers and Linux machines in a sparse disk image (<code>data.img</code> or <code>data.img.raw</code>) in <code>~/Library/Group Containers/HUAQ24HBR6.dev.orbstack/data</code>. Its documentation explains that the file can show an apparent size of 8 TB while using only what you store, and that it shrinks automatically when you delete data. <code>du -h</code> on the file, or “size on disk” in Finder’s Get Info window, gives the real figure.</p>
<p>OrbStack creates a Docker context called <code>orbstack</code>, so the commands above work against it. If you run more than one engine, <code>docker context ls</code> shows which one your commands reach, and <code>docker --context orbstack system df</code> asks OrbStack directly.</p>
<h2 id="nodemodules-and-package-caches">node_modules and package caches</h2>
<p>Every JavaScript project carries its own node_modules. To list them by size:</p>
<pre><code class="language-sh">find ~/code -type d -name node_modules -prune -exec du -sh {} + | sort -h
</code></pre>
<p><code>-prune</code> stops <code>find</code> from descending into each one, so nested node_modules aren’t counted twice. Deleting a project’s node_modules is safe while its <code>package.json</code> and lockfile are intact: <code>npm ci</code> reinstalls exactly what <code>package-lock.json</code> specifies, and <code>pnpm install</code> or <code>yarn install</code> rebuild it for those tools.</p>
<p>The shared caches:</p>
<ul>
<li><strong>npm</strong> keeps its cache in <code>~/.npm</code> (<code>npm config get cache</code> confirms it). npm’s documentation calls the cache self-healing and says clearing it should only be needed to reclaim disk space. <code>npm cache verify</code> garbage-collects data that isn’t needed; <code>npm cache clean --force</code> empties it.</li>
<li><strong>Yarn 1</strong>: <code>yarn cache dir</code> prints the location, under <code>~/Library/Caches/Yarn</code> on a Mac, and <code>yarn cache clean</code> empties it. <strong>Yarn 2 and later</strong> keep a global cache in <code>~/.yarn/berry/cache</code> by default, and <code>yarn cache clean --mirror</code> clears it.</li>
<li><strong>pnpm</strong> keeps one content-addressable store, <code>~/Library/pnpm/store</code> on macOS (<code>pnpm store path</code> prints it). <code>pnpm store prune</code> removes packages no project references. pnpm’s documentation calls that harmless but suggests not running it too often, since switching to an older branch may need those packages again.</li>
</ul>
<h2 id="rust">Rust</h2>
<p>Every Cargo workspace builds into a <code>target</code> folder at its root. <code>cargo clean</code> deletes it, and the next build compiles everything again; in current Cargo, <code>cargo clean --dry-run</code> shows what would go. To find every Rust build folder without catching other tools’ <code>target</code> folders, look for Cargo’s tag:</p>
<pre><code class="language-sh">find ~/code -type d -name target -prune -exec test -f {}/CACHEDIR.TAG \; -exec du -sh {} + | sort -h
</code></pre>
<p>Cargo’s shared downloads live in <code>~/.cargo/registry</code> (the index, downloaded <code>.crate</code> archives in <code>cache</code> and unpacked sources in <code>src</code>) and <code>~/.cargo/git</code>. The Cargo Book says you can remove any part of this cache and Cargo will restore what a build needs. Since Rust 1.88, Cargo also cleans it on its own, removing files downloaded from the network after three months without use and files from your own system after one month. Leave <code>~/.cargo/bin</code> alone: it holds the tools you installed with <code>cargo install</code>.</p>
<p>Installed toolchains live in <code>~/.rustup/toolchains</code>. <code>rustup toolchain list</code> shows them, and <code>rustup toolchain uninstall &lt;name&gt;</code> removes old nightlies or pinned versions you no longer build with.</p>
<h2 id="gradle-and-android">Gradle and Android</h2>
<p>Gradle’s user home, <code>~/.gradle</code>, keeps downloaded dependencies and build caches in <code>caches</code> and wrapper distributions in <code>wrapper/dists</code>. Gradle prunes these itself: by default it checks every 24 hours and removes entries unused for 30 days (downloaded resources, released wrapper distributions) or 7 days (created resources, the build cache).</p>
<p>In a project, <code>./gradlew clean</code> deletes the build directory. To clear the shared cache entirely, run <code>./gradlew --stop</code> to stop that Gradle version’s daemons, then delete <code>~/.gradle/caches</code>. The next build downloads its dependencies again, and offline builds fail until it has.</p>
<p>Android emulators use two kinds of storage:</p>
<ul>
<li><strong>System images</strong> live in the SDK, by default <code>~/Library/Android/sdk/system-images</code>. In Android Studio’s SDK Manager (Tools &gt; SDK Manager), which also shows the SDK’s real location, clear the checkbox next to an image you no longer use and click Apply. You can download it again later.</li>
<li><strong>Each emulator’s own data</strong>, its installed apps and settings, lives in <code>~/.android/avd</code>. In Device Manager, an emulator’s ⋮ menu has Wipe Data, which resets it to new, and Delete, which removes it. Both are permanent.</li>
</ul>
<h2 id="homebrew">Homebrew</h2>
<p><code>brew --cache</code> prints the download cache, <code>~/Library/Caches/Homebrew</code> by default. <code>brew cleanup</code> removes old versions of installed formulae, stale lock files and downloads older than 120 days (<code>HOMEBREW_CLEANUP_MAX_AGE_DAYS</code> changes that). Preview it first with <code>-n</code>, which only shows what would be removed. <code>--prune=all</code> removes all cached files, whatever their age, and <code>brew autoremove -n</code> lists dependencies nothing needs any more:</p>
<pre><code class="language-sh">brew cleanup -n
brew cleanup
brew cleanup --prune=all
brew autoremove -n
</code></pre>
<p>Unless <code>HOMEBREW_NO_INSTALL_CLEANUP</code> is set, Homebrew already cleans up the packages involved after <code>brew install</code>, <code>upgrade</code> and <code>reinstall</code>, and everything every 30 days. <code>brew autoremove</code> without <code>-n</code> uninstalls formulae that were only installed as dependencies and are no longer needed. Installed packages live in <code>$(brew --prefix)/Cellar</code>; remove them with <code>brew uninstall</code>, not by deleting folders.</p>
<h2 id="other-caches-worth-checking">Other caches worth checking</h2>
<ul>
<li><strong>CocoaPods</strong>: <code>~/Library/Caches/CocoaPods</code>. <code>pod cache list</code> shows what’s there, <code>pod cache clean --all</code> empties it, and the next <code>pod install</code> downloads what it needs.</li>
<li><strong>pip</strong>: <code>pip cache dir</code> (<code>~/Library/Caches/pip</code> on macOS), <code>pip cache info</code> for its size and <code>pip cache purge</code> to empty it. pip’s documentation says the cache layout can change between versions, so use these commands rather than deleting files by hand.</li>
<li><strong>uv</strong>: <code>uv cache dir</code> (<code>~/.cache/uv</code>), <code>uv cache prune</code> for unused entries and <code>uv cache clean</code> for everything.</li>
<li><strong>Go</strong>: the module cache is <code>go env GOMODCACHE</code> (<code>~/go/pkg/mod</code> by default) and the build cache is <code>go env GOCACHE</code> (<code>~/Library/Caches/go-build</code> on a Mac). Go creates module cache folders read-only, so <code>rm -r</code> fails part-way; use <code>go clean -modcache</code>. Go trims the build cache itself, and <code>go clean -cache</code> empties it.</li>
</ul>
<h2 id="before-you-delete-anything">Before you delete anything</h2>
<p>Moving something to the Trash in Finder frees its space only when you empty the Trash, while <code>rm -rf</code> and each tool’s own prune and clean commands are permanent. Archives, Docker volumes and stopped containers, simulator and emulator data, and <code>~/.cargo/bin</code> don’t come back. Everything else here rebuilds or downloads again, at the cost of time and bandwidth, so the caches for this week’s projects are usually worth keeping.</p>
<p>Disk Whisk, the Mac app behind this blog, shows the same kind of breakdown without a terminal, including what OrbStack, Docker Desktop, Colima and Lima hold, and clears containers through each engine’s own tools rather than by deleting its disk image.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Final Cut, Logic, Premiere and Lightroom: what’s safe to delete on a creator’s Mac</title>
      <link>https://diskwhisk.com/blog/what-creators-can-delete-on-a-mac/</link>
      <guid isPermaLink="true">https://diskwhisk.com/blog/what-creators-can-delete-on-a-mac/</guid>
      <pubDate>Tue, 20 Oct 2026 00:00:00 GMT</pubDate>
      <description>Render files, caches, previews and sound packs, sorted into what rebuilds itself, what downloads again, and what you can’t get back.</description>
      <content:encoded><![CDATA[<p>If you edit video, make music or shoot photos on a Mac, a lot of your disk isn’t your work. It’s files your apps made from your work: render files, caches, previews, proxies and downloaded sounds. Most of it can go. Some of it can’t, and in the Finder the two look much the same.</p>
<p>This guide shows where each app keeps its big generated files and how to remove them with the app’s own commands. Menu names match Final Cut Pro 12.4, Logic Pro 12.3, GarageBand 10.4.14, Adobe’s current help pages for Premiere, After Effects and Lightroom Classic, and Photos on macOS Tahoe 26.</p>
<h2 id="three-kinds-of-space">Three kinds of space</h2>
<p>Before you delete anything, ask what it will cost to get it back. Everything here falls into one of three groups.</p>
<ul>
<li><strong>Rebuilds itself.</strong> Safe to remove. The app recreates it from your originals, so the cost is time: rendering, re-caching and slower playback for a while.</li>
<li><strong>Re-downloadable.</strong> Safe to remove. It comes back from Apple or iCloud, so the cost is bandwidth and waiting.</li>
<li><strong>Losing this loses work.</strong> Your footage, recordings, photos, projects, catalogs and libraries. Never delete these to make room. If you need the space, move or archive them with the app’s own tools.</li>
</ul>
<div class="post-table"><table>
<thead>
<tr>
<th>App</th>
<th>Item</th>
<th>Group</th>
</tr>
</thead>
<tbody><tr>
<td>Final Cut Pro</td>
<td>Render files</td>
<td>Rebuilds itself</td>
</tr>
<tr>
<td>Final Cut Pro</td>
<td>Optimized and proxy media</td>
<td>Rebuilds itself (when you ask)</td>
</tr>
<tr>
<td>Final Cut Pro</td>
<td>The library, and media it holds or links to</td>
<td>Losing this loses work</td>
</tr>
<tr>
<td>Logic Pro</td>
<td>Downloaded sound packs</td>
<td>Re-downloadable</td>
</tr>
<tr>
<td>GarageBand</td>
<td>Downloaded sounds and loops</td>
<td>Re-downloadable</td>
</tr>
<tr>
<td>Logic Pro, GarageBand</td>
<td>Your projects and recordings</td>
<td>Losing this loses work</td>
</tr>
<tr>
<td>Premiere</td>
<td>Media cache and preview files</td>
<td>Rebuilds itself</td>
</tr>
<tr>
<td>Premiere</td>
<td>Proxies</td>
<td>Rebuilds itself (when you ask)</td>
</tr>
<tr>
<td>After Effects</td>
<td>Disk cache and media cache</td>
<td>Rebuilds itself</td>
</tr>
<tr>
<td>Premiere, After Effects</td>
<td>Projects and source footage</td>
<td>Losing this loses work</td>
</tr>
<tr>
<td>Lightroom Classic</td>
<td>Standard and 1:1 previews, Camera Raw cache</td>
<td>Rebuilds itself</td>
</tr>
<tr>
<td>Lightroom Classic</td>
<td>Smart Previews</td>
<td>Rebuilds itself (while originals are connected)</td>
</tr>
<tr>
<td>Lightroom Classic</td>
<td>The catalog and your original photos</td>
<td>Losing this loses work</td>
</tr>
<tr>
<td>Photos</td>
<td>Full-size originals already in iCloud Photos</td>
<td>Re-downloadable</td>
</tr>
<tr>
<td>Photos</td>
<td>The Photos library</td>
<td>Losing this loses work</td>
</tr>
</tbody></table></div>
<h2 id="use-the-app-not-the-finder">Use the app, not the Finder</h2>
<p>Several of these files sit inside something that looks like a single file in the Finder: a Final Cut Pro library, your Photos library, Logic’s <code>Logic Pro Library.bundle</code>. These are packages, folders that the Finder shows as one item. You can open one with Show Package Contents and delete things inside it. Don’t.</p>
<p>Each app keeps its own record of what’s inside. A Final Cut Pro library tracks your media files, your edits and their metadata, and Adobe’s media cache has a database that links to every cached file. Delete files behind the app’s back and that record no longer matches what’s on disk. Apple’s Photos guide is direct about it: to avoid deleting or corrupting a photo library, don’t access or change its contents in the Finder.</p>
<p>An app’s own command knows which files are safe to remove and updates its records as it goes. Every step below uses one.</p>
<h2 id="final-cut-pro">Final Cut Pro</h2>
<p>The first time you open Final Cut Pro, it creates a library in your Movies folder. Media you import into a library is stored inside it (Apple calls this managed media), and by default so are the files Final Cut Pro generates: render files, optimized media and proxy media.</p>
<h3 id="delete-render-optimized-and-proxy-files">Delete render, optimized and proxy files</h3>
<ol>
<li>Select the library in the Libraries sidebar. To see how much space generated files use, choose <strong>File ▸ Library Properties</strong> (Control-Command-J) and scroll to Cache.</li>
<li>Choose <strong>File ▸ Delete Generated Library Files</strong>.</li>
<li>Select <strong>Delete Render Files</strong>, then choose unused or all render files. Select <strong>Delete Optimized Media</strong> and <strong>Delete Proxy Media</strong> too if you want those gone.</li>
<li>Click OK.</li>
</ol>
<p>There are matching commands for events, projects and clips (<strong>Delete Generated Event Files</strong> and so on) if you only want to clear part of a library. Your original media isn’t touched. Final Cut Pro regenerates render files the next time you work on the project, but you have to recreate optimized and proxy media yourself. The library and clip versions of the command also delete generated files stored outside the library.</p>
<p>Unused render files build up as you change timelines and when you update Final Cut Pro, macOS or plug-ins, so clearing them now and then is a cheap habit.</p>
<h3 id="keep-the-cache-on-another-drive">Keep the cache on another drive</h3>
<p>In Library Properties, click <strong>Modify Settings</strong>. The <strong>Cache</strong> menu sets where render files, analysis files, thumbnails and audio waveforms go. Choose a folder on another drive, and Final Cut Pro asks whether to move your existing render files there.</p>
<h3 id="what-not-to-delete">What not to delete</h3>
<p>The library itself holds your edits and any managed media. If you imported media as external files, the library links to them where they are, and those folders are your originals. Both are in the third group.</p>
<h2 id="logic-pro-and-garageband">Logic Pro and GarageBand</h2>
<h3 id="logic-s-sound-packs">Logic’s sound packs</h3>
<p>In Logic Pro 12, all the sound content lives in one file, <code>Logic Pro Library.bundle</code>, in your Music folder. Apple lists plug-in settings, channel strip settings, patches, Apple Loops and samples among its contents. The sound packs in it are re-downloadable.</p>
<ol>
<li>Choose <strong>Logic Pro ▸ Sound Library</strong>.</li>
<li>Click <strong>Manage Packs</strong> in the upper-left corner. The total space used by installed packs is shown at the top, and each pack’s size is in the list.</li>
<li>Click <strong>Delete</strong> next to any pack you don’t use.</li>
</ol>
<p>If a task needs a pack you’ve removed, Logic asks whether to download it. Don’t trash the whole bundle to save space: it holds more than the packs you downloaded.</p>
<h3 id="move-the-sound-library-instead">Move the Sound Library instead</h3>
<p>To keep every sound, move the library to another drive. In the Finder, drag <code>Logic Pro Library.bundle</code> (the whole file, never its contents) to the other drive. This is the one Finder step in this guide, and it’s Apple’s own method. Then choose <strong>Logic Pro ▸ Settings ▸ General</strong>, and under Sound Library click <strong>Locate</strong> and choose the bundle in its new place. Once the copy is on the other drive, you can delete the original from your Music folder.</p>
<p>If you upgraded to Logic Pro 12, Apple says the upgrade cloned your old library into the new bundle without using extra space on your Mac, and that you don’t have to delete the old sound library files to save space. Keep them if you still use an older version of Logic, which can’t read the new bundle.</p>
<h3 id="garageband">GarageBand</h3>
<p>GarageBand can fetch its sounds with <strong>GarageBand ▸ Sound Library ▸ Download All Available Sounds</strong> and repair them with <strong>Reinstall Sound Library</strong>, but Apple’s guide doesn’t describe a way to delete sounds from inside the app. For that, choose <strong>System Settings ▸ General ▸ Storage</strong>, open <strong>Music Creation</strong>, select an item and click Delete. That category lists GarageBand, Logic and MainStage content together, so check what each item is first.</p>
<p>Your Logic projects, GarageBand songs and anything you recorded are in the third group.</p>
<h2 id="premiere-and-after-effects">Premiere and After Effects</h2>
<p>Adobe dropped “Pro” from Premiere’s name with version 26 in January 2026, and its menus now say Premiere.</p>
<h3 id="premiere-s-media-cache">Premiere’s media cache</h3>
<p>When you import footage, Premiere writes cache files, such as conformed audio (.cfa) and peak (.pek) files, to speed up playback. By default they’re in <code>~/Library/Application Support/Adobe/Common</code>, and the cache database is shared with After Effects and Media Encoder.</p>
<ol>
<li>Choose <strong>Premiere ▸ Settings ▸ Media Cache</strong>.</li>
<li>Click <strong>Delete</strong> next to Remove Media Cache Files.</li>
<li>Choose <strong>Delete unused media cache files</strong> (files for source media Premiere can no longer find) or <strong>Delete all media cache files from the system</strong>. For the second, Adobe suggests restarting Premiere and doing it before you open a project.</li>
</ol>
<p>Deleted cache files are recreated when the media needs them, so expect a slower first open on a big project. Under <strong>Media Cache Management</strong> in the same settings, you can have Premiere delete cache files older than a set number of days (90 by default) or once the cache passes a share of the drive (10% by default). Automatic deletion is off until you choose one.</p>
<h3 id="premiere-s-preview-files-and-proxies">Premiere’s preview files and proxies</h3>
<p>Rendering a timeline creates preview files. With the Timeline panel active, choose <strong>Sequence ▸ Delete Render Files</strong>, or <strong>Sequence ▸ Delete Work Area Render Files</strong> for part of it. <strong>File ▸ Project Settings ▸ Scratch Disks</strong> shows where they’re stored. To get smooth playback back, re-render with <strong>Sequence ▸ Render In to Out</strong>.</p>
<p>Premiere doesn’t delete proxies for you. Right-click the clips in the Project panel and choose <strong>Proxy ▸ Detach Proxy</strong>. Adobe notes this leaves the files on disk, because another project might use them. Unless you chose a location, they’re in a folder named <code>Proxies</code> next to your original clips. Delete only that folder: your camera originals sit right beside it.</p>
<h3 id="after-effects-disk-cache">After Effects’ disk cache</h3>
<p>After Effects saves rendered frames to a disk cache that it keeps between sessions. By default the cache can grow to 10% of the drive, up to 100 GB.</p>
<ul>
<li>Choose <strong>After Effects ▸ Settings ▸ Disk</strong> and click <strong>Empty Disk Cache</strong>, or choose <strong>Edit ▸ Purge ▸ All Memory &amp; Disk Cache</strong>.</li>
<li>In the same panel, <strong>Clean Database &amp; Cache</strong> removes media cache files for footage whose source files are no longer available. Connect the drives with your current footage first, or After Effects treats that footage as missing and clears its cache too.</li>
<li><strong>Empty All Caches</strong>, under <strong>After Effects ▸ Settings ▸ Startup &amp; Repair</strong>, clears the disk cache, media cache and database cache together.</li>
</ul>
<h2 id="lightroom-classic">Lightroom Classic</h2>
<p>By default, Lightroom Classic keeps your catalog, <code>Lightroom Catalog.lrcat</code>, in <code>~/Pictures/Lightroom</code>, with two large files beside it: <code>Lightroom Catalog Previews.lrdata</code> and <code>Lightroom Catalog Smart Previews.lrdata</code>. The catalog links to your original photos, which stay wherever you imported them. The catalog and the originals are in the third group. The previews are not.</p>
<h3 id="standard-and-1-1-previews">Standard and 1:1 previews</h3>
<p>Choose <strong>Library ▸ Previews ▸ Discard Standard and 1:1 Previews</strong>. Lightroom Classic recreates them when it needs them, so browsing is slower at first. The 1:1 previews are the big ones: in <strong>Lightroom Classic ▸ Catalog Settings</strong>, set <strong>Automatically Discard 1:1 Previews</strong> so they don’t pile up. Recent versions also let you cap the preview cache size there.</p>
<p>One catch: Adobe warns that previews of photos you’ve archived are lost too. Previews are drawn from the originals, so do this while your photo drives are connected.</p>
<h3 id="smart-previews">Smart Previews</h3>
<p>Smart Previews are smaller, lossy DNG stand-ins that let you edit while your originals are offline. Remove them with <strong>Library ▸ Previews ▸ Discard Smart Previews</strong>, and make them again with <strong>Library ▸ Previews ▸ Build Smart Previews</strong>.</p>
<p>Only discard them while your originals are connected. If the status under the Histogram says Smart Preview rather than Original + Smart Preview, Lightroom Classic can’t find the original, and the Smart Preview may be the only version you can work with.</p>
<h3 id="camera-raw-cache">Camera Raw cache</h3>
<p>Choose <strong>Lightroom Classic ▸ Preferences</strong>, find <strong>Camera Raw Cache Settings</strong> and click <strong>Purge Cache</strong>. Adobe sets this cache to 5 GB by default. Only the Develop module uses it, and it fills again as you edit.</p>
<h2 id="apple-photos">Apple Photos</h2>
<p>Your Photos library is a package in your Pictures folder. If you use iCloud Photos, Photos can make room for you: choose <strong>Photos ▸ Settings</strong>, click <strong>iCloud</strong> and select <strong>Optimize Mac Storage</strong>. Photos then keeps smaller versions on your Mac when storage space is limited, with the full-size originals in iCloud, ready to download again. To bring them all back, select <strong>Download Originals to this Mac</strong>. iCloud Photos stores your whole library in iCloud, so you need iCloud storage for all of it.</p>
<p>If you don’t use iCloud Photos, the library on your Mac may be your only copy. Back it up, and leave it in the third group.</p>
<h2 id="the-short-version">The short version</h2>
<p>Clear what rebuilds itself with each app’s own command. Delete what’s re-downloadable when you can afford to fetch it again. Move or archive your libraries, catalogs, projects and originals, and never delete them to make room.</p>
<p>If you want to see where the space is going first, Disk Whisk shows what’s filling your Mac and explains each item, and anything you approve goes to the Trash.</p>
]]></content:encoded>
    </item>
    <item>
      <title>The best disk cleaners for Mac in 2026, compared</title>
      <link>https://diskwhisk.com/blog/best-disk-cleaners-for-mac/</link>
      <guid isPermaLink="true">https://diskwhisk.com/blog/best-disk-cleaners-for-mac/</guid>
      <pubDate>Tue, 20 Oct 2026 00:00:00 GMT</pubDate>
      <description>Apple’s Storage settings, CleanMyMac, DaisyDisk, OmniDiskSweeper, GrandPerspective, DevCleaner, Mole and Disk Whisk: what each removes, how, and what it costs.</description>
      <content:encoded><![CDATA[<p>A full Mac disk usually has one or two big causes, and the right tool depends on what they are. Below are eight options, from the Storage settings already on your Mac to free disk maps, a Terminal cleaner and paid apps, with who each suits, what it removes and how, whether it explains items, what it costs and which macOS it needs.</p>
<p><strong>How we put this together.</strong> We haven’t run these apps side by side on one Mac. This comparison is based on each tool’s own documentation, store listings and published prices as of October 2026, linked so you can check them. Prices are US list prices, and some vary by region. We make Disk Whisk, one of the apps below, so weigh that section accordingly.</p>
<h2 id="start-with-apple-s-storage-settings">Start with Apple’s Storage settings</h2>
<p>Every Mac already has a free storage tool. Choose Apple menu → System Settings → General → Storage. <a href="https://support.apple.com/guide/mac-help/sysp4ee93ca4/mac">Apple’s guide</a> describes a chart of what each category uses, followed by three recommendations:</p>
<ul>
<li><strong>Store in iCloud</strong> keeps Desktop and Documents files, photos and messages in iCloud, and leaves only recently opened files on the Mac when space is needed.</li>
<li><strong>Optimize Storage</strong> removes Apple TV movies and shows you’ve watched, and keeps only recent email attachments.</li>
<li><strong>Empty Trash automatically</strong> erases items that have been in the Trash for more than 30 days.</li>
</ul>
<p>Below that, categories such as Applications, Documents, iOS Files and Trash have an Info button. <a href="https://support.apple.com/guide/mac-help/syspf5a64aa6/mac">Open one</a>, select a file and click Delete, or click Show in Finder to look first. Apple’s guide doesn’t say whether that Delete goes through the Trash, so read the confirmation before you click. System Data is managed by macOS, and you can’t clear it from here.</p>
<ul>
<li><strong>Suits:</strong> everyone, as a first look.</li>
<li><strong>Explains items:</strong> by category, not folder by folder.</li>
<li><strong>Price:</strong> free, built in.</li>
<li><strong>Needs:</strong> Apple documents this layout for macOS 13 and later.</li>
</ul>
<h2 id="cleanmymac">CleanMyMac</h2>
<p>CleanMyMac is MacPaw’s all-in-one Mac maintenance app. Alongside cleanup it <a href="https://macpaw.com/cleanmymac">covers</a> uninstalling apps, malware scanning, performance tools, duplicate and similar files, cloud storage cleanup and Space Lens, a visual map of your storage. If you want one app for general Mac upkeep and not only disk space, it’s built for that.</p>
<ul>
<li><strong>Removes:</strong> system junk such as caches, logs and language files, plus large and old files, and apps with their leftovers. Its <a href="https://macpaw.com/support/cleanmymac/knowledgebase/system-junk">System Junk scan</a> pre-selects items by rule: for example, all Xcode junk except module caches and archives, and user caches except the Gradle cache. MacPaw’s guide for <a href="https://macpaw.com/support/cleanmymac/knowledgebase/large-and-old">Large &amp; Old Files</a> says those files are deleted permanently, bypassing the Trash. Its other guides don’t say.</li>
<li><strong>Explains items:</strong> results are grouped by type, and a Smart Insights button gives more detail on an unfamiliar item on macOS Tahoe 26 or later with Apple Intelligence turned on.</li>
<li><strong>Price:</strong> a subscription or a one-time purchase, with a 7-day free trial and a 30-day money-back guarantee. MacPaw’s <a href="https://cleanmymac.com/">US site</a> lists plans from $3.33 a month, billed yearly. The <a href="https://apps.apple.com/us/app/cleanmymac/id1339170533?mt=12">Mac App Store listing</a> is a free download with yearly access at $39.99 and monthly at $9.99. Prices vary by plan, region and number of Macs (see the <a href="https://macpaw.com/store/cleanmymac">store</a>).</li>
<li><strong>Needs:</strong> macOS 11 or later.</li>
</ul>
<h2 id="daisydisk">DaisyDisk</h2>
<p><a href="https://daisydiskapp.com/">DaisyDisk</a>, from Software Ambience, draws your disk as an interactive sunburst: rings of folders sized by what they hold. You click into the biggest segment, then the next, until you find what’s using the space. It can also reveal hidden space when it scans as administrator, purge purgeable space, and scan cloud storage such as Dropbox and Google Drive. It suits anyone who thinks in pictures.</p>
<ul>
<li><strong>Removes:</strong> anything you drag into its Collector, once you click Delete. DaisyDisk <a href="https://daisydiskapp.com/guide/4/en/Undelete/">deletes permanently by design</a>, so the space comes back at once: it doesn’t use the Trash, and you get <a href="https://daisydiskapp.com/guide/4/en/DeletingFiles/">5 seconds to cancel</a>.</li>
<li><strong>Explains items:</strong> it shows sizes and lets you preview files; deciding what’s safe is up to you.</li>
<li><strong>Price:</strong> <a href="https://daisydiskapp.com/support/pricing">$9.99 one-time</a> for up to 5 personal Macs, with minor updates included. The <a href="https://daisydiskapp.com/guide/full-vs-trial">free trial</a> scans and browses the map but can’t delete. The <a href="https://apps.apple.com/us/app/daisydisk/id411643860?mt=12">Mac App Store edition</a> is also $9.99, has no trial and <a href="https://daisydiskapp.com/guide/4/en/Editions/">can’t scan as administrator</a>.</li>
<li><strong>Needs:</strong> macOS 10.13 or later for the <a href="https://daisydiskapp.com/specs/">direct download</a>, or macOS 12 or later from the App Store. Apple silicon and Intel.</li>
</ul>
<h2 id="omnidisksweeper">OmniDiskSweeper</h2>
<p>The Omni Group’s <a href="https://www.omnigroup.com/more">OmniDiskSweeper</a> is the plainest tool here: a list of your files and folders, largest first, that you drill down through. Omni made it <a href="https://omnigroup.com/blog/OmniWeb_OmniDazzle_OmniDiskSweeper_and_OmniObjectMeter_now_freeware">freeware in 2009</a> and still updates it. It suits anyone who wants a free, no-frills list.</p>
<ul>
<li><strong>Removes:</strong> whatever you select, by moving it to the Trash.</li>
<li><strong>Explains items:</strong> no. It shows names and sizes.</li>
<li><strong>Price:</strong> free.</li>
<li><strong>Needs:</strong> Omni lists version 1.16 as <a href="https://www.omnigroup.com/releasenotes/omnidisksweeper/1.16">supported on macOS 11 through macOS 26</a>, with older versions for older systems.</li>
</ul>
<h2 id="grandperspective">GrandPerspective</h2>
<p><a href="https://grandperspectiv.sourceforge.net/">GrandPerspective</a>, by Erwin Bonsma, draws your disk as a tree map: each file is a rectangle with an area proportional to its size, so large files stand out at a glance. It’s open source under the GPL. If you want a visual map without paying, this is the one to try.</p>
<ul>
<li><strong>Removes:</strong> files or folders straight from the map, if you turn deletion on in <a href="https://grandperspectiv.sourceforge.net/HelpDocumentation/Preferences.html">Preferences</a> (off, single files or whole folders, with optional confirmation). Deleted items go to the Trash.</li>
<li><strong>Explains items:</strong> no. It shows sizes.</li>
<li><strong>Price:</strong> free from SourceForge, or $2.99 on the <a href="https://apps.apple.com/us/app/grandperspective/id1111570163?mt=12">Mac App Store</a>, which adds automatic updates.</li>
<li><strong>Needs:</strong> macOS 14 or later, Apple silicon or Intel. Version 3.8.1 came out in September 2026.</li>
</ul>
<h2 id="devcleaner-for-xcode">DevCleaner for Xcode</h2>
<p><a href="https://github.com/vashpan/xcode-dev-cleaner">DevCleaner</a>, by Konrad Kołakowski, does one job for anyone who builds with Xcode: it finds the caches Xcode leaves behind, which can run to tens of gigabytes. It’s open source under GPL-3.0.</p>
<ul>
<li><strong>Removes:</strong> device support files, old archives, DerivedData, documentation caches, old simulator and device logs, and old documentation downloads. Its <a href="https://github.com/vashpan/xcode-dev-cleaner/blob/master/DevCleaner/Model/XcodeFiles.swift">source code</a> deletes items directly rather than using the Trash, and a dry-run mode lets you rehearse first.</li>
<li><strong>Explains items:</strong> it groups files by Xcode category, and its README says what each category holds. The author notes it relies on Xcode’s internal folder layout, so a new Xcode can change what it finds.</li>
<li><strong>Price:</strong> free on the <a href="https://apps.apple.com/us/app/devcleaner-for-xcode/id1388020431?mt=12">Mac App Store</a>, with optional tips from $1.99.</li>
<li><strong>Needs:</strong> macOS 14 or later. The latest version, 2.8.0, came out in November 2025.</li>
</ul>
<h2 id="mole">Mole</h2>
<p><a href="https://github.com/tw93/Mole">Mole</a> is an open-source command-line Mac cleaner by the developer Tw93, licensed under GPL-3.0. You install it with Homebrew (<code>brew install mole</code>) and run <code>mo</code>. Its commands include <code>mo clean</code> for caches, logs and leftovers, <code>mo uninstall</code> for apps and their related files, <code>mo analyze</code> for a disk explorer in Terminal, and <code>mo purge</code> for project build folders such as <code>node_modules</code>, <code>target</code> and <code>dist</code>. If you’re at home in Terminal, it covers a lot in one free tool.</p>
<ul>
<li><strong>Removes:</strong> it depends on the command. <code>mo uninstall</code> and <code>mo analyze</code> move items to the Trash after you confirm; <code>mo clean</code>, <code>mo purge</code> and <code>mo installer</code> delete permanently. <code>mo clean</code> also empties your Trash by default, unless you protect it with <code>mo clean --whitelist</code>. <code>clean</code>, <code>uninstall</code>, <code>purge</code> and <code>installer</code> all take <code>--dry-run</code> to preview first, and <code>mo purge</code> leaves anything with activity in the last 7 days unselected.</li>
<li><strong>Explains items:</strong> it groups results by category and gives a reason when it skips something.</li>
<li><strong>Price:</strong> the command-line tool is free. The same developer sells a separate native app, <a href="https://mole.fit/">Mole for Mac</a>, at $19 one-time for 2 Macs. Scanning in it is free, and each paid tool works twice before you need a license.</li>
<li><strong>Needs:</strong> macOS 12 or later for the command-line tool, Apple silicon or Intel. The Mac app needs macOS 14.</li>
</ul>
<h2 id="disk-whisk">Disk Whisk</h2>
<p><a href="https://diskwhisk.com/">Disk Whisk</a> is our app. It explains what’s filling a Mac, including developer storage that disk maps show only as large folders: OrbStack, Docker Desktop, Colima and Lima, virtual machines, build folders and AI models. It’s in public beta.</p>
<ul>
<li><strong>Removes:</strong> only what you approve. Scans are read-only: you approve a plan, each item is checked again just before it moves, and approved items go to the Trash with a receipt you can restore from in History. A few steps are permanent and say so before they run: container images and stopped virtual machines are removed through each tool itself, and Empty Trash deletes for good.</li>
<li><strong>Explains items:</strong> yes. Each item says why it’s there and what happens if it goes, and carries one of three labels: Safe to remove, Review first or Protected.</li>
<li><strong>Price:</strong> free to scan, explore, read every explanation and plan a cleanup. Pro runs cleanups and adds Compress (macOS’s built-in file compression), Storage Story and Maintain. Pro is $20 one-time for the first 500 licenses, then $40, or $20 a year, or $3 a month. Every plan covers 2 Macs. There’s a 7-day Pro trial with no card, and a 30-day refund on one-time and yearly plans (<a href="https://diskwhisk.com/license-policy/">license policy</a>).</li>
<li><strong>Needs:</strong> macOS 14 or later, Apple silicon or Intel.</li>
</ul>
<p>Where others fit better: Disk Whisk covers storage only, so for malware scanning, app uninstalling and performance tools, CleanMyMac does more. If a visual map is the main thing you want, DaisyDisk is built around one, and GrandPerspective and OmniDiskSweeper do the looking for free. On a Mac older than macOS 14, Disk Whisk won’t run.</p>
<h2 id="side-by-side">Side by side</h2>
<div class="post-table"><table>
<thead>
<tr>
<th>Tool</th>
<th>Price (US, Oct 2026)</th>
<th>Best for</th>
<th>Free option</th>
<th>Removes to Trash?</th>
<th>Developer storage?</th>
</tr>
</thead>
<tbody><tr>
<td>Storage settings</td>
<td>Free, built in</td>
<td>A first look and quick wins</td>
<td>Yes</td>
<td>Not stated by Apple</td>
<td>Not covered in Apple’s guide</td>
</tr>
<tr>
<td>CleanMyMac</td>
<td>From $3.33/month billed yearly; one-time option</td>
<td>All-round Mac upkeep</td>
<td>7-day trial</td>
<td>Large &amp; Old Files: no, permanent</td>
<td>Some: Xcode junk, developer caches</td>
</tr>
<tr>
<td>DaisyDisk</td>
<td>$9.99 once, up to 5 Macs</td>
<td>A visual map of your disk</td>
<td>Trial looks but can’t delete</td>
<td>No, permanent by design</td>
<td>Sizes only</td>
</tr>
<tr>
<td>OmniDiskSweeper</td>
<td>Free</td>
<td>A plain largest-first list</td>
<td>Yes</td>
<td>Yes</td>
<td>Sizes only</td>
</tr>
<tr>
<td>GrandPerspective</td>
<td>Free, or $2.99 on the App Store</td>
<td>A free visual map</td>
<td>Yes</td>
<td>Yes</td>
<td>Sizes only</td>
</tr>
<tr>
<td>DevCleaner</td>
<td>Free, optional tips</td>
<td>Xcode caches</td>
<td>Yes</td>
<td>No, deletes directly</td>
<td>Xcode only</td>
</tr>
<tr>
<td>Mole</td>
<td>Free CLI; Mac app $19 once</td>
<td>Terminal users</td>
<td>Yes</td>
<td>Depends on the command</td>
<td>Build folders, developer caches</td>
</tr>
<tr>
<td>Disk Whisk</td>
<td>Free to scan; Pro $20 once for the first 500, then $40, or $20/year, or $3/month</td>
<td>Developer Macs, explained items</td>
<td>Scan, explore and plan; 7-day Pro trial</td>
<td>Yes, except a few permanent steps that ask first</td>
<td>Containers, VMs, build folders, AI models</td>
</tr>
</tbody></table></div>
<h2 id="which-one-should-you-use">Which one should you use?</h2>
<h3 id="you-want-space-back-today-without-installing-anything">You want space back today without installing anything</h3>
<p>Use Storage settings, then Finder. Turn on the recommendations that suit you, open the largest categories, and empty the Trash when you’re done.</p>
<h3 id="you-want-to-see-where-the-space-went">You want to see where the space went</h3>
<p>DaisyDisk, if $9.99 is fine and you like a map. GrandPerspective, if you’d rather not pay and you’re on macOS 14 or later. OmniDiskSweeper, if you want a free list that moves things to the Trash.</p>
<h3 id="xcode-is-filling-your-disk">Xcode is filling your disk</h3>
<p>DevCleaner. It’s free and focused, and its dry-run mode lets you rehearse a cleanup first.</p>
<h3 id="you-live-in-terminal">You live in Terminal</h3>
<p>Mole’s command-line tool. Run <code>--dry-run</code> first, and decide whether you want <code>mo clean</code> to empty your Trash.</p>
<h3 id="you-want-one-app-for-general-mac-upkeep">You want one app for general Mac upkeep</h3>
<p>CleanMyMac. It’s the only option here with malware scanning, alongside cleanup, app uninstalling and performance tools.</p>
<h3 id="containers-vms-and-build-folders-are-the-problem">Containers, VMs and build folders are the problem</h3>
<p>Disk Whisk, if you want each item explained and cleanups that go to the Trash first. If you prefer free tools, Mole’s <code>mo purge</code> handles build folders, and Docker’s own commands handle Docker (see below).</p>
<h3 id="you-want-to-be-able-to-undo">You want to be able to undo</h3>
<p>Pick a tool that uses the Trash: OmniDiskSweeper, GrandPerspective, Disk Whisk, or Mole’s <code>uninstall</code> and <code>analyze</code>. DaisyDisk and DevCleaner delete directly, and DaisyDisk does so on purpose so the space comes back at once.</p>
<h3 id="you-re-on-an-older-mac">You’re on an older Mac</h3>
<p>On macOS 13 or earlier, look at DaisyDisk (10.13 or later from its own site), CleanMyMac and OmniDiskSweeper (macOS 11 or later) and Mole’s command-line tool (macOS 12 or later). GrandPerspective, DevCleaner and Disk Whisk need macOS 14.</p>
<h2 id="when-you-don-t-need-any-of-these">When you don’t need any of these</h2>
<p>If this is a one-off, the free route is usually enough:</p>
<ul>
<li><strong>Follow the Storage recommendations</strong> and open the biggest categories. Old iOS backups, apps you no longer use and the Trash are common wins.</li>
<li><strong>Sort folders by size in Finder.</strong> In List view, choose View → Show View Options and turn on Calculate all sizes, then sort by Size.</li>
<li><strong>Leave caches alone unless they’re huge.</strong> <a href="https://support.apple.com/guide/mac-help/sysp4ee93ca4/mac">Apple says</a> macOS already clears caches and logs that are safe to delete when space is needed, and apps rebuild their caches as you use them, so clearing them by hand buys less than it seems.</li>
<li><strong>Use Docker’s own tools for Docker.</strong> <a href="https://docs.docker.com/reference/cli/docker/system/df/"><code>docker system df</code></a> shows what images, containers and build cache use. <a href="https://docs.docker.com/reference/cli/docker/system/prune/"><code>docker system prune</code></a> removes unused containers and networks, dangling images and build cache after asking, and leaves volumes alone unless you add <code>--volumes</code>.</li>
<li><strong>Empty the Trash.</strong> Moving files to the Trash doesn’t free any space until you empty it, whichever tool moved them there.</li>
</ul>
<p>We make Disk Whisk, and we’d rather you pick the tool that fits your Mac than the one we sell.</p>
]]></content:encoded>
    </item>
    <item>
      <title>What “System Data” is on your Mac, and what’s safe to delete</title>
      <link>https://diskwhisk.com/blog/what-is-system-data-on-mac/</link>
      <guid isPermaLink="true">https://diskwhisk.com/blog/what-is-system-data-on-mac/</guid>
      <pubDate>Tue, 20 Oct 2026 00:00:00 GMT</pubDate>
      <description>System Data is macOS’s catch-all storage category. Here’s what’s in it, how to measure each part with built-in tools, and what’s safe to remove.</description>
      <content:encoded><![CDATA[<p>System Data is the catch-all category in System Settings &gt; General &gt; Storage. Apple describes it as files that don’t fit any other category, mostly things macOS uses to run: caches, logs, VM files, temporary files, fonts, app support files and plug-ins. You can’t clear it from Storage settings, and you shouldn’t try by deleting system folders. What you can do is find out which parts of it are big on your Mac, then shrink those with the tools that made them. This guide shows you how, using only what’s built into macOS.</p>
<h2 id="what-apple-counts-as-system-data">What Apple counts as System Data</h2>
<p>Apple’s <a href="https://support.apple.com/guide/mac-help/change-storage-settings-mchl3d437fbc/mac">Storage settings guide</a> puts System Data in a group with macOS and Other Users &amp; Shared: categories that only show how much space they use. There’s no info button and no Delete. In Apple’s words, “You can’t manage the contents of this category.” The guide adds that macOS manages the contents, and that the size varies with the current state of your Mac. The wording is the same in the guides for macOS Sequoia 15, macOS Tahoe 26 and macOS 27, the current version as this is written.</p>
<p>It helps just as much to know what isn’t System Data. Storage settings gives these their own categories:</p>
<ul>
<li><strong>iOS Files</strong> holds iPhone and iPad backups and firmware.</li>
<li><strong>Applications</strong> holds the apps you installed, including any “Install macOS” app you downloaded.</li>
<li><strong>Documents</strong> holds the other files in your home folder and has a Downloads button, so leftover disk images and installer packages in your home folder show up there.</li>
<li><strong>Mail</strong>, <strong>Messages</strong>, <strong>Photos</strong> and <strong>Trash</strong> each have their own bar.</li>
</ul>
<p>So if you’ve been told to delete old iPhone backups or installers to shrink System Data, look at those categories instead.</p>
<p>You may also see <strong>purgeable</strong> space in Disk Utility. Apple <a href="https://support.apple.com/guide/disk-utility/get-detailed-information-about-a-disk-dskutl1005/mac">describes it</a> as space macOS can free when needed by removing files, and counts it as available. You can’t remove purgeable files yourself; macOS removes them as space is required.</p>
<h2 id="why-the-bar-shrinks-on-its-own">Why the bar shrinks on its own</h2>
<p>Much of what macOS keeps for itself is temporary by design:</p>
<ul>
<li><strong>Time Machine local snapshots.</strong> Time Machine saves a snapshot about every hour, keeps it for 24 hours, and deletes snapshots as they age or when space is needed (<a href="https://support.apple.com/en-us/102154">Apple</a>).</li>
<li><strong>Caches.</strong> Apple’s <a href="https://developer.apple.com/library/archive/documentation/FileManagement/Conceptual/FileSystemProgrammingGuide/MacOSXDirectories/MacOSXDirectories.html">developer documentation</a> defines them as data that can be regenerated as needed. <a href="https://support.apple.com/en-us/116946">Starting up in safe mode</a> clears certain system caches, and Apple suggests it when you need room only for a while, such as during a macOS update (<a href="https://support.apple.com/en-us/102624">Apple</a>).</li>
<li><strong>Swap.</strong> When apps need more memory than your Mac has, macOS writes some of it to disk, and that use rises and falls with what you have open.</li>
</ul>
<p>That’s why System Data can be smaller after a restart, or a day later, without you doing anything. Before you delete anything, restart, wait a day if you can, and look again.</p>
<h2 id="find-out-what-s-in-your-system-data">Find out what’s in your System Data</h2>
<p>Here’s a method that uses only Storage settings, Finder, Disk Utility and a few read-only Terminal commands. It starts with items that can be very large on their own, then works through the folders where the rest collects. By the end you’ll have a short list.</p>
<h3 id="step-1-write-down-the-starting-numbers">Step 1: Write down the starting numbers</h3>
<p>Open System Settings &gt; General &gt; Storage and wait for the bar to finish. Note the System Data figure. Click the info button next to iOS Files, Applications and Documents to see what’s in them: anything there is already counted outside System Data. Then click All Volumes, which shows a bar for each volume on your internal disk.</p>
<h3 id="step-2-check-time-machine-local-snapshots">Step 2: Check Time Machine local snapshots</h3>
<p>Local snapshots exist only on APFS disks with automatic Time Machine backups turned on. To list them, open Terminal and run:</p>
<pre><code class="language-sh">tmutil listlocalsnapshots /
</code></pre>
<p>Time Machine’s snapshots are named <code>com.apple.TimeMachine</code> followed by a date. To see their sizes, open Disk Utility, choose View &gt; Show APFS Snapshots and select your startup volume. The table at the bottom lists each snapshot, and Show Columns in its menu adds Private Size and Cumulative Size.</p>
<p>Apple says your Mac counts snapshot space as available storage, so snapshots shouldn’t stop you downloading files or installing software. Apple doesn’t say whether Storage settings includes them in System Data, so use this step to rule snapshots in or out, not to match numbers exactly.</p>
<h3 id="step-3-check-container-and-virtual-machine-disks">Step 3: Check container and virtual machine disks</h3>
<p>Docker Desktop stores all its Linux containers and images in one large disk image file. Its own Settings &gt; Resources &gt; Advanced shows where that file is and how much space it actually uses; Docker <a href="https://docs.docker.com/desktop/troubleshoot-and-support/faqs/macfaqs/">warns</a> that other tools may report its maximum size instead. From Terminal:</p>
<pre><code class="language-sh">docker system df
</code></pre>
<p>Virtual machine apps need a virtual disk for each machine, and it lives on your Mac unless you put it elsewhere. Check each machine’s size in the app that runs it.</p>
<h3 id="step-4-size-your-library-folder">Step 4: Size your Library folder</h3>
<p>The caches, logs and app support files Apple mentions live in Library folders, and the one you control is the Library in your home folder.</p>
<p>In Finder, choose Go &gt; Go to Folder, type <code>~/Library</code> and press Return. Switch to List view, choose View &gt; Show View Options, select “Calculate all sizes”, then click the Size column header to sort. Folder sizes take a while to fill in.</p>
<p>Or in Terminal:</p>
<pre><code class="language-sh">du -sh ~/Library/Caches ~/Library/Logs ~/Library/Application\ Support 2&gt;/dev/null
du -hd 1 ~/Library 2&gt;/dev/null | sort -h | tail -n 15
</code></pre>
<p>The first line totals three folders. The second lists the 15 biggest folders in your Library, largest last. Both only read. On a big Library they can take minutes. macOS privacy protections cover some folders, so you may get a prompt asking whether Terminal can access other apps’ data. You can say no: <code>du</code> skips those folders, and <code>2&gt;/dev/null</code> hides the “Operation not permitted” lines.</p>
<p>Skip Mail and Messages in the results, since Storage settings counts them separately. Also, <code>du -h</code> counts in units of 1,024, while macOS reports storage in decimal units (a gigabyte is a billion bytes), so <code>du</code> figures look about 7% smaller. Use <code>du -s --si</code> instead of <code>du -sh</code> if you want them to line up.</p>
<h3 id="step-5-look-inside-caches-and-logs">Step 5: Look inside Caches and Logs</h3>
<p>Open the biggest folders from Step 4. Apple’s convention is for each app to keep its cache in a folder named after its bundle identifier, which looks like <code>com.company.AppName</code>, so you can usually tell whose cache is big. <code>~/Library/Logs</code> holds log files apps write, which you can read in the Console app. The system’s own log store sits in <code>/var/db/diagnostics</code> (see <code>man log</code>), and macOS looks after it.</p>
<h3 id="step-6-read-but-don-t-touch-swap-and-the-sleep-image">Step 6: Read, but don’t touch, swap and the sleep image</h3>
<pre><code class="language-sh">sysctl vm.swapusage
pmset -g | grep hibernatefile
</code></pre>
<p>The first shows how much swap is in use. The swap files live on a hidden VM volume (<a href="https://support.apple.com/guide/security/role-of-apple-file-system-seca6147599e/web">Apple Platform Security</a>). The second shows where macOS writes its sleep image: by default, Mac laptops store a copy of memory on disk when they sleep (<code>man pmset</code>). Both are part of how macOS runs.</p>
<h3 id="your-list">Your list</h3>
<p>You now know which of these matter on your Mac:</p>
<div class="post-table"><table>
<thead>
<tr>
<th>Item</th>
<th>Measure with</th>
<th>Safe to remove?</th>
<th>The right way</th>
</tr>
</thead>
<tbody><tr>
<td>Time Machine snapshots</td>
<td><code>tmutil</code>, Disk Utility</td>
<td>Yes</td>
<td>Wait, or pause automatic backups</td>
</tr>
<tr>
<td>Docker and VM disks</td>
<td>The app itself</td>
<td>What’s inside them</td>
<td>The app’s own cleanup</td>
</tr>
<tr>
<td>App caches</td>
<td>Finder, <code>du</code></td>
<td>Usually; they regrow</td>
<td>Quit the app, trash its folder</td>
</tr>
<tr>
<td>App logs</td>
<td>Finder, <code>du</code></td>
<td>Your apps’ old logs</td>
<td>Quit the app, trash old files</td>
</tr>
<tr>
<td>Mail downloads</td>
<td>Finder, <code>du</code></td>
<td>Yes</td>
<td>Mail’s own setting</td>
</tr>
<tr>
<td>App support data</td>
<td>Finder, <code>du</code></td>
<td>Only if you know what it is</td>
<td>The app, or its uninstaller</td>
</tr>
<tr>
<td>Swap, sleep image</td>
<td><code>sysctl</code>, <code>pmset</code></td>
<td>No</td>
<td>Leave alone</td>
</tr>
</tbody></table></div>
<h2 id="what-s-safe-to-remove-and-how">What’s safe to remove, and how</h2>
<h3 id="time-machine-local-snapshots">Time Machine local snapshots</h3>
<p>Usually you don’t need to do anything. To clear them now, Apple’s <a href="https://support.apple.com/en-us/102154">method</a> is to pause automatic backups: go to System Settings &gt; General &gt; Time Machine, click Options, set Backup Frequency to Manually, click Done, wait a few minutes, then turn automatic backups back on. Time Machine remembers your backup disks.</p>
<p>From Terminal, <code>tmutil</code> can thin them:</p>
<pre><code class="language-sh">tmutil thinlocalsnapshots / 20000000000 4
</code></pre>
<p>That asks macOS to try to reclaim 20 GB (the amount is in bytes) by thinning snapshots, at urgency level 4 on the manual’s scale of 1 to 4. If it reports a permissions error, run the same command with <code>sudo</code> in front; this one only asks Time Machine to thin its own snapshots.</p>
<h3 id="docker-and-virtual-machines">Docker and virtual machines</h3>
<p>Use the tool, not Finder. <code>docker system prune</code> removes stopped containers, unused networks, dangling images and build cache, and Docker says freeing the space can take a few minutes. Don’t move or delete the disk image file by hand: it holds every container and image. For virtual machines, delete the ones you no longer need from inside the app that runs them.</p>
<h3 id="caches-and-logs">Caches and logs</h3>
<p>Quit the app, move its folder in <code>~/Library/Caches</code> to the Trash, then empty the Trash; space isn’t freed until you do (<a href="https://support.apple.com/en-us/102624">Apple</a>). Expect the cache to grow back as you use the app. Do the same for an app’s old files in <code>~/Library/Logs</code>.</p>
<h3 id="mail-downloads">Mail downloads</h3>
<p>Mail keeps some attachments temporarily in a Mail Downloads folder in your Library. In Mail &gt; Settings &gt; General, “Remove unedited downloads” controls when they’re deleted; by default an unedited attachment goes when you delete its message (<a href="https://support.apple.com/guide/mail/change-general-settings-cpmlprefgen/mac">Apple</a>).</p>
<h3 id="app-support-data">App support data</h3>
<p>Apple’s developer documentation says Application Support can hold files with user data, so don’t clear it wholesale. Remove a folder only when you’ve removed its app and know you don’t want what’s inside.</p>
<h3 id="device-backups-installers-and-updates">Device backups, installers and updates</h3>
<p>These usually aren’t System Data, but they’re often what people mean. Delete old iPhone and iPad backups in Finder: connect the device, select it, click Manage Backups in the General tab, then right-click a backup and choose Delete (<a href="https://support.apple.com/en-us/108809">Apple</a>). Remove installers from the Applications or Documents category in Storage settings. Leave macOS update files to Software Update; if there isn’t room to install, Apple suggests starting up in safe mode.</p>
<h2 id="what-not-to-do">What not to do</h2>
<ul>
<li><strong>Don’t delete anything in <code>/System</code>.</strong> By default, no process can write to the system volume, not even Apple’s own, and on macOS 11 and later your Mac starts up from a snapshot of it (<a href="https://support.apple.com/guide/security/role-of-apple-file-system-seca6147599e/web">Apple Platform Security</a>).</li>
<li><strong>Don’t delete things in <code>/private/var</code> by hand.</strong> It holds working data macOS manages, including the system log store and, on Macs that use one, the sleep image.</li>
<li><strong>Don’t use <code>sudo rm</code> on anything you don’t recognise.</strong> <code>sudo</code> runs the command as root, past the permission checks that normally stop you, and <code>rm</code> skips the Trash, so there’s no undo.</li>
<li><strong>Don’t delete other snapshots.</strong> In Disk Utility, only snapshots named <code>com.apple.TimeMachine</code> belong to Time Machine. Leave anything else alone.</li>
<li><strong>Don’t change sleep settings to save space.</strong> The <code>pmset</code> manual asks you to use caution with its hibernation settings.</li>
</ul>
<p>If you’d rather see all of this on one map, Disk Whisk scans without changing anything, explains each item it finds, and moves only what you approve to the Trash.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Your Mac might be storing the same AI model three times: Ollama, LM Studio, Hugging Face</title>
      <link>https://diskwhisk.com/blog/ai-models-taking-up-space-on-mac/</link>
      <guid isPermaLink="true">https://diskwhisk.com/blog/ai-models-taking-up-space-on-mac/</guid>
      <pubDate>Tue, 20 Oct 2026 00:00:00 GMT</pubDate>
      <description>Where Ollama, LM Studio, Hugging Face and ComfyUI keep models on a Mac, how to remove them safely, and a hash check that finds the same file stored twice.</description>
      <content:encoded><![CDATA[<p>If you build with local models, you probably have more than one tool that downloads them. Ollama, LM Studio, the Hugging Face libraries and ComfyUI each keep their own folder, and none of them looks in the others’. Pull a model in Ollama, try the same quantization in LM Studio, load it once from a Python script, and the same file can end up on your disk three times.</p>
<p>Here’s where each tool keeps its models on macOS, how to measure and remove them, and how to prove two files are the same before you delete either.</p>
<h2 id="where-each-tool-keeps-its-models">Where each tool keeps its models</h2>
<div class="post-table"><table>
<thead>
<tr>
<th>Tool</th>
<th>Default folder</th>
<th>How to change it</th>
</tr>
</thead>
<tbody><tr>
<td>Ollama</td>
<td><code>~/.ollama/models</code></td>
<td>Model location in the Ollama app’s Settings, or <code>OLLAMA_MODELS</code></td>
</tr>
<tr>
<td>LM Studio</td>
<td><code>~/.lmstudio/models</code></td>
<td>The My Models tab</td>
</tr>
<tr>
<td>Hugging Face cache</td>
<td><code>~/.cache/huggingface/hub</code></td>
<td><code>HF_HOME</code> or <code>HF_HUB_CACHE</code></td>
</tr>
<tr>
<td>ComfyUI (Comfy Desktop)</td>
<td><code>~/ComfyUI-Shared/models</code></td>
<td>The Storage tab, or <code>extra_model_paths.yaml</code></td>
</tr>
<tr>
<td>PyTorch hub</td>
<td><code>~/.cache/torch/hub</code></td>
<td><code>TORCH_HOME</code></td>
</tr>
</tbody></table></div>
<p>A few details change where you should look:</p>
<ul>
<li><strong>LM Studio</strong> moved its home folder from <code>~/.cache/lm-studio</code> to <code>~/.lmstudio</code> in version 0.3.6, but only for first-time installs, and it doesn’t move existing data. If you’ve used it since before then, your models may be in <code>~/.cache/lm-studio/models</code>. Check both.</li>
<li><strong>Ollama</strong> keeps small manifests in <code>manifests</code> and the actual weights in <code>blobs</code>.</li>
<li><strong>Hugging Face</strong> keeps one cache for the Python libraries that download from the Hub, such as transformers and diffusers. mlx-lm downloads into it too, so MLX models you run from Python live here. If you set <code>HF_HOME</code>, the cache is <code>$HF_HOME/hub</code>.</li>
<li><strong>ComfyUI</strong> sorts models into folders by type (<code>checkpoints</code>, <code>loras</code>, <code>vae</code> and so on). A manual install keeps them in <code>ComfyUI/models</code> inside the folder you installed it in. In Comfy Desktop, <code>~/ComfyUI-Shared</code> also holds <code>output</code>, which is where your generated images go, so never clear that folder wholesale.</li>
</ul>
<h2 id="measure-what-you-have">Measure what you have</h2>
<p>Start with totals. <code>du</code> reports what’s actually on disk, and <code>2&gt;/dev/null</code> hides the errors for folders you don’t have:</p>
<pre><code class="language-sh">du -sh ~/.ollama/models ~/.lmstudio/models ~/.cache/lm-studio/models ~/.cache/huggingface/hub ~/ComfyUI-Shared/models ~/.cache/torch/hub 2&gt;/dev/null
</code></pre>
<p>If you’ve moved a folder, ask the tool where it is. <code>hf env</code> prints the <code>HF_HUB_CACHE</code> in use, and the Ollama app shows its folder under Model location in Settings.</p>
<p>Then list what’s inside, model by model:</p>
<pre><code class="language-sh">ollama list
lms ls
hf cache ls --sort size
</code></pre>
<p><code>ollama list</code> shows each model’s size, <code>lms ls</code> lists the models LM Studio sees on disk, and <code>hf cache ls --sort size</code> lists cached Hugging Face repos, largest first. The <code>hf cache</code> commands arrived in huggingface_hub 1.0 (<code>--sort</code> in 1.1); older versions use <code>huggingface-cli scan-cache</code>.</p>
<h2 id="find-the-same-model-stored-twice">Find the same model stored twice</h2>
<p>No tool tells you when another tool holds the same file. But two of them name their large files after a SHA-256 hash of the contents, which makes duplicates easy to spot:</p>
<ul>
<li><strong>Ollama</strong> names every blob <code>sha256-&lt;hash&gt;</code>. Its source computes the hash while writing the file, and the name is that hash.</li>
<li><strong>The Hugging Face cache</strong> names each large file in a repo’s <code>blobs</code> folder after its SHA-256 (small text files get a shorter Git hash). The readable file names under <code>snapshots</code> are symlinks to those blobs.</li>
</ul>
<p>LM Studio and ComfyUI keep the original file names, so for those you compute the hash yourself with <code>shasum</code>, which comes with macOS.</p>
<h3 id="check-one-file">Check one file</h3>
<p>Say LM Studio has a GGUF and you suspect Ollama or the Hugging Face cache has it too. Hash it, then search the other two folders for that hash:</p>
<pre><code class="language-sh">hash=$(shasum -a 256 ~/.lmstudio/models/bartowski/Llama-3.2-1B-Instruct-GGUF/Llama-3.2-1B-Instruct-Q4_K_M.gguf | cut -d&#39; &#39; -f1)
find ~/.ollama/models/blobs ~/.cache/huggingface/hub -name &quot;*$hash&quot; 2&gt;/dev/null
</code></pre>
<p>Any path it prints holds the same bytes.</p>
<p>A real example: the Q4_K_M file in the <code>bartowski/Llama-3.2-1B-Instruct-GGUF</code> repo on Hugging Face is 807,694,464 bytes, with a SHA-256 starting <code>6f85a640</code>. For <code>ollama pull hf.co/bartowski/Llama-3.2-1B-Instruct-GGUF:Q4_K_M</code>, the manifest Hugging Face serves lists the model layer with that same digest and size, so Ollama saves it as <code>blobs/sha256-6f85a640…</code>. LM Studio downloads the same file from Hugging Face under its original name, and a Python download adds a third copy to the Hugging Face cache. That’s about 808 MB, stored three times.</p>
<p>You can read a Hub file’s SHA-256 without downloading it, from the <code>X-Linked-Etag</code> header:</p>
<pre><code class="language-sh">curl -sI https://huggingface.co/bartowski/Llama-3.2-1B-Instruct-GGUF/resolve/main/Llama-3.2-1B-Instruct-Q4_K_M.gguf | grep -i x-linked-etag
</code></pre>
<h3 id="check-every-folder-at-once">Check every folder at once</h3>
<p>Hashing reads every byte, so it’s slow on files this size. Identical files must be the same size, so this check lists sizes first and hashes only files that share one. It only reads. Run the three parts in order:</p>
<pre><code class="language-sh">find ~/.ollama/models/blobs ~/.cache/huggingface/hub ~/.lmstudio/models ~/.cache/lm-studio/models ~/ComfyUI-Shared/models -type f -size +100M -exec stat -f &#39;%z %d:%i %N&#39; {} + 2&gt;/dev/null | awk &#39;!seen[$2]++&#39; | sort -n &gt; /tmp/model-files.txt
</code></pre>
<pre><code class="language-sh">awk &#39;{print $1}&#39; /tmp/model-files.txt | uniq -d | while read -r size; do
  grep &quot;^$size &quot; /tmp/model-files.txt | cut -d&#39; &#39; -f3- | while IFS= read -r file; do
    shasum -a 256 &quot;$file&quot;
  done
done | sort &gt; /tmp/model-hashes.txt
</code></pre>
<pre><code class="language-sh">awk &#39;{print $1}&#39; /tmp/model-hashes.txt | uniq -d | while read -r hash; do
  grep &quot;^$hash&quot; /tmp/model-hashes.txt; echo
done
</code></pre>
<p>The first part lists every file over 100 MB with its size and a disk-and-inode ID, the second hashes files whose size matches another’s, and the third prints each hash that appears more than once, with its paths. Add any other folder where you keep <code>.gguf</code> or <code>.safetensors</code> files, such as <code>~/Downloads</code>, to the <code>find</code> line. A few notes:</p>
<ul>
<li><code>-type f</code> skips symlinks, so Hugging Face <code>snapshots</code> links aren’t counted twice.</li>
<li><code>awk &#39;!seen[$2]++&#39;</code> keeps one path per file, so hard links (two names for one file, stored once) don’t show up as duplicates.</li>
<li>It works for safetensors shards as well as GGUF files, which covers MLX models you may have in both LM Studio and the Hugging Face cache.</li>
</ul>
<h3 id="what-a-match-tells-you-and-what-it-doesn-t">What a match tells you, and what it doesn’t</h3>
<p>A matching hash means identical bytes. A different hash doesn’t mean a different model. Models from Ollama’s own library come from Ollama’s registry, not a Hugging Face repo, so they won’t necessarily match a Hugging Face GGUF with the same name and quantization. And one model in two quantizations, say Q4_K_M in Ollama and Q8_0 in LM Studio, is two files by design. Whether you need both is your call.</p>
<p>To map an Ollama blob back to a model, run <code>ollama show --modelfile &lt;model&gt;</code>: for GGUF models, the <code>FROM</code> line is the blob’s path. Models Ollama stores in its Safetensors format (the ones it runs with MLX) are split across many smaller blobs, and their <code>FROM</code> line shows a model name instead, so this check won’t match them to anything.</p>
<h2 id="keep-one-copy">Keep one copy</h2>
<p>Once you know two tools hold the same bytes, these are the options the tools support.</p>
<h3 id="share-a-file-between-ollama-and-lm-studio">Share a file between Ollama and LM Studio</h3>
<p>A hard link gives one file two names. Both tools see an ordinary file, the data is stored once, and removing one name (with <code>ollama rm</code>, say) leaves the other working. The space comes back only when both names are gone. Both folders must be on the same disk.</p>
<p>First delete LM Studio’s copy in the My Models tab, from the model’s menu. Then recreate it as a hard link to Ollama’s blob, at the <code>publisher/model/file.gguf</code> path LM Studio expects inside its models folder:</p>
<pre><code class="language-sh">mkdir -p ~/.lmstudio/models/bartowski/Llama-3.2-1B-Instruct-GGUF
ln ~/.ollama/models/blobs/sha256-&lt;hash&gt; ~/.lmstudio/models/bartowski/Llama-3.2-1B-Instruct-GGUF/Llama-3.2-1B-Instruct-Q4_K_M.gguf
</code></pre>
<p><code>ls -li</code> on both paths should show the same inode number and a link count of 2. Use a hard link, not a symlink: a symlink into Ollama’s blob folder breaks as soon as Ollama removes that model.</p>
<p><code>lms import --hard-link</code> also makes hard links, but it keeps the source file’s name, and an Ollama blob has no <code>.gguf</code> extension. Without <code>--copy</code>, <code>--hard-link</code> or <code>--symbolic-link</code>, <code>lms import</code> moves the file into LM Studio’s folder.</p>
<h3 id="import-a-gguf-into-ollama">Import a GGUF into Ollama</h3>
<p>If LM Studio already has a GGUF that you want in Ollama, put <code>FROM /path/to/model.gguf</code> in a file called <code>Modelfile</code> and run:</p>
<pre><code class="language-sh">ollama create my-model -f Modelfile
</code></pre>
<p>This saves a download, not disk space: <code>ollama create</code> copies the file into its blob store (you’ll see “copying file” as it runs). The hard-link step above brings it back to one copy.</p>
<h3 id="point-mlx-lm-at-a-folder-you-already-have">Point mlx-lm at a folder you already have</h3>
<p>mlx-lm takes a local folder anywhere it takes a repo ID; its <code>--model</code> option accepts “the path to the local model directory or Hugging Face repo”. If LM Studio already holds a complete MLX model folder (weights, config and tokenizer files), you can point mlx-lm at it and remove the cached copy with <code>hf cache rm</code>.</p>
<h3 id="share-models-across-comfyui-installs">Share models across ComfyUI installs</h3>
<p>In Comfy Desktop, open the capsule menu at the top of the app and add model folders in the Storage tab. A manual install reads extra folders from <code>extra_model_paths.yaml</code> in its root folder; copy <code>extra_model_paths.yaml.example</code> to start. Restart ComfyUI after changing either.</p>
<h3 id="keep-one-hugging-face-cache">Keep one Hugging Face cache</h3>
<p>Hub-based libraries share one cache unless something overrides it, so check that your projects don’t each set their own <code>HF_HOME</code> or <code>cache_dir</code>. Since huggingface_hub 1.32, the cache also stores identical Xet-backed files once across repos.</p>
<h2 id="remove-models-with-each-tool-s-own-command">Remove models with each tool’s own command</h2>
<p>Deleting files inside these folders by hand can leave a tool pointing at files that are gone. Use the tool instead:</p>
<ul>
<li><strong>Ollama:</strong> <code>ollama rm &lt;model&gt;</code> removes the model and any blobs no other model still uses.</li>
<li><strong>Hugging Face:</strong> <code>hf cache rm model/&lt;org&gt;/&lt;name&gt; --dry-run</code> shows what would go and how much space it frees; run it again without <code>--dry-run</code> to delete. <code>hf cache prune</code> removes revisions no branch or tag points to, plus interrupted downloads. Before huggingface_hub 1.0, the command is <code>huggingface-cli delete-cache</code>.</li>
<li><strong>mlx-lm:</strong> <code>mlx_lm.manage --scan</code> lists cached repos with “mlx” in the name, and <code>mlx_lm.manage --delete --pattern &lt;text&gt;</code> removes matching ones after asking.</li>
<li><strong>LM Studio:</strong> in My Models, open the model’s menu and choose Delete. <code>lms</code> has no remove command yet; there’s an open request for one.</li>
<li><strong>ComfyUI:</strong> models are plain files in their type folders, so move the ones you don’t want to the Trash in Finder.</li>
</ul>
<p><code>ollama rm</code> and <code>hf cache rm</code> delete permanently. They don’t use the Trash.</p>
<h2 id="what-you-can-t-download-again">What you can’t download again</h2>
<p>Most of what these folders hold is a download and can come back. These can’t, so check before you delete:</p>
<ul>
<li><strong>Fine-tunes, LoRAs and adapters you trained.</strong> mlx-lm saves adapters to <code>adapters</code> and fused models to <code>fused_model</code>, in the folder you ran it from, outside the cache.</li>
<li><strong>Merges, conversions and quantizations you made yourself</strong>, such as <code>mlx_lm.convert</code> output in <code>mlx_model</code>. You can redo them, but not by downloading.</li>
<li><strong>Ollama models you created from a local file you’ve since deleted.</strong> The blob is then the only copy.</li>
<li><strong>Files you added with a plain <code>lms import</code>.</strong> It moves the file, so LM Studio’s copy may be the only one.</li>
<li><strong>ComfyUI’s <code>output</code> folder</strong> and any LoRAs you trained.</li>
<li><strong>Models from gated, private or deleted repos</strong>, which may not download again.</li>
</ul>
<h2 id="other-caches-worth-a-look">Other caches worth a look</h2>
<p>Python environments for local AI pull in large packages, and their download caches grow quietly. Everything in them downloads again when needed. To see each cache’s folder and size:</p>
<pre><code class="language-sh">pip cache dir
pip cache info
uv cache dir
uv cache size
conda clean --all --dry-run
</code></pre>
<p>To clear them, use <code>pip cache purge</code>, <code>uv cache prune</code> (which removes unused entries; <code>uv cache clean</code> removes everything) and <code>conda clean --all</code>. PyTorch hub downloads are plain files, with weights in <code>~/.cache/torch/hub/checkpoints</code>; remove the ones you no longer use in Finder.</p>
<p>If you’d rather see all this in one place, Disk Whisk’s Overview groups Ollama, LM Studio, Hugging Face and ComfyUI storage under “AI models &amp; datasets” and explains each item, and anything you approve for cleanup goes to the Trash.</p>
]]></content:encoded>
    </item>
  </channel>
</rss>
