[
  {
    "explanation" : {
      "afterDeletion" : "Each application rebuilds what it needs.",
      "keepItSmall" : "Nothing to configure.",
      "what" : "Scratch and cache directories from Cinema 4D, Maya, Houdini and Substance.",
      "whyItGrows" : "Each application writes scratch data per scene and none of them removes it when the scene is closed."
    },
    "family" : "design",
    "guards" : [
      {
        "noOpenFiles" : {

        }
      }
    ],
    "id" : "3d.caches",
    "locations" : [
      {
        "glob" : {
          "_0" : "~/Library/Preferences/Maxon/*/_bugreports"
        }
      },
      {
        "glob" : {
          "_0" : "~/Library/Preferences/Maxon/*/Cache"
        }
      },
      {
        "glob" : {
          "_0" : "~/Library/Preferences/Autodesk/maya/*/cache"
        }
      },
      {
        "glob" : {
          "_0" : "~/Library/Application Support/Autodesk/cache"
        }
      },
      {
        "glob" : {
          "_0" : "$TMPDIR/houdini_temp"
        }
      },
      {
        "absolute" : {
          "_0" : "~/Library/Caches/Adobe/Substance 3D Painter"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "none" : {

      }
    },
    "selection" : {
      "perItem" : {

      }
    },
    "strategy" : {
      "delete" : {

      }
    },
    "tier" : 1,
    "title" : "3D application caches",
    "verified" : "expected",
    "visual" : "plain"
  },
  {
    "explanation" : {
      "afterDeletion" : "Files are decoded again when you open the set.",
      "keepItSmall" : "Preferences, File and Folder sets a maximum cache size.",
      "what" : "Decoded audio Live writes so compressed files play without stutter.",
      "whyItGrows" : "Every compressed file in every set is decoded and cached."
    },
    "family" : "design",
    "guards" : [
      {
        "appNotRunning" : {
          "_0" : {
            "app" : {
              "_0" : "Ableton Live 12 Suite"
            }
          }
        }
      }
    ],
    "id" : "ableton.cache",
    "locations" : [
      {
        "absolute" : {
          "_0" : "~/Library/Caches/Ableton"
        }
      },
      {
        "glob" : {
          "_0" : "~/Library/Caches/Ableton*"
        }
      },
      {
        "glob" : {
          "_0" : "~/Music/Ableton/Cache*"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "none" : {

      }
    },
    "selection" : {
      "whole" : {

      }
    },
    "strategy" : {
      "delete" : {

      }
    },
    "tier" : 1,
    "title" : "Ableton decoding cache",
    "verified" : "expected",
    "visual" : "plain"
  },
  {
    "explanation" : {
      "afterDeletion" : "Each application refills what it needs.",
      "keepItSmall" : "Nothing to configure.",
      "what" : "Shared caches from the Creative Cloud applications and their installer.",
      "whyItGrows" : "Each application keeps its own cache here and nothing expires."
    },
    "family" : "design",
    "guards" : [

    ],
    "id" : "adobe.caches",
    "locations" : [
      {
        "absolute" : {
          "_0" : "~/Library/Caches/Adobe"
        }
      },
      {
        "glob" : {
          "_0" : "~/Library/Caches/com.adobe.*"
        }
      },
      {
        "absolute" : {
          "_0" : "~/Library/Application Support/Adobe/Common/Team Projects Cache"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "none" : {

      }
    },
    "selection" : {
      "whole" : {

      }
    },
    "strategy" : {
      "delete" : {

      }
    },
    "tier" : 1,
    "title" : "Other Adobe caches",
    "verified" : "expected",
    "visual" : "plain"
  },
  {
    "explanation" : {
      "afterDeletion" : "Playback re-decodes the first time you scrub a clip.",
      "keepItSmall" : "Preferences, Media Cache has an option to delete files older than a set number of days.",
      "what" : "Decoded video and audio Premiere and After Effects write to scrub smoothly.",
      "whyItGrows" : "Every clip you import is decoded and cached, and nothing expires by default."
    },
    "family" : "design",
    "guards" : [
      {
        "appNotRunning" : {
          "_0" : {
            "app" : {
              "_0" : "Adobe Premiere Pro"
            }
          }
        }
      },
      {
        "appNotRunning" : {
          "_0" : {
            "app" : {
              "_0" : "Adobe After Effects"
            }
          }
        }
      },
      {
        "appNotRunning" : {
          "_0" : {
            "app" : {
              "_0" : "Adobe Media Encoder"
            }
          }
        }
      },
      {
        "appNotRunning" : {
          "_0" : {
            "app" : {
              "_0" : "Adobe Audition"
            }
          }
        }
      }
    ],
    "id" : "adobe.media-cache",
    "locations" : [
      {
        "absolute" : {
          "_0" : "~/Library/Application Support/Adobe/Common/Media Cache Files"
        }
      },
      {
        "absolute" : {
          "_0" : "~/Library/Application Support/Adobe/Common/Media Cache"
        }
      },
      {
        "absolute" : {
          "_0" : "~/Library/Application Support/Adobe/Common/Peak Files"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "rebuild" : {
        "minutes" : 5
      }
    },
    "selection" : {
      "whole" : {

      }
    },
    "strategy" : {
      "delete" : {

      }
    },
    "tier" : 1,
    "title" : "Adobe media cache",
    "verified" : "expected",
    "visual" : "stackedUsage"
  },
  {
    "explanation" : {
      "afterDeletion" : "Nothing is removed here; Creative Cloud should uninstall them.",
      "keepItSmall" : "Creative Cloud has a setting to remove old versions on update.",
      "what" : "Previous years' Creative Cloud applications, kept alongside the current ones.",
      "whyItGrows" : "Creative Cloud installs each year's version separately by default."
    },
    "family" : "design",
    "guards" : [

    ],
    "id" : "adobe.old-versions",
    "locations" : [
      {
        "glob" : {
          "_0" : "/Applications/Adobe */Adobe *.app"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "none" : {

      }
    },
    "selection" : {
      "perItem" : {

      }
    },
    "strategy" : {
      "advisory" : {
        "_0" : "Creative Cloud, Settings, remove older versions"
      }
    },
    "tier" : 4,
    "title" : "Superseded Adobe applications",
    "verified" : "expected",
    "visual" : "plain"
  },
  {
    "explanation" : {
      "afterDeletion" : "Previews render again the first time you play them.",
      "keepItSmall" : "Preferences, Media and Disk Cache sets the maximum size.",
      "what" : "Rendered frames After Effects keeps so previews replay instantly.",
      "whyItGrows" : "The cache fills to the size set in preferences and stays there."
    },
    "family" : "design",
    "guards" : [
      {
        "appNotRunning" : {
          "_0" : {
            "app" : {
              "_0" : "Adobe After Effects"
            }
          }
        }
      }
    ],
    "id" : "ae.disk-cache",
    "locations" : [
      {
        "glob" : {
          "_0" : "~/Library/Caches/Adobe/After Effects/*/Disk Cache*"
        }
      },
      {
        "glob" : {
          "_0" : "~/Library/Caches/Adobe/After Effects/*"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "none" : {

      }
    },
    "selection" : {
      "whole" : {

      }
    },
    "strategy" : {
      "delete" : {

      }
    },
    "tier" : 1,
    "title" : "After Effects disk cache",
    "verified" : "expected",
    "visual" : "plain"
  },
  {
    "explanation" : {
      "afterDeletion" : "Copies go to the Trash; saved documents are untouched.",
      "keepItSmall" : "Settings, Performance sets the file recovery interval.",
      "what" : "Recovery copies of open documents.",
      "whyItGrows" : "A crash leaves the recovery copy in place after you have recovered."
    },
    "family" : "design",
    "guards" : [
      {
        "olderThan" : {
          "days" : 30
        }
      }
    ],
    "id" : "affinity.autosave",
    "locations" : [
      {
        "glob" : {
          "_0" : "~/Library/Containers/com.seriflabs.*/Data/Library/Application Support/*/autosave"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "irreversible" : {

      }
    },
    "selection" : {
      "perItem" : {

      }
    },
    "strategy" : {
      "trash" : {

      }
    },
    "tier" : 3,
    "title" : "Affinity autosaves",
    "verified" : "expected",
    "visual" : "plain"
  },
  {
    "explanation" : {
      "afterDeletion" : "Each app refills what it needs.",
      "keepItSmall" : "Nothing to configure.",
      "what" : "Caches from Affinity Photo, Designer and Publisher.",
      "whyItGrows" : "Each app caches thumbnails and rendered previews for every document you open."
    },
    "family" : "design",
    "guards" : [

    ],
    "id" : "affinity.caches",
    "locations" : [
      {
        "glob" : {
          "_0" : "~/Library/Containers/com.seriflabs.*/Data/Library/Caches"
        }
      },
      {
        "glob" : {
          "_0" : "~/Library/Caches/com.seriflabs.*"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "none" : {

      }
    },
    "selection" : {
      "whole" : {

      }
    },
    "strategy" : {
      "delete" : {

      }
    },
    "tier" : 1,
    "title" : "Affinity caches",
    "verified" : "expected",
    "visual" : "plain"
  },
  {
    "explanation" : {
      "afterDeletion" : "The device is recreated from its system image.",
      "keepItSmall" : "Turn off quick boot for devices you rarely use.",
      "what" : "Emulated Android devices, each with its own disk image and snapshots.",
      "whyItGrows" : "Snapshots are saved on every quick boot and add gigabytes per device."
    },
    "family" : "systems",
    "guards" : [
      {
        "appNotRunning" : {
          "_0" : {
            "binary" : {
              "_0" : "qemu-system-aarch64"
            }
          }
        }
      },
      {
        "noOpenFiles" : {

        }
      }
    ],
    "id" : "android.avd",
    "locations" : [
      {
        "discovered" : {
          "_0" : "androidVirtualDevices"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "rebuild" : {
        "minutes" : 5
      }
    },
    "selection" : {
      "perItem" : {

      }
    },
    "strategy" : {
      "toolCommand" : {
        "_0" : "avdmanager delete avd -n {}"
      }
    },
    "tier" : 2,
    "title" : "Android virtual devices",
    "verified" : "expected",
    "visual" : "deviceGrid"
  },
  {
    "explanation" : {
      "afterDeletion" : "The next build regenerates it.",
      "keepItSmall" : "Nothing to configure; current Android Gradle plugin versions no longer use this cache.",
      "what" : "Intermediate build output the Android plugin caches.",
      "whyItGrows" : "Every library transformed for a build is stored, keyed by version, and nothing expires."
    },
    "family" : "systems",
    "guards" : [

    ],
    "id" : "android.caches",
    "locations" : [
      {
        "absolute" : {
          "_0" : "~/.android/build-cache"
        }
      },
      {
        "absolute" : {
          "_0" : "~/.android/cache"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "rebuild" : {
        "minutes" : 3
      }
    },
    "selection" : {
      "whole" : {

      }
    },
    "strategy" : {
      "delete" : {

      }
    },
    "tier" : 1,
    "title" : "Android build caches",
    "verified" : "expected",
    "visual" : "plain"
  },
  {
    "explanation" : {
      "afterDeletion" : "`sdkmanager` downloads the version again.",
      "keepItSmall" : "Remove NDK versions no project's Gradle file names.",
      "what" : "SDK platforms, build tools and NDK versions, one to three gigabytes each for the NDK.",
      "whyItGrows" : "Every Studio update offers new versions and keeps the old ones."
    },
    "family" : "systems",
    "guards" : [
      {
        "newerVersionPresent" : {
          "_0" : {
            "grouping" : "familyAndMajor",
            "keep" : 1
          }
        }
      }
    ],
    "id" : "android.old-platforms",
    "locations" : [
      {
        "glob" : {
          "_0" : "~/Library/Android/sdk/platforms/*"
        }
      },
      {
        "glob" : {
          "_0" : "~/Library/Android/sdk/build-tools/*"
        }
      },
      {
        "glob" : {
          "_0" : "~/Library/Android/sdk/ndk/*"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "redownload" : {

      }
    },
    "selection" : {
      "allButNewest" : {
        "_0" : {
          "grouping" : "familyAndMajor",
          "keep" : 1
        }
      }
    },
    "strategy" : {
      "toolCommand" : {
        "_0" : "sdkmanager --uninstall {parent};{}"
      }
    },
    "tier" : 2,
    "title" : "Android platforms and build tools",
    "verified" : "expected",
    "visual" : "versionTimeline"
  },
  {
    "explanation" : {
      "afterDeletion" : "`sdkmanager` downloads the image again.",
      "keepItSmall" : "Keep the API levels your virtual devices actually use.",
      "what" : "Operating system images the emulator boots, one per API level and variant.",
      "whyItGrows" : "Studio downloads a new image per API level and keeps every one."
    },
    "family" : "systems",
    "guards" : [
      {
        "newerVersionPresent" : {
          "_0" : {
            "grouping" : "family",
            "keep" : 1
          }
        }
      }
    ],
    "id" : "android.system-images",
    "locations" : [
      {
        "glob" : {
          "_0" : "~/Library/Android/sdk/system-images/*/*/*"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "redownload" : {

      }
    },
    "selection" : {
      "perItem" : {

      }
    },
    "strategy" : {
      "delete" : {

      }
    },
    "tier" : 2,
    "title" : "Android system images",
    "verified" : "expected",
    "visual" : "versionTimeline"
  },
  {
    "explanation" : {
      "afterDeletion" : "Each app rebuilds what it needs.",
      "keepItSmall" : "Nothing to configure.",
      "what" : "Preview renders and transcode scratch data.",
      "whyItGrows" : "Every project you preview or transcode leaves its renders behind."
    },
    "family" : "design",
    "guards" : [

    ],
    "id" : "apple-media.caches",
    "locations" : [
      {
        "absolute" : {
          "_0" : "~/Library/Caches/com.apple.motionapp"
        }
      },
      {
        "absolute" : {
          "_0" : "~/Library/Caches/com.apple.Compressor"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "none" : {

      }
    },
    "selection" : {
      "whole" : {

      }
    },
    "strategy" : {
      "delete" : {

      }
    },
    "tier" : 1,
    "title" : "Motion and Compressor caches",
    "verified" : "expected",
    "visual" : "plain"
  },
  {
    "explanation" : {
      "afterDeletion" : "Folders go to the Trash; reinstalling the app starts with defaults.",
      "keepItSmall" : "An uninstaller that removes support files avoids this entirely.",
      "what" : "Support folders, caches and preferences whose application is gone.",
      "whyItGrows" : "Dragging an app to the Trash leaves everything it wrote in your Library."
    },
    "family" : "apps",
    "guards" : [

    ],
    "id" : "apps.leftovers",
    "locations" : [
      {
        "discovered" : {
          "_0" : "applicationLeftovers"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "irreversible" : {

      }
    },
    "selection" : {
      "perItem" : {

      }
    },
    "strategy" : {
      "trash" : {

      }
    },
    "tier" : 2,
    "title" : "Leftovers from removed applications",
    "verified" : "confirmed",
    "visual" : "plain"
  },
  {
    "explanation" : {
      "afterDeletion" : "The installer can be downloaded again from Software Update.",
      "keepItSmall" : "Remove the installer once the upgrade is done.",
      "what" : "Full macOS installers, twelve to fifteen gigabytes each.",
      "whyItGrows" : "Each upgrade downloads an installer and leaves it in Applications."
    },
    "family" : "apps",
    "guards" : [

    ],
    "id" : "apps.macos-installers",
    "locations" : [
      {
        "glob" : {
          "_0" : "/Applications/Install macOS *.app"
        }
      },
      {
        "glob" : {
          "_0" : "~/Applications/Install macOS *.app"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "redownload" : {
        "bytes" : 15032385536
      }
    },
    "selection" : {
      "perItem" : {

      }
    },
    "strategy" : {
      "trash" : {

      }
    },
    "tier" : 2,
    "title" : "macOS installers",
    "verified" : "expected",
    "visual" : "plain"
  },
  {
    "explanation" : {
      "afterDeletion" : "Applications go to the Trash; App Store apps can be downloaded again.",
      "keepItSmall" : "Reviewing this list twice a year is enough.",
      "what" : "Installed applications with no record of being opened recently.",
      "whyItGrows" : "Apps installed to try something once are rarely removed."
    },
    "family" : "apps",
    "guards" : [
      {
        "olderThan" : {
          "days" : 180
        }
      }
    ],
    "id" : "apps.unused",
    "locations" : [
      {
        "discovered" : {
          "_0" : "unusedApplications"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "redownload" : {

      }
    },
    "selection" : {
      "perItem" : {

      }
    },
    "strategy" : {
      "trash" : {

      }
    },
    "tier" : 3,
    "title" : "Applications you have not opened",
    "verified" : "confirmed",
    "visual" : "plain"
  },
  {
    "explanation" : {
      "afterDeletion" : "The next build refetches and rebuilds from scratch.",
      "keepItSmall" : "`bazel clean --expunge` in a workspace you have finished with.",
      "what" : "Bazel's output base: fetched dependencies and every build artifact.",
      "whyItGrows" : "One output base per workspace, none of which expire."
    },
    "family" : "systems",
    "guards" : [
      {
        "appNotRunning" : {
          "_0" : {
            "binary" : {
              "_0" : "bazel"
            }
          }
        }
      },
      {
        "noOpenFiles" : {

        }
      }
    ],
    "id" : "bazel.cache",
    "locations" : [
      {
        "absolute" : {
          "_0" : "~/.cache/bazel"
        }
      },
      {
        "absolute" : {
          "_0" : "~/.cache/bazelisk"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "rebuild" : {
        "minutes" : 15
      }
    },
    "selection" : {
      "whole" : {

      }
    },
    "strategy" : {
      "delete" : {

      }
    },
    "tier" : 2,
    "title" : "Bazel cache",
    "verified" : "expected",
    "visual" : "plain"
  },
  {
    "explanation" : {
      "afterDeletion" : "Simulations bake again when you play them.",
      "keepItSmall" : "Nothing to configure; Blender removes its scratch files on a clean quit.",
      "what" : "Render and simulation caches, plus scratch files from crashed sessions.",
      "whyItGrows" : "Every baked simulation is written out in full, and a crash leaves the scratch files behind."
    },
    "family" : "design",
    "guards" : [
      {
        "appNotRunning" : {
          "_0" : {
            "app" : {
              "_0" : "Blender"
            }
          }
        }
      },
      {
        "noOpenFiles" : {

        }
      }
    ],
    "id" : "blender.caches",
    "locations" : [
      {
        "absolute" : {
          "_0" : "~/Library/Caches/Blender"
        }
      },
      {
        "glob" : {
          "_0" : "/private/tmp/blender_*"
        }
      },
      {
        "glob" : {
          "_0" : "$TMPDIR/blender_*"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "rebuild" : {
        "minutes" : 15
      }
    },
    "selection" : {
      "perItem" : {

      }
    },
    "strategy" : {
      "delete" : {

      }
    },
    "tier" : 1,
    "title" : "Blender caches",
    "verified" : "confirmed",
    "visual" : "plain"
  },
  {
    "explanation" : {
      "afterDeletion" : "Directories go to the Trash, so add-on settings can be recovered.",
      "keepItSmall" : "Blender can copy settings forward on first launch of a new version.",
      "what" : "Per-version configuration, add-ons and asset libraries.",
      "whyItGrows" : "Each Blender release makes its own directory."
    },
    "family" : "design",
    "guards" : [
      {
        "appNotRunning" : {
          "_0" : {
            "app" : {
              "_0" : "Blender"
            }
          }
        }
      },
      {
        "newerVersionPresent" : {
          "_0" : {
            "grouping" : "flat",
            "keep" : 1
          }
        }
      }
    ],
    "id" : "blender.versions",
    "locations" : [
      {
        "glob" : {
          "_0" : "~/Library/Application Support/Blender/*"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "irreversible" : {

      }
    },
    "selection" : {
      "allButNewest" : {
        "_0" : {
          "grouping" : "flat",
          "keep" : 1
        }
      }
    },
    "strategy" : {
      "trash" : {

      }
    },
    "tier" : 2,
    "title" : "Blender versions",
    "verified" : "confirmed",
    "visual" : "versionTimeline"
  },
  {
    "explanation" : {
      "afterDeletion" : "Thumbnails regenerate as you browse.",
      "keepItSmall" : "Bridge preferences can cap the cache size.",
      "what" : "Thumbnails and previews Bridge builds for every folder you browse.",
      "whyItGrows" : "Every folder you browse adds its thumbnails, including folders you never return to."
    },
    "family" : "design",
    "guards" : [
      {
        "appNotRunning" : {
          "_0" : {
            "app" : {
              "_0" : "Adobe Bridge"
            }
          }
        }
      }
    ],
    "id" : "bridge.cache",
    "locations" : [
      {
        "glob" : {
          "_0" : "~/Library/Caches/Adobe/Bridge*/**/Cache"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "none" : {

      }
    },
    "selection" : {
      "whole" : {

      }
    },
    "strategy" : {
      "delete" : {

      }
    },
    "tier" : 1,
    "title" : "Adobe Bridge cache",
    "verified" : "expected",
    "visual" : "plain"
  },
  {
    "explanation" : {
      "afterDeletion" : "The next build is a cold build.",
      "keepItSmall" : "Turborepo and Nx both support a size cap in their configuration.",
      "what" : "Shared caches from Turborepo, Nx, TypeScript and the bundlers.",
      "whyItGrows" : "Each cache keyed by input hash, so every change adds an entry."
    },
    "family" : "node",
    "guards" : [

    ],
    "id" : "build-tool.caches",
    "locations" : [
      {
        "absolute" : {
          "_0" : "~/.cache/turbo"
        }
      },
      {
        "absolute" : {
          "_0" : "~/Library/Caches/turbo"
        }
      },
      {
        "absolute" : {
          "_0" : "~/.cache/nx"
        }
      },
      {
        "absolute" : {
          "_0" : "~/Library/Caches/typescript"
        }
      },
      {
        "absolute" : {
          "_0" : "~/.cache/rollup-plugin-typescript2"
        }
      },
      {
        "absolute" : {
          "_0" : "~/.cache/esbuild"
        }
      },
      {
        "absolute" : {
          "_0" : "~/.vite"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "rebuild" : {
        "minutes" : 3
      }
    },
    "selection" : {
      "whole" : {

      }
    },
    "strategy" : {
      "delete" : {

      }
    },
    "tier" : 1,
    "title" : "Build tool caches",
    "verified" : "expected",
    "visual" : "plain"
  },
  {
    "explanation" : {
      "afterDeletion" : "The next `bun install` downloads again.",
      "keepItSmall" : "`bun pm cache rm` empties it.",
      "what" : "Package archives Bun keeps between installs.",
      "whyItGrows" : "Every version of every package any project has installed is kept."
    },
    "family" : "node",
    "guards" : [

    ],
    "id" : "bun.cache",
    "locations" : [
      {
        "absolute" : {
          "_0" : "~/.bun/install/cache"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "redownload" : {

      }
    },
    "requiresTool" : {
      "binary" : {
        "_0" : "bun"
      }
    },
    "selection" : {
      "whole" : {

      }
    },
    "strategy" : {
      "delete" : {

      }
    },
    "tier" : 1,
    "title" : "Bun install cache",
    "verified" : "expected",
    "visual" : "plain"
  },
  {
    "explanation" : {
      "afterDeletion" : "Each application refills what it needs.",
      "keepItSmall" : "Nothing to configure; caches are meant to be disposable.",
      "what" : "Cache directories in your Library that no named rule covers.",
      "whyItGrows" : "Every application writes here and almost none impose a limit."
    },
    "family" : "apps",
    "guards" : [

    ],
    "id" : "caches.other",
    "locations" : [
      {
        "discovered" : {
          "_0" : "unmatchedCaches"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "none" : {

      }
    },
    "selection" : {
      "perItem" : {

      }
    },
    "strategy" : {
      "delete" : {

      }
    },
    "tier" : 1,
    "title" : "Other caches",
    "verified" : "confirmed",
    "visual" : "stackedUsage"
  },
  {
    "explanation" : {
      "afterDeletion" : "The next build or launch fills it again, a little slower once.",
      "keepItSmall" : "Nothing to configure.",
      "what" : "Caches applications and compilers keep in the per-user cache folder, such as clang's module cache.",
      "whyItGrows" : "Compilers add an entry per module and build setting, and nothing trims the folder until macOS needs the space."
    },
    "family" : "apps",
    "guards" : [
      {
        "noOpenFiles" : {

        }
      },
      {
        "olderThan" : {
          "days" : 3
        }
      }
    ],
    "id" : "caches.user-cache-dir",
    "locations" : [
      {
        "discovered" : {
          "_0" : "userCacheEntries"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "rebuild" : {
        "minutes" : 1
      }
    },
    "selection" : {
      "perItem" : {

      }
    },
    "strategy" : {
      "delete" : {

      }
    },
    "tier" : 1,
    "title" : "Per-user system caches",
    "verified" : "confirmed",
    "visual" : "plain"
  },
  {
    "explanation" : {
      "afterDeletion" : "Raw files are decoded again when you open them.",
      "keepItSmall" : "Camera Raw preferences set the maximum cache size.",
      "what" : "Decoded raw image data shared by Photoshop, Bridge and Lightroom.",
      "whyItGrows" : "Every raw file you open is decoded and kept until the cache reaches the size set in preferences."
    },
    "family" : "design",
    "guards" : [

    ],
    "id" : "camera-raw.cache",
    "locations" : [
      {
        "absolute" : {
          "_0" : "~/Library/Caches/Adobe Camera Raw"
        }
      },
      {
        "glob" : {
          "_0" : "~/Library/Caches/Adobe Camera Raw*"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "none" : {

      }
    },
    "selection" : {
      "whole" : {

      }
    },
    "strategy" : {
      "delete" : {

      }
    },
    "tier" : 1,
    "title" : "Camera Raw cache",
    "verified" : "expected",
    "visual" : "plain"
  },
  {
    "explanation" : {
      "afterDeletion" : "The next build clones them again.",
      "keepItSmall" : "Nothing to configure; Cargo 1.88 and later removes cache entries it has not used for months.",
      "what" : "Full clones of crates depended on by git rather than by version.",
      "whyItGrows" : "Every git dependency of every project is cloned in full, then checked out again per revision."
    },
    "family" : "systems",
    "guards" : [

    ],
    "id" : "cargo.git",
    "locations" : [
      {
        "absolute" : {
          "_0" : "~/.cargo/git"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "redownload" : {

      }
    },
    "selection" : {
      "whole" : {

      }
    },
    "strategy" : {
      "delete" : {

      }
    },
    "tier" : 1,
    "title" : "Cargo git checkouts",
    "verified" : "expected",
    "visual" : "plain"
  },
  {
    "explanation" : {
      "afterDeletion" : "The next build downloads and unpacks again.",
      "keepItSmall" : "The index is left in place, so a rebuild does not re-resolve.",
      "what" : "Downloaded crate archives and their unpacked sources.",
      "whyItGrows" : "Every version of every crate any project has built is kept."
    },
    "family" : "systems",
    "guards" : [

    ],
    "id" : "cargo.registry",
    "locations" : [
      {
        "absolute" : {
          "_0" : "~/.cargo/registry/cache"
        }
      },
      {
        "absolute" : {
          "_0" : "~/.cargo/registry/src"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "redownload" : {

      }
    },
    "requiresTool" : {
      "binary" : {
        "_0" : "cargo"
      }
    },
    "selection" : {
      "whole" : {

      }
    },
    "strategy" : {
      "delete" : {

      }
    },
    "tier" : 1,
    "title" : "Cargo registry cache",
    "verified" : "confirmed",
    "visual" : "plain"
  },
  {
    "explanation" : {
      "afterDeletion" : "`carthage bootstrap` fetches and rebuilds them.",
      "keepItSmall" : "Nothing to configure.",
      "what" : "Cloned dependencies and built frameworks from Carthage.",
      "whyItGrows" : "Every dependency any project has resolved is cloned in full, and each built version keeps its framework."
    },
    "family" : "xcode",
    "guards" : [

    ],
    "id" : "carthage.cache",
    "locations" : [
      {
        "absolute" : {
          "_0" : "~/Library/Caches/org.carthage.CarthageKit"
        }
      },
      {
        "absolute" : {
          "_0" : "~/Library/Caches/carthage"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "rebuild" : {
        "minutes" : 10
      }
    },
    "selection" : {
      "whole" : {

      }
    },
    "strategy" : {
      "delete" : {

      }
    },
    "tier" : 1,
    "title" : "Carthage cache",
    "verified" : "expected",
    "visual" : "plain"
  },
  {
    "explanation" : {
      "afterDeletion" : "Pages and components load from the network once; history, passwords and tabs are untouched.",
      "keepItSmall" : "Nothing to configure; browsers manage this within their own limit.",
      "what" : "Cached pages, scripts, compiled JavaScript and downloaded components from Chromium browsers.",
      "whyItGrows" : "The cache fills to its limit, and service worker caches and optional components grow beside it."
    },
    "family" : "browsers",
    "guards" : [
      {
        "appNotRunning" : {
          "_0" : {
            "app" : {
              "_0" : "Google Chrome"
            }
          }
        }
      },
      {
        "appNotRunning" : {
          "_0" : {
            "app" : {
              "_0" : "Brave Browser"
            }
          }
        }
      },
      {
        "appNotRunning" : {
          "_0" : {
            "app" : {
              "_0" : "Microsoft Edge"
            }
          }
        }
      },
      {
        "appNotRunning" : {
          "_0" : {
            "app" : {
              "_0" : "Arc"
            }
          }
        }
      }
    ],
    "id" : "chrome-family",
    "locations" : [
      {
        "absolute" : {
          "_0" : "~/Library/Caches/Google/Chrome"
        }
      },
      {
        "absolute" : {
          "_0" : "~/Library/Caches/BraveSoftware"
        }
      },
      {
        "absolute" : {
          "_0" : "~/Library/Caches/Microsoft Edge"
        }
      },
      {
        "absolute" : {
          "_0" : "~/Library/Caches/company.thebrowser.Browser"
        }
      },
      {
        "absolute" : {
          "_0" : "~/Library/Caches/com.vivaldi.Vivaldi"
        }
      },
      {
        "absolute" : {
          "_0" : "~/Library/Caches/Chromium"
        }
      },
      {
        "glob" : {
          "_0" : "~/Library/Application Support/Google/Chrome/*/Code Cache"
        }
      },
      {
        "glob" : {
          "_0" : "~/Library/Application Support/Google/Chrome/*/GPUCache"
        }
      },
      {
        "glob" : {
          "_0" : "~/Library/Application Support/Google/Chrome/*/Service Worker/CacheStorage"
        }
      },
      {
        "glob" : {
          "_0" : "~/Library/Application Support/Google/Chrome/*/Service Worker/ScriptCache"
        }
      },
      {
        "glob" : {
          "_0" : "~/Library/Application Support/Google/Chrome/*/Shared Dictionary"
        }
      },
      {
        "absolute" : {
          "_0" : "~/Library/Application Support/Google/Chrome/component_crx_cache"
        }
      },
      {
        "absolute" : {
          "_0" : "~/Library/Application Support/Google/Chrome/screen_ai"
        }
      },
      {
        "glob" : {
          "_0" : "~/Library/Application Support/BraveSoftware/Brave-Browser/*/Code Cache"
        }
      },
      {
        "glob" : {
          "_0" : "~/Library/Application Support/Arc/User Data/*/Code Cache"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "none" : {

      }
    },
    "selection" : {
      "whole" : {

      }
    },
    "strategy" : {
      "delete" : {

      }
    },
    "tier" : 1,
    "title" : "Chromium browser caches",
    "verified" : "confirmed",
    "visual" : "plain"
  },
  {
    "explanation" : {
      "afterDeletion" : "Your extensions and their settings stay; only builds no profile points at go to the Trash.",
      "keepItSmall" : "Nothing to configure; quitting Chrome fully now and then lets it finish pending updates.",
      "what" : "Earlier builds of your Chrome extensions, kept beside the build Chrome uses.",
      "whyItGrows" : "Each extension update unpacks a complete new build, and the previous one is not always removed."
    },
    "family" : "browsers",
    "guards" : [
      {
        "appNotRunning" : {
          "_0" : {
            "app" : {
              "_0" : "Google Chrome"
            }
          }
        }
      },
      {
        "noOpenFiles" : {

        }
      }
    ],
    "id" : "chrome.old-extensions",
    "locations" : [
      {
        "discovered" : {
          "_0" : "chromeSupersededExtensions"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "none" : {

      }
    },
    "selection" : {
      "perItem" : {

      }
    },
    "strategy" : {
      "trash" : {

      }
    },
    "tier" : 2,
    "title" : "Superseded Chrome extension builds",
    "verified" : "confirmed",
    "visual" : "versionTimeline"
  },
  {
    "explanation" : {
      "afterDeletion" : "Nothing is removed here; some web apps keep their only copy of your work in it.",
      "keepItSmall" : "Remove the data of sites you no longer use from Chrome's site data settings.",
      "what" : "Files websites have stored in Chrome, per profile.",
      "whyItGrows" : "Web apps keep documents, offline copies and media here, and Chrome only trims it under pressure."
    },
    "family" : "browsers",
    "guards" : [

    ],
    "id" : "chrome.site-storage",
    "locations" : [
      {
        "glob" : {
          "_0" : "~/Library/Application Support/Google/Chrome/*/File System"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "none" : {

      }
    },
    "selection" : {
      "perItem" : {

      }
    },
    "strategy" : {
      "advisory" : {
        "_0" : "Chrome, Settings, Privacy and security, Site data"
      }
    },
    "tier" : 4,
    "title" : "Chrome site storage",
    "verified" : "confirmed",
    "visual" : "plain"
  },
  {
    "explanation" : {
      "afterDeletion" : "Chrome is unaffected; the next update may download in full rather than as a patch.",
      "keepItSmall" : "Nothing to configure; the updater replaces the file with each update.",
      "what" : "Chrome installers Google's updater keeps after applying an update.",
      "whyItGrows" : "Each update leaves the full installer it downloaded, several hundred megabytes for Chrome."
    },
    "family" : "browsers",
    "guards" : [
      {
        "olderThan" : {
          "days" : 7
        }
      },
      {
        "noOpenFiles" : {

        }
      }
    ],
    "id" : "chrome.updater-cache",
    "locations" : [
      {
        "glob" : {
          "_0" : "~/Library/Application Support/Google/GoogleUpdater/crx_cache/*"
        }
      }
    ],
    "minimumBytes" : 1048576,
    "pass" : "probe",
    "regenerationCost" : {
      "redownload" : {

      }
    },
    "selection" : {
      "perItem" : {

      }
    },
    "strategy" : {
      "delete" : {

      }
    },
    "tier" : 1,
    "title" : "Google updater download cache",
    "verified" : "confirmed",
    "visual" : "plain"
  },
  {
    "explanation" : {
      "afterDeletion" : "The app refills them as you use it.",
      "keepItSmall" : "Nothing to configure; these are not exposed as settings.",
      "what" : "Web content caches from the desktop app's embedded browser.",
      "whyItGrows" : "Every script, image and rendered artifact the embedded browser loads is cached, with no limit the app exposes."
    },
    "family" : "aiAgents",
    "guards" : [
      {
        "appNotRunning" : {
          "_0" : {
            "app" : {
              "_0" : "Claude"
            }
          }
        }
      }
    ],
    "id" : "claude.desktop-cache",
    "locations" : [
      {
        "absolute" : {
          "_0" : "~/Library/Application Support/Claude/Cache"
        }
      },
      {
        "absolute" : {
          "_0" : "~/Library/Application Support/Claude/Code Cache"
        }
      },
      {
        "absolute" : {
          "_0" : "~/Library/Application Support/Claude/GPUCache"
        }
      },
      {
        "absolute" : {
          "_0" : "~/Library/Application Support/Claude/DawnWebGPUCache"
        }
      },
      {
        "glob" : {
          "_0" : "~/Library/Application Support/Claude/Partitions/*/Cache"
        }
      },
      {
        "absolute" : {
          "_0" : "~/Library/Caches/com.anthropic.claudefordesktop"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "none" : {

      }
    },
    "selection" : {
      "whole" : {

      }
    },
    "strategy" : {
      "delete" : {

      }
    },
    "tier" : 1,
    "title" : "Claude desktop caches",
    "verified" : "confirmed",
    "visual" : "plain"
  },
  {
    "explanation" : {
      "afterDeletion" : "The next sandboxed run downloads the bundle again.",
      "keepItSmall" : "Nothing to configure; this is worth revisiting after an update.",
      "what" : "The Linux machine image the Claude desktop app runs sandboxed code inside; its session disk stays.",
      "whyItGrows" : "Each bundle is a full machine image and updates add a new one."
    },
    "family" : "containers",
    "guards" : [
      {
        "appNotRunning" : {
          "_0" : {
            "app" : {
              "_0" : "Claude"
            }
          }
        }
      },
      {
        "noOpenFiles" : {

        }
      }
    ],
    "id" : "claude.desktop-vm",
    "locations" : [
      {
        "glob" : {
          "_0" : "~/Library/Application Support/Claude/vm_bundles/*.bundle/rootfs.img"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "redownload" : {

      }
    },
    "selection" : {
      "perItem" : {

      }
    },
    "strategy" : {
      "delete" : {

      }
    },
    "tier" : 2,
    "title" : "Claude sandbox virtual machine",
    "verified" : "confirmed",
    "visual" : "sparseDisk"
  },
  {
    "explanation" : {
      "afterDeletion" : "Those sessions can no longer rewind their edits. Your files stay as they are.",
      "keepItSmall" : "Nothing to configure.",
      "what" : "Copies of files as they were before each edit, kept so a session can rewind.",
      "whyItGrows" : "Every edit in every session keeps the previous version."
    },
    "family" : "aiAgents",
    "guards" : [
      {
        "noOpenFiles" : {

        }
      }
    ],
    "id" : "claude.file-history",
    "locations" : [
      {
        "discovered" : {
          "_0" : "claudeIdleFileHistory"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "irreversible" : {

      }
    },
    "selection" : {
      "perItem" : {

      }
    },
    "strategy" : {
      "trash" : {

      }
    },
    "tier" : 2,
    "title" : "Claude Code rewind checkpoints",
    "verified" : "confirmed",
    "visual" : "ageHistogram"
  },
  {
    "explanation" : {
      "afterDeletion" : "Your installed plugins keep working; browsing that marketplace needs it cloned again.",
      "keepItSmall" : "Remove marketplaces you no longer browse with the plugin command in Claude Code.",
      "what" : "Plugin catalogs Claude Code has cloned from which no installed plugin comes.",
      "whyItGrows" : "Adding a marketplace clones its whole repository, and it is updated in place."
    },
    "family" : "aiAgents",
    "guards" : [
      {
        "noOpenFiles" : {

        }
      }
    ],
    "id" : "claude.marketplaces",
    "locations" : [
      {
        "discovered" : {
          "_0" : "claudeUnusedMarketplaces"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "redownload" : {

      }
    },
    "selection" : {
      "perItem" : {

      }
    },
    "strategy" : {
      "trash" : {

      }
    },
    "tier" : 2,
    "title" : "Unused Claude Code plugin marketplaces",
    "verified" : "confirmed",
    "visual" : "plain"
  },
  {
    "explanation" : {
      "afterDeletion" : "The version you run stays; only versions nothing points at go.",
      "keepItSmall" : "Nothing to configure.",
      "what" : "Earlier versions of Claude Code, kept after each update.",
      "whyItGrows" : "Every update installs a complete new binary of two hundred megabytes beside the last."
    },
    "family" : "aiAgents",
    "guards" : [
      {
        "noOpenFiles" : {

        }
      }
    ],
    "id" : "claude.old-binaries",
    "locations" : [
      {
        "discovered" : {
          "_0" : "claudeOldBinaries"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "redownload" : {

      }
    },
    "selection" : {
      "perItem" : {

      }
    },
    "strategy" : {
      "delete" : {

      }
    },
    "tier" : 1,
    "title" : "Superseded Claude Code binaries",
    "verified" : "confirmed",
    "visual" : "versionTimeline"
  },
  {
    "explanation" : {
      "afterDeletion" : "Installed plugins keep working; only versions nothing points at go.",
      "keepItSmall" : "Nothing to configure.",
      "what" : "Older copies of plugins, left in the cache when a plugin updates.",
      "whyItGrows" : "Each update installs the new version beside the old one."
    },
    "family" : "aiAgents",
    "guards" : [
      {
        "noOpenFiles" : {

        }
      }
    ],
    "id" : "claude.plugins",
    "locations" : [
      {
        "discovered" : {
          "_0" : "claudeSupersededPlugins"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "redownload" : {

      }
    },
    "selection" : {
      "perItem" : {

      }
    },
    "strategy" : {
      "delete" : {

      }
    },
    "tier" : 1,
    "title" : "Superseded Claude Code plugin versions",
    "verified" : "confirmed",
    "visual" : "plain"
  },
  {
    "explanation" : {
      "afterDeletion" : "New sessions write new snapshots.",
      "keepItSmall" : "Nothing to configure.",
      "what" : "Shell environment captures from each session.",
      "whyItGrows" : "One snapshot per session, kept indefinitely."
    },
    "family" : "aiAgents",
    "guards" : [

    ],
    "id" : "claude.snapshots",
    "locations" : [
      {
        "discovered" : {
          "_0" : "claudeIdleShellSnapshots"
        }
      },
      {
        "glob" : {
          "_0" : "~/.claude/statsig/*"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "none" : {

      }
    },
    "selection" : {
      "entriesOlderThan" : {
        "days" : 7
      }
    },
    "strategy" : {
      "delete" : {

      }
    },
    "tier" : 1,
    "title" : "Claude Code shell snapshots",
    "verified" : "confirmed",
    "visual" : "ageHistogram"
  },
  {
    "explanation" : {
      "afterDeletion" : "Those sessions can no longer be resumed. Project memory notes stay where they are.",
      "keepItSmall" : "Remove sessions you have not resumed in a month.",
      "what" : "The conversation history of each Claude Code session, with its subagents.",
      "whyItGrows" : "Every session appends, and nothing is removed when a project is deleted."
    },
    "family" : "aiAgents",
    "guards" : [
      {
        "noActiveSession" : {

        }
      },
      {
        "noOpenFiles" : {

        }
      }
    ],
    "id" : "claude.transcripts",
    "locations" : [
      {
        "discovered" : {
          "_0" : "claudeTranscripts"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "irreversible" : {

      }
    },
    "selection" : {
      "entriesOlderThan" : {
        "days" : 30
      }
    },
    "strategy" : {
      "trash" : {

      }
    },
    "tier" : 3,
    "title" : "Claude Code transcripts",
    "verified" : "confirmed",
    "visual" : "ageHistogram"
  },
  {
    "explanation" : {
      "afterDeletion" : "Tools fetch what they need and may ask you to sign in again.",
      "keepItSmall" : "Nothing to configure.",
      "what" : "Credential caches, logs and downloaded helpers from cloud command line tools.",
      "whyItGrows" : "Logs are appended per invocation and nothing expires."
    },
    "family" : "system",
    "guards" : [

    ],
    "id" : "cloud-cli.caches",
    "locations" : [
      {
        "absolute" : {
          "_0" : "~/.aws/cli/cache"
        }
      },
      {
        "absolute" : {
          "_0" : "~/.config/gcloud/logs"
        }
      },
      {
        "absolute" : {
          "_0" : "~/.azure/logs"
        }
      },
      {
        "absolute" : {
          "_0" : "~/.kube/cache"
        }
      },
      {
        "absolute" : {
          "_0" : "~/.helm/cache"
        }
      },
      {
        "absolute" : {
          "_0" : "~/Library/Caches/helm"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "relogin" : {

      }
    },
    "selection" : {
      "whole" : {

      }
    },
    "strategy" : {
      "delete" : {

      }
    },
    "tier" : 2,
    "title" : "Cloud tool caches",
    "verified" : "confirmed",
    "visual" : "plain"
  },
  {
    "explanation" : {
      "afterDeletion" : "`pod install` downloads them again.",
      "keepItSmall" : "`pod cache clean --all` empties it.",
      "what" : "Downloaded pod sources and prebuilt frameworks.",
      "whyItGrows" : "Every version of every pod any project has installed is kept."
    },
    "family" : "xcode",
    "guards" : [

    ],
    "id" : "cocoapods.cache",
    "locations" : [
      {
        "absolute" : {
          "_0" : "~/Library/Caches/CocoaPods"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "redownload" : {

      }
    },
    "requiresTool" : {
      "binary" : {
        "_0" : "pod"
      }
    },
    "selection" : {
      "whole" : {

      }
    },
    "strategy" : {
      "delete" : {

      }
    },
    "tier" : 1,
    "title" : "CocoaPods cache",
    "verified" : "expected",
    "visual" : "plain"
  },
  {
    "explanation" : {
      "afterDeletion" : "CocoaPods uses the CDN instead, which is the current default.",
      "keepItSmall" : "Nothing further; the CDN needs no local clone.",
      "what" : "A full git clone of every podspec ever published.",
      "whyItGrows" : "The legacy specs repository grows with the ecosystem, not with your projects."
    },
    "family" : "xcode",
    "guards" : [

    ],
    "id" : "cocoapods.specs",
    "locations" : [
      {
        "absolute" : {
          "_0" : "~/.cocoapods/repos/master"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "redownload" : {

      }
    },
    "requiresTool" : {
      "binary" : {
        "_0" : "pod"
      }
    },
    "selection" : {
      "whole" : {

      }
    },
    "strategy" : {
      "toolCommand" : {
        "_0" : "pod repo remove master"
      }
    },
    "tier" : 2,
    "title" : "CocoaPods master specs",
    "verified" : "expected",
    "visual" : "plain"
  },
  {
    "explanation" : {
      "afterDeletion" : "The app refills them as you use it.",
      "keepItSmall" : "Nothing to configure.",
      "what" : "Web content and update caches from the Codex application.",
      "whyItGrows" : "Every page the embedded browser renders is cached, and each update leaves its download beside it."
    },
    "family" : "aiAgents",
    "guards" : [

    ],
    "id" : "codex.caches",
    "locations" : [
      {
        "absolute" : {
          "_0" : "~/Library/Caches/com.openai.codex"
        }
      },
      {
        "absolute" : {
          "_0" : "~/Library/Caches/Codex"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "none" : {

      }
    },
    "selection" : {
      "whole" : {

      }
    },
    "strategy" : {
      "delete" : {

      }
    },
    "tier" : 1,
    "title" : "Codex caches",
    "verified" : "confirmed",
    "visual" : "plain"
  },
  {
    "explanation" : {
      "afterDeletion" : "Images go to the Trash, so anything worth keeping is recoverable.",
      "keepItSmall" : "Move images you want into a project folder.",
      "what" : "Images generated during sessions, kept as files.",
      "whyItGrows" : "Every generated image is written and none are removed."
    },
    "family" : "aiAgents",
    "guards" : [

    ],
    "id" : "codex.images",
    "locations" : [
      {
        "absolute" : {
          "_0" : "~/.codex/generated_images"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "irreversible" : {

      }
    },
    "selection" : {
      "perItem" : {

      }
    },
    "strategy" : {
      "trash" : {

      }
    },
    "tier" : 3,
    "title" : "Codex generated images",
    "verified" : "confirmed",
    "visual" : "fileGrid"
  },
  {
    "explanation" : {
      "afterDeletion" : "Codex starts a new log database. Its write-ahead log files go with it.",
      "keepItSmall" : "Nothing to configure.",
      "what" : "Diagnostic logs Codex writes as a database.",
      "whyItGrows" : "Every session appends to the same database and nothing expires."
    },
    "family" : "aiAgents",
    "guards" : [
      {
        "noOpenFiles" : {

        }
      },
      {
        "appNotRunning" : {
          "_0" : {
            "app" : {
              "_0" : "Codex"
            }
          }
        }
      },
      {
        "appNotRunning" : {
          "_0" : {
            "binary" : {
              "_0" : "codex"
            }
          }
        }
      }
    ],
    "id" : "codex.logs",
    "locations" : [
      {
        "glob" : {
          "_0" : "~/.codex/logs_*.sqlite"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "none" : {

      }
    },
    "selection" : {
      "perItem" : {

      }
    },
    "strategy" : {
      "trash" : {

      }
    },
    "tier" : 2,
    "title" : "Codex logs",
    "verified" : "confirmed",
    "visual" : "plain"
  },
  {
    "explanation" : {
      "afterDeletion" : "Only the newest runtime is used.",
      "keepItSmall" : "Nothing to configure.",
      "what" : "Sandbox runtime images Codex downloads, one per version.",
      "whyItGrows" : "Each update downloads a new runtime and keeps the previous one."
    },
    "family" : "aiAgents",
    "guards" : [
      {
        "newerVersionPresent" : {
          "_0" : {
            "grouping" : "family",
            "keep" : 1
          }
        }
      }
    ],
    "id" : "codex.runtimes",
    "locations" : [
      {
        "glob" : {
          "_0" : "~/.cache/codex-runtimes/*"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "redownload" : {

      }
    },
    "selection" : {
      "allButNewest" : {
        "_0" : {
          "grouping" : "family",
          "keep" : 1
        }
      }
    },
    "strategy" : {
      "delete" : {

      }
    },
    "tier" : 2,
    "title" : "Codex sandbox runtimes",
    "verified" : "confirmed",
    "visual" : "versionTimeline"
  },
  {
    "explanation" : {
      "afterDeletion" : "Those sessions can no longer be reopened.",
      "keepItSmall" : "Remove archived sessions older than a month.",
      "what" : "Transcripts of every Codex session, one file each, live and archived.",
      "whyItGrows" : "Sessions are archived rather than removed, so the directory only grows."
    },
    "family" : "aiAgents",
    "guards" : [
      {
        "noOpenFiles" : {

        }
      },
      {
        "appNotRunning" : {
          "_0" : {
            "app" : {
              "_0" : "Codex"
            }
          }
        }
      },
      {
        "appNotRunning" : {
          "_0" : {
            "binary" : {
              "_0" : "codex"
            }
          }
        }
      }
    ],
    "id" : "codex.sessions",
    "locations" : [
      {
        "glob" : {
          "_0" : "~/.codex/sessions/*/*/*/rollout-*.jsonl"
        }
      },
      {
        "glob" : {
          "_0" : "~/.codex/archived_sessions/*.jsonl"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "irreversible" : {

      }
    },
    "selection" : {
      "entriesOlderThan" : {
        "days" : 30
      }
    },
    "strategy" : {
      "trash" : {

      }
    },
    "tier" : 3,
    "title" : "Codex sessions",
    "verified" : "confirmed",
    "visual" : "ageHistogram"
  },
  {
    "explanation" : {
      "afterDeletion" : "Nothing is removed here; vacuuming compacts the file in place.",
      "keepItSmall" : "Quit Codex first, and keep free space at least the size of the file while it vacuums.",
      "what" : "The database holding conversation threads the interface reads.",
      "whyItGrows" : "Deleted rows leave free pages that SQLite reuses but does not return."
    },
    "family" : "aiAgents",
    "guards" : [

    ],
    "id" : "codex.thread-db",
    "locations" : [
      {
        "glob" : {
          "_0" : "~/.codex/thread_history_*.sqlite"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "none" : {

      }
    },
    "selection" : {
      "perItem" : {

      }
    },
    "strategy" : {
      "advisory" : {
        "_0" : "sqlite3 ~/.codex/thread_history_1.sqlite 'VACUUM;'"
      }
    },
    "tier" : 4,
    "title" : "Codex thread history",
    "verified" : "confirmed",
    "visual" : "plain"
  },
  {
    "explanation" : {
      "afterDeletion" : "Nothing is removed here; `colima delete` removes the machine with every image, container and volume in it, and `colima start` makes an empty one.",
      "keepItSmall" : "`colima prune` removes unused images; `colima delete` starts fresh.",
      "what" : "The disk image and state of the Linux virtual machine Colima runs.",
      "whyItGrows" : "The disk grows with every image pulled and never shrinks."
    },
    "family" : "containers",
    "guards" : [

    ],
    "id" : "colima.disks",
    "locations" : [
      {
        "absolute" : {
          "_0" : "~/.colima/_lima/_disks"
        }
      },
      {
        "glob" : {
          "_0" : "~/.colima/_lima/colima*"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "none" : {

      }
    },
    "requiresTool" : {
      "binary" : {
        "_0" : "colima"
      }
    },
    "selection" : {
      "whole" : {

      }
    },
    "strategy" : {
      "advisory" : {
        "_0" : "colima delete"
      }
    },
    "tier" : 4,
    "title" : "Colima virtual machine",
    "verified" : "confirmed",
    "visual" : "sparseDisk"
  },
  {
    "explanation" : {
      "afterDeletion" : "Files go to the Trash, so anything you made yourself is recoverable.",
      "keepItSmall" : "Group models by workflow so unused sets are easy to spot.",
      "what" : "Checkpoints, LoRAs and upscalers ComfyUI loads, often imported by hand.",
      "whyItGrows" : "Downloads accumulate per workflow you try."
    },
    "family" : "python",
    "guards" : [

    ],
    "id" : "comfyui.models",
    "locations" : [
      {
        "glob" : {
          "_0" : "~/Library/Application Support/ComfyUI/models/*"
        }
      },
      {
        "glob" : {
          "_0" : "~/ComfyUI/models/*"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "irreversible" : {

      }
    },
    "selection" : {
      "perItem" : {

      }
    },
    "strategy" : {
      "trash" : {

      }
    },
    "tier" : 3,
    "title" : "ComfyUI models",
    "verified" : "expected",
    "visual" : "modelList"
  },
  {
    "explanation" : {
      "afterDeletion" : "Recreating needs the environment file, if one was saved.",
      "keepItSmall" : "Export an environment file before removing, so it can be rebuilt.",
      "what" : "Complete Python environments, one directory per environment.",
      "whyItGrows" : "Environments outlive the experiments they were made for."
    },
    "family" : "python",
    "guards" : [
      {
        "olderThan" : {
          "days" : 90
        }
      },
      {
        "noActiveSession" : {

        }
      }
    ],
    "id" : "conda.envs",
    "locations" : [
      {
        "glob" : {
          "_0" : "~/miniconda3/envs/*"
        }
      },
      {
        "glob" : {
          "_0" : "~/anaconda3/envs/*"
        }
      },
      {
        "glob" : {
          "_0" : "~/.conda/envs/*"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "rebuild" : {
        "minutes" : 5
      }
    },
    "requiresTool" : {
      "binary" : {
        "_0" : "conda"
      }
    },
    "selection" : {
      "perItem" : {

      }
    },
    "strategy" : {
      "toolCommand" : {
        "_0" : "conda env remove --yes --prefix {path}"
      }
    },
    "tier" : 2,
    "title" : "conda environments",
    "verified" : "expected",
    "visual" : "plain"
  },
  {
    "explanation" : {
      "afterDeletion" : "Creating an environment downloads the packages again.",
      "keepItSmall" : "`conda clean --all` after removing an environment.",
      "what" : "Downloaded and unpacked conda packages shared across environments.",
      "whyItGrows" : "Packages stay after the environments that used them are removed."
    },
    "family" : "python",
    "guards" : [

    ],
    "id" : "conda.pkgs",
    "locations" : [
      {
        "absolute" : {
          "_0" : "~/miniconda3/pkgs"
        }
      },
      {
        "absolute" : {
          "_0" : "~/anaconda3/pkgs"
        }
      },
      {
        "absolute" : {
          "_0" : "~/.conda/pkgs"
        }
      },
      {
        "absolute" : {
          "_0" : "~/miniforge3/pkgs"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "redownload" : {

      }
    },
    "requiresTool" : {
      "binary" : {
        "_0" : "conda"
      }
    },
    "selection" : {
      "whole" : {

      }
    },
    "strategy" : {
      "toolCommand" : {
        "_0" : "conda clean --all --yes"
      }
    },
    "tier" : 1,
    "title" : "conda package cache",
    "verified" : "expected",
    "visual" : "plain"
  },
  {
    "explanation" : {
      "afterDeletion" : "Corepack downloads the pinned version again.",
      "keepItSmall" : "Nothing to configure.",
      "what" : "Package manager versions Corepack downloads on demand.",
      "whyItGrows" : "One copy per version any project has pinned."
    },
    "family" : "node",
    "guards" : [

    ],
    "id" : "corepack.cache",
    "locations" : [
      {
        "absolute" : {
          "_0" : "~/.cache/node/corepack"
        }
      },
      {
        "absolute" : {
          "_0" : "~/Library/Caches/node/corepack"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "none" : {

      }
    },
    "selection" : {
      "whole" : {

      }
    },
    "strategy" : {
      "delete" : {

      }
    },
    "tier" : 1,
    "title" : "Corepack downloads",
    "verified" : "confirmed",
    "visual" : "plain"
  },
  {
    "explanation" : {
      "afterDeletion" : "Reports already sent to developers are unaffected.",
      "keepItSmall" : "Nothing to configure.",
      "what" : "Diagnostic reports macOS writes when an application crashes or hangs.",
      "whyItGrows" : "One file per crash, kept indefinitely."
    },
    "family" : "system",
    "guards" : [

    ],
    "id" : "crash-reports",
    "locations" : [
      {
        "absolute" : {
          "_0" : "~/Library/Logs/DiagnosticReports"
        }
      },
      {
        "absolute" : {
          "_0" : "~/Library/Application Support/CrashReporter"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "none" : {

      }
    },
    "selection" : {
      "whole" : {

      }
    },
    "strategy" : {
      "delete" : {

      }
    },
    "tier" : 1,
    "title" : "Crash reports",
    "verified" : "confirmed",
    "visual" : "plain"
  },
  {
    "explanation" : {
      "afterDeletion" : "Cursor uses the newest build, which stays.",
      "keepItSmall" : "Nothing to configure.",
      "what" : "Earlier builds of the agent Cursor runs in the background, kept after each update.",
      "whyItGrows" : "Each update unpacks a complete new build beside the old one."
    },
    "family" : "ides",
    "guards" : [
      {
        "newerVersionPresent" : {
          "_0" : {
            "grouping" : "flat",
            "keep" : 1
          }
        }
      },
      {
        "notActiveVersion" : {
          "tool" : "cursor-agent"
        }
      },
      {
        "appNotRunning" : {
          "_0" : {
            "app" : {
              "_0" : "Cursor"
            }
          }
        }
      }
    ],
    "id" : "cursor.agent-versions",
    "locations" : [
      {
        "glob" : {
          "_0" : "~/Library/Application Support/Cursor/User/globalStorage/anysphere.cursor-agent-worker/agent-cli/.local/share/cursor-agent/versions/*"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "redownload" : {

      }
    },
    "selection" : {
      "allButNewest" : {
        "_0" : {
          "grouping" : "flat",
          "keep" : 1
        }
      }
    },
    "strategy" : {
      "delete" : {

      }
    },
    "tier" : 1,
    "title" : "Superseded Cursor agent versions",
    "verified" : "confirmed",
    "visual" : "versionTimeline"
  },
  {
    "explanation" : {
      "afterDeletion" : "Cursor rebuilds its caches on next launch.",
      "keepItSmall" : "Nothing to configure.",
      "what" : "Editor caches, logs and downloaded update payloads.",
      "whyItGrows" : "Each update leaves its installer behind in the ShipIt directory, and every window writes its own logs."
    },
    "family" : "ides",
    "guards" : [
      {
        "appNotRunning" : {
          "_0" : {
            "app" : {
              "_0" : "Cursor"
            }
          }
        }
      }
    ],
    "id" : "cursor.caches",
    "locations" : [
      {
        "absolute" : {
          "_0" : "~/Library/Application Support/Cursor/Cache"
        }
      },
      {
        "absolute" : {
          "_0" : "~/Library/Application Support/Cursor/Code Cache"
        }
      },
      {
        "absolute" : {
          "_0" : "~/Library/Application Support/Cursor/GPUCache"
        }
      },
      {
        "absolute" : {
          "_0" : "~/Library/Application Support/Cursor/CachedExtensionVSIXs"
        }
      },
      {
        "absolute" : {
          "_0" : "~/Library/Application Support/Cursor/CachedData"
        }
      },
      {
        "absolute" : {
          "_0" : "~/Library/Application Support/Cursor/logs"
        }
      },
      {
        "absolute" : {
          "_0" : "~/Library/Caches/com.todesktop.230313mzl4w4u92.ShipIt"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "none" : {

      }
    },
    "selection" : {
      "whole" : {

      }
    },
    "strategy" : {
      "delete" : {

      }
    },
    "tier" : 1,
    "title" : "Cursor caches",
    "verified" : "confirmed",
    "visual" : "plain"
  },
  {
    "explanation" : {
      "afterDeletion" : "Only the version your project pins is needed.",
      "keepItSmall" : "`cypress cache prune` after every upgrade.",
      "what" : "The Cypress application, one copy per version.",
      "whyItGrows" : "Each upgrade installs a new copy beside the old one."
    },
    "family" : "node",
    "guards" : [
      {
        "newerVersionPresent" : {
          "_0" : {
            "grouping" : "flat",
            "keep" : 1
          }
        }
      }
    ],
    "id" : "cypress.binaries",
    "locations" : [
      {
        "glob" : {
          "_0" : "~/Library/Caches/Cypress/*"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "redownload" : {

      }
    },
    "selection" : {
      "allButNewest" : {
        "_0" : {
          "grouping" : "flat",
          "keep" : 1
        }
      }
    },
    "strategy" : {
      "toolCommand" : {
        "_0" : "cypress cache prune"
      }
    },
    "tier" : 2,
    "title" : "Cypress binaries",
    "verified" : "expected",
    "visual" : "versionTimeline"
  },
  {
    "explanation" : {
      "afterDeletion" : "Nothing is removed here; this is your data.",
      "keepItSmall" : "An old Postgres major left after an upgrade can be removed once the new one works.",
      "what" : "Data directories of databases installed through Homebrew.",
      "whyItGrows" : "Development databases accumulate every table ever created."
    },
    "family" : "system",
    "guards" : [

    ],
    "id" : "databases.local",
    "locations" : [
      {
        "glob" : {
          "_0" : "/opt/homebrew/var/postgresql@*"
        }
      },
      {
        "absolute" : {
          "_0" : "/opt/homebrew/var/postgres"
        }
      },
      {
        "absolute" : {
          "_0" : "/opt/homebrew/var/mysql"
        }
      },
      {
        "absolute" : {
          "_0" : "/opt/homebrew/var/mongodb"
        }
      },
      {
        "absolute" : {
          "_0" : "/opt/homebrew/var/redis"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "none" : {

      }
    },
    "selection" : {
      "perItem" : {

      }
    },
    "strategy" : {
      "advisory" : {
        "_0" : "Connect to the database and drop what you no longer need"
      }
    },
    "tier" : 4,
    "title" : "Local database data",
    "verified" : "confirmed",
    "visual" : "plain"
  },
  {
    "explanation" : {
      "afterDeletion" : "The next run fetches and recompiles.",
      "keepItSmall" : "`deno clean` empties it.",
      "what" : "Remote modules and compiled output Deno caches.",
      "whyItGrows" : "Every version of every remote module any script has imported is kept, along with the npm packages Deno installs."
    },
    "family" : "node",
    "guards" : [

    ],
    "id" : "deno.cache",
    "locations" : [
      {
        "absolute" : {
          "_0" : "~/Library/Caches/deno"
        }
      },
      {
        "absolute" : {
          "_0" : "~/.cache/deno"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "redownload" : {

      }
    },
    "requiresTool" : {
      "binary" : {
        "_0" : "deno"
      }
    },
    "selection" : {
      "whole" : {

      }
    },
    "strategy" : {
      "delete" : {

      }
    },
    "tier" : 1,
    "title" : "Deno cache",
    "verified" : "confirmed",
    "visual" : "plain"
  },
  {
    "explanation" : {
      "afterDeletion" : "Nothing is removed here; the owning app should do it so its library stays consistent.",
      "keepItSmall" : "Delete snapshots you no longer need from inside the app.",
      "what" : "Full virtual machines, including their snapshots, from UTM, Parallels, VMware and VirtualBox.",
      "whyItGrows" : "Snapshots are kept by default and each holds a copy of the changed blocks."
    },
    "family" : "containers",
    "guards" : [

    ],
    "id" : "desktop-vms",
    "locations" : [
      {
        "glob" : {
          "_0" : "~/Library/Containers/com.utmapp.UTM/Data/Documents/*.utm"
        }
      },
      {
        "glob" : {
          "_0" : "~/Parallels/*.pvm"
        }
      },
      {
        "glob" : {
          "_0" : "~/Virtual Machines.localized/*.vmwarevm"
        }
      },
      {
        "glob" : {
          "_0" : "~/VirtualBox VMs/*"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "none" : {

      }
    },
    "selection" : {
      "perItem" : {

      }
    },
    "strategy" : {
      "advisory" : {
        "_0" : "Open the virtualisation app and remove the machine there"
      }
    },
    "tier" : 4,
    "title" : "Desktop virtual machines",
    "verified" : "expected",
    "visual" : "sparseDisk"
  },
  {
    "explanation" : {
      "afterDeletion" : "Files go to the Trash, so anything worth keeping is recoverable.",
      "keepItSmall" : "Screenshot, Options can save captures into a folder instead of the Desktop.",
      "what" : "Screen captures saved to the Desktop with their default names.",
      "whyItGrows" : "Screenshots are taken constantly and saved to the Desktop by default."
    },
    "family" : "downloads",
    "guards" : [
      {
        "olderThan" : {
          "days" : 30
        }
      }
    ],
    "id" : "desktop.screenshots",
    "locations" : [
      {
        "glob" : {
          "_0" : "~/Desktop/Screenshot *.png"
        }
      },
      {
        "glob" : {
          "_0" : "~/Desktop/Screen Recording *.mov"
        }
      },
      {
        "glob" : {
          "_0" : "~/Desktop/Screenshot*.png"
        }
      },
      {
        "glob" : {
          "_0" : "~/Desktop/CleanShot*.png"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "irreversible" : {

      }
    },
    "selection" : {
      "perItem" : {

      }
    },
    "strategy" : {
      "trash" : {

      }
    },
    "tier" : 3,
    "title" : "Screenshots and recordings",
    "verified" : "confirmed",
    "visual" : "fileGrid"
  },
  {
    "explanation" : {
      "afterDeletion" : "The backup goes to the Trash, where it can still be put back.",
      "keepItSmall" : "Check whether iCloud already backs up the devices you still use.",
      "what" : "Full backups of an iPhone or iPad, holding photos and messages.",
      "whyItGrows" : "Each device keeps its own backup and old devices are never removed."
    },
    "family" : "xcode",
    "guards" : [

    ],
    "id" : "device.backups",
    "locations" : [
      {
        "glob" : {
          "_0" : "~/Library/Application Support/MobileSync/Backup/*"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "irreversible" : {

      }
    },
    "selection" : {
      "perItem" : {

      }
    },
    "strategy" : {
      "trash" : {

      }
    },
    "tier" : 3,
    "title" : "Device backups",
    "verified" : "expected",
    "visual" : "deviceGrid"
  },
  {
    "explanation" : {
      "afterDeletion" : "Reports still on the device can be copied again.",
      "keepItSmall" : "Nothing to configure.",
      "what" : "Crash reports copied from every iPhone and iPad you connect.",
      "whyItGrows" : "Each connection syncs the device's full report directory."
    },
    "family" : "xcode",
    "guards" : [

    ],
    "id" : "device.crash-logs",
    "locations" : [
      {
        "glob" : {
          "_0" : "~/Library/Logs/CrashReporter/MobileDevice/*"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "none" : {

      }
    },
    "selection" : {
      "entriesOlderThan" : {
        "days" : 30
      }
    },
    "strategy" : {
      "delete" : {

      }
    },
    "tier" : 1,
    "title" : "Device crash logs",
    "verified" : "expected",
    "visual" : "ageHistogram"
  },
  {
    "explanation" : {
      "afterDeletion" : "A future restore downloads the image again.",
      "keepItSmall" : "Nothing to configure.",
      "what" : "Full operating system images left by a restore or an update.",
      "whyItGrows" : "Finder downloads six to eight gigabytes per restore and keeps the file."
    },
    "family" : "xcode",
    "guards" : [

    ],
    "id" : "device.firmware",
    "locations" : [
      {
        "glob" : {
          "_0" : "~/Library/MobileDevice/Software Images/*.ipsw"
        }
      },
      {
        "glob" : {
          "_0" : "~/Library/iTunes/iPhone Software Updates/*.ipsw"
        }
      },
      {
        "glob" : {
          "_0" : "~/Library/iTunes/iPad Software Updates/*.ipsw"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "redownload" : {

      }
    },
    "selection" : {
      "perItem" : {

      }
    },
    "strategy" : {
      "delete" : {

      }
    },
    "tier" : 2,
    "title" : "Device firmware images",
    "verified" : "expected",
    "visual" : "plain"
  },
  {
    "explanation" : {
      "afterDeletion" : "The next session creates a fresh profile.",
      "keepItSmall" : "Running the server with `--isolated` uses a temporary profile that is removed on exit.",
      "what" : "Chrome profiles the DevTools MCP server creates per session.",
      "whyItGrows" : "The profile keeps browser cache and history across sessions, and each Chrome channel gets its own."
    },
    "family" : "node",
    "guards" : [
      {
        "appNotRunning" : {
          "_0" : {
            "binary" : {
              "_0" : "chrome-devtools-mcp"
            }
          }
        }
      },
      {
        "noOpenFiles" : {

        }
      }
    ],
    "id" : "devtools-mcp.profiles",
    "locations" : [
      {
        "absolute" : {
          "_0" : "~/.cache/chrome-devtools-mcp"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "relogin" : {

      }
    },
    "selection" : {
      "whole" : {

      }
    },
    "strategy" : {
      "delete" : {

      }
    },
    "tier" : 1,
    "title" : "Chrome DevTools MCP profiles",
    "verified" : "confirmed",
    "visual" : "plain"
  },
  {
    "explanation" : {
      "afterDeletion" : "The next build recreates the layers it needs.",
      "keepItSmall" : "Set a `gc` keep-storage limit in the BuildKit configuration.",
      "what" : "Intermediate layers BuildKit keeps to make rebuilds fast.",
      "whyItGrows" : "Every build adds entries and the default has no size limit."
    },
    "family" : "containers",
    "guards" : [

    ],
    "id" : "docker.build-cache",
    "locations" : [
      {
        "discovered" : {
          "_0" : "dockerBuildCache"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "rebuild" : {
        "minutes" : 10
      }
    },
    "requiresTool" : {
      "binary" : {
        "_0" : "docker"
      }
    },
    "selection" : {
      "whole" : {

      }
    },
    "strategy" : {
      "toolCommand" : {
        "_0" : "docker builder prune -f"
      }
    },
    "tier" : 1,
    "title" : "Docker build cache",
    "verified" : "expected",
    "visual" : "stackedUsage"
  },
  {
    "explanation" : {
      "afterDeletion" : "Nothing is removed here; `docker rm` removes the container and anything written inside it.",
      "keepItSmall" : "`docker run --rm` for one-off commands.",
      "what" : "Containers that have exited, keeping their writable layer.",
      "whyItGrows" : "A container run without `--rm` stays after it exits."
    },
    "family" : "containers",
    "guards" : [

    ],
    "id" : "docker.containers.stopped",
    "locations" : [
      {
        "discovered" : {
          "_0" : "dockerStoppedContainers"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "irreversible" : {

      }
    },
    "requiresTool" : {
      "binary" : {
        "_0" : "docker"
      }
    },
    "selection" : {
      "perItem" : {

      }
    },
    "strategy" : {
      "advisory" : {
        "_0" : "docker rm {}"
      }
    },
    "tier" : 4,
    "title" : "Stopped containers",
    "verified" : "expected",
    "visual" : "stackedUsage"
  },
  {
    "explanation" : {
      "afterDeletion" : "Nothing; no container or tag can reach these.",
      "keepItSmall" : "`docker image prune` after a build session.",
      "what" : "Image layers left untagged by a rebuild, referenced by nothing.",
      "whyItGrows" : "Every rebuild of a tag orphans the previous layers."
    },
    "family" : "containers",
    "guards" : [

    ],
    "id" : "docker.images.dangling",
    "locations" : [
      {
        "discovered" : {
          "_0" : "dockerDanglingImages"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "none" : {

      }
    },
    "requiresTool" : {
      "binary" : {
        "_0" : "docker"
      }
    },
    "selection" : {
      "perItem" : {

      }
    },
    "strategy" : {
      "toolCommand" : {
        "_0" : "docker image prune -f"
      }
    },
    "tier" : 1,
    "title" : "Dangling Docker images",
    "verified" : "expected",
    "visual" : "stackedUsage"
  },
  {
    "explanation" : {
      "afterDeletion" : "Running that image pulls it again. Images you committed or loaded from a file are never listed.",
      "keepItSmall" : "`docker image prune -a` removes every image without a container.",
      "what" : "Tagged images pulled from a registry, with no container using them.",
      "whyItGrows" : "Pulled base images and old builds stay until removed by name."
    },
    "family" : "containers",
    "guards" : [

    ],
    "id" : "docker.images.unused",
    "locations" : [
      {
        "discovered" : {
          "_0" : "dockerImages"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "redownload" : {

      }
    },
    "requiresTool" : {
      "binary" : {
        "_0" : "docker"
      }
    },
    "selection" : {
      "perItem" : {

      }
    },
    "strategy" : {
      "toolCommand" : {
        "_0" : "docker image rm {}"
      }
    },
    "tier" : 2,
    "title" : "Unused Docker images",
    "verified" : "confirmed",
    "visual" : "stackedUsage"
  },
  {
    "explanation" : {
      "afterDeletion" : "New logs start empty.",
      "keepItSmall" : "Nothing to configure.",
      "what" : "Diagnostic logs from the Docker virtual machine and daemon.",
      "whyItGrows" : "The daemon and the virtual machine each append to their own logs while Docker Desktop runs."
    },
    "family" : "containers",
    "guards" : [

    ],
    "id" : "docker.logs",
    "locations" : [
      {
        "absolute" : {
          "_0" : "~/Library/Containers/com.docker.docker/Data/log"
        }
      },
      {
        "absolute" : {
          "_0" : "~/Library/Group Containers/group.com.docker/Library/Logs"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "none" : {

      }
    },
    "selection" : {
      "whole" : {

      }
    },
    "strategy" : {
      "delete" : {

      }
    },
    "tier" : 1,
    "title" : "Docker Desktop logs",
    "verified" : "expected",
    "visual" : "plain"
  },
  {
    "explanation" : {
      "afterDeletion" : "Nothing is removed here; only Docker can shrink this file.",
      "keepItSmall" : "Prune first, then use Docker Desktop's own disk image controls.",
      "what" : "One sparse file holding every image, container and volume Docker has.",
      "whyItGrows" : "The file only ever grows; pruning inside Docker frees space within it."
    },
    "family" : "containers",
    "guards" : [

    ],
    "id" : "docker.vm-disk",
    "locations" : [
      {
        "absolute" : {
          "_0" : "~/Library/Containers/com.docker.docker/Data/vms/0/data/Docker.raw"
        }
      },
      {
        "absolute" : {
          "_0" : "~/Library/Containers/com.docker.docker/Data/vms/0/data/Docker.raw.lock"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "none" : {

      }
    },
    "selection" : {
      "whole" : {

      }
    },
    "strategy" : {
      "advisory" : {
        "_0" : "Docker Desktop, Settings, Resources, Disk image size"
      }
    },
    "tier" : 4,
    "title" : "Docker Desktop disk image",
    "verified" : "expected",
    "visual" : "sparseDisk"
  },
  {
    "explanation" : {
      "afterDeletion" : "Nothing is removed here; `docker volume rm` removes the volume, and Docker cannot restore its data.",
      "keepItSmall" : "Name the volumes you mean to keep and prune the anonymous ones.",
      "what" : "Volumes with no container attached, which is where databases live.",
      "whyItGrows" : "Removing a container leaves its named volume behind."
    },
    "family" : "containers",
    "guards" : [

    ],
    "id" : "docker.volumes.unused",
    "locations" : [
      {
        "discovered" : {
          "_0" : "dockerVolumes"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "irreversible" : {

      }
    },
    "requiresTool" : {
      "binary" : {
        "_0" : "docker"
      }
    },
    "selection" : {
      "perItem" : {

      }
    },
    "strategy" : {
      "advisory" : {
        "_0" : "docker volume rm {}"
      }
    },
    "tier" : 4,
    "title" : "Unused Docker volumes",
    "verified" : "expected",
    "visual" : "stackedUsage"
  },
  {
    "explanation" : {
      "afterDeletion" : "The next restore downloads the packages again.",
      "keepItSmall" : "Nothing to configure.",
      "what" : "Extracted NuGet packages shared across .NET projects.",
      "whyItGrows" : "Every version of every package is kept."
    },
    "family" : "systems",
    "guards" : [

    ],
    "id" : "dotnet.nuget",
    "locations" : [
      {
        "absolute" : {
          "_0" : "~/.nuget/packages"
        }
      },
      {
        "absolute" : {
          "_0" : "~/.local/share/NuGet/http-cache"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "redownload" : {

      }
    },
    "requiresTool" : {
      "binary" : {
        "_0" : "dotnet"
      }
    },
    "selection" : {
      "whole" : {

      }
    },
    "strategy" : {
      "toolCommand" : {
        "_0" : "dotnet nuget locals all --clear"
      }
    },
    "tier" : 2,
    "title" : "NuGet packages",
    "verified" : "expected",
    "visual" : "plain"
  },
  {
    "explanation" : {
      "afterDeletion" : "Files go to the Trash, so anything still needed is recoverable.",
      "keepItSmall" : "Extract into a project folder and remove the archive in the same step.",
      "what" : "Compressed archives, including asset packs and exported project files.",
      "whyItGrows" : "Archives are extracted once and the original is rarely removed."
    },
    "family" : "downloads",
    "guards" : [
      {
        "olderThan" : {
          "days" : 30
        }
      }
    ],
    "id" : "downloads.archives",
    "locations" : [
      {
        "glob" : {
          "_0" : "~/Downloads/**/*.zip"
        }
      },
      {
        "glob" : {
          "_0" : "~/Downloads/**/*.rar"
        }
      },
      {
        "glob" : {
          "_0" : "~/Downloads/**/*.7z"
        }
      },
      {
        "glob" : {
          "_0" : "~/Downloads/**/*.tar.gz"
        }
      },
      {
        "glob" : {
          "_0" : "~/Downloads/**/*.tgz"
        }
      },
      {
        "glob" : {
          "_0" : "~/Downloads/**/*.tar.bz2"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "redownload" : {

      }
    },
    "selection" : {
      "perItem" : {

      }
    },
    "strategy" : {
      "trash" : {

      }
    },
    "tier" : 3,
    "title" : "Archives in Downloads",
    "verified" : "confirmed",
    "visual" : "originList"
  },
  {
    "explanation" : {
      "afterDeletion" : "Files go to the Trash; the installed application is untouched.",
      "keepItSmall" : "Safari can be set to remove download list items after one day.",
      "what" : "Disk images and installer packages you have already run.",
      "whyItGrows" : "Every app you install leaves its installer behind."
    },
    "family" : "downloads",
    "guards" : [
      {
        "olderThan" : {
          "days" : 14
        }
      },
      {
        "alreadyInstalled" : {

        }
      }
    ],
    "id" : "downloads.installers",
    "locations" : [
      {
        "glob" : {
          "_0" : "~/Downloads/**/*.dmg"
        }
      },
      {
        "glob" : {
          "_0" : "~/Downloads/**/*.pkg"
        }
      },
      {
        "glob" : {
          "_0" : "~/Downloads/**/*.mpkg"
        }
      },
      {
        "glob" : {
          "_0" : "~/Downloads/**/*.iso"
        }
      },
      {
        "glob" : {
          "_0" : "~/Downloads/**/*.xip"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "redownload" : {

      }
    },
    "selection" : {
      "perItem" : {

      }
    },
    "strategy" : {
      "trash" : {

      }
    },
    "tier" : 2,
    "title" : "Installers in Downloads",
    "verified" : "confirmed",
    "visual" : "originList"
  },
  {
    "explanation" : {
      "afterDeletion" : "Files go to the Trash, so anything still needed is recoverable.",
      "keepItSmall" : "A Finder smart folder sorted by size makes this a two-minute habit.",
      "what" : "Video, audio and image files large enough to be worth reviewing.",
      "whyItGrows" : "Downloads is where files land and nothing moves them on."
    },
    "family" : "downloads",
    "guards" : [
      {
        "olderThan" : {
          "days" : 60
        }
      }
    ],
    "id" : "downloads.media",
    "locations" : [
      {
        "glob" : {
          "_0" : "~/Downloads/**/*.mp4"
        }
      },
      {
        "glob" : {
          "_0" : "~/Downloads/**/*.mov"
        }
      },
      {
        "glob" : {
          "_0" : "~/Downloads/**/*.mkv"
        }
      },
      {
        "glob" : {
          "_0" : "~/Downloads/**/*.avi"
        }
      },
      {
        "glob" : {
          "_0" : "~/Downloads/**/*.wav"
        }
      },
      {
        "glob" : {
          "_0" : "~/Downloads/**/*.psd"
        }
      },
      {
        "glob" : {
          "_0" : "~/Downloads/**/*.tiff"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "irreversible" : {

      }
    },
    "selection" : {
      "perItem" : {

      }
    },
    "strategy" : {
      "trash" : {

      }
    },
    "tier" : 3,
    "title" : "Large media in Downloads",
    "verified" : "confirmed",
    "visual" : "fileGrid"
  },
  {
    "explanation" : {
      "afterDeletion" : "Files go to the Trash, so anything still needed is recoverable.",
      "keepItSmall" : "The threshold and the age are both settings.",
      "what" : "Any other file in Downloads above the size set in Settings.",
      "whyItGrows" : "Large files of unusual types are missed by the rules above."
    },
    "family" : "downloads",
    "guards" : [
      {
        "olderThan" : {
          "days" : 30
        }
      }
    ],
    "id" : "downloads.threshold",
    "locations" : [
      {
        "glob" : {
          "_0" : "~/Downloads/**/*"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "irreversible" : {

      }
    },
    "selection" : {
      "perItem" : {

      }
    },
    "strategy" : {
      "trash" : {

      }
    },
    "tier" : 3,
    "title" : "Everything else over the size threshold",
    "verified" : "confirmed",
    "visual" : "originList"
  },
  {
    "explanation" : {
      "afterDeletion" : "Folders go to the Trash. The archive beside each one, while you keep it, can unpack it again.",
      "keepItSmall" : "Move anything you keep out of Downloads.",
      "what" : "Folders in Downloads that sit beside the archive they were unpacked from and have not changed since.",
      "whyItGrows" : "Opening an archive leaves its folder next to it, and both stay."
    },
    "family" : "downloads",
    "guards" : [
      {
        "olderThan" : {
          "days" : 30
        }
      },
      {
        "noOpenFiles" : {

        }
      },
      {
        "ownedByCurrentUser" : {

        }
      }
    ],
    "id" : "downloads.unpacked",
    "locations" : [
      {
        "discovered" : {
          "_0" : "unpackedDownloads"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "none" : {

      }
    },
    "selection" : {
      "perItem" : {

      }
    },
    "strategy" : {
      "trash" : {

      }
    },
    "tier" : 3,
    "title" : "Unpacked archives in Downloads",
    "verified" : "confirmed",
    "visual" : "originList"
  },
  {
    "explanation" : {
      "afterDeletion" : "The newest copy stays and the others go to the Trash.",
      "keepItSmall" : "Settings chooses which folders are compared.",
      "what" : "Files whose contents match another file byte for byte.",
      "whyItGrows" : "Downloading twice and copying to be safe both leave identical files."
    },
    "family" : "downloads",
    "guards" : [
      {
        "noOpenFiles" : {

        }
      }
    ],
    "id" : "duplicates",
    "locations" : [
      {
        "discovered" : {
          "_0" : "duplicateFiles"
        }
      }
    ],
    "pass" : "deep",
    "regenerationCost" : {
      "irreversible" : {

      }
    },
    "selection" : {
      "perItem" : {

      }
    },
    "strategy" : {
      "trash" : {

      }
    },
    "tier" : 3,
    "title" : "Duplicate files",
    "verified" : "expected",
    "visual" : "fileGrid"
  },
  {
    "explanation" : {
      "afterDeletion" : "Each editor rebuilds what it needs.",
      "keepItSmall" : "Nothing to configure.",
      "what" : "Caches from Sublime Text, Nova and other editors.",
      "whyItGrows" : "Each editor caches what it indexes and downloads, and none of them impose a limit."
    },
    "family" : "ides",
    "guards" : [

    ],
    "id" : "editor.other-caches",
    "locations" : [
      {
        "absolute" : {
          "_0" : "~/Library/Caches/com.sublimetext.4"
        }
      },
      {
        "absolute" : {
          "_0" : "~/Library/Caches/com.panic.Nova"
        }
      },
      {
        "absolute" : {
          "_0" : "~/Library/Caches/com.microsoft.VSCodeInsiders"
        }
      },
      {
        "absolute" : {
          "_0" : "~/Library/Caches/com.exafunction.windsurf"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "none" : {

      }
    },
    "selection" : {
      "whole" : {

      }
    },
    "strategy" : {
      "delete" : {

      }
    },
    "tier" : 1,
    "title" : "Other editor caches",
    "verified" : "expected",
    "visual" : "plain"
  },
  {
    "explanation" : {
      "afterDeletion" : "The next package run downloads them again.",
      "keepItSmall" : "Nothing to configure.",
      "what" : "Code signing helpers and packaging tools electron-builder downloads.",
      "whyItGrows" : "Each electron-builder release can pin new helper versions, and the earlier downloads stay."
    },
    "family" : "node",
    "guards" : [

    ],
    "id" : "electron-builder.cache",
    "locations" : [
      {
        "absolute" : {
          "_0" : "~/Library/Caches/electron-builder"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "redownload" : {

      }
    },
    "selection" : {
      "whole" : {

      }
    },
    "strategy" : {
      "delete" : {

      }
    },
    "tier" : 1,
    "title" : "electron-builder cache",
    "verified" : "confirmed",
    "visual" : "plain"
  },
  {
    "explanation" : {
      "afterDeletion" : "Building against that version downloads it again.",
      "keepItSmall" : "Nothing to configure.",
      "what" : "Electron runtime archives downloaded per version and architecture.",
      "whyItGrows" : "Every Electron version any project has built against is kept."
    },
    "family" : "node",
    "guards" : [
      {
        "newerVersionPresent" : {
          "_0" : {
            "grouping" : "flat",
            "keep" : 1
          }
        }
      }
    ],
    "id" : "electron.dist",
    "locations" : [
      {
        "glob" : {
          "_0" : "~/Library/Caches/electron/*"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "redownload" : {

      }
    },
    "selection" : {
      "allButNewest" : {
        "_0" : {
          "grouping" : "flat",
          "keep" : 1
        }
      }
    },
    "strategy" : {
      "delete" : {

      }
    },
    "tier" : 2,
    "title" : "Electron distributions",
    "verified" : "confirmed",
    "visual" : "versionTimeline"
  },
  {
    "explanation" : {
      "afterDeletion" : "Each app refills its cache as you use it; you stay signed in.",
      "keepItSmall" : "Nothing to configure; these are not exposed as settings.",
      "what" : "Chromium content caches inside apps built on web technology.",
      "whyItGrows" : "Every image, script and font each app loads is cached without limit."
    },
    "family" : "electron",
    "guards" : [

    ],
    "id" : "electron.generic",
    "locations" : [
      {
        "discovered" : {
          "_0" : "electronCaches"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "none" : {

      }
    },
    "selection" : {
      "perItem" : {

      }
    },
    "strategy" : {
      "delete" : {

      }
    },
    "tier" : 1,
    "title" : "Electron app caches",
    "verified" : "confirmed",
    "visual" : "stackedUsage"
  },
  {
    "explanation" : {
      "afterDeletion" : "Expo signs in again and re-downloads what it needs.",
      "keepItSmall" : "Nothing to configure.",
      "what" : "Expo's cached builds, credentials cache and downloaded clients.",
      "whyItGrows" : "Each SDK version downloads its own Expo Go client, and old versions stay."
    },
    "family" : "node",
    "guards" : [

    ],
    "id" : "expo.cache",
    "locations" : [
      {
        "absolute" : {
          "_0" : "~/.expo"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "relogin" : {

      }
    },
    "selection" : {
      "whole" : {

      }
    },
    "strategy" : {
      "delete" : {

      }
    },
    "tier" : 2,
    "title" : "Expo cache",
    "verified" : "expected",
    "visual" : "plain"
  },
  {
    "explanation" : {
      "afterDeletion" : "Copies go to the Trash; the live library is untouched.",
      "keepItSmall" : "Nothing to configure; these are small individually but many.",
      "what" : "Periodic copies of your library's database, without the media.",
      "whyItGrows" : "Final Cut saves a backup every fifteen minutes while a library is open."
    },
    "family" : "design",
    "guards" : [
      {
        "olderThan" : {
          "days" : 30
        }
      }
    ],
    "id" : "fcp.backups",
    "locations" : [
      {
        "glob" : {
          "_0" : "~/Movies/Final Cut Backups*/*"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "irreversible" : {

      }
    },
    "selection" : {
      "perItem" : {

      }
    },
    "strategy" : {
      "trash" : {

      }
    },
    "tier" : 3,
    "title" : "Final Cut library backups",
    "verified" : "expected",
    "visual" : "plain"
  },
  {
    "explanation" : {
      "afterDeletion" : "Final Cut re-renders on demand; your original media is untouched.",
      "keepItSmall" : "File, Delete Generated Library Files does this from inside the app.",
      "what" : "Render files, proxies and analysis data inside a library bundle.",
      "whyItGrows" : "Every effect and every proxy is rendered and kept with the library."
    },
    "family" : "design",
    "guards" : [
      {
        "appNotRunning" : {
          "_0" : {
            "app" : {
              "_0" : "Final Cut Pro"
            }
          }
        }
      },
      {
        "noOpenFiles" : {

        }
      }
    ],
    "id" : "fcp.generated",
    "locations" : [
      {
        "glob" : {
          "_0" : "~/Movies/**/*.fcpbundle/**/Render Files"
        }
      },
      {
        "glob" : {
          "_0" : "~/Movies/**/*.fcpbundle/**/Transcoded Media"
        }
      },
      {
        "glob" : {
          "_0" : "~/Movies/**/*.fcpbundle/**/Analysis Files"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "rebuild" : {
        "minutes" : 20
      }
    },
    "selection" : {
      "perItem" : {

      }
    },
    "strategy" : {
      "delete" : {

      }
    },
    "tier" : 2,
    "title" : "Final Cut generated media",
    "verified" : "expected",
    "visual" : "stackedUsage"
  },
  {
    "explanation" : {
      "afterDeletion" : "Files you marked available offline are untouched.",
      "keepItSmall" : "Nothing to configure.",
      "what" : "Web content caches from the Figma desktop app.",
      "whyItGrows" : "Every file you open caches its assets."
    },
    "family" : "design",
    "guards" : [
      {
        "appNotRunning" : {
          "_0" : {
            "app" : {
              "_0" : "Figma"
            }
          }
        }
      }
    ],
    "id" : "figma.cache",
    "locations" : [
      {
        "absolute" : {
          "_0" : "~/Library/Application Support/Figma/Cache"
        }
      },
      {
        "absolute" : {
          "_0" : "~/Library/Application Support/Figma/Code Cache"
        }
      },
      {
        "absolute" : {
          "_0" : "~/Library/Application Support/Figma/GPUCache"
        }
      },
      {
        "glob" : {
          "_0" : "~/Library/Application Support/Figma/DesktopProfile/*/Cache"
        }
      },
      {
        "glob" : {
          "_0" : "~/Library/Application Support/Figma/DesktopProfile/*/Code Cache"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "none" : {

      }
    },
    "selection" : {
      "whole" : {

      }
    },
    "strategy" : {
      "delete" : {

      }
    },
    "tier" : 1,
    "title" : "Figma cache",
    "verified" : "expected",
    "visual" : "plain"
  },
  {
    "explanation" : {
      "afterDeletion" : "Figma rebuilds it on next launch.",
      "keepItSmall" : "Nothing to configure; it tracks the fonts you have installed.",
      "what" : "Font data Figma caches so the browser can render local fonts.",
      "whyItGrows" : "Every font installed on the machine is indexed here, so the cache grows with your font library."
    },
    "family" : "design",
    "guards" : [
      {
        "appNotRunning" : {
          "_0" : {
            "app" : {
              "_0" : "Figma"
            }
          }
        }
      }
    ],
    "id" : "figma.fonts",
    "locations" : [
      {
        "absolute" : {
          "_0" : "~/Library/Application Support/Figma/Desktop/fonts"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "none" : {

      }
    },
    "selection" : {
      "whole" : {

      }
    },
    "strategy" : {
      "delete" : {

      }
    },
    "tier" : 1,
    "title" : "Figma font cache",
    "verified" : "expected",
    "visual" : "plain"
  },
  {
    "explanation" : {
      "afterDeletion" : "`flutter pub get` downloads the packages again.",
      "keepItSmall" : "Nothing to configure; the cache has no expiry.",
      "what" : "Downloaded Dart and Flutter packages, plus activated command line tools.",
      "whyItGrows" : "Every version ever resolved is kept."
    },
    "family" : "systems",
    "guards" : [

    ],
    "id" : "flutter.pub",
    "locations" : [
      {
        "absolute" : {
          "_0" : "~/.pub-cache/hosted"
        }
      },
      {
        "absolute" : {
          "_0" : "~/.pub-cache/git"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "redownload" : {

      }
    },
    "requiresTool" : {
      "binary" : {
        "_0" : "flutter"
      }
    },
    "selection" : {
      "whole" : {

      }
    },
    "strategy" : {
      "delete" : {

      }
    },
    "tier" : 2,
    "title" : "Dart package cache",
    "verified" : "expected",
    "visual" : "plain"
  },
  {
    "explanation" : {
      "afterDeletion" : "Previews regenerate as you browse.",
      "keepItSmall" : "Nothing to configure.",
      "what" : "Preview renders and indexes from font management apps.",
      "whyItGrows" : "Every font you preview adds a render, so the cache grows with your library."
    },
    "family" : "design",
    "guards" : [

    ],
    "id" : "font-managers.cache",
    "locations" : [
      {
        "absolute" : {
          "_0" : "~/Library/Caches/com.fontcase.RightFont"
        }
      },
      {
        "absolute" : {
          "_0" : "~/Library/Caches/com.typefaceapp.Typeface"
        }
      },
      {
        "absolute" : {
          "_0" : "~/Library/Application Support/FontBase/Cache"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "none" : {

      }
    },
    "selection" : {
      "whole" : {

      }
    },
    "strategy" : {
      "delete" : {

      }
    },
    "tier" : 1,
    "title" : "Font manager caches",
    "verified" : "expected",
    "visual" : "plain"
  },
  {
    "explanation" : {
      "afterDeletion" : "Nothing is removed here; the system rebuilds this on restart.",
      "keepItSmall" : "Worth removing only when fonts render incorrectly.",
      "what" : "The system's database of installed fonts and their metadata.",
      "whyItGrows" : "Activating and deactivating fonts leaves stale entries."
    },
    "family" : "design",
    "guards" : [

    ],
    "id" : "fonts.cache",
    "locations" : [
      {
        "absolute" : {
          "_0" : "~/Library/Caches/com.apple.FontRegistry"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "none" : {

      }
    },
    "selection" : {
      "whole" : {

      }
    },
    "strategy" : {
      "advisory" : {
        "_0" : "sudo atsutil databases -remove"
      }
    },
    "tier" : 4,
    "title" : "Font caches",
    "verified" : "confirmed",
    "visual" : "plain"
  },
  {
    "explanation" : {
      "afterDeletion" : "Nothing is removed here; the paths are listed so you can choose.",
      "keepItSmall" : "A worktree shares the history instead of copying it.",
      "what" : "Two or more clones of the same repository, each with its own full history.",
      "whyItGrows" : "Cloning again is quicker than remembering where the first clone went."
    },
    "family" : "git",
    "guards" : [

    ],
    "id" : "git.clone.duplicate",
    "locations" : [
      {
        "gitQuery" : {
          "_0" : "duplicateClones"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "none" : {

      }
    },
    "requiresTool" : {
      "binary" : {
        "_0" : "git"
      }
    },
    "selection" : {
      "perItem" : {

      }
    },
    "strategy" : {
      "advisory" : {
        "_0" : "git worktree add ../<name> <branch>"
      }
    },
    "tier" : 4,
    "title" : "Repositories cloned more than once",
    "verified" : "confirmed",
    "visual" : "branchGraph"
  },
  {
    "explanation" : {
      "afterDeletion" : "Nothing is lost that the remote does not have.",
      "keepItSmall" : "Clone into a projects folder so these are easy to spot.",
      "what" : "Repositories cloned into a temporary folder, Downloads or the Desktop.",
      "whyItGrows" : "A clone made to check one thing is never removed."
    },
    "family" : "git",
    "guards" : [
      {
        "olderThan" : {
          "days" : 2
        }
      },
      {
        "gitClean" : {

        }
      },
      {
        "gitPushed" : {

        }
      },
      {
        "noActiveSession" : {

        }
      },
      {
        "noOpenFiles" : {

        }
      }
    ],
    "id" : "git.clone.stale",
    "locations" : [
      {
        "gitQuery" : {
          "_0" : "staleClones"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "redownload" : {

      }
    },
    "requiresTool" : {
      "binary" : {
        "_0" : "git"
      }
    },
    "selection" : {
      "perItem" : {

      }
    },
    "strategy" : {
      "trash" : {

      }
    },
    "tier" : 2,
    "title" : "Clones in temporary places",
    "verified" : "expected",
    "visual" : "branchGraph"
  },
  {
    "explanation" : {
      "afterDeletion" : "Nothing is removed here; packing rewrites the history more compactly.",
      "keepItSmall" : "Git packs on its own schedule, which a busy repository can outrun.",
      "what" : "Repositories with a large history directory or many loose objects.",
      "whyItGrows" : "Every fetch and rebase writes loose objects that only packing consolidates."
    },
    "family" : "git",
    "guards" : [

    ],
    "id" : "git.gc",
    "locations" : [
      {
        "gitQuery" : {
          "_0" : "repositoriesNeedingGarbageCollection"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "none" : {

      }
    },
    "requiresTool" : {
      "binary" : {
        "_0" : "git"
      }
    },
    "selection" : {
      "perItem" : {

      }
    },
    "strategy" : {
      "advisory" : {
        "_0" : "git -C {path} gc"
      }
    },
    "tier" : 4,
    "title" : "Repositories worth packing",
    "verified" : "confirmed",
    "visual" : "plain"
  },
  {
    "explanation" : {
      "afterDeletion" : "Checking out an older commit downloads its files again.",
      "keepItSmall" : "`git lfs prune` keeps what recent commits reference.",
      "what" : "Large files LFS has downloaded, including versions no branch points at.",
      "whyItGrows" : "Every version of every large file you have checked out is kept."
    },
    "family" : "git",
    "guards" : [
      {
        "noActiveSession" : {

        }
      },
      {
        "noOpenFiles" : {

        }
      }
    ],
    "id" : "git.lfs.cache",
    "locations" : [
      {
        "gitQuery" : {
          "_0" : "lfsCaches"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "redownload" : {

      }
    },
    "requiresTool" : {
      "binary" : {
        "_0" : "git"
      }
    },
    "selection" : {
      "perItem" : {

      }
    },
    "strategy" : {
      "toolCommand" : {
        "_0" : "git -C {} lfs prune"
      }
    },
    "tier" : 2,
    "title" : "Git LFS objects",
    "verified" : "expected",
    "visual" : "plain"
  },
  {
    "explanation" : {
      "afterDeletion" : "Nothing is removed here; a stash is work and only you can judge it.",
      "keepItSmall" : "`git stash list` is worth reading before starting something new.",
      "what" : "Stashed changes older than ninety days, listed by repository.",
      "whyItGrows" : "A stash is easy to make and easy to forget."
    },
    "family" : "git",
    "guards" : [

    ],
    "id" : "git.stash.old",
    "locations" : [
      {
        "gitQuery" : {
          "_0" : "oldStashes"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "none" : {

      }
    },
    "requiresTool" : {
      "binary" : {
        "_0" : "git"
      }
    },
    "selection" : {
      "perItem" : {

      }
    },
    "strategy" : {
      "advisory" : {
        "_0" : "git -C {path} stash list"
      }
    },
    "tier" : 4,
    "title" : "Old stashes",
    "verified" : "expected",
    "visual" : "plain"
  },
  {
    "explanation" : {
      "afterDeletion" : "A patch and an archive of the untracked files are saved first, then the directory goes to the Trash.",
      "keepItSmall" : "Commit to a scratch branch before switching tasks.",
      "what" : "Worktrees holding changes that are in no commit, tracked or untracked.",
      "whyItGrows" : "Work gets left half done when attention moves elsewhere."
    },
    "family" : "git",
    "guards" : [
      {
        "noActiveSession" : {

        }
      },
      {
        "noOpenFiles" : {

        }
      }
    ],
    "id" : "git.worktree.dirty",
    "locations" : [
      {
        "gitQuery" : {
          "_0" : "dirtyWorktrees"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "irreversible" : {

      }
    },
    "requiresTool" : {
      "binary" : {
        "_0" : "git"
      }
    },
    "selection" : {
      "perItem" : {

      }
    },
    "strategy" : {
      "trash" : {

      }
    },
    "tier" : 3,
    "title" : "Worktrees with uncommitted work",
    "verified" : "confirmed",
    "visual" : "branchGraph"
  },
  {
    "explanation" : {
      "afterDeletion" : "The work is in the default branch and every commit is on the remote.",
      "keepItSmall" : "Run `git worktree remove` once a pull request merges.",
      "what" : "Clean worktrees whose branch already landed, untouched for over a week.",
      "whyItGrows" : "A worktree is rarely removed when its pull request merges."
    },
    "family" : "git",
    "guards" : [
      {
        "gitClean" : {

        }
      },
      {
        "gitPushed" : {

        }
      },
      {
        "noActiveSession" : {

        }
      },
      {
        "noOpenFiles" : {

        }
      }
    ],
    "id" : "git.worktree.merged",
    "locations" : [
      {
        "gitQuery" : {
          "_0" : "mergedWorktrees"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "rebuild" : {
        "minutes" : 2
      }
    },
    "requiresTool" : {
      "binary" : {
        "_0" : "git"
      }
    },
    "selection" : {
      "perItem" : {

      }
    },
    "strategy" : {
      "toolCommand" : {
        "_0" : "git -C {} worktree remove {}"
      }
    },
    "tier" : 2,
    "title" : "Worktrees whose branch is merged",
    "verified" : "confirmed",
    "visual" : "branchGraph"
  },
  {
    "explanation" : {
      "afterDeletion" : "The directory goes to the Trash, so anything unexpected is recoverable.",
      "keepItSmall" : "Finishing or cancelling an agent session lets it clean up after itself.",
      "what" : "Directories where worktrees live that no repository lists any more.",
      "whyItGrows" : "A coding agent creates a worktree per task and an interrupted run leaves it behind."
    },
    "family" : "git",
    "guards" : [
      {
        "notRegisteredWorktree" : {

        }
      },
      {
        "noActiveSession" : {

        }
      },
      {
        "noOpenFiles" : {

        }
      },
      {
        "gitClean" : {

        }
      },
      {
        "gitPushed" : {

        }
      }
    ],
    "id" : "git.worktree.orphaned",
    "locations" : [
      {
        "gitQuery" : {
          "_0" : "orphanedWorktrees"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "irreversible" : {

      }
    },
    "requiresTool" : {
      "binary" : {
        "_0" : "git"
      }
    },
    "selection" : {
      "perItem" : {

      }
    },
    "strategy" : {
      "trash" : {

      }
    },
    "tier" : 3,
    "title" : "Worktrees no repository claims",
    "verified" : "confirmed",
    "visual" : "branchGraph"
  },
  {
    "explanation" : {
      "afterDeletion" : "Only the record goes; there is no directory left to lose.",
      "keepItSmall" : "`git worktree remove` instead of deleting the directory keeps the record right.",
      "what" : "Entries a repository still lists for worktrees whose directories have gone.",
      "whyItGrows" : "Removing a worktree directory by hand leaves the repository's record of it."
    },
    "family" : "git",
    "guards" : [

    ],
    "id" : "git.worktree.prunable",
    "locations" : [
      {
        "gitQuery" : {
          "_0" : "prunableWorktrees"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "none" : {

      }
    },
    "requiresTool" : {
      "binary" : {
        "_0" : "git"
      }
    },
    "selection" : {
      "perItem" : {

      }
    },
    "strategy" : {
      "toolCommand" : {
        "_0" : "git -C {} worktree prune"
      }
    },
    "tier" : 1,
    "title" : "Worktrees already gone",
    "verified" : "confirmed",
    "visual" : "branchGraph"
  },
  {
    "explanation" : {
      "afterDeletion" : "Every commit is on the remote, but you may be part way through something.",
      "keepItSmall" : "These are never in the one-click button; review them yourself.",
      "what" : "Registered worktrees with nothing uncommitted, touched within the last week.",
      "whyItGrows" : "Each task gets its own worktree and they are rarely removed on finishing."
    },
    "family" : "git",
    "guards" : [
      {
        "gitClean" : {

        }
      },
      {
        "gitPushed" : {

        }
      },
      {
        "noActiveSession" : {

        }
      },
      {
        "noOpenFiles" : {

        }
      }
    ],
    "id" : "git.worktree.recent",
    "locations" : [
      {
        "gitQuery" : {
          "_0" : "recentWorktrees"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "rebuild" : {
        "minutes" : 2
      }
    },
    "requiresTool" : {
      "binary" : {
        "_0" : "git"
      }
    },
    "selection" : {
      "perItem" : {

      }
    },
    "strategy" : {
      "toolCommand" : {
        "_0" : "git -C {} worktree remove {}"
      }
    },
    "tier" : 2,
    "title" : "Worktrees that may still be in use",
    "verified" : "confirmed",
    "visual" : "branchGraph"
  },
  {
    "explanation" : {
      "afterDeletion" : "Every commit is on the remote, so the branch can be checked out again.",
      "keepItSmall" : "`git worktree remove` when a branch is merged.",
      "what" : "Registered worktrees with no uncommitted work, untouched for over a week.",
      "whyItGrows" : "A worktree outlives the branch it was made for."
    },
    "family" : "git",
    "guards" : [
      {
        "gitClean" : {

        }
      },
      {
        "gitPushed" : {

        }
      },
      {
        "noActiveSession" : {

        }
      },
      {
        "noOpenFiles" : {

        }
      }
    ],
    "id" : "git.worktree.stale",
    "locations" : [
      {
        "gitQuery" : {
          "_0" : "staleWorktrees"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "rebuild" : {
        "minutes" : 2
      }
    },
    "requiresTool" : {
      "binary" : {
        "_0" : "git"
      }
    },
    "selection" : {
      "perItem" : {

      }
    },
    "strategy" : {
      "toolCommand" : {
        "_0" : "git -C {} worktree remove {}"
      }
    },
    "tier" : 2,
    "title" : "Worktrees nobody has touched",
    "verified" : "confirmed",
    "visual" : "branchGraph"
  },
  {
    "explanation" : {
      "afterDeletion" : "A bundle of those commits is saved first, and it can be fetched from later.",
      "keepItSmall" : "Pushing a branch, even a draft, makes its worktree disposable.",
      "what" : "Worktrees whose commits exist on this machine and nowhere else.",
      "whyItGrows" : "A branch gets committed to and never pushed."
    },
    "family" : "git",
    "guards" : [
      {
        "noActiveSession" : {

        }
      },
      {
        "noOpenFiles" : {

        }
      }
    ],
    "id" : "git.worktree.unpushed",
    "locations" : [
      {
        "gitQuery" : {
          "_0" : "unpushedWorktrees"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "irreversible" : {

      }
    },
    "requiresTool" : {
      "binary" : {
        "_0" : "git"
      }
    },
    "selection" : {
      "perItem" : {

      }
    },
    "strategy" : {
      "trash" : {

      }
    },
    "tier" : 3,
    "title" : "Worktrees with unpushed commits",
    "verified" : "confirmed",
    "visual" : "branchGraph"
  },
  {
    "explanation" : {
      "afterDeletion" : "The next build is a cold build.",
      "keepItSmall" : "`GOCACHE` can point somewhere you clean with the project.",
      "what" : "Compiled package output Go reuses between builds.",
      "whyItGrows" : "Entries are keyed by content, so every change adds one."
    },
    "family" : "systems",
    "guards" : [

    ],
    "id" : "go.build",
    "locations" : [
      {
        "absolute" : {
          "_0" : "~/Library/Caches/go-build"
        }
      },
      {
        "absolute" : {
          "_0" : "~/.cache/go-build"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "rebuild" : {
        "minutes" : 3
      }
    },
    "requiresTool" : {
      "binary" : {
        "_0" : "go"
      }
    },
    "selection" : {
      "whole" : {

      }
    },
    "strategy" : {
      "toolCommand" : {
        "_0" : "go clean -cache"
      }
    },
    "tier" : 1,
    "title" : "Go build cache",
    "verified" : "expected",
    "visual" : "plain"
  },
  {
    "explanation" : {
      "afterDeletion" : "The next build downloads the modules again.",
      "keepItSmall" : "Nothing to configure; Go has no expiry for this cache.",
      "what" : "Downloaded module sources, stored read-only per version.",
      "whyItGrows" : "Every version of every dependency is kept forever."
    },
    "family" : "systems",
    "guards" : [

    ],
    "id" : "go.mod",
    "locations" : [
      {
        "absolute" : {
          "_0" : "~/go/pkg/mod"
        }
      },
      {
        "absolute" : {
          "_0" : "~/.go/pkg/mod"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "redownload" : {

      }
    },
    "requiresTool" : {
      "binary" : {
        "_0" : "go"
      }
    },
    "selection" : {
      "whole" : {

      }
    },
    "strategy" : {
      "toolCommand" : {
        "_0" : "go clean -modcache"
      }
    },
    "tier" : 2,
    "title" : "Go module cache",
    "verified" : "expected",
    "visual" : "plain"
  },
  {
    "explanation" : {
      "afterDeletion" : "The next build downloads dependencies again.",
      "keepItSmall" : "Gradle can expire cached entries; see `cacheDays` in its documentation.",
      "what" : "Downloaded dependencies and build output Gradle shares across projects.",
      "whyItGrows" : "Nothing expires, and Android projects pull large artifacts."
    },
    "family" : "systems",
    "guards" : [
      {
        "appNotRunning" : {
          "_0" : {
            "binary" : {
              "_0" : "java"
            }
          }
        }
      },
      {
        "noOpenFiles" : {

        }
      }
    ],
    "id" : "gradle.caches",
    "locations" : [
      {
        "absolute" : {
          "_0" : "~/.gradle/caches"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "redownload" : {

      }
    },
    "selection" : {
      "whole" : {

      }
    },
    "strategy" : {
      "delete" : {

      }
    },
    "tier" : 2,
    "title" : "Gradle caches",
    "verified" : "expected",
    "visual" : "plain"
  },
  {
    "explanation" : {
      "afterDeletion" : "New daemons write new logs.",
      "keepItSmall" : "Nothing to configure; worth revisiting after a Gradle upgrade.",
      "what" : "Log files from each Gradle daemon that has run.",
      "whyItGrows" : "Each Gradle version keeps its own directory here, and every daemon started writes a new log."
    },
    "family" : "systems",
    "guards" : [
      {
        "appNotRunning" : {
          "_0" : {
            "binary" : {
              "_0" : "java"
            }
          }
        }
      }
    ],
    "id" : "gradle.daemon",
    "locations" : [
      {
        "glob" : {
          "_0" : "~/.gradle/daemon/*"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "none" : {

      }
    },
    "selection" : {
      "entriesOlderThan" : {
        "days" : 7
      }
    },
    "strategy" : {
      "delete" : {

      }
    },
    "tier" : 1,
    "title" : "Gradle daemon logs",
    "verified" : "expected",
    "visual" : "ageHistogram"
  },
  {
    "explanation" : {
      "afterDeletion" : "A project on that version downloads it again.",
      "keepItSmall" : "Align the wrapper version across your projects.",
      "what" : "Gradle itself, one copy per version any project's wrapper has requested.",
      "whyItGrows" : "Each project pins its own version and the wrapper downloads it."
    },
    "family" : "systems",
    "guards" : [
      {
        "newerVersionPresent" : {
          "_0" : {
            "grouping" : "family",
            "keep" : 1
          }
        }
      }
    ],
    "id" : "gradle.wrapper",
    "locations" : [
      {
        "glob" : {
          "_0" : "~/.gradle/wrapper/dists/*"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "redownload" : {

      }
    },
    "selection" : {
      "allButNewest" : {
        "_0" : {
          "grouping" : "family",
          "keep" : 1
        }
      }
    },
    "strategy" : {
      "delete" : {

      }
    },
    "tier" : 2,
    "title" : "Gradle distributions",
    "verified" : "expected",
    "visual" : "versionTimeline"
  },
  {
    "explanation" : {
      "afterDeletion" : "Loading the dataset downloads and reprocesses it.",
      "keepItSmall" : "Point `HF_DATASETS_CACHE` at a project folder you clean with the project.",
      "what" : "Downloaded and preprocessed datasets.",
      "whyItGrows" : "Each dataset keeps both its download and its processed form."
    },
    "family" : "python",
    "guards" : [

    ],
    "id" : "hf.datasets",
    "locations" : [
      {
        "absolute" : {
          "_0" : "~/.cache/huggingface/datasets"
        }
      },
      {
        "absolute" : {
          "_0" : "~/.cache/huggingface/assets"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "redownload" : {

      }
    },
    "selection" : {
      "whole" : {

      }
    },
    "strategy" : {
      "delete" : {

      }
    },
    "tier" : 2,
    "title" : "Hugging Face datasets",
    "verified" : "expected",
    "visual" : "plain"
  },
  {
    "explanation" : {
      "afterDeletion" : "Loading the model downloads it again.",
      "keepItSmall" : "`huggingface-cli delete-cache` offers an interactive picker.",
      "what" : "Downloaded model weights, one directory per model repository.",
      "whyItGrows" : "Every model any script has loaded stays, including every revision."
    },
    "family" : "python",
    "guards" : [
      {
        "noOpenFiles" : {

        }
      }
    ],
    "id" : "hf.hub",
    "locations" : [
      {
        "discovered" : {
          "_0" : "huggingFaceModels"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "redownload" : {

      }
    },
    "selection" : {
      "perItem" : {

      }
    },
    "strategy" : {
      "delete" : {

      }
    },
    "tier" : 2,
    "title" : "Hugging Face models",
    "verified" : "confirmed",
    "visual" : "modelList"
  },
  {
    "explanation" : {
      "afterDeletion" : "The next install downloads again.",
      "keepItSmall" : "`brew cleanup` runs automatically unless `HOMEBREW_NO_INSTALL_CLEANUP` is set.",
      "what" : "Bottles and source archives Homebrew keeps after installing them.",
      "whyItGrows" : "Every version of every formula you have installed is kept."
    },
    "family" : "system",
    "guards" : [
      {
        "appNotRunning" : {
          "_0" : {
            "binary" : {
              "_0" : "brew"
            }
          }
        }
      }
    ],
    "id" : "homebrew.cache",
    "locations" : [
      {
        "absolute" : {
          "_0" : "~/Library/Caches/Homebrew/downloads"
        }
      },
      {
        "absolute" : {
          "_0" : "~/Library/Caches/Homebrew/Cask"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "redownload" : {

      }
    },
    "requiresTool" : {
      "binary" : {
        "_0" : "brew"
      }
    },
    "selection" : {
      "whole" : {

      }
    },
    "strategy" : {
      "delete" : {

      }
    },
    "tier" : 1,
    "title" : "Homebrew downloads",
    "verified" : "confirmed",
    "visual" : "plain"
  },
  {
    "explanation" : {
      "afterDeletion" : "Only the current version stays; pinned formulae are left alone.",
      "keepItSmall" : "Leave `HOMEBREW_NO_INSTALL_CLEANUP` unset so Homebrew tidies up itself.",
      "what" : "Older installed versions of formulae, kept after an upgrade.",
      "whyItGrows" : "An upgrade installs the new version beside the old one."
    },
    "family" : "system",
    "guards" : [

    ],
    "id" : "homebrew.old-kegs",
    "locations" : [
      {
        "discovered" : {
          "_0" : "homebrewKegs"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "redownload" : {

      }
    },
    "requiresTool" : {
      "binary" : {
        "_0" : "brew"
      }
    },
    "selection" : {
      "perItem" : {

      }
    },
    "strategy" : {
      "toolCommand" : {
        "_0" : "brew cleanup {}"
      }
    },
    "tier" : 2,
    "title" : "Superseded Homebrew versions",
    "verified" : "confirmed",
    "visual" : "versionTimeline"
  },
  {
    "explanation" : {
      "afterDeletion" : "Nothing is removed here; the system decides what to keep local.",
      "keepItSmall" : "Optimize Mac Storage lets macOS evict files you have not opened.",
      "what" : "iCloud Drive files that have been downloaded to this Mac.",
      "whyItGrows" : "Opening a file downloads it and it stays local afterwards."
    },
    "family" : "system",
    "guards" : [

    ],
    "id" : "icloud.downloaded",
    "locations" : [
      {
        "absolute" : {
          "_0" : "~/Library/Mobile Documents"
        }
      }
    ],
    "pass" : "deep",
    "regenerationCost" : {
      "none" : {

      }
    },
    "selection" : {
      "whole" : {

      }
    },
    "strategy" : {
      "advisory" : {
        "_0" : "System Settings, iCloud, Optimize Mac Storage"
      }
    },
    "tier" : 4,
    "title" : "Downloaded iCloud Drive files",
    "verified" : "confirmed",
    "visual" : "plain"
  },
  {
    "explanation" : {
      "afterDeletion" : "Copies go to the Trash; saved documents are untouched.",
      "keepItSmall" : "Nothing to configure.",
      "what" : "Recovery data for documents that were open when InDesign last quit.",
      "whyItGrows" : "A crash or force quit leaves the recovery data in place after the document has been recovered."
    },
    "family" : "design",
    "guards" : [
      {
        "appNotRunning" : {
          "_0" : {
            "app" : {
              "_0" : "Adobe InDesign"
            }
          }
        }
      }
    ],
    "id" : "indesign.recovery",
    "locations" : [
      {
        "glob" : {
          "_0" : "~/Library/Caches/Adobe InDesign/Version */*/InDesign Recovery/*"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "irreversible" : {

      }
    },
    "selection" : {
      "perItem" : {

      }
    },
    "strategy" : {
      "trash" : {

      }
    },
    "tier" : 3,
    "title" : "InDesign recovery data",
    "verified" : "expected",
    "visual" : "plain"
  },
  {
    "explanation" : {
      "afterDeletion" : "Instruments starts a fresh session; saved templates are in the Trash if you need them.",
      "keepItSmall" : "Nothing to configure.",
      "what" : "Working data Instruments writes while profiling, and any templates you saved.",
      "whyItGrows" : "Each profiling session leaves working data behind."
    },
    "family" : "xcode",
    "guards" : [
      {
        "appNotRunning" : {
          "_0" : {
            "app" : {
              "_0" : "Instruments"
            }
          }
        }
      }
    ],
    "id" : "instruments.support",
    "locations" : [
      {
        "absolute" : {
          "_0" : "~/Library/Application Support/Instruments"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "none" : {

      }
    },
    "selection" : {
      "whole" : {

      }
    },
    "strategy" : {
      "trash" : {

      }
    },
    "tier" : 3,
    "title" : "Instruments templates and data",
    "verified" : "expected",
    "visual" : "plain"
  },
  {
    "explanation" : {
      "afterDeletion" : "The trace goes to the Trash; recording again needs the same setup.",
      "keepItSmall" : "Save traces into one project folder so they are easy to review.",
      "what" : "Profiling traces you saved, which can be hundreds of megabytes each.",
      "whyItGrows" : "A single long recording is large and easy to forget."
    },
    "family" : "xcode",
    "guards" : [
      {
        "olderThan" : {
          "days" : 30
        }
      }
    ],
    "id" : "instruments.traces",
    "locations" : [
      {
        "glob" : {
          "_0" : "~/Desktop/*.trace"
        }
      },
      {
        "glob" : {
          "_0" : "~/Documents/*.trace"
        }
      },
      {
        "glob" : {
          "_0" : "~/Downloads/*.trace"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "irreversible" : {

      }
    },
    "selection" : {
      "perItem" : {

      }
    },
    "strategy" : {
      "trash" : {

      }
    },
    "tier" : 3,
    "title" : "Saved trace files",
    "verified" : "expected",
    "visual" : "plain"
  },
  {
    "explanation" : {
      "afterDeletion" : "`sdk install java` downloads it again.",
      "keepItSmall" : "Keep the LTS releases your projects target.",
      "what" : "Java runtimes a version manager installed in your home directory.",
      "whyItGrows" : "Each version installs alongside the last."
    },
    "family" : "systems",
    "guards" : [
      {
        "newerVersionPresent" : {
          "_0" : {
            "grouping" : "familyAndMajor",
            "keep" : 1
          }
        }
      }
    ],
    "id" : "jdk.managed",
    "locations" : [
      {
        "glob" : {
          "_0" : "~/.sdkman/candidates/java/*"
        }
      },
      {
        "glob" : {
          "_0" : "~/.jenv/versions/*"
        }
      },
      {
        "glob" : {
          "_0" : "~/Library/Java/JavaVirtualMachines/*"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "redownload" : {

      }
    },
    "selection" : {
      "allButNewest" : {
        "_0" : {
          "grouping" : "familyAndMajor",
          "keep" : 1
        }
      }
    },
    "strategy" : {
      "delete" : {

      }
    },
    "tier" : 2,
    "title" : "Managed JDKs",
    "verified" : "expected",
    "visual" : "versionTimeline"
  },
  {
    "explanation" : {
      "afterDeletion" : "Nothing is removed here; this needs administrator rights.",
      "keepItSmall" : "Install JDKs through a version manager instead of the system installer.",
      "what" : "Java runtimes installed for every user, three hundred megabytes and up each.",
      "whyItGrows" : "Each installer adds a version and removes none."
    },
    "family" : "systems",
    "guards" : [

    ],
    "id" : "jdk.system",
    "locations" : [
      {
        "glob" : {
          "_0" : "/Library/Java/JavaVirtualMachines/*"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "none" : {

      }
    },
    "selection" : {
      "perItem" : {

      }
    },
    "strategy" : {
      "advisory" : {
        "_0" : "sudo rm -rf {path}"
      }
    },
    "tier" : 4,
    "title" : "System JDKs",
    "verified" : "confirmed",
    "visual" : "versionTimeline"
  },
  {
    "explanation" : {
      "afterDeletion" : "The IDE reindexes your projects on next open.",
      "keepItSmall" : "Invalidate caches from the IDE after finishing a large project.",
      "what" : "Indexes, compiler caches and temporary files of each IDE version; its local history stays.",
      "whyItGrows" : "Each version keeps its own caches and old versions are never cleaned."
    },
    "family" : "ides",
    "guards" : [
      {
        "appNotRunning" : {
          "_0" : {
            "app" : {
              "_0" : "IntelliJ IDEA"
            }
          }
        }
      },
      {
        "appNotRunning" : {
          "_0" : {
            "app" : {
              "_0" : "PyCharm"
            }
          }
        }
      },
      {
        "appNotRunning" : {
          "_0" : {
            "app" : {
              "_0" : "WebStorm"
            }
          }
        }
      },
      {
        "appNotRunning" : {
          "_0" : {
            "app" : {
              "_0" : "GoLand"
            }
          }
        }
      },
      {
        "appNotRunning" : {
          "_0" : {
            "app" : {
              "_0" : "CLion"
            }
          }
        }
      },
      {
        "appNotRunning" : {
          "_0" : {
            "app" : {
              "_0" : "Rider"
            }
          }
        }
      },
      {
        "appNotRunning" : {
          "_0" : {
            "app" : {
              "_0" : "RubyMine"
            }
          }
        }
      },
      {
        "appNotRunning" : {
          "_0" : {
            "app" : {
              "_0" : "PhpStorm"
            }
          }
        }
      },
      {
        "appNotRunning" : {
          "_0" : {
            "app" : {
              "_0" : "DataGrip"
            }
          }
        }
      },
      {
        "appNotRunning" : {
          "_0" : {
            "app" : {
              "_0" : "Android Studio"
            }
          }
        }
      },
      {
        "noOpenFiles" : {

        }
      }
    ],
    "id" : "jetbrains.caches",
    "locations" : [
      {
        "glob" : {
          "_0" : "~/Library/Caches/JetBrains/*/{caches,index,tmp,compile-server,jcef_cache}"
        }
      },
      {
        "glob" : {
          "_0" : "~/Library/Caches/Google/AndroidStudio*/{caches,index,tmp,compile-server,jcef_cache}"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "rebuild" : {
        "minutes" : 10
      }
    },
    "selection" : {
      "perItem" : {

      }
    },
    "strategy" : {
      "delete" : {

      }
    },
    "tier" : 1,
    "title" : "JetBrains caches",
    "verified" : "expected",
    "visual" : "plain"
  },
  {
    "explanation" : {
      "afterDeletion" : "New logs start empty.",
      "keepItSmall" : "Nothing to configure; worth revisiting after an IDE upgrade.",
      "what" : "IDE log files, one set per version.",
      "whyItGrows" : "Each IDE version writes its own log directory, and the directories of versions you have upgraded away from stay."
    },
    "family" : "ides",
    "guards" : [

    ],
    "id" : "jetbrains.logs",
    "locations" : [
      {
        "absolute" : {
          "_0" : "~/Library/Logs/JetBrains"
        }
      },
      {
        "absolute" : {
          "_0" : "~/Library/Logs/Google/AndroidStudio"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "none" : {

      }
    },
    "selection" : {
      "whole" : {

      }
    },
    "strategy" : {
      "delete" : {

      }
    },
    "tier" : 1,
    "title" : "JetBrains logs",
    "verified" : "expected",
    "visual" : "plain"
  },
  {
    "explanation" : {
      "afterDeletion" : "Settings go to the Trash, so an old version can still be restored.",
      "keepItSmall" : "The IDE offers to import settings on upgrade, after which the old copy is spare.",
      "what" : "Settings and plugins from IDE versions you have upgraded away from.",
      "whyItGrows" : "Each version keeps its own configuration directory."
    },
    "family" : "ides",
    "guards" : [
      {
        "newerVersionPresent" : {
          "_0" : {
            "grouping" : "family",
            "keep" : 1
          }
        }
      }
    ],
    "id" : "jetbrains.old-config",
    "locations" : [
      {
        "glob" : {
          "_0" : "~/Library/Application Support/JetBrains/*"
        }
      },
      {
        "glob" : {
          "_0" : "~/Library/Application Support/Google/AndroidStudio*"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "irreversible" : {

      }
    },
    "selection" : {
      "allButNewest" : {
        "_0" : {
          "grouping" : "family",
          "keep" : 1
        }
      }
    },
    "strategy" : {
      "trash" : {

      }
    },
    "tier" : 2,
    "title" : "Superseded JetBrains configuration",
    "verified" : "expected",
    "visual" : "versionTimeline"
  },
  {
    "explanation" : {
      "afterDeletion" : "Starting a kernel writes a new one.",
      "keepItSmall" : "Nothing to configure; shutting kernels down rather than killing them removes their files.",
      "what" : "Kernel connection files from notebook sessions.",
      "whyItGrows" : "Each kernel writes a connection file when it starts, and one killed without a clean shutdown leaves it behind."
    },
    "family" : "python",
    "guards" : [
      {
        "noOpenFiles" : {

        }
      },
      {
        "appNotRunning" : {
          "_0" : {
            "binary" : {
              "_0" : "jupyter-lab"
            }
          }
        }
      },
      {
        "appNotRunning" : {
          "_0" : {
            "binary" : {
              "_0" : "jupyter-notebook"
            }
          }
        }
      },
      {
        "appNotRunning" : {
          "_0" : {
            "binary" : {
              "_0" : "jupyter-server"
            }
          }
        }
      }
    ],
    "id" : "jupyter.runtime",
    "locations" : [
      {
        "absolute" : {
          "_0" : "~/Library/Jupyter/runtime"
        }
      },
      {
        "absolute" : {
          "_0" : "~/.local/share/jupyter/runtime"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "none" : {

      }
    },
    "selection" : {
      "whole" : {

      }
    },
    "strategy" : {
      "delete" : {

      }
    },
    "tier" : 1,
    "title" : "Jupyter runtime and checkpoints",
    "verified" : "expected",
    "visual" : "plain"
  },
  {
    "explanation" : {
      "afterDeletion" : "Files go to the Trash, so anything still wanted is recoverable.",
      "keepItSmall" : "The size and age thresholds are both settings.",
      "what" : "Files over a gigabyte that have not been changed or opened in six months.",
      "whyItGrows" : "Exports, recordings and disk images are made once and forgotten."
    },
    "family" : "downloads",
    "guards" : [
      {
        "noOpenFiles" : {

        }
      }
    ],
    "id" : "large-old",
    "locations" : [
      {
        "discovered" : {
          "_0" : "largeOldFiles"
        }
      }
    ],
    "pass" : "deep",
    "regenerationCost" : {
      "irreversible" : {

      }
    },
    "selection" : {
      "perItem" : {

      }
    },
    "strategy" : {
      "trash" : {

      }
    },
    "tier" : 3,
    "title" : "Large files nobody has opened",
    "verified" : "expected",
    "visual" : "fileGrid"
  },
  {
    "explanation" : {
      "afterDeletion" : "Copies go to the Trash; keep the newest two.",
      "keepItSmall" : "Catalog Settings sets the backup frequency.",
      "what" : "Zipped copies of your catalog, one per backup Lightroom has taken.",
      "whyItGrows" : "Lightroom backs up on a schedule and never removes an old backup."
    },
    "family" : "design",
    "guards" : [
      {
        "olderThan" : {
          "days" : 60
        }
      }
    ],
    "id" : "lightroom.backups",
    "locations" : [
      {
        "glob" : {
          "_0" : "~/Pictures/Lightroom/**/Backups/*"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "irreversible" : {

      }
    },
    "selection" : {
      "perItem" : {

      }
    },
    "strategy" : {
      "trash" : {

      }
    },
    "tier" : 3,
    "title" : "Lightroom catalog backups",
    "verified" : "expected",
    "visual" : "plain"
  },
  {
    "explanation" : {
      "afterDeletion" : "Lightroom regenerates previews as you browse; smart previews need the originals.",
      "keepItSmall" : "Catalog Settings can limit previews to Standard rather than one to one.",
      "what" : "Rendered previews beside a catalog, separate from your photographs.",
      "whyItGrows" : "Full-size previews are generated per photograph and never discarded."
    },
    "family" : "design",
    "guards" : [
      {
        "appNotRunning" : {
          "_0" : {
            "app" : {
              "_0" : "Adobe Lightroom Classic"
            }
          }
        }
      },
      {
        "noOpenFiles" : {

        }
      }
    ],
    "id" : "lightroom.previews",
    "locations" : [
      {
        "glob" : {
          "_0" : "~/Pictures/**/*Previews.lrdata"
        }
      },
      {
        "glob" : {
          "_0" : "~/Pictures/**/*Smart Previews.lrdata"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "rebuild" : {
        "minutes" : 20
      }
    },
    "selection" : {
      "perItem" : {

      }
    },
    "strategy" : {
      "trash" : {

      }
    },
    "tier" : 2,
    "title" : "Lightroom previews",
    "verified" : "expected",
    "visual" : "plain"
  },
  {
    "explanation" : {
      "afterDeletion" : "Nothing is removed here; `limactl delete` removes the instance and anything inside it.",
      "keepItSmall" : "Delete instances you created to try something once.",
      "what" : "Linux virtual machines managed by Lima, one directory each.",
      "whyItGrows" : "Each instance keeps a disk image sized for its whole lifetime."
    },
    "family" : "containers",
    "guards" : [
      {
        "appNotRunning" : {
          "_0" : {
            "binary" : {
              "_0" : "limactl"
            }
          }
        }
      },
      {
        "noOpenFiles" : {

        }
      }
    ],
    "id" : "lima.instances",
    "locations" : [
      {
        "glob" : {
          "_0" : "~/.lima/*"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "irreversible" : {

      }
    },
    "selection" : {
      "perItem" : {

      }
    },
    "strategy" : {
      "advisory" : {
        "_0" : "limactl delete {}"
      }
    },
    "tier" : 4,
    "title" : "Lima instances",
    "verified" : "expected",
    "visual" : "sparseDisk"
  },
  {
    "explanation" : {
      "afterDeletion" : "Models go to the Trash, so an imported file can still be recovered.",
      "keepItSmall" : "Remove variants you have stopped comparing.",
      "what" : "Model files LM Studio and MLX hold, some of which may be your own conversions.",
      "whyItGrows" : "Quantised variants are kept alongside the originals."
    },
    "family" : "python",
    "guards" : [

    ],
    "id" : "lmstudio.models",
    "locations" : [
      {
        "absolute" : {
          "_0" : "~/.lmstudio/models"
        }
      },
      {
        "absolute" : {
          "_0" : "~/.cache/lm-studio/models"
        }
      },
      {
        "absolute" : {
          "_0" : "~/.cache/mlx"
        }
      },
      {
        "absolute" : {
          "_0" : "~/.cache/mlx_lm"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "redownload" : {

      }
    },
    "selection" : {
      "perItem" : {

      }
    },
    "strategy" : {
      "trash" : {

      }
    },
    "tier" : 3,
    "title" : "LM Studio and MLX models",
    "verified" : "expected",
    "visual" : "modelList"
  },
  {
    "explanation" : {
      "afterDeletion" : "Files go to the Trash; bouncing again needs the project.",
      "keepItSmall" : "Bounce to a single folder you review between projects.",
      "what" : "Exported mixes saved beside their projects.",
      "whyItGrows" : "Every bounce is kept, including the drafts."
    },
    "family" : "design",
    "guards" : [
      {
        "olderThan" : {
          "days" : 60
        }
      }
    ],
    "id" : "logic.bounces",
    "locations" : [
      {
        "glob" : {
          "_0" : "~/Music/Logic/**/Bounces/*"
        }
      },
      {
        "glob" : {
          "_0" : "~/Music/Audio Music Apps/Databases"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "irreversible" : {

      }
    },
    "selection" : {
      "perItem" : {

      }
    },
    "strategy" : {
      "trash" : {

      }
    },
    "tier" : 3,
    "title" : "Logic bounces and backups",
    "verified" : "expected",
    "visual" : "plain"
  },
  {
    "explanation" : {
      "afterDeletion" : "Nothing is removed here; Logic manages this library itself.",
      "keepItSmall" : "Logic's Sound Library Manager can remove individual collections.",
      "what" : "Instruments and loops Logic downloads, which can exceed seventy gigabytes.",
      "whyItGrows" : "The full library is optional but downloaded in one piece."
    },
    "family" : "design",
    "guards" : [

    ],
    "id" : "logic.sound-library",
    "locations" : [
      {
        "absolute" : {
          "_0" : "~/Music/Audio Music Apps/Sampler Instruments"
        }
      },
      {
        "absolute" : {
          "_0" : "/Library/Application Support/Logic"
        }
      },
      {
        "absolute" : {
          "_0" : "/Library/Audio/Apple Loops"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "none" : {

      }
    },
    "selection" : {
      "whole" : {

      }
    },
    "strategy" : {
      "advisory" : {
        "_0" : "Logic, Sound Library, Delete and Re-download"
      }
    },
    "tier" : 4,
    "title" : "Logic sound library",
    "verified" : "confirmed",
    "visual" : "plain"
  },
  {
    "explanation" : {
      "afterDeletion" : "New logs start empty.",
      "keepItSmall" : "Nothing to configure.",
      "what" : "Log files applications write in your Library.",
      "whyItGrows" : "Few applications rotate or cap their own logs."
    },
    "family" : "system",
    "guards" : [
      {
        "olderThan" : {
          "days" : 7
        }
      },
      {
        "noOpenFiles" : {

        }
      }
    ],
    "id" : "logs",
    "locations" : [
      {
        "glob" : {
          "_0" : "~/Library/Logs/*"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "none" : {

      }
    },
    "selection" : {
      "perItem" : {

      }
    },
    "strategy" : {
      "delete" : {

      }
    },
    "tier" : 1,
    "title" : "Application logs",
    "verified" : "confirmed",
    "visual" : "ageHistogram"
  },
  {
    "explanation" : {
      "afterDeletion" : "Nothing is removed here; this needs administrator rights.",
      "keepItSmall" : "`port clean --all` after installing a port.",
      "what" : "Downloaded sources and build directories from every port installed.",
      "whyItGrows" : "Nothing is removed after a successful build."
    },
    "family" : "systems",
    "guards" : [

    ],
    "id" : "macports.build",
    "locations" : [
      {
        "absolute" : {
          "_0" : "/opt/local/var/macports/distfiles"
        }
      },
      {
        "absolute" : {
          "_0" : "/opt/local/var/macports/build"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "none" : {

      }
    },
    "selection" : {
      "whole" : {

      }
    },
    "strategy" : {
      "advisory" : {
        "_0" : "sudo port clean --all installed"
      }
    },
    "tier" : 4,
    "title" : "MacPorts distfiles and builds",
    "verified" : "expected",
    "visual" : "plain"
  },
  {
    "explanation" : {
      "afterDeletion" : "They go to the Trash; the originals stay in the messages, and your edits can still be put back.",
      "keepItSmall" : "Save attachments you edit somewhere of your own.",
      "what" : "Copies of attachments made when you opened them, with any edits you saved into them.",
      "whyItGrows" : "Opening an attachment writes a copy here and Mail does not remove it."
    },
    "family" : "communication",
    "guards" : [
      {
        "appNotRunning" : {
          "_0" : {
            "app" : {
              "_0" : "Mail"
            }
          }
        }
      },
      {
        "olderThan" : {
          "days" : 30
        }
      }
    ],
    "id" : "mail.downloads",
    "locations" : [
      {
        "absolute" : {
          "_0" : "~/Library/Containers/com.apple.mail/Data/Library/Mail Downloads"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "irreversible" : {

      }
    },
    "selection" : {
      "entriesOlderThan" : {
        "days" : 30
      }
    },
    "strategy" : {
      "trash" : {

      }
    },
    "tier" : 2,
    "title" : "Mail attachment downloads",
    "verified" : "confirmed",
    "visual" : "plain"
  },
  {
    "explanation" : {
      "afterDeletion" : "The next build downloads published dependencies again; ones you installed locally are in the Trash.",
      "keepItSmall" : "Nothing to configure; Maven has no expiry for release artifacts.",
      "what" : "Downloaded jars and poms, the local mirror of everything you depend on.",
      "whyItGrows" : "Every version ever resolved is kept."
    },
    "family" : "systems",
    "guards" : [

    ],
    "id" : "maven.repository",
    "locations" : [
      {
        "absolute" : {
          "_0" : "~/.m2/repository"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "redownload" : {

      }
    },
    "selection" : {
      "whole" : {

      }
    },
    "strategy" : {
      "trash" : {

      }
    },
    "tier" : 3,
    "title" : "Maven repository",
    "verified" : "expected",
    "visual" : "plain"
  },
  {
    "explanation" : {
      "afterDeletion" : "Nothing is removed here; Messages owns this and iCloud may sync it.",
      "keepItSmall" : "Settings can keep messages for thirty days or a year rather than forever.",
      "what" : "Every photograph and video sent or received in Messages.",
      "whyItGrows" : "Attachments are kept for as long as the conversation is."
    },
    "family" : "communication",
    "guards" : [

    ],
    "id" : "messages.attachments",
    "locations" : [
      {
        "absolute" : {
          "_0" : "~/Library/Messages/Attachments"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "none" : {

      }
    },
    "selection" : {
      "whole" : {

      }
    },
    "strategy" : {
      "advisory" : {
        "_0" : "Messages, Settings, General, Keep messages"
      }
    },
    "tier" : 4,
    "title" : "Messages attachments",
    "verified" : "confirmed",
    "visual" : "plain"
  },
  {
    "explanation" : {
      "afterDeletion" : "Shaders recompile the first time each app draws.",
      "keepItSmall" : "Nothing to configure.",
      "what" : "Compiled GPU shaders, cached per application.",
      "whyItGrows" : "Every app that draws with Metal adds its own compiled shaders, including apps since removed."
    },
    "family" : "xcode",
    "guards" : [

    ],
    "id" : "metal.cache",
    "locations" : [
      {
        "absolute" : {
          "_0" : "~/Library/Caches/com.apple.metal"
        }
      },
      {
        "absolute" : {
          "_0" : "~/Library/Caches/com.apple.metalfe"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "rebuild" : {
        "minutes" : 1
      }
    },
    "selection" : {
      "whole" : {

      }
    },
    "strategy" : {
      "delete" : {

      }
    },
    "tier" : 1,
    "title" : "Metal shader cache",
    "verified" : "confirmed",
    "visual" : "plain"
  },
  {
    "explanation" : {
      "afterDeletion" : "The next bundle is built from source.",
      "keepItSmall" : "Nothing to configure; macOS clears the temporary directory on restart.",
      "what" : "Metro bundler caches and module maps from React Native builds.",
      "whyItGrows" : "Each project writes its own cache and module map, and a moved or deleted project leaves its entries."
    },
    "family" : "node",
    "guards" : [
      {
        "noOpenFiles" : {

        }
      }
    ],
    "id" : "metro.cache",
    "locations" : [
      {
        "glob" : {
          "_0" : "$TMPDIR/metro-*"
        }
      },
      {
        "glob" : {
          "_0" : "$TMPDIR/haste-map-*"
        }
      },
      {
        "glob" : {
          "_0" : "$TMPDIR/react-*"
        }
      },
      {
        "glob" : {
          "_0" : "/private/tmp/metro-*"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "rebuild" : {
        "minutes" : 2
      }
    },
    "selection" : {
      "perItem" : {

      }
    },
    "strategy" : {
      "delete" : {

      }
    },
    "tier" : 1,
    "title" : "React Native build caches",
    "verified" : "expected",
    "visual" : "plain"
  },
  {
    "explanation" : {
      "afterDeletion" : "Nothing is removed here; `minikube delete` removes the clusters and anything stored in them.",
      "keepItSmall" : "Delete clusters when you finish with them rather than stopping them.",
      "what" : "Local Kubernetes clusters and the images cached for them.",
      "whyItGrows" : "Each cluster keeps its own disk and image cache."
    },
    "family" : "containers",
    "guards" : [
      {
        "noOpenFiles" : {

        }
      },
      {
        "appNotRunning" : {
          "_0" : {
            "binary" : {
              "_0" : "minikube"
            }
          }
        }
      }
    ],
    "id" : "minikube.clusters",
    "locations" : [
      {
        "absolute" : {
          "_0" : "~/.minikube/machines"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "irreversible" : {

      }
    },
    "selection" : {
      "whole" : {

      }
    },
    "strategy" : {
      "advisory" : {
        "_0" : "minikube delete --all"
      }
    },
    "tier" : 4,
    "title" : "minikube and kind clusters",
    "verified" : "expected",
    "visual" : "plain"
  },
  {
    "explanation" : {
      "afterDeletion" : "The next run downloads the weights again.",
      "keepItSmall" : "Set the framework's cache directory per project.",
      "what" : "Pretrained weights PyTorch, Kaggle, CLIP and timm download on first use.",
      "whyItGrows" : "Every checkpoint any script has asked for is kept."
    },
    "family" : "python",
    "guards" : [

    ],
    "id" : "ml.frameworks",
    "locations" : [
      {
        "absolute" : {
          "_0" : "~/.cache/torch"
        }
      },
      {
        "absolute" : {
          "_0" : "~/.cache/kagglehub"
        }
      },
      {
        "absolute" : {
          "_0" : "~/.cache/clip"
        }
      },
      {
        "absolute" : {
          "_0" : "~/.cache/timm"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "redownload" : {

      }
    },
    "selection" : {
      "whole" : {

      }
    },
    "strategy" : {
      "delete" : {

      }
    },
    "tier" : 2,
    "title" : "Framework model caches",
    "verified" : "expected",
    "visual" : "modelList"
  },
  {
    "explanation" : {
      "afterDeletion" : "Downloads come back on the next run. Anything you saved here yourself does not, so it goes to the Trash.",
      "keepItSmall" : "Set `KERAS_HOME` and `NLTK_DATA` to a folder you clean with the project.",
      "what" : "Weights, datasets and corpora Keras and NLTK download, kept in your home folder.",
      "whyItGrows" : "Every model or corpus a script has asked for is kept."
    },
    "family" : "python",
    "guards" : [

    ],
    "id" : "ml.keras-nltk",
    "locations" : [
      {
        "absolute" : {
          "_0" : "~/.keras"
        }
      },
      {
        "absolute" : {
          "_0" : "~/nltk_data"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "redownload" : {

      }
    },
    "selection" : {
      "perItem" : {

      }
    },
    "strategy" : {
      "trash" : {

      }
    },
    "tier" : 3,
    "title" : "Keras and NLTK data",
    "verified" : "expected",
    "visual" : "modelList"
  },
  {
    "explanation" : {
      "afterDeletion" : "Nothing is removed here; Nix owns this directory.",
      "keepItSmall" : "`nix-collect-garbage -d` removes generations you can no longer roll back to.",
      "what" : "Every package version Nix has ever built or downloaded.",
      "whyItGrows" : "Old generations are kept so a rollback is always possible."
    },
    "family" : "systems",
    "guards" : [

    ],
    "id" : "nix.store",
    "locations" : [
      {
        "absolute" : {
          "_0" : "/nix/store"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "none" : {

      }
    },
    "selection" : {
      "whole" : {

      }
    },
    "strategy" : {
      "advisory" : {
        "_0" : "nix-collect-garbage -d"
      }
    },
    "tier" : 4,
    "title" : "Nix store",
    "verified" : "expected",
    "visual" : "plain"
  },
  {
    "explanation" : {
      "afterDeletion" : "Building a native module downloads the headers again.",
      "keepItSmall" : "Nothing to configure.",
      "what" : "Node header archives native modules compile against.",
      "whyItGrows" : "One set per Node version ever used to build a native module."
    },
    "family" : "node",
    "guards" : [

    ],
    "id" : "node-gyp.headers",
    "locations" : [
      {
        "absolute" : {
          "_0" : "~/Library/Caches/node-gyp"
        }
      },
      {
        "absolute" : {
          "_0" : "~/.cache/node-gyp"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "redownload" : {

      }
    },
    "selection" : {
      "whole" : {

      }
    },
    "strategy" : {
      "delete" : {

      }
    },
    "tier" : 1,
    "title" : "node-gyp headers",
    "verified" : "confirmed",
    "visual" : "plain"
  },
  {
    "explanation" : {
      "afterDeletion" : "The next run recompiles, costing a fraction of a second.",
      "keepItSmall" : "Setting `NODE_DISABLE_COMPILE_CACHE=1` stops Node writing it.",
      "what" : "Compiled JavaScript bytecode Node caches between runs.",
      "whyItGrows" : "Every module of every script run with the compile cache on adds an entry, keyed by Node version."
    },
    "family" : "node",
    "guards" : [

    ],
    "id" : "node.compile-cache",
    "locations" : [
      {
        "absolute" : {
          "_0" : "$TMPDIR/node-compile-cache"
        }
      },
      {
        "absolute" : {
          "_0" : "/private/tmp/node-compile-cache"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "none" : {

      }
    },
    "selection" : {
      "whole" : {

      }
    },
    "strategy" : {
      "delete" : {

      }
    },
    "tier" : 1,
    "title" : "Node compile cache",
    "verified" : "confirmed",
    "visual" : "plain"
  },
  {
    "explanation" : {
      "afterDeletion" : "The next build compiles from scratch once and fills it again.",
      "keepItSmall" : "Nothing to configure; the rest of `.next` is listed with the project.",
      "what" : "The build cache each Next project keeps inside its `.next` folder.",
      "whyItGrows" : "Every build adds compiled pages and optimized images, and Next never trims it."
    },
    "family" : "node",
    "guards" : [
      {
        "gitIgnored" : {

        }
      },
      {
        "noOpenFiles" : {

        }
      }
    ],
    "id" : "node.next-cache",
    "locations" : [
      {
        "gitQuery" : {
          "_0" : "nextCaches"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "rebuild" : {
        "minutes" : 2
      }
    },
    "requiresTool" : {
      "binary" : {
        "_0" : "git"
      }
    },
    "selection" : {
      "perItem" : {

      }
    },
    "strategy" : {
      "delete" : {

      }
    },
    "tier" : 1,
    "title" : "Next.js build caches",
    "verified" : "confirmed",
    "visual" : "plain"
  },
  {
    "explanation" : {
      "afterDeletion" : "`nvm install <version>` brings it back in a minute.",
      "keepItSmall" : "Keep the newest patch of each major you still build against.",
      "what" : "Complete Node installations, one per version you have used.",
      "whyItGrows" : "Version managers install alongside rather than replacing."
    },
    "family" : "node",
    "guards" : [
      {
        "newerVersionPresent" : {
          "_0" : {
            "grouping" : "familyAndMajor",
            "keep" : 1
          }
        }
      },
      {
        "notActiveVersion" : {
          "tool" : "nvm"
        }
      }
    ],
    "id" : "node.versions",
    "locations" : [
      {
        "glob" : {
          "_0" : "~/.nvm/versions/node/*"
        }
      },
      {
        "glob" : {
          "_0" : "~/.fnm/node-versions/*"
        }
      },
      {
        "glob" : {
          "_0" : "~/Library/Application Support/fnm/node-versions/*"
        }
      },
      {
        "glob" : {
          "_0" : "~/.volta/tools/image/node/*"
        }
      },
      {
        "glob" : {
          "_0" : "~/n/versions/node/*"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "redownload" : {

      }
    },
    "selection" : {
      "allButNewest" : {
        "_0" : {
          "grouping" : "familyAndMajor",
          "keep" : 1
        }
      }
    },
    "strategy" : {
      "delete" : {

      }
    },
    "tier" : 2,
    "title" : "Node versions",
    "verified" : "confirmed",
    "visual" : "versionTimeline"
  },
  {
    "explanation" : {
      "afterDeletion" : "The next install downloads what it needs again.",
      "keepItSmall" : "`npm cache verify` trims corrupted entries but not size; clearing it is the only lever.",
      "what" : "Every package tarball and HTTP response npm has ever fetched.",
      "whyItGrows" : "Entries are added on install and never removed, whatever the project."
    },
    "family" : "node",
    "guards" : [

    ],
    "id" : "npm.cache",
    "locations" : [
      {
        "absolute" : {
          "_0" : "~/.npm/_cacache"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "redownload" : {

      }
    },
    "requiresTool" : {
      "binary" : {
        "_0" : "npm"
      }
    },
    "selection" : {
      "whole" : {

      }
    },
    "strategy" : {
      "toolCommand" : {
        "_0" : "npm cache clean --force"
      }
    },
    "tier" : 1,
    "title" : "npm cache",
    "verified" : "confirmed",
    "visual" : "plain"
  },
  {
    "explanation" : {
      "afterDeletion" : "Nothing; these are only useful right after a failure.",
      "keepItSmall" : "`npm config set logs-max 0` stops npm writing them.",
      "what" : "Debug logs npm writes when an install fails.",
      "whyItGrows" : "One file per failed command; npm keeps the ten most recent by default."
    },
    "family" : "node",
    "guards" : [

    ],
    "id" : "npm.logs",
    "locations" : [
      {
        "glob" : {
          "_0" : "~/.npm/_logs/*"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "none" : {

      }
    },
    "selection" : {
      "entriesOlderThan" : {
        "days" : 7
      }
    },
    "strategy" : {
      "delete" : {

      }
    },
    "tier" : 1,
    "title" : "npm logs",
    "verified" : "confirmed",
    "visual" : "ageHistogram"
  },
  {
    "explanation" : {
      "afterDeletion" : "The next `npx` run installs again.",
      "keepItSmall" : "Install tools you use often as real dependencies.",
      "what" : "Throwaway installs npx makes to run a package once.",
      "whyItGrows" : "Each distinct package and version gets its own directory."
    },
    "family" : "node",
    "guards" : [

    ],
    "id" : "npm.npx",
    "locations" : [
      {
        "absolute" : {
          "_0" : "~/.npm/_npx"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "redownload" : {

      }
    },
    "selection" : {
      "whole" : {

      }
    },
    "strategy" : {
      "delete" : {

      }
    },
    "tier" : 1,
    "title" : "npx working copies",
    "verified" : "confirmed",
    "visual" : "plain"
  },
  {
    "explanation" : {
      "afterDeletion" : "They go to the Trash; a plugin manager reinstalls what your configuration names.",
      "keepItSmall" : "Nothing to configure; your configuration is the source of truth.",
      "what" : "Cloned plugins and language server binaries, including any plugin you cloned or wrote yourself.",
      "whyItGrows" : "Plugins are full clones and Mason downloads a binary per language."
    },
    "family" : "ides",
    "guards" : [

    ],
    "id" : "nvim.plugins",
    "locations" : [
      {
        "absolute" : {
          "_0" : "~/.local/share/nvim/lazy"
        }
      },
      {
        "absolute" : {
          "_0" : "~/.local/share/nvim/mason"
        }
      },
      {
        "absolute" : {
          "_0" : "~/.local/share/nvim/site/pack"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "redownload" : {

      }
    },
    "selection" : {
      "whole" : {

      }
    },
    "strategy" : {
      "trash" : {

      }
    },
    "tier" : 2,
    "title" : "Neovim plugins and language servers",
    "verified" : "expected",
    "visual" : "plain"
  },
  {
    "explanation" : {
      "afterDeletion" : "Nothing is removed here; `ollama pull` brings a pulled model back, but not one you made yourself.",
      "keepItSmall" : "`ollama list` is worth a look after trying models out.",
      "what" : "Local language model weights Ollama has pulled.",
      "whyItGrows" : "Every model you have tried stays until removed by name."
    },
    "family" : "python",
    "guards" : [

    ],
    "id" : "ollama.models",
    "locations" : [
      {
        "discovered" : {
          "_0" : "ollamaModels"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "redownload" : {

      }
    },
    "requiresTool" : {
      "binary" : {
        "_0" : "ollama"
      }
    },
    "selection" : {
      "perItem" : {

      }
    },
    "strategy" : {
      "advisory" : {
        "_0" : "ollama rm {}"
      }
    },
    "tier" : 4,
    "title" : "Ollama models",
    "verified" : "expected",
    "visual" : "modelList"
  },
  {
    "explanation" : {
      "afterDeletion" : "Nothing is removed here; OrbStack owns this directory.",
      "keepItSmall" : "OrbStack's own storage panel reclaims space safely.",
      "what" : "Container images and Linux machines OrbStack holds.",
      "whyItGrows" : "Images and machines accumulate the same way Docker's do."
    },
    "family" : "containers",
    "guards" : [

    ],
    "id" : "orbstack.data",
    "locations" : [
      {
        "absolute" : {
          "_0" : "~/.orbstack"
        }
      },
      {
        "absolute" : {
          "_0" : "~/Library/Group Containers/HUAQ24HBR6.dev.orbstack"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "none" : {

      }
    },
    "selection" : {
      "whole" : {

      }
    },
    "strategy" : {
      "advisory" : {
        "_0" : "OrbStack, Settings, Storage"
      }
    },
    "tier" : 4,
    "title" : "OrbStack data",
    "verified" : "expected",
    "visual" : "sparseDisk"
  },
  {
    "explanation" : {
      "afterDeletion" : "Copies go to the Trash; saved documents are untouched.",
      "keepItSmall" : "Preferences, File Handling sets the recovery interval.",
      "what" : "Recovery copies of open documents, written every few minutes.",
      "whyItGrows" : "A crash leaves the recovery copy in place after you have recovered."
    },
    "family" : "design",
    "guards" : [
      {
        "appNotRunning" : {
          "_0" : {
            "app" : {
              "_0" : "Adobe Photoshop"
            }
          }
        }
      },
      {
        "olderThan" : {
          "days" : 7
        }
      }
    ],
    "id" : "photoshop.autorecover",
    "locations" : [
      {
        "glob" : {
          "_0" : "~/Library/Application Support/Adobe/Adobe Photoshop */AutoRecover/*"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "irreversible" : {

      }
    },
    "selection" : {
      "perItem" : {

      }
    },
    "strategy" : {
      "trash" : {

      }
    },
    "tier" : 3,
    "title" : "Photoshop recovery files",
    "verified" : "expected",
    "visual" : "plain"
  },
  {
    "explanation" : {
      "afterDeletion" : "Nothing; these belong to sessions that have ended.",
      "keepItSmall" : "Nothing to configure; Photoshop removes these on a clean quit.",
      "what" : "Virtual memory files Photoshop writes while a document is open.",
      "whyItGrows" : "A crash leaves the scratch file behind, sometimes several gigabytes."
    },
    "family" : "design",
    "guards" : [
      {
        "appNotRunning" : {
          "_0" : {
            "app" : {
              "_0" : "Adobe Photoshop"
            }
          }
        }
      },
      {
        "noOpenFiles" : {

        }
      }
    ],
    "id" : "photoshop.temp",
    "locations" : [
      {
        "glob" : {
          "_0" : "/private/tmp/Photoshop Temp*"
        }
      },
      {
        "glob" : {
          "_0" : "$TMPDIR/Photoshop Temp*"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "none" : {

      }
    },
    "selection" : {
      "perItem" : {

      }
    },
    "strategy" : {
      "delete" : {

      }
    },
    "tier" : 1,
    "title" : "Photoshop scratch files",
    "verified" : "expected",
    "visual" : "plain"
  },
  {
    "explanation" : {
      "afterDeletion" : "The next install downloads again.",
      "keepItSmall" : "`composer config --global cache-files-maxsize 100MiB` lowers the size limit.",
      "what" : "Downloaded package archives and repository metadata.",
      "whyItGrows" : "Every package archive any project has installed is kept for six months by default, whatever the project."
    },
    "family" : "systems",
    "guards" : [

    ],
    "id" : "php.composer",
    "locations" : [
      {
        "absolute" : {
          "_0" : "~/.composer/cache"
        }
      },
      {
        "absolute" : {
          "_0" : "~/Library/Caches/composer"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "redownload" : {

      }
    },
    "requiresTool" : {
      "binary" : {
        "_0" : "composer"
      }
    },
    "selection" : {
      "whole" : {

      }
    },
    "strategy" : {
      "toolCommand" : {
        "_0" : "composer clear-cache"
      }
    },
    "tier" : 1,
    "title" : "Composer cache",
    "verified" : "expected",
    "visual" : "plain"
  },
  {
    "explanation" : {
      "afterDeletion" : "The next install downloads again.",
      "keepItSmall" : "`pip install --no-cache-dir` in throwaway environments.",
      "what" : "Wheels and source archives pip keeps after installing them.",
      "whyItGrows" : "Every version of every package installed anywhere is kept."
    },
    "family" : "python",
    "guards" : [

    ],
    "id" : "pip.cache",
    "locations" : [
      {
        "absolute" : {
          "_0" : "~/Library/Caches/pip"
        }
      },
      {
        "absolute" : {
          "_0" : "~/.cache/pip"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "redownload" : {

      }
    },
    "selection" : {
      "whole" : {

      }
    },
    "strategy" : {
      "toolCommand" : {
        "_0" : "pip cache purge"
      }
    },
    "tier" : 1,
    "title" : "pip cache",
    "verified" : "confirmed",
    "visual" : "plain"
  },
  {
    "explanation" : {
      "afterDeletion" : "Only the newest build is used, so nothing changes for your tests.",
      "keepItSmall" : "`npx playwright uninstall --all` before an upgrade starts from empty.",
      "what" : "Browser builds Playwright downloads, one directory per build number.",
      "whyItGrows" : "Every Playwright upgrade downloads a new build and leaves the old one."
    },
    "family" : "node",
    "guards" : [
      {
        "newerVersionPresent" : {
          "_0" : {
            "grouping" : "family",
            "keep" : 1
          }
        }
      }
    ],
    "id" : "playwright.browsers",
    "locations" : [
      {
        "glob" : {
          "_0" : "~/Library/Caches/ms-playwright/*"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "redownload" : {

      }
    },
    "selection" : {
      "allButNewest" : {
        "_0" : {
          "grouping" : "family",
          "keep" : 1
        }
      }
    },
    "strategy" : {
      "delete" : {

      }
    },
    "tier" : 2,
    "title" : "Playwright browsers",
    "verified" : "confirmed",
    "visual" : "versionTimeline"
  },
  {
    "explanation" : {
      "afterDeletion" : "New sessions create fresh profiles.",
      "keepItSmall" : "Nothing to configure.",
      "what" : "Browser profiles the Playwright MCP server creates per session.",
      "whyItGrows" : "A profile is left behind for each session."
    },
    "family" : "node",
    "guards" : [
      {
        "appNotRunning" : {
          "_0" : {
            "binary" : {
              "_0" : "playwright-mcp"
            }
          }
        }
      }
    ],
    "id" : "playwright.mcp",
    "locations" : [
      {
        "absolute" : {
          "_0" : "~/Library/Caches/ms-playwright-mcp"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "relogin" : {

      }
    },
    "selection" : {
      "whole" : {

      }
    },
    "strategy" : {
      "delete" : {

      }
    },
    "tier" : 1,
    "title" : "Playwright MCP profiles",
    "verified" : "confirmed",
    "visual" : "plain"
  },
  {
    "explanation" : {
      "afterDeletion" : "Nothing; these are abandoned by definition.",
      "keepItSmall" : "macOS clears the temporary directory on restart, which is rare on a laptop.",
      "what" : "Scratch directories package managers leave when an install is interrupted.",
      "whyItGrows" : "A cancelled or failed install never cleans up after itself."
    },
    "family" : "node",
    "guards" : [
      {
        "olderThan" : {
          "days" : 1
        }
      },
      {
        "noOpenFiles" : {

        }
      }
    ],
    "id" : "pm.temp",
    "locations" : [
      {
        "glob" : {
          "_0" : "$TMPDIR/pip-*"
        }
      },
      {
        "glob" : {
          "_0" : "$TMPDIR/npm-*"
        }
      },
      {
        "glob" : {
          "_0" : "$TMPDIR/yarn--*"
        }
      },
      {
        "glob" : {
          "_0" : "$TMPDIR/pnpm-*"
        }
      },
      {
        "glob" : {
          "_0" : "$TMPDIR/tmp-*"
        }
      },
      {
        "glob" : {
          "_0" : "$TMPDIR/cargo-install*"
        }
      },
      {
        "glob" : {
          "_0" : "$TMPDIR/go-build*"
        }
      },
      {
        "glob" : {
          "_0" : "$TMPDIR/swiftpm-*"
        }
      },
      {
        "glob" : {
          "_0" : "/private/tmp/homebrew-*"
        }
      },
      {
        "absolute" : {
          "_0" : "~/.gradle/.tmp"
        }
      },
      {
        "absolute" : {
          "_0" : "~/Library/pnpm/.tmp"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "none" : {

      }
    },
    "selection" : {
      "perItem" : {

      }
    },
    "strategy" : {
      "delete" : {

      }
    },
    "tier" : 1,
    "title" : "Package manager temporary files",
    "verified" : "confirmed",
    "visual" : "ageHistogram"
  },
  {
    "explanation" : {
      "afterDeletion" : "pnpm asks the registry again on the next install.",
      "keepItSmall" : "`pnpm cache delete` removes metadata entries by package name or pattern.",
      "what" : "Registry metadata and download side files, separate from the store.",
      "whyItGrows" : "Every package name any project has resolved gets a metadata file, refreshed but never removed."
    },
    "family" : "node",
    "guards" : [

    ],
    "id" : "pnpm.cache",
    "locations" : [
      {
        "absolute" : {
          "_0" : "~/Library/Caches/pnpm"
        }
      },
      {
        "absolute" : {
          "_0" : "~/.cache/pnpm"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "redownload" : {

      }
    },
    "selection" : {
      "whole" : {

      }
    },
    "strategy" : {
      "delete" : {

      }
    },
    "tier" : 1,
    "title" : "pnpm metadata cache",
    "verified" : "confirmed",
    "visual" : "plain"
  },
  {
    "explanation" : {
      "afterDeletion" : "Pruning keeps what your projects still reference and removes the rest.",
      "keepItSmall" : "Run `pnpm store prune` after deleting a project.",
      "what" : "The content-addressed store every pnpm project hardlinks into.",
      "whyItGrows" : "Packages stay after the project that needed them is deleted."
    },
    "family" : "node",
    "guards" : [

    ],
    "id" : "pnpm.store",
    "locations" : [
      {
        "absolute" : {
          "_0" : "~/Library/pnpm/store"
        }
      },
      {
        "absolute" : {
          "_0" : "~/.local/share/pnpm/store"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "redownload" : {

      }
    },
    "requiresTool" : {
      "binary" : {
        "_0" : "pnpm"
      }
    },
    "selection" : {
      "whole" : {

      }
    },
    "strategy" : {
      "toolCommand" : {
        "_0" : "pnpm store prune"
      }
    },
    "tier" : 2,
    "title" : "pnpm store",
    "verified" : "confirmed",
    "visual" : "plain"
  },
  {
    "explanation" : {
      "afterDeletion" : "Episodes, including unplayed ones, download again when you play them.",
      "keepItSmall" : "Settings, Podcasts has options to remove played episodes automatically.",
      "what" : "Episodes Podcasts has downloaded, including ones already played.",
      "whyItGrows" : "Subscribed shows download automatically and are kept by default."
    },
    "family" : "communication",
    "guards" : [
      {
        "appNotRunning" : {
          "_0" : {
            "app" : {
              "_0" : "Podcasts"
            }
          }
        }
      }
    ],
    "id" : "podcasts.cache",
    "locations" : [
      {
        "absolute" : {
          "_0" : "~/Library/Group Containers/243LU875E5.groups.com.apple.podcasts/Library/Cache"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "redownload" : {

      }
    },
    "selection" : {
      "whole" : {

      }
    },
    "strategy" : {
      "delete" : {

      }
    },
    "tier" : 2,
    "title" : "Podcasts cache",
    "verified" : "confirmed",
    "visual" : "plain"
  },
  {
    "explanation" : {
      "afterDeletion" : "Images and containers inside the machine go with it.",
      "keepItSmall" : "`podman system prune` inside the machine first.",
      "what" : "The virtual machine Podman runs containers inside.",
      "whyItGrows" : "The disk image grows with pulled images and never shrinks."
    },
    "family" : "containers",
    "guards" : [
      {
        "appNotRunning" : {
          "_0" : {
            "binary" : {
              "_0" : "podman"
            }
          }
        }
      },
      {
        "noOpenFiles" : {

        }
      }
    ],
    "id" : "podman.machine",
    "locations" : [
      {
        "glob" : {
          "_0" : "~/.local/share/containers/podman/machine/*"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "redownload" : {

      }
    },
    "selection" : {
      "perItem" : {

      }
    },
    "strategy" : {
      "advisory" : {
        "_0" : "podman machine ls, then podman machine rm <name>"
      }
    },
    "tier" : 4,
    "title" : "Podman machines",
    "verified" : "expected",
    "visual" : "sparseDisk"
  },
  {
    "explanation" : {
      "afterDeletion" : "The next install downloads again.",
      "keepItSmall" : "`poetry cache clear PyPI --all` empties Poetry's package cache.",
      "what" : "Downloaded archives and virtual environment templates.",
      "whyItGrows" : "Every package version any project has resolved is kept, and `pipx run` keeps an environment per tool it has run."
    },
    "family" : "python",
    "guards" : [

    ],
    "id" : "poetry.cache",
    "locations" : [
      {
        "absolute" : {
          "_0" : "~/Library/Caches/pypoetry"
        }
      },
      {
        "absolute" : {
          "_0" : "~/.cache/pypoetry"
        }
      },
      {
        "absolute" : {
          "_0" : "~/.local/pipx/.cache"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "redownload" : {

      }
    },
    "selection" : {
      "whole" : {

      }
    },
    "strategy" : {
      "delete" : {

      }
    },
    "tier" : 1,
    "title" : "Poetry and pipx caches",
    "verified" : "expected",
    "visual" : "plain"
  },
  {
    "explanation" : {
      "afterDeletion" : "Copies go to the Trash; your current project file is untouched.",
      "keepItSmall" : "Preferences, Auto Save sets how many versions are kept.",
      "what" : "Timed copies of your project file, one per autosave interval.",
      "whyItGrows" : "Premiere keeps a configurable number per project and creates one every few minutes."
    },
    "family" : "design",
    "guards" : [
      {
        "olderThan" : {
          "days" : 30
        }
      }
    ],
    "id" : "premiere.autosave",
    "locations" : [
      {
        "glob" : {
          "_0" : "~/Documents/Adobe/Premiere Pro/*/Adobe Premiere Pro Auto-Save/*"
        }
      },
      {
        "glob" : {
          "_0" : "~/Documents/Adobe/After Effects/*/Adobe After Effects Auto-Save/*"
        }
      },
      {
        "glob" : {
          "_0" : "~/Movies/**/Adobe Premiere Pro Auto-Save/*"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "irreversible" : {

      }
    },
    "selection" : {
      "perItem" : {

      }
    },
    "strategy" : {
      "trash" : {

      }
    },
    "tier" : 3,
    "title" : "Premiere and After Effects autosaves",
    "verified" : "expected",
    "visual" : "plain"
  },
  {
    "explanation" : {
      "afterDeletion" : "Running the project's install or build command puts it back.",
      "keepItSmall" : "Removing build output from projects with no recent commits is the largest single win on a developer machine.",
      "what" : "Dependency and build directories inside your projects, each with the command that rebuilds it.",
      "whyItGrows" : "Every project keeps its own copy, and a project you have finished with keeps it too."
    },
    "family" : "projects",
    "guards" : [
      {
        "gitIgnored" : {

        }
      },
      {
        "noOpenFiles" : {

        }
      },
      {
        "noActiveSession" : {

        }
      }
    ],
    "id" : "projects.artifacts",
    "locations" : [
      {
        "gitQuery" : {
          "_0" : "projectArtifacts"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "rebuild" : {
        "minutes" : 3
      }
    },
    "requiresTool" : {
      "binary" : {
        "_0" : "git"
      }
    },
    "selection" : {
      "perItem" : {

      }
    },
    "strategy" : {
      "delete" : {

      }
    },
    "tier" : 2,
    "title" : "Build output in projects",
    "verified" : "confirmed",
    "visual" : "projectCard"
  },
  {
    "explanation" : {
      "afterDeletion" : "Folders go to the Trash; nothing in the project rebuilds them, so check what each one holds.",
      "keepItSmall" : "Write such output outside the repository, or clear the folder when the work it served is done.",
      "what" : "Folders near the top of a project that git ignores and that no build tool is known to recreate.",
      "whyItGrows" : "Exports, screenshots, downloads and deploy output collect in ignored folders because git never shows them."
    },
    "family" : "projects",
    "guards" : [
      {
        "gitIgnored" : {

        }
      },
      {
        "notRegisteredWorktree" : {

        }
      },
      {
        "noOpenFiles" : {

        }
      },
      {
        "noActiveSession" : {

        }
      },
      {
        "olderThan" : {
          "days" : 30
        }
      }
    ],
    "id" : "projects.ignored-folders",
    "locations" : [
      {
        "gitQuery" : {
          "_0" : "ignoredProjectFolders"
        }
      }
    ],
    "minimumBytes" : 104857600,
    "pass" : "probe",
    "regenerationCost" : {
      "irreversible" : {

      }
    },
    "requiresTool" : {
      "binary" : {
        "_0" : "git"
      }
    },
    "selection" : {
      "perItem" : {

      }
    },
    "strategy" : {
      "trash" : {

      }
    },
    "tier" : 3,
    "title" : "Large ignored folders in projects",
    "verified" : "confirmed",
    "visual" : "plain"
  },
  {
    "explanation" : {
      "afterDeletion" : "Waveforms redraw; backups go to the Trash.",
      "keepItSmall" : "Preferences, Operation sets how many backups are kept.",
      "what" : "Waveform caches and timed session backups.",
      "whyItGrows" : "A backup is written every few minutes a session is open."
    },
    "family" : "design",
    "guards" : [
      {
        "olderThan" : {
          "days" : 30
        }
      }
    ],
    "id" : "protools.cache",
    "locations" : [
      {
        "glob" : {
          "_0" : "~/Documents/Pro Tools/**/WaveCache.wfm"
        }
      },
      {
        "glob" : {
          "_0" : "~/Documents/**/Session File Backups/*"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "rebuild" : {
        "minutes" : 2
      }
    },
    "selection" : {
      "perItem" : {

      }
    },
    "strategy" : {
      "trash" : {

      }
    },
    "tier" : 3,
    "title" : "Pro Tools caches and backups",
    "verified" : "expected",
    "visual" : "plain"
  },
  {
    "explanation" : {
      "afterDeletion" : "The newest build is the one Puppeteer uses.",
      "keepItSmall" : "Set `PUPPETEER_SKIP_DOWNLOAD` and share one browser across projects.",
      "what" : "Chromium builds Puppeteer downloads per version.",
      "whyItGrows" : "Each Puppeteer release pins a new build and keeps the previous one."
    },
    "family" : "node",
    "guards" : [
      {
        "newerVersionPresent" : {
          "_0" : {
            "grouping" : "family",
            "keep" : 1
          }
        }
      }
    ],
    "id" : "puppeteer.browsers",
    "locations" : [
      {
        "glob" : {
          "_0" : "~/.cache/puppeteer/*/*"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "redownload" : {

      }
    },
    "selection" : {
      "allButNewest" : {
        "_0" : {
          "grouping" : "family",
          "keep" : 1
        }
      }
    },
    "strategy" : {
      "delete" : {

      }
    },
    "tier" : 2,
    "title" : "Puppeteer browsers",
    "verified" : "expected",
    "visual" : "versionTimeline"
  },
  {
    "explanation" : {
      "afterDeletion" : "`pyenv install` builds it again, which takes a few minutes.",
      "keepItSmall" : "Keep the newest patch of each major you still need.",
      "what" : "Python interpreters pyenv has compiled or downloaded.",
      "whyItGrows" : "Each version installs alongside the last."
    },
    "family" : "python",
    "guards" : [
      {
        "newerVersionPresent" : {
          "_0" : {
            "grouping" : "familyAndMinor",
            "keep" : 1
          }
        }
      },
      {
        "notActiveVersion" : {
          "tool" : "pyenv"
        }
      }
    ],
    "id" : "pyenv.versions",
    "locations" : [
      {
        "glob" : {
          "_0" : "~/.pyenv/versions/*"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "rebuild" : {
        "minutes" : 5
      }
    },
    "requiresTool" : {
      "binary" : {
        "_0" : "pyenv"
      }
    },
    "selection" : {
      "allButNewest" : {
        "_0" : {
          "grouping" : "familyAndMinor",
          "keep" : 1
        }
      }
    },
    "strategy" : {
      "toolCommand" : {
        "_0" : "pyenv uninstall -f {}"
      }
    },
    "tier" : 2,
    "title" : "pyenv versions",
    "verified" : "expected",
    "visual" : "versionTimeline"
  },
  {
    "explanation" : {
      "afterDeletion" : "Playback renders again; your source media is untouched.",
      "keepItSmall" : "Playback, Delete Render Cache, and set the cache to User rather than Smart.",
      "what" : "Render cache, optimised media and proxies Resolve generates.",
      "whyItGrows" : "Smart cache renders every effect you add and keeps the result."
    },
    "family" : "design",
    "guards" : [
      {
        "appNotRunning" : {
          "_0" : {
            "app" : {
              "_0" : "DaVinci Resolve"
            }
          }
        }
      },
      {
        "noOpenFiles" : {

        }
      }
    ],
    "id" : "resolve.cache",
    "locations" : [
      {
        "absolute" : {
          "_0" : "~/Movies/DaVinci Resolve/CacheClip"
        }
      },
      {
        "absolute" : {
          "_0" : "~/Movies/DaVinci Resolve/ProxyMedia"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "rebuild" : {
        "minutes" : 20
      }
    },
    "selection" : {
      "whole" : {

      }
    },
    "strategy" : {
      "delete" : {

      }
    },
    "tier" : 2,
    "title" : "DaVinci Resolve cache",
    "verified" : "expected",
    "visual" : "stackedUsage"
  },
  {
    "explanation" : {
      "afterDeletion" : "Assets download again when you open a place.",
      "keepItSmall" : "Nothing to configure.",
      "what" : "Downloaded assets and logs from Roblox Studio.",
      "whyItGrows" : "Every asset any place has loaded is cached, and logs are per session."
    },
    "family" : "design",
    "guards" : [
      {
        "appNotRunning" : {
          "_0" : {
            "app" : {
              "_0" : "RobloxStudio"
            }
          }
        }
      }
    ],
    "id" : "roblox.cache",
    "locations" : [
      {
        "absolute" : {
          "_0" : "~/Library/Roblox/logs"
        }
      },
      {
        "absolute" : {
          "_0" : "~/Library/Roblox/http"
        }
      },
      {
        "glob" : {
          "_0" : "~/Library/Caches/com.Roblox.*"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "redownload" : {

      }
    },
    "selection" : {
      "whole" : {

      }
    },
    "strategy" : {
      "delete" : {

      }
    },
    "tier" : 1,
    "title" : "Roblox Studio cache",
    "verified" : "confirmed",
    "visual" : "plain"
  },
  {
    "explanation" : {
      "afterDeletion" : "Studio keeps running from Applications and downloads the next update when one comes.",
      "keepItSmall" : "Nothing to configure.",
      "what" : "The update archive Roblox Studio downloads and the copy it unpacks from it.",
      "whyItGrows" : "The installer leaves both behind after the update is in place."
    },
    "family" : "design",
    "guards" : [
      {
        "appNotRunning" : {
          "_0" : {
            "app" : {
              "_0" : "RobloxStudio"
            }
          }
        }
      },
      {
        "noOpenFiles" : {

        }
      }
    ],
    "id" : "roblox.staged-update",
    "locations" : [
      {
        "absolute" : {
          "_0" : "~/Library/Roblox/UnzippedBundle"
        }
      },
      {
        "absolute" : {
          "_0" : "~/Library/Roblox/RobloxStudioApp.zip"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "redownload" : {

      }
    },
    "selection" : {
      "perItem" : {

      }
    },
    "strategy" : {
      "trash" : {

      }
    },
    "tier" : 2,
    "title" : "Roblox Studio staged update",
    "verified" : "confirmed",
    "visual" : "plain"
  },
  {
    "explanation" : {
      "afterDeletion" : "`bundle install` fetches what a project needs.",
      "keepItSmall" : "`gem cleanup` after upgrading a gem you use everywhere.",
      "what" : "Installed gems and cached gem archives.",
      "whyItGrows" : "Old versions stay installed after an upgrade."
    },
    "family" : "systems",
    "guards" : [

    ],
    "id" : "ruby.gems",
    "locations" : [
      {
        "absolute" : {
          "_0" : "~/.gem"
        }
      },
      {
        "absolute" : {
          "_0" : "~/.bundle/cache"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "redownload" : {

      }
    },
    "selection" : {
      "whole" : {

      }
    },
    "strategy" : {
      "toolCommand" : {
        "_0" : "gem cleanup"
      }
    },
    "tier" : 2,
    "title" : "Ruby gems and versions",
    "verified" : "expected",
    "visual" : "plain"
  },
  {
    "explanation" : {
      "afterDeletion" : "`rbenv install` compiles it again, which takes a few minutes.",
      "keepItSmall" : "Keep the versions your projects' version files name.",
      "what" : "Complete Ruby installations, one per version.",
      "whyItGrows" : "Each version installs alongside the last."
    },
    "family" : "systems",
    "guards" : [
      {
        "newerVersionPresent" : {
          "_0" : {
            "grouping" : "familyAndMajor",
            "keep" : 1
          }
        }
      }
    ],
    "id" : "ruby.versions",
    "locations" : [
      {
        "glob" : {
          "_0" : "~/.rbenv/versions/*"
        }
      },
      {
        "glob" : {
          "_0" : "~/.rubies/*"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "rebuild" : {
        "minutes" : 5
      }
    },
    "selection" : {
      "allButNewest" : {
        "_0" : {
          "grouping" : "familyAndMajor",
          "keep" : 1
        }
      }
    },
    "strategy" : {
      "delete" : {

      }
    },
    "tier" : 2,
    "title" : "Ruby versions",
    "verified" : "expected",
    "visual" : "versionTimeline"
  },
  {
    "explanation" : {
      "afterDeletion" : "`rustup toolchain install` downloads it again.",
      "keepItSmall" : "Keep the channel your projects pin and remove one-off nightlies.",
      "what" : "Complete Rust toolchains, one per channel or version installed.",
      "whyItGrows" : "Nightly toolchains and pinned versions install alongside stable."
    },
    "family" : "systems",
    "guards" : [
      {
        "notActiveVersion" : {
          "tool" : "rustup"
        }
      }
    ],
    "id" : "rustup.toolchains",
    "locations" : [
      {
        "glob" : {
          "_0" : "~/.rustup/toolchains/*"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "redownload" : {

      }
    },
    "requiresTool" : {
      "binary" : {
        "_0" : "rustup"
      }
    },
    "selection" : {
      "perItem" : {

      }
    },
    "strategy" : {
      "toolCommand" : {
        "_0" : "rustup toolchain uninstall {}"
      }
    },
    "tier" : 2,
    "title" : "Rust toolchains",
    "verified" : "confirmed",
    "visual" : "versionTimeline"
  },
  {
    "explanation" : {
      "afterDeletion" : "Pages load from the network once; history and passwords are untouched.",
      "keepItSmall" : "Nothing to configure; browsers manage this within their own limit.",
      "what" : "Cached web content from Safari and Firefox.",
      "whyItGrows" : "Each browser fills its cache to its own limit, and Firefox keeps a separate cache per profile."
    },
    "family" : "browsers",
    "guards" : [
      {
        "appNotRunning" : {
          "_0" : {
            "app" : {
              "_0" : "Safari"
            }
          }
        }
      },
      {
        "appNotRunning" : {
          "_0" : {
            "app" : {
              "_0" : "Firefox"
            }
          }
        }
      }
    ],
    "id" : "safari-firefox",
    "locations" : [
      {
        "absolute" : {
          "_0" : "~/Library/Caches/com.apple.Safari"
        }
      },
      {
        "absolute" : {
          "_0" : "~/Library/Caches/com.apple.SafariTechnologyPreview"
        }
      },
      {
        "glob" : {
          "_0" : "~/Library/Caches/Firefox/Profiles/*/cache2"
        }
      },
      {
        "glob" : {
          "_0" : "~/Library/Caches/Mozilla/updates"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "none" : {

      }
    },
    "selection" : {
      "whole" : {

      }
    },
    "strategy" : {
      "delete" : {

      }
    },
    "tier" : 1,
    "title" : "Safari and Firefox caches",
    "verified" : "confirmed",
    "visual" : "plain"
  },
  {
    "explanation" : {
      "afterDeletion" : "Each app refills what it needs; documents and settings are untouched.",
      "keepItSmall" : "Nothing to configure.",
      "what" : "Cache and temporary directories inside sandboxed applications' containers.",
      "whyItGrows" : "Each app caches what it downloads and few of them impose a limit."
    },
    "family" : "apps",
    "guards" : [

    ],
    "id" : "sandboxed.caches",
    "locations" : [
      {
        "discovered" : {
          "_0" : "containerCaches"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "none" : {

      }
    },
    "selection" : {
      "perItem" : {

      }
    },
    "strategy" : {
      "delete" : {

      }
    },
    "tier" : 1,
    "title" : "Sandboxed app caches",
    "verified" : "confirmed",
    "visual" : "stackedUsage"
  },
  {
    "explanation" : {
      "afterDeletion" : "They go to the Trash; apps open with default windows rather than restoring the last session.",
      "keepItSmall" : "Turning off Close windows when quitting an app stops these growing.",
      "what" : "Window positions and unsaved text apps restore when you reopen them.",
      "whyItGrows" : "One directory per app ever launched, including apps long removed."
    },
    "family" : "apps",
    "guards" : [
      {
        "olderThan" : {
          "days" : 30
        }
      }
    ],
    "id" : "saved-state",
    "locations" : [
      {
        "glob" : {
          "_0" : "~/Library/Saved Application State/*"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "none" : {

      }
    },
    "selection" : {
      "perItem" : {

      }
    },
    "strategy" : {
      "trash" : {

      }
    },
    "tier" : 2,
    "title" : "Saved application state",
    "verified" : "confirmed",
    "visual" : "plain"
  },
  {
    "explanation" : {
      "afterDeletion" : "The next build compiles from source.",
      "keepItSmall" : "`SCCACHE_CACHE_SIZE` caps it; the default is ten gigabytes.",
      "what" : "Compiler output sccache reuses between builds.",
      "whyItGrows" : "Every distinct compilation is stored until the cache reaches its size limit."
    },
    "family" : "systems",
    "guards" : [

    ],
    "id" : "sccache.cache",
    "locations" : [
      {
        "absolute" : {
          "_0" : "~/Library/Caches/Mozilla.sccache"
        }
      },
      {
        "absolute" : {
          "_0" : "~/.cache/sccache"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "rebuild" : {
        "minutes" : 5
      }
    },
    "selection" : {
      "whole" : {

      }
    },
    "strategy" : {
      "delete" : {

      }
    },
    "tier" : 1,
    "title" : "sccache",
    "verified" : "expected",
    "visual" : "plain"
  },
  {
    "explanation" : {
      "afterDeletion" : "Files go to the Trash, so anything worth keeping is recoverable.",
      "keepItSmall" : "Most of these apps can delete a recording after you export it.",
      "what" : "Recordings from screen capture tools and meeting apps.",
      "whyItGrows" : "Recordings are saved by default and rarely revisited."
    },
    "family" : "design",
    "guards" : [
      {
        "olderThan" : {
          "days" : 30
        }
      }
    ],
    "id" : "screen-capture.recordings",
    "locations" : [
      {
        "glob" : {
          "_0" : "~/Movies/CleanShot/*"
        }
      },
      {
        "glob" : {
          "_0" : "~/Movies/Screen Studio/*"
        }
      },
      {
        "glob" : {
          "_0" : "~/Movies/Loom/*"
        }
      },
      {
        "glob" : {
          "_0" : "~/Movies/OBS/*"
        }
      },
      {
        "glob" : {
          "_0" : "~/Documents/Zoom/*"
        }
      },
      {
        "glob" : {
          "_0" : "~/Library/Application Support/CleanShot/media/*"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "irreversible" : {

      }
    },
    "selection" : {
      "perItem" : {

      }
    },
    "strategy" : {
      "trash" : {

      }
    },
    "tier" : 3,
    "title" : "Screen recordings",
    "verified" : "expected",
    "visual" : "fileGrid"
  },
  {
    "explanation" : {
      "afterDeletion" : "Selenium downloads the driver it needs again.",
      "keepItSmall" : "Nothing to configure.",
      "what" : "Drivers and browsers Selenium Manager downloads.",
      "whyItGrows" : "Each browser update needs a matching driver, and the earlier drivers stay."
    },
    "family" : "node",
    "guards" : [

    ],
    "id" : "selenium.cache",
    "locations" : [
      {
        "absolute" : {
          "_0" : "~/.cache/selenium"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "redownload" : {

      }
    },
    "selection" : {
      "whole" : {

      }
    },
    "strategy" : {
      "delete" : {

      }
    },
    "tier" : 1,
    "title" : "Selenium Manager cache",
    "verified" : "expected",
    "visual" : "plain"
  },
  {
    "explanation" : {
      "afterDeletion" : "Your main shell history file is untouched.",
      "keepItSmall" : "Setting `SHELL_SESSIONS_DISABLE=1` stops these being written.",
      "what" : "Per-terminal-window history files macOS keeps to restore sessions.",
      "whyItGrows" : "A new file per window, kept indefinitely."
    },
    "family" : "system",
    "guards" : [

    ],
    "id" : "shell.sessions",
    "locations" : [
      {
        "glob" : {
          "_0" : "~/.zsh_sessions/*"
        }
      },
      {
        "glob" : {
          "_0" : "~/.bash_sessions/*"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "none" : {

      }
    },
    "selection" : {
      "entriesOlderThan" : {
        "days" : 30
      }
    },
    "strategy" : {
      "delete" : {

      }
    },
    "tier" : 1,
    "title" : "Shell session history",
    "verified" : "confirmed",
    "visual" : "ageHistogram"
  },
  {
    "explanation" : {
      "afterDeletion" : "The device is recreated empty the next time it is needed.",
      "keepItSmall" : "Keep the two or three models you actually test on.",
      "what" : "Simulated devices, each with its own disk of installed apps and data.",
      "whyItGrows" : "Xcode creates a device for every model in every runtime it installs."
    },
    "family" : "xcode",
    "guards" : [
      {
        "appNotRunning" : {
          "_0" : {
            "app" : {
              "_0" : "Simulator"
            }
          }
        }
      },
      {
        "appNotRunning" : {
          "_0" : {
            "binary" : {
              "_0" : "xcodebuild"
            }
          }
        }
      }
    ],
    "id" : "sim.devices",
    "locations" : [
      {
        "discovered" : {
          "_0" : "simulatorDevices"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "rebuild" : {
        "minutes" : 2
      }
    },
    "requiresTool" : {
      "binary" : {
        "_0" : "xcrun"
      }
    },
    "selection" : {
      "perItem" : {

      }
    },
    "strategy" : {
      "toolCommand" : {
        "_0" : "xcrun simctl delete {}"
      }
    },
    "tier" : 2,
    "title" : "Simulator devices",
    "verified" : "confirmed",
    "visual" : "deviceGrid"
  },
  {
    "explanation" : {
      "afterDeletion" : "The first boot after this takes a minute longer.",
      "keepItSmall" : "Nothing to configure.",
      "what" : "Shared library caches the simulator builds per runtime.",
      "whyItGrows" : "A new cache is built for every runtime and kept after the runtime goes."
    },
    "family" : "xcode",
    "guards" : [
      {
        "appNotRunning" : {
          "_0" : {
            "app" : {
              "_0" : "Simulator"
            }
          }
        }
      }
    ],
    "id" : "sim.dyld-cache",
    "locations" : [
      {
        "glob" : {
          "_0" : "~/Library/Developer/CoreSimulator/Caches/dyld/*/*"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "rebuild" : {
        "minutes" : 1
      }
    },
    "selection" : {
      "perItem" : {

      }
    },
    "strategy" : {
      "delete" : {

      }
    },
    "tier" : 1,
    "title" : "Simulator dyld cache",
    "verified" : "confirmed",
    "visual" : "plain"
  },
  {
    "explanation" : {
      "afterDeletion" : "Nothing is removed here; a missing cache is rebuilt on the next simulator boot.",
      "keepItSmall" : "Only folders named after a macOS build other than the one you run are spare.",
      "what" : "Shared library caches the simulator builds per runtime, one folder per macOS build.",
      "whyItGrows" : "Each macOS update builds a fresh set, and the previous build's folder stays."
    },
    "family" : "xcode",
    "guards" : [

    ],
    "id" : "sim.dyld-cache-system",
    "locations" : [
      {
        "glob" : {
          "_0" : "/Library/Developer/CoreSimulator/Caches/dyld/*/*"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "rebuild" : {
        "minutes" : 1
      }
    },
    "selection" : {
      "perItem" : {

      }
    },
    "strategy" : {
      "advisory" : {
        "_0" : "sudo rm -rf /Library/Developer/CoreSimulator/Caches/dyld/<older macOS build>"
      }
    },
    "tier" : 4,
    "title" : "Simulator dyld cache in the system library",
    "verified" : "confirmed",
    "visual" : "plain"
  },
  {
    "explanation" : {
      "afterDeletion" : "New logs start empty.",
      "keepItSmall" : "Nothing to configure.",
      "what" : "Console output from every simulator boot.",
      "whyItGrows" : "Each device keeps its own log directory and every boot adds to it."
    },
    "family" : "xcode",
    "guards" : [

    ],
    "id" : "sim.logs",
    "locations" : [
      {
        "absolute" : {
          "_0" : "~/Library/Logs/CoreSimulator"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "none" : {

      }
    },
    "selection" : {
      "whole" : {

      }
    },
    "strategy" : {
      "delete" : {

      }
    },
    "tier" : 1,
    "title" : "Simulator logs",
    "verified" : "confirmed",
    "visual" : "plain"
  },
  {
    "explanation" : {
      "afterDeletion" : "They are recreated on demand.",
      "keepItSmall" : "Nothing to configure.",
      "what" : "Simulator devices Swift Playgrounds and previews create.",
      "whyItGrows" : "A device is created per playground and runtime, and it stays after the playground is closed."
    },
    "family" : "xcode",
    "guards" : [

    ],
    "id" : "sim.playground-devices",
    "locations" : [
      {
        "absolute" : {
          "_0" : "~/Library/Developer/XCPGDevices"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "none" : {

      }
    },
    "selection" : {
      "whole" : {

      }
    },
    "strategy" : {
      "delete" : {

      }
    },
    "tier" : 1,
    "title" : "Playground devices",
    "verified" : "confirmed",
    "visual" : "plain"
  },
  {
    "explanation" : {
      "afterDeletion" : "Testing on that OS version downloads the runtime again.",
      "keepItSmall" : "Keep the current runtime and the oldest version you support.",
      "what" : "Complete operating system images the simulator boots.",
      "whyItGrows" : "Each Xcode release downloads a new one and leaves every earlier one in place."
    },
    "family" : "xcode",
    "guards" : [
      {
        "appNotRunning" : {
          "_0" : {
            "app" : {
              "_0" : "Simulator"
            }
          }
        }
      }
    ],
    "id" : "sim.runtimes",
    "locations" : [
      {
        "discovered" : {
          "_0" : "simulatorRuntimes"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "redownload" : {

      }
    },
    "requiresTool" : {
      "binary" : {
        "_0" : "xcrun"
      }
    },
    "selection" : {
      "perItem" : {

      }
    },
    "strategy" : {
      "toolCommand" : {
        "_0" : "xcrun simctl runtime delete {}"
      }
    },
    "tier" : 2,
    "title" : "Simulator runtimes",
    "verified" : "confirmed",
    "visual" : "versionTimeline"
  },
  {
    "explanation" : {
      "afterDeletion" : "The next parallel run creates the clones it needs.",
      "keepItSmall" : "Nothing to configure.",
      "what" : "Simulator clones created for parallel test runs.",
      "whyItGrows" : "A cancelled test run leaves its clones behind."
    },
    "family" : "xcode",
    "guards" : [
      {
        "appNotRunning" : {
          "_0" : {
            "binary" : {
              "_0" : "xcodebuild"
            }
          }
        }
      },
      {
        "noOpenFiles" : {

        }
      }
    ],
    "id" : "sim.test-devices",
    "locations" : [
      {
        "absolute" : {
          "_0" : "~/Library/Developer/XCTestDevices"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "rebuild" : {
        "minutes" : 2
      }
    },
    "selection" : {
      "whole" : {

      }
    },
    "strategy" : {
      "delete" : {

      }
    },
    "tier" : 1,
    "title" : "Parallel test devices",
    "verified" : "confirmed",
    "visual" : "plain"
  },
  {
    "explanation" : {
      "afterDeletion" : "Nothing changes; these devices could not be started.",
      "keepItSmall" : "Nothing to configure.",
      "what" : "Devices whose runtime has been removed, so nothing can boot them.",
      "whyItGrows" : "Removing a runtime leaves its devices behind."
    },
    "family" : "xcode",
    "guards" : [

    ],
    "id" : "sim.unavailable",
    "locations" : [
      {
        "discovered" : {
          "_0" : "simulatorUnavailableDevices"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "none" : {

      }
    },
    "requiresTool" : {
      "binary" : {
        "_0" : "xcrun"
      }
    },
    "selection" : {
      "perItem" : {

      }
    },
    "strategy" : {
      "toolCommand" : {
        "_0" : "xcrun simctl delete unavailable"
      }
    },
    "tier" : 1,
    "title" : "Simulators with no runtime",
    "verified" : "expected",
    "visual" : "deviceGrid"
  },
  {
    "explanation" : {
      "afterDeletion" : "Versions go to the Trash; saved documents are untouched.",
      "keepItSmall" : "File, Revert To, Browse All Versions shows what each app is holding.",
      "what" : "Unsaved document states macOS keeps for apps that support versions.",
      "whyItGrows" : "A crash or a force quit leaves a copy behind."
    },
    "family" : "design",
    "guards" : [
      {
        "olderThan" : {
          "days" : 30
        }
      },
      {
        "noOpenFiles" : {

        }
      }
    ],
    "id" : "sketch.autosave",
    "locations" : [
      {
        "glob" : {
          "_0" : "~/Library/Autosave Information/*"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "irreversible" : {

      }
    },
    "selection" : {
      "perItem" : {

      }
    },
    "strategy" : {
      "trash" : {

      }
    },
    "tier" : 3,
    "title" : "Autosave versions",
    "verified" : "confirmed",
    "visual" : "plain"
  },
  {
    "explanation" : {
      "afterDeletion" : "Previews regenerate as you browse.",
      "keepItSmall" : "Nothing to configure.",
      "what" : "Thumbnails and previews Sketch caches for your documents.",
      "whyItGrows" : "Every document you open adds its previews, and nothing is removed when the document is."
    },
    "family" : "design",
    "guards" : [
      {
        "appNotRunning" : {
          "_0" : {
            "app" : {
              "_0" : "Sketch"
            }
          }
        }
      }
    ],
    "id" : "sketch.cache",
    "locations" : [
      {
        "absolute" : {
          "_0" : "~/Library/Caches/com.bohemiancoding.sketch3"
        }
      },
      {
        "absolute" : {
          "_0" : "~/Library/Application Support/com.bohemiancoding.sketch3/cache"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "none" : {

      }
    },
    "selection" : {
      "whole" : {

      }
    },
    "strategy" : {
      "delete" : {

      }
    },
    "tier" : 1,
    "title" : "Sketch cache",
    "verified" : "expected",
    "visual" : "plain"
  },
  {
    "explanation" : {
      "afterDeletion" : "Copies go to the Trash; saved models are untouched.",
      "keepItSmall" : "Preferences, General sets the autosave interval.",
      "what" : "Recovery copies of models that were open during a crash.",
      "whyItGrows" : "A crash leaves the recovery copy in place after you have recovered."
    },
    "family" : "design",
    "guards" : [
      {
        "olderThan" : {
          "days" : 30
        }
      }
    ],
    "id" : "sketchup.autosave",
    "locations" : [
      {
        "glob" : {
          "_0" : "~/Library/Application Support/SketchUp*/SketchUp/Autosave/*"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "irreversible" : {

      }
    },
    "selection" : {
      "perItem" : {

      }
    },
    "strategy" : {
      "trash" : {

      }
    },
    "tier" : 3,
    "title" : "SketchUp autosaves",
    "verified" : "expected",
    "visual" : "plain"
  },
  {
    "explanation" : {
      "afterDeletion" : "Nothing; these have already been applied.",
      "keepItSmall" : "Nothing to configure.",
      "what" : "Installer payloads apps download when they update themselves.",
      "whyItGrows" : "Each update leaves its archive behind after installing."
    },
    "family" : "apps",
    "guards" : [

    ],
    "id" : "sparkle.updates",
    "locations" : [
      {
        "glob" : {
          "_0" : "~/Library/Caches/*/org.sparkle-project.Sparkle"
        }
      },
      {
        "glob" : {
          "_0" : "~/Library/Caches/org.sparkle-project.Sparkle/*"
        }
      },
      {
        "glob" : {
          "_0" : "~/Library/Caches/*.ShipIt"
        }
      },
      {
        "glob" : {
          "_0" : "~/Library/Application Support/Caches/*.ShipIt"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "none" : {

      }
    },
    "selection" : {
      "perItem" : {

      }
    },
    "strategy" : {
      "delete" : {

      }
    },
    "tier" : 1,
    "title" : "Downloaded app updates",
    "verified" : "confirmed",
    "visual" : "plain"
  },
  {
    "explanation" : {
      "afterDeletion" : "The next dictation or transcription compiles its model again, which takes a few seconds.",
      "keepItSmall" : "Nothing to configure.",
      "what" : "Speech-recognition models macOS compiles for the Neural Engine and keeps in a temporary folder.",
      "whyItGrows" : "Each new model version is compiled beside the last, and nothing removes the old set."
    },
    "family" : "system",
    "guards" : [
      {
        "olderThan" : {
          "days" : 7
        }
      },
      {
        "noOpenFiles" : {

        }
      },
      {
        "ownedByCurrentUser" : {

        }
      }
    ],
    "id" : "speech.model-cache",
    "locations" : [
      {
        "glob" : {
          "_0" : "/private/var/tmp/SpeechModelCache/*"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "rebuild" : {
        "minutes" : 1
      }
    },
    "selection" : {
      "perItem" : {

      }
    },
    "strategy" : {
      "delete" : {

      }
    },
    "tier" : 1,
    "title" : "Compiled speech models",
    "verified" : "confirmed",
    "visual" : "ageHistogram"
  },
  {
    "explanation" : {
      "afterDeletion" : "Tracks stream again; downloads for offline listening are not touched.",
      "keepItSmall" : "Settings, Storage sets the cache limit.",
      "what" : "Streamed audio Spotify keeps so replays do not use the network.",
      "whyItGrows" : "The cache grows to its configured limit, which defaults to generous."
    },
    "family" : "communication",
    "guards" : [
      {
        "appNotRunning" : {
          "_0" : {
            "app" : {
              "_0" : "Spotify"
            }
          }
        }
      }
    ],
    "id" : "spotify.cache",
    "locations" : [
      {
        "absolute" : {
          "_0" : "~/Library/Caches/com.spotify.client"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "none" : {

      }
    },
    "selection" : {
      "whole" : {

      }
    },
    "strategy" : {
      "delete" : {

      }
    },
    "tier" : 1,
    "title" : "Spotify cache",
    "verified" : "expected",
    "visual" : "plain"
  },
  {
    "explanation" : {
      "afterDeletion" : "Nothing is removed here; Steam should uninstall so its library stays correct.",
      "keepItSmall" : "Steam can be set to keep only recently played games installed.",
      "what" : "Installed games, which are often the largest folders on a Mac.",
      "whyItGrows" : "Games stay installed after you stop playing them."
    },
    "family" : "apps",
    "guards" : [

    ],
    "id" : "steam.games",
    "locations" : [
      {
        "glob" : {
          "_0" : "~/Library/Application Support/Steam/steamapps/common/*"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "none" : {

      }
    },
    "selection" : {
      "perItem" : {

      }
    },
    "strategy" : {
      "advisory" : {
        "_0" : "Steam, Library, right-click the game, Manage, Uninstall"
      }
    },
    "tier" : 4,
    "title" : "Installed Steam games",
    "verified" : "expected",
    "visual" : "plain"
  },
  {
    "explanation" : {
      "afterDeletion" : "Shaders are downloaded or compiled again on next launch.",
      "keepItSmall" : "Settings, Downloads has a switch for shader pre-caching.",
      "what" : "Precompiled shaders and metadata Steam downloads per game.",
      "whyItGrows" : "Every game you launch downloads its own shader set, and games you have uninstalled keep theirs."
    },
    "family" : "apps",
    "guards" : [
      {
        "appNotRunning" : {
          "_0" : {
            "app" : {
              "_0" : "Steam"
            }
          }
        }
      }
    ],
    "id" : "steam.shader-cache",
    "locations" : [
      {
        "absolute" : {
          "_0" : "~/Library/Application Support/Steam/steamapps/shadercache"
        }
      },
      {
        "absolute" : {
          "_0" : "~/Library/Application Support/Steam/appcache"
        }
      },
      {
        "absolute" : {
          "_0" : "~/Library/Application Support/Steam/logs"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "redownload" : {

      }
    },
    "selection" : {
      "whole" : {

      }
    },
    "strategy" : {
      "delete" : {

      }
    },
    "tier" : 1,
    "title" : "Steam shader cache",
    "verified" : "expected",
    "visual" : "plain"
  },
  {
    "explanation" : {
      "afterDeletion" : "The next resolve clones the packages again.",
      "keepItSmall" : "Nothing to configure.",
      "what" : "Cloned package repositories and resolved manifests.",
      "whyItGrows" : "Every package any project has ever resolved stays here."
    },
    "family" : "xcode",
    "guards" : [
      {
        "appNotRunning" : {
          "_0" : {
            "app" : {
              "_0" : "Xcode"
            }
          }
        }
      },
      {
        "appNotRunning" : {
          "_0" : {
            "binary" : {
              "_0" : "swift"
            }
          }
        }
      }
    ],
    "id" : "swiftpm.cache",
    "locations" : [
      {
        "absolute" : {
          "_0" : "~/Library/Caches/org.swift.swiftpm"
        }
      },
      {
        "absolute" : {
          "_0" : "~/Library/org.swift.swiftpm/cache"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "redownload" : {

      }
    },
    "selection" : {
      "whole" : {

      }
    },
    "strategy" : {
      "delete" : {

      }
    },
    "tier" : 1,
    "title" : "Swift Package Manager cache",
    "verified" : "confirmed",
    "visual" : "plain"
  },
  {
    "explanation" : {
      "afterDeletion" : "Nothing is removed here; installing the update clears its staged copy.",
      "keepItSmall" : "Install pending updates, or turn off automatic downloads in Software Update.",
      "what" : "macOS updates Software Update has downloaded and staged for installation.",
      "whyItGrows" : "Updates download in the background and wait here until they are installed."
    },
    "family" : "system",
    "guards" : [

    ],
    "id" : "system.update-staging",
    "locations" : [
      {
        "glob" : {
          "_0" : "/Library/Updates/*"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "none" : {

      }
    },
    "selection" : {
      "perItem" : {

      }
    },
    "strategy" : {
      "advisory" : {
        "_0" : "System Settings, General, Software Update"
      }
    },
    "tier" : 4,
    "title" : "Downloaded macOS updates",
    "verified" : "confirmed",
    "visual" : "plain"
  },
  {
    "explanation" : {
      "afterDeletion" : "Pulling an image downloads the layers again.",
      "keepItSmall" : "Nothing to configure; Tart removes the least recently used entries itself when disk space runs low.",
      "what" : "Downloaded layers Tart keeps after building a virtual machine from them.",
      "whyItGrows" : "Each remote image you pull keeps its layers here so the next clone of the same image is local."
    },
    "family" : "containers",
    "guards" : [

    ],
    "id" : "tart.cache",
    "locations" : [
      {
        "absolute" : {
          "_0" : "~/.tart/cache"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "redownload" : {

      }
    },
    "selection" : {
      "whole" : {

      }
    },
    "strategy" : {
      "delete" : {

      }
    },
    "tier" : 1,
    "title" : "Tart image cache",
    "verified" : "expected",
    "visual" : "plain"
  },
  {
    "explanation" : {
      "afterDeletion" : "Nothing is removed here; `tart delete` removes the machine and whatever was changed inside it.",
      "keepItSmall" : "Keep one image per macOS version you test on.",
      "what" : "macOS and Linux virtual machines Tart runs, used for local continuous integration.",
      "whyItGrows" : "A macOS image is tens of gigabytes and each pull keeps its own copy."
    },
    "family" : "containers",
    "guards" : [
      {
        "appNotRunning" : {
          "_0" : {
            "binary" : {
              "_0" : "tart"
            }
          }
        }
      },
      {
        "noOpenFiles" : {

        }
      }
    ],
    "id" : "tart.vms",
    "locations" : [
      {
        "glob" : {
          "_0" : "~/.tart/vms/*"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "irreversible" : {

      }
    },
    "selection" : {
      "perItem" : {

      }
    },
    "strategy" : {
      "advisory" : {
        "_0" : "tart delete {}"
      }
    },
    "tier" : 4,
    "title" : "Tart virtual machines",
    "verified" : "expected",
    "visual" : "sparseDisk"
  },
  {
    "explanation" : {
      "afterDeletion" : "`terraform init` downloads the providers again.",
      "keepItSmall" : "Nothing to configure; the plugin cache exists to avoid re-downloads.",
      "what" : "Provider binaries, tens to hundreds of megabytes each.",
      "whyItGrows" : "One copy per provider per version any workspace has used."
    },
    "family" : "system",
    "guards" : [

    ],
    "id" : "terraform.plugins",
    "locations" : [
      {
        "absolute" : {
          "_0" : "~/.terraform.d/plugin-cache"
        }
      },
      {
        "absolute" : {
          "_0" : "~/.pulumi/plugins"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "redownload" : {

      }
    },
    "selection" : {
      "whole" : {

      }
    },
    "strategy" : {
      "delete" : {

      }
    },
    "tier" : 2,
    "title" : "Terraform and Pulumi plugins",
    "verified" : "expected",
    "visual" : "plain"
  },
  {
    "explanation" : {
      "afterDeletion" : "Nothing is removed here; while the backup disk is away these snapshots are the only versions Time Machine keeps.",
      "keepItSmall" : "This space counts as purgeable and is reclaimed automatically.",
      "what" : "Hourly snapshots of the startup disk, kept for twenty-four hours.",
      "whyItGrows" : "One snapshot per hour, each holding the blocks that have changed."
    },
    "family" : "system",
    "guards" : [

    ],
    "id" : "tm.snapshots",
    "locations" : [
      {
        "discovered" : {
          "_0" : "localSnapshots"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "none" : {

      }
    },
    "selection" : {
      "whole" : {

      }
    },
    "strategy" : {
      "advisory" : {
        "_0" : "tmutil listlocalsnapshots /"
      }
    },
    "tier" : 4,
    "title" : "Time Machine local snapshots",
    "verified" : "confirmed",
    "visual" : "sparseDisk"
  },
  {
    "explanation" : {
      "afterDeletion" : "Nothing; anything still in use is held open and shown as blocked.",
      "keepItSmall" : "Restarting clears the per-user temporary directory.",
      "what" : "Scratch files applications and build tools leave in the temporary directory.",
      "whyItGrows" : "macOS clears this on restart, which on a laptop can be months apart."
    },
    "family" : "system",
    "guards" : [
      {
        "olderThan" : {
          "days" : 3
        }
      },
      {
        "noOpenFiles" : {

        }
      },
      {
        "ownedByCurrentUser" : {

        }
      }
    ],
    "id" : "tmp",
    "locations" : [
      {
        "glob" : {
          "_0" : "$TMPDIR/*"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "none" : {

      }
    },
    "selection" : {
      "perItem" : {

      }
    },
    "strategy" : {
      "delete" : {

      }
    },
    "tier" : 1,
    "title" : "Temporary files",
    "verified" : "confirmed",
    "visual" : "ageHistogram"
  },
  {
    "explanation" : {
      "afterDeletion" : "They go to the Trash, so anything you meant to keep can be put back.",
      "keepItSmall" : "Keep work you care about outside /tmp.",
      "what" : "Files left in the shared temporary folder that every user and tool can write to.",
      "whyItGrows" : "macOS does not clear this folder on its own, so files stay until someone removes them."
    },
    "family" : "system",
    "guards" : [
      {
        "olderThan" : {
          "days" : 7
        }
      },
      {
        "noOpenFiles" : {

        }
      },
      {
        "ownedByCurrentUser" : {

        }
      }
    ],
    "id" : "tmp.shared",
    "locations" : [
      {
        "glob" : {
          "_0" : "/private/tmp/*"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "none" : {

      }
    },
    "selection" : {
      "perItem" : {

      }
    },
    "strategy" : {
      "trash" : {

      }
    },
    "tier" : 2,
    "title" : "Shared temporary files",
    "verified" : "expected",
    "visual" : "ageHistogram"
  },
  {
    "explanation" : {
      "afterDeletion" : "Reclaim never empties it, so anything there can still be put back.",
      "keepItSmall" : "Finder settings can remove Trash items after thirty days.",
      "what" : "Everything you have already put in the Trash, including what Reclaim moved there.",
      "whyItGrows" : "The Trash is not emptied unless you empty it."
    },
    "family" : "system",
    "guards" : [

    ],
    "id" : "trash",
    "locations" : [
      {
        "absolute" : {
          "_0" : "~/.Trash"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "irreversible" : {

      }
    },
    "selection" : {
      "whole" : {

      }
    },
    "strategy" : {
      "advisory" : {
        "_0" : "Finder, Empty Trash"
      }
    },
    "tier" : 4,
    "title" : "Trash",
    "verified" : "confirmed",
    "visual" : "plain"
  },
  {
    "explanation" : {
      "afterDeletion" : "Packages are downloaded again when a project needs them.",
      "keepItSmall" : "Nothing to configure.",
      "what" : "The global illumination cache and the package cache.",
      "whyItGrows" : "Downloaded packages are kept per version and never expire."
    },
    "family" : "design",
    "guards" : [
      {
        "appNotRunning" : {
          "_0" : {
            "binary" : {
              "_0" : "Unity"
            }
          }
        }
      }
    ],
    "id" : "unity.caches",
    "locations" : [
      {
        "glob" : {
          "_0" : "~/Library/Caches/com.unity3d.*"
        }
      },
      {
        "absolute" : {
          "_0" : "~/Library/Unity/cache"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "redownload" : {

      }
    },
    "selection" : {
      "whole" : {

      }
    },
    "strategy" : {
      "delete" : {

      }
    },
    "tier" : 1,
    "title" : "Unity caches",
    "verified" : "expected",
    "visual" : "plain"
  },
  {
    "explanation" : {
      "afterDeletion" : "Nothing is removed here; Unity Hub should uninstall them.",
      "keepItSmall" : "Consolidate projects onto one long-term support version.",
      "what" : "Complete Unity editors, five to fifteen gigabytes each with their modules.",
      "whyItGrows" : "Each project pins its own editor version and Hub keeps them all."
    },
    "family" : "design",
    "guards" : [

    ],
    "id" : "unity.editors",
    "locations" : [
      {
        "glob" : {
          "_0" : "/Applications/Unity/Hub/Editor/*"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "none" : {

      }
    },
    "selection" : {
      "perItem" : {

      }
    },
    "strategy" : {
      "advisory" : {
        "_0" : "Unity Hub, Installs, remove the version"
      }
    },
    "tier" : 4,
    "title" : "Unity editor versions",
    "verified" : "expected",
    "visual" : "plain"
  },
  {
    "explanation" : {
      "afterDeletion" : "The next editor launch recompiles shaders, which takes a while once.",
      "keepItSmall" : "Unreal supports a size cap on the local derived data cache.",
      "what" : "Cooked shaders and compiled assets shared across Unreal projects.",
      "whyItGrows" : "Every shader permutation any project has compiled is kept."
    },
    "family" : "design",
    "guards" : [
      {
        "appNotRunning" : {
          "_0" : {
            "binary" : {
              "_0" : "UnrealEditor"
            }
          }
        }
      },
      {
        "noOpenFiles" : {

        }
      }
    ],
    "id" : "unreal.derived-data",
    "locations" : [
      {
        "glob" : {
          "_0" : "~/Library/Application Support/Epic/UnrealEngine/Common/DerivedDataCache"
        }
      },
      {
        "glob" : {
          "_0" : "~/Library/Logs/Unreal Engine/*"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "rebuild" : {
        "minutes" : 30
      }
    },
    "selection" : {
      "perItem" : {

      }
    },
    "strategy" : {
      "delete" : {

      }
    },
    "tier" : 2,
    "title" : "Unreal derived data cache",
    "verified" : "expected",
    "visual" : "plain"
  },
  {
    "explanation" : {
      "afterDeletion" : "The next sync rebuilds the wheels it needs.",
      "keepItSmall" : "`uv cache prune` keeps what current environments reference.",
      "what" : "Built wheels and unpacked packages uv reuses across environments.",
      "whyItGrows" : "uv caches aggressively on purpose, and nothing expires."
    },
    "family" : "python",
    "guards" : [

    ],
    "id" : "uv.cache",
    "locations" : [
      {
        "absolute" : {
          "_0" : "~/.cache/uv"
        }
      },
      {
        "absolute" : {
          "_0" : "~/Library/Caches/uv"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "rebuild" : {
        "minutes" : 2
      }
    },
    "requiresTool" : {
      "binary" : {
        "_0" : "uv"
      }
    },
    "selection" : {
      "whole" : {

      }
    },
    "strategy" : {
      "toolCommand" : {
        "_0" : "uv cache clean"
      }
    },
    "tier" : 1,
    "title" : "uv cache",
    "verified" : "confirmed",
    "visual" : "plain"
  },
  {
    "explanation" : {
      "afterDeletion" : "`uv python install` fetches the version again.",
      "keepItSmall" : "Keep the versions your active projects pin in their configuration.",
      "what" : "Standalone Python builds uv downloads for projects that pin a version.",
      "whyItGrows" : "Each pinned version installs its own interpreter."
    },
    "family" : "python",
    "guards" : [
      {
        "newerVersionPresent" : {
          "_0" : {
            "grouping" : "familyAndMinor",
            "keep" : 1
          }
        }
      }
    ],
    "id" : "uv.python",
    "locations" : [
      {
        "glob" : {
          "_0" : "~/.local/share/uv/python/*"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "redownload" : {

      }
    },
    "selection" : {
      "allButNewest" : {
        "_0" : {
          "grouping" : "familyAndMinor",
          "keep" : 1
        }
      }
    },
    "strategy" : {
      "toolCommand" : {
        "_0" : "uv python uninstall {}"
      }
    },
    "tier" : 2,
    "title" : "Python versions installed by uv",
    "verified" : "confirmed",
    "visual" : "versionTimeline"
  },
  {
    "explanation" : {
      "afterDeletion" : "`vagrant up` downloads the box again.",
      "keepItSmall" : "`vagrant box prune` after updating a box.",
      "what" : "Base images Vagrant downloads, one per box and version.",
      "whyItGrows" : "Updating a box downloads a new version and keeps the old one."
    },
    "family" : "containers",
    "guards" : [

    ],
    "id" : "vagrant.boxes",
    "locations" : [
      {
        "absolute" : {
          "_0" : "~/.vagrant.d/boxes"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "redownload" : {

      }
    },
    "requiresTool" : {
      "binary" : {
        "_0" : "vagrant"
      }
    },
    "selection" : {
      "whole" : {

      }
    },
    "strategy" : {
      "toolCommand" : {
        "_0" : "vagrant box prune"
      }
    },
    "tier" : 2,
    "title" : "Vagrant boxes",
    "verified" : "expected",
    "visual" : "plain"
  },
  {
    "explanation" : {
      "afterDeletion" : "Code rebuilds its caches on next launch.",
      "keepItSmall" : "Nothing to configure; worth revisiting after an editor update.",
      "what" : "Editor caches, downloaded extension archives and logs.",
      "whyItGrows" : "Each editor update adds a compiled-code folder under CachedData, and every extension install keeps its archive."
    },
    "family" : "ides",
    "guards" : [
      {
        "appNotRunning" : {
          "_0" : {
            "app" : {
              "_0" : "Visual Studio Code"
            }
          }
        }
      }
    ],
    "id" : "vscode.caches",
    "locations" : [
      {
        "absolute" : {
          "_0" : "~/Library/Application Support/Code/Cache"
        }
      },
      {
        "absolute" : {
          "_0" : "~/Library/Application Support/Code/CachedData"
        }
      },
      {
        "absolute" : {
          "_0" : "~/Library/Application Support/Code/CachedExtensionVSIXs"
        }
      },
      {
        "absolute" : {
          "_0" : "~/Library/Application Support/Code/Code Cache"
        }
      },
      {
        "absolute" : {
          "_0" : "~/Library/Application Support/Code/GPUCache"
        }
      },
      {
        "absolute" : {
          "_0" : "~/Library/Application Support/Code/logs"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "none" : {

      }
    },
    "selection" : {
      "whole" : {

      }
    },
    "strategy" : {
      "delete" : {

      }
    },
    "tier" : 1,
    "title" : "Visual Studio Code caches",
    "verified" : "expected",
    "visual" : "plain"
  },
  {
    "explanation" : {
      "afterDeletion" : "Only the newest version of each extension is loaded.",
      "keepItSmall" : "Nothing to configure.",
      "what" : "Older versions of installed extensions, left after an update.",
      "whyItGrows" : "An update installs into a new directory and does not always remove the old one."
    },
    "family" : "ides",
    "guards" : [
      {
        "newerVersionPresent" : {
          "_0" : {
            "grouping" : "family",
            "keep" : 1
          }
        }
      }
    ],
    "id" : "vscode.old-extensions",
    "locations" : [
      {
        "glob" : {
          "_0" : "~/.vscode/extensions/*"
        }
      },
      {
        "glob" : {
          "_0" : "~/.cursor/extensions/*"
        }
      },
      {
        "glob" : {
          "_0" : "~/.vscode-insiders/extensions/*"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "none" : {

      }
    },
    "selection" : {
      "allButNewest" : {
        "_0" : {
          "grouping" : "family",
          "keep" : 1
        }
      }
    },
    "strategy" : {
      "delete" : {

      }
    },
    "tier" : 1,
    "title" : "Superseded editor extensions",
    "verified" : "confirmed",
    "visual" : "versionTimeline"
  },
  {
    "explanation" : {
      "afterDeletion" : "Its project folder is already gone, and the storage goes to the Trash.",
      "keepItSmall" : "Nothing to configure.",
      "what" : "Per-project editor state: open files, search history, extension data.",
      "whyItGrows" : "One directory per folder ever opened, kept after the folder is gone."
    },
    "family" : "ides",
    "guards" : [

    ],
    "id" : "vscode.workspaces",
    "locations" : [
      {
        "discovered" : {
          "_0" : "orphanedEditorWorkspaces"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "none" : {

      }
    },
    "selection" : {
      "perItem" : {

      }
    },
    "strategy" : {
      "trash" : {

      }
    },
    "tier" : 2,
    "title" : "Orphaned workspace storage",
    "verified" : "confirmed",
    "visual" : "plain"
  },
  {
    "explanation" : {
      "afterDeletion" : "Warp keeps running from Applications and downloads the next update when one comes.",
      "keepItSmall" : "Nothing to configure.",
      "what" : "Update bundles Warp downloads before installing them.",
      "whyItGrows" : "Each update downloads a complete copy of the app, and the folder is not emptied afterwards."
    },
    "family" : "apps",
    "guards" : [
      {
        "appNotRunning" : {
          "_0" : {
            "app" : {
              "_0" : "Warp"
            }
          }
        }
      }
    ],
    "id" : "warp.updates",
    "locations" : [
      {
        "glob" : {
          "_0" : "~/Library/Application Support/dev.warp.Warp-Stable/autoupdate/*"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "redownload" : {

      }
    },
    "selection" : {
      "perItem" : {

      }
    },
    "strategy" : {
      "delete" : {

      }
    },
    "tier" : 1,
    "title" : "Warp downloaded updates",
    "verified" : "confirmed",
    "visual" : "plain"
  },
  {
    "explanation" : {
      "afterDeletion" : "The next transcription downloads the model again.",
      "keepItSmall" : "Keep the one size you actually use.",
      "what" : "Whisper speech recognition checkpoints, one file per model size.",
      "whyItGrows" : "Trying a larger model downloads it and keeps the smaller ones."
    },
    "family" : "python",
    "guards" : [

    ],
    "id" : "whisper.models",
    "locations" : [
      {
        "glob" : {
          "_0" : "~/.cache/whisper/*.pt"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "redownload" : {

      }
    },
    "selection" : {
      "perItem" : {

      }
    },
    "strategy" : {
      "delete" : {

      }
    },
    "tier" : 2,
    "title" : "Whisper models",
    "verified" : "confirmed",
    "visual" : "modelList"
  },
  {
    "explanation" : {
      "afterDeletion" : "Crash reports from that version can no longer be symbolicated.",
      "keepItSmall" : "Keep the archives for versions still in the field and remove the rest.",
      "what" : "Archived builds, each holding the debug symbols for a shipped version.",
      "whyItGrows" : "Every Organizer upload leaves one behind."
    },
    "family" : "xcode",
    "guards" : [
      {
        "olderThan" : {
          "days" : 90
        }
      }
    ],
    "id" : "xcode.archives",
    "locations" : [
      {
        "glob" : {
          "_0" : "~/Library/Developer/Xcode/Archives/*/*.xcarchive"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "irreversible" : {

      }
    },
    "selection" : {
      "perItem" : {

      }
    },
    "strategy" : {
      "trash" : {

      }
    },
    "tier" : 3,
    "title" : "Archives",
    "verified" : "expected",
    "visual" : "plain"
  },
  {
    "explanation" : {
      "afterDeletion" : "Xcode fills what it needs on next launch.",
      "keepItSmall" : "Nothing to configure.",
      "what" : "Xcode's own cache directory.",
      "whyItGrows" : "Downloaded components, test reports and scratch data accumulate across every project and Xcode does not trim them."
    },
    "family" : "xcode",
    "guards" : [
      {
        "appNotRunning" : {
          "_0" : {
            "app" : {
              "_0" : "Xcode"
            }
          }
        }
      }
    ],
    "id" : "xcode.caches",
    "locations" : [
      {
        "absolute" : {
          "_0" : "~/Library/Caches/com.apple.dt.Xcode"
        }
      },
      {
        "absolute" : {
          "_0" : "~/Library/Caches/com.apple.dt.xcodebuild"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "none" : {

      }
    },
    "selection" : {
      "whole" : {

      }
    },
    "strategy" : {
      "delete" : {

      }
    },
    "tier" : 1,
    "title" : "Xcode caches",
    "verified" : "confirmed",
    "visual" : "plain"
  },
  {
    "explanation" : {
      "afterDeletion" : "Nothing is removed here; while Xcode is selected, builds use Xcode's own copy.",
      "keepItSmall" : "`xcode-select --install` puts them back if a tool asks for them.",
      "what" : "A second copy of the compilers and headers, installed outside Xcode.",
      "whyItGrows" : "Installing Homebrew or running git for the first time installs it, and Xcode never replaces it."
    },
    "family" : "xcode",
    "guards" : [

    ],
    "id" : "xcode.clt-redundant",
    "locations" : [
      {
        "discovered" : {
          "_0" : "redundantCommandLineTools"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "none" : {

      }
    },
    "selection" : {
      "perItem" : {

      }
    },
    "strategy" : {
      "advisory" : {
        "_0" : "sudo rm -rf /Library/Developer/CommandLineTools"
      }
    },
    "tier" : 4,
    "title" : "Command Line Tools beside Xcode",
    "verified" : "confirmed",
    "visual" : "plain"
  },
  {
    "explanation" : {
      "afterDeletion" : "The next build is a clean build and takes longer once.",
      "keepItSmall" : "Xcode settings, Locations, lets you point derived data at a per-project folder.",
      "what" : "Build products, indexes and logs Xcode keeps for each project.",
      "whyItGrows" : "Xcode writes a new folder per project and never removes the old ones."
    },
    "family" : "xcode",
    "guards" : [
      {
        "appNotRunning" : {
          "_0" : {
            "app" : {
              "_0" : "Xcode"
            }
          }
        }
      },
      {
        "noOpenFiles" : {

        }
      }
    ],
    "id" : "xcode.derived-data",
    "locations" : [
      {
        "glob" : {
          "_0" : "~/Library/Developer/Xcode/DerivedData/*"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "rebuild" : {
        "minutes" : 5
      }
    },
    "requiresTool" : {
      "app" : {
        "_0" : "Xcode"
      }
    },
    "selection" : {
      "perItem" : {

      }
    },
    "strategy" : {
      "delete" : {

      }
    },
    "tier" : 1,
    "title" : "Derived data",
    "verified" : "confirmed",
    "visual" : "stackedUsage"
  },
  {
    "explanation" : {
      "afterDeletion" : "Plugging in a device on that OS version copies them again.",
      "keepItSmall" : "Nothing to configure; this is worth revisiting once a year.",
      "what" : "Symbol files Xcode copies from every device you plug in.",
      "whyItGrows" : "One folder per OS build, two to five gigabytes each, kept forever."
    },
    "family" : "xcode",
    "guards" : [
      {
        "newerVersionPresent" : {
          "_0" : {
            "grouping" : "familyAndMajor",
            "keep" : 1
          }
        }
      }
    ],
    "id" : "xcode.device-support",
    "locations" : [
      {
        "glob" : {
          "_0" : "~/Library/Developer/Xcode/iOS DeviceSupport/*"
        }
      },
      {
        "glob" : {
          "_0" : "~/Library/Developer/Xcode/watchOS DeviceSupport/*"
        }
      },
      {
        "glob" : {
          "_0" : "~/Library/Developer/Xcode/tvOS DeviceSupport/*"
        }
      },
      {
        "glob" : {
          "_0" : "~/Library/Developer/Xcode/visionOS DeviceSupport/*"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "rebuild" : {
        "minutes" : 10
      }
    },
    "selection" : {
      "allButNewest" : {
        "_0" : {
          "grouping" : "familyAndMajor",
          "keep" : 1
        }
      }
    },
    "strategy" : {
      "delete" : {

      }
    },
    "tier" : 2,
    "title" : "Device support",
    "verified" : "expected",
    "visual" : "versionTimeline"
  },
  {
    "explanation" : {
      "afterDeletion" : "Documentation is fetched again when you open it.",
      "keepItSmall" : "Nothing to configure.",
      "what" : "Downloaded developer documentation sets.",
      "whyItGrows" : "Every documentation set you have opened is kept, across Xcode versions."
    },
    "family" : "xcode",
    "guards" : [

    ],
    "id" : "xcode.doc-cache",
    "locations" : [
      {
        "absolute" : {
          "_0" : "~/Library/Developer/Xcode/DocumentationCache"
        }
      },
      {
        "absolute" : {
          "_0" : "~/Library/Developer/Shared/Documentation"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "redownload" : {

      }
    },
    "selection" : {
      "whole" : {

      }
    },
    "strategy" : {
      "delete" : {

      }
    },
    "tier" : 1,
    "title" : "Documentation cache",
    "verified" : "expected",
    "visual" : "plain"
  },
  {
    "explanation" : {
      "afterDeletion" : "Xcode downloads a current profile when it next signs.",
      "keepItSmall" : "Nothing to configure; these are small but confusing to leave.",
      "what" : "Signing profiles that are past their expiry date.",
      "whyItGrows" : "Xcode adds a new profile on every signing change and keeps the old ones."
    },
    "family" : "xcode",
    "guards" : [
      {
        "olderThan" : {
          "days" : 365
        }
      }
    ],
    "id" : "xcode.expired-profiles",
    "locations" : [
      {
        "glob" : {
          "_0" : "~/Library/Developer/Xcode/UserData/Provisioning Profiles/*.mobileprovision"
        }
      },
      {
        "glob" : {
          "_0" : "~/Library/MobileDevice/Provisioning Profiles/*.mobileprovision"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "none" : {

      }
    },
    "selection" : {
      "perItem" : {

      }
    },
    "strategy" : {
      "delete" : {

      }
    },
    "tier" : 1,
    "title" : "Expired provisioning profiles",
    "verified" : "expected",
    "visual" : "plain"
  },
  {
    "explanation" : {
      "afterDeletion" : "Opening a storyboard rebuilds what it needs.",
      "keepItSmall" : "Nothing to configure.",
      "what" : "Rendering caches for storyboards and xib files.",
      "whyItGrows" : "Every storyboard you open adds its rendered previews and nothing expires."
    },
    "family" : "xcode",
    "guards" : [

    ],
    "id" : "xcode.ib-support",
    "locations" : [
      {
        "absolute" : {
          "_0" : "~/Library/Developer/Xcode/UserData/IB Support"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "none" : {

      }
    },
    "selection" : {
      "whole" : {

      }
    },
    "strategy" : {
      "delete" : {

      }
    },
    "tier" : 1,
    "title" : "Interface Builder support",
    "verified" : "confirmed",
    "visual" : "plain"
  },
  {
    "explanation" : {
      "afterDeletion" : "The next build recompiles them.",
      "keepItSmall" : "Nothing to configure; worth revisiting after an Xcode update.",
      "what" : "Precompiled module headers shared across every project.",
      "whyItGrows" : "Every SDK, toolchain and build-setting combination produces its own set of modules, and old sets are not removed."
    },
    "family" : "xcode",
    "guards" : [
      {
        "appNotRunning" : {
          "_0" : {
            "app" : {
              "_0" : "Xcode"
            }
          }
        }
      }
    ],
    "id" : "xcode.module-cache",
    "locations" : [
      {
        "absolute" : {
          "_0" : "~/Library/Developer/Xcode/DerivedData/ModuleCache.noindex"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "rebuild" : {
        "minutes" : 3
      }
    },
    "selection" : {
      "whole" : {

      }
    },
    "strategy" : {
      "delete" : {

      }
    },
    "tier" : 1,
    "title" : "Module cache",
    "verified" : "confirmed",
    "visual" : "plain"
  },
  {
    "explanation" : {
      "afterDeletion" : "Nothing is removed here; move the bundle to the Trash yourself.",
      "keepItSmall" : "Keep the current release and one beta.",
      "what" : "Xcode bundles other than the one the command line tools point at.",
      "whyItGrows" : "Each version is ten to forty gigabytes and installs alongside the last."
    },
    "family" : "xcode",
    "guards" : [

    ],
    "id" : "xcode.old-versions",
    "locations" : [
      {
        "discovered" : {
          "_0" : "xcodeVersions"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "redownload" : {

      }
    },
    "selection" : {
      "perItem" : {

      }
    },
    "strategy" : {
      "advisory" : {
        "_0" : "xcode-select -p"
      }
    },
    "tier" : 4,
    "title" : "Xcode versions not selected",
    "verified" : "expected",
    "visual" : "plain"
  },
  {
    "explanation" : {
      "afterDeletion" : "The first preview after this rebuilds them.",
      "keepItSmall" : "Nothing to configure.",
      "what" : "Simulators and build products the preview canvas uses.",
      "whyItGrows" : "Preview simulators and build products are created per project and kept after you move on."
    },
    "family" : "xcode",
    "guards" : [
      {
        "appNotRunning" : {
          "_0" : {
            "app" : {
              "_0" : "Xcode"
            }
          }
        }
      }
    ],
    "id" : "xcode.previews",
    "locations" : [
      {
        "absolute" : {
          "_0" : "~/Library/Developer/Xcode/UserData/Previews"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "rebuild" : {
        "minutes" : 2
      }
    },
    "selection" : {
      "whole" : {

      }
    },
    "strategy" : {
      "delete" : {

      }
    },
    "tier" : 1,
    "title" : "SwiftUI previews",
    "verified" : "confirmed",
    "visual" : "plain"
  },
  {
    "explanation" : {
      "afterDeletion" : "Installs fetch from the registry again.",
      "keepItSmall" : "Yarn Berry projects can commit a per-project cache instead of using the global one.",
      "what" : "Package archives Yarn keeps for offline installs.",
      "whyItGrows" : "Every version of every dependency is kept."
    },
    "family" : "node",
    "guards" : [

    ],
    "id" : "yarn.cache",
    "locations" : [
      {
        "absolute" : {
          "_0" : "~/Library/Caches/Yarn"
        }
      },
      {
        "absolute" : {
          "_0" : "~/.yarn/berry/cache"
        }
      },
      {
        "absolute" : {
          "_0" : "~/.cache/yarn"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "redownload" : {

      }
    },
    "requiresTool" : {
      "binary" : {
        "_0" : "yarn"
      }
    },
    "selection" : {
      "whole" : {

      }
    },
    "strategy" : {
      "toolCommand" : {
        "_0" : "yarn cache clean"
      }
    },
    "tier" : 1,
    "title" : "Yarn cache",
    "verified" : "expected",
    "visual" : "plain"
  },
  {
    "explanation" : {
      "afterDeletion" : "Zed rebuilds them as you work.",
      "keepItSmall" : "Nothing to configure.",
      "what" : "Editor caches and logs.",
      "whyItGrows" : "Logs accumulate per session and the cache is never trimmed."
    },
    "family" : "ides",
    "guards" : [
      {
        "appNotRunning" : {
          "_0" : {
            "app" : {
              "_0" : "Zed"
            }
          }
        }
      }
    ],
    "id" : "zed.caches",
    "locations" : [
      {
        "absolute" : {
          "_0" : "~/Library/Caches/dev.zed.Zed"
        }
      },
      {
        "absolute" : {
          "_0" : "~/Library/Logs/Zed"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "none" : {

      }
    },
    "selection" : {
      "whole" : {

      }
    },
    "strategy" : {
      "delete" : {

      }
    },
    "tier" : 1,
    "title" : "Zed caches",
    "verified" : "expected",
    "visual" : "plain"
  },
  {
    "explanation" : {
      "afterDeletion" : "Opening that language downloads the server again.",
      "keepItSmall" : "Nothing to configure.",
      "what" : "Language server binaries Zed downloads per language.",
      "whyItGrows" : "Each language you open downloads its server and updates keep old copies."
    },
    "family" : "ides",
    "guards" : [
      {
        "appNotRunning" : {
          "_0" : {
            "app" : {
              "_0" : "Zed"
            }
          }
        }
      }
    ],
    "id" : "zed.languages",
    "locations" : [
      {
        "glob" : {
          "_0" : "~/Library/Application Support/Zed/languages/*"
        }
      }
    ],
    "pass" : "probe",
    "regenerationCost" : {
      "redownload" : {

      }
    },
    "selection" : {
      "perItem" : {

      }
    },
    "strategy" : {
      "delete" : {

      }
    },
    "tier" : 2,
    "title" : "Zed language servers",
    "verified" : "expected",
    "visual" : "plain"
  }
]