[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-95974":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":9,"language":10,"languages":9,"totalLinesOfCode":9,"stars":11,"forks":12,"watchers":13,"openIssues":14,"contributorsCount":15,"subscribersCount":15,"size":15,"stars1d":15,"stars7d":15,"stars30d":16,"stars90d":15,"forks30d":15,"starsTrendScore":15,"compositeScore":17,"rankGlobal":9,"rankLanguage":9,"license":18,"archived":19,"fork":19,"defaultBranch":20,"hasWiki":21,"hasPages":19,"topics":22,"createdAt":9,"pushedAt":9,"updatedAt":29,"readmeContent":30,"aiSummary":31,"trendingCount":15,"starSnapshotCount":15,"syncStatus":32,"lastSyncTime":33,"discoverSource":34},95974,"macos-sysdata","Jarvis322\u002Fmacos-sysdata","Jarvis322","See what is really inside macOS System Data and delete it, item by item, from the menu bar.",null,"Swift",630,33,176,1,0,151,8.59,"Other",false,"main",true,[23,24,25,26,27,28],"disk-cleanup","macos","menubar","swiftui","system-data","xcode","2026-09-21 02:04:29","\u003Cp align=\"center\">\n  \u003Cimg src=\"assets\u002Ficon.png\" width=\"128\" alt=\"System Data app icon\">\n\u003C\u002Fp>\n\n\u003Ch1 align=\"center\">System Data\u003C\u002Fh1>\n\n\u003Cp align=\"center\">\n  A menu bar app that shows what is really inside macOS \"System Data\" and lets you delete it, item by item.\u003Cbr>\n  \u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FmacOS-14%2B-black\" alt=\"macOS 14+\">\n  \u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FSwift-6-orange\" alt=\"Swift 6\">\n  \u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Fi18n-EN%20·%20TR%20·%20ZH%20·%20JA-blue\" alt=\"English, Turkish, Simplified Chinese, Japanese\">\n  \u003Ca href=\"LICENSE\">\u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Flicense-proprietary-lightgrey\" alt=\"Proprietary\">\u003C\u002Fa>\n\u003C\u002Fp>\n\n\u003Cp align=\"center\">\n  \u003Cimg src=\"assets\u002Fscreenshot.png\" width=\"460\" alt=\"The System Data window: a header with the total, a sort control and a settings menu, a filter field, then simulator devices and runtimes listed with their sizes and safety badges\">\n\u003C\u002Fp>\n\n---\n\nOpen System Settings > General > Storage on a developer Mac and \"System\nData\" is often the largest line, with no way to see inside it. Finder puts\neverything it cannot attribute to an app, photos or documents in that bucket:\nsimulator runtimes, Xcode symbol caches, package-manager stores, virtual\nmachine disks, the unified log, per-app data folders.\n\nThis app opens the bucket. It is not a cache cleaner: `~\u002FLibrary\u002FCaches` is\none small line among fifty, and the app never deletes anything you did not\nclick.\n\nEvery release is listed in [CHANGELOG.md](CHANGELOG.md), including the two\nthat shipped a broken updater and what to do if you are on one of them.\n\n## Install\n\n```bash\nbrew install --cask Jarvis322\u002Ftap\u002Fsysdata\n```\n\nOr download `SysDataMenu-\u003Cversion>.dmg` from the\n[latest release](https:\u002F\u002Fgithub.com\u002FJarvis322\u002Fmacos-sysdata\u002Freleases\u002Flatest),\nopen it and drag the app onto Applications. A `.zip` of the same app is\nattached to every release for anyone scripting the download.\n\nReleases from 0.3.2 on are signed with a Developer ID and notarized by\nApple, so the app opens without a Gatekeeper prompt. From 0.3.7 the binary\nis universal; 0.3.2 to 0.3.6 were Apple Silicon only and will not launch on\nan Intel Mac.\n\nBuild from source (Xcode 16 or later):\n\n```bash\ngit clone https:\u002F\u002Fgithub.com\u002FJarvis322\u002Fmacos-sysdata.git\ncd macos-sysdata\nscripts\u002Fbuild-app.sh\nopen build\u002FSysDataMenu.app\n```\n\nThe app has a **Launch at login** switch in its footer.\n\n## Updates\n\nThe app can check GitHub once a day for a newer release and offer to install\nit. It is **off by default**, and it is the only network request the app\nmakes: with the switch off, nothing leaves the Mac.\n\nInstalling replaces the app in place. Before anything is moved, the download\nmust have come from `github.com` over HTTPS, pass the same Gatekeeper\nassessment a fresh download gets, and be signed by the same team as the copy\nasking for the update. Anything else is discarded with a message, and the\ninstalled app is left alone.\n\n## Uninstall\n\n```bash\nbrew uninstall --zap --cask sysdata\n```\n\n`--zap` is the part that matters: without it the app goes and its files stay.\n\nIf it was installed by dragging the disk image, drag the app to the Trash and\nremove the four things it leaves behind:\n\n```bash\nrm -rf ~\u002FLibrary\u002FApplication\\ Support\u002FSysDataMenu \\\n       ~\u002FLibrary\u002FCaches\u002Flocal.sysdata.menu \\\n       ~\u002FLibrary\u002FHTTPStorages\u002Flocal.sysdata.menu \\\n       ~\u002FLibrary\u002FPreferences\u002Flocal.sysdata.menu.plist\n```\n\nThe first of those is the scan history, which records the path of everything\nthe app measured and everything you deleted. It never leaves the machine, but\nit is the file worth being deliberate about. **Remember what changed** in the\nsettings menu deletes it at any time without uninstalling anything.\n\nTwo grants outlive the app, because macOS keeps them rather than the app:\n\n- **Full Disk Access**, in System Settings > Privacy & Security. Remove the\n  entry with the **−** button.\n- **Notifications**, if you turned the low-space warning on.\n\nIf **Launch at login** was on, switch it off before uninstalling, or remove\nthe entry from System Settings > General > Login Items afterwards.\n\nNothing else is left. The app installs no privileged helper, no launch daemon\nand no kernel extension: every root action runs as a one-off `osascript`\nprompt, which is why it asks each time and shows you the command first.\n\n## What it does\n\n- **Menu bar total.** The icon shows the size of everything the scan found,\n  the number Storage settings calls System Data. The window header says how\n  much of it is safe to free right now. It scans on launch and once a day.\n  Results appear as each place is measured, with a count in the header, so a\n  slow first scan on a full disk cannot be mistaken for a stuck one.\n- **Every item has a real size**, measured on disk, plus a badge:\n  **Safe** regenerates automatically, **Review** costs you something (a\n  simulator, a login, a re-download), **Manual** cannot be removed by the app\n  and the info button shows the command or settings path.\n- **Trash first.** Review items go to the Trash, so a wrong click can be\n  undone for 30 days. Safe items are deleted outright because they come back\n  on their own.\n- **Quiet rows.** Reveal, hide and the breakdown chevron appear on hover, the\n  way Finder and Mail do it; delete stays visible, because it is the reason\n  the window is open. Right-click reaches all of them without a pointer.\n- **Idle time.** Rows past a fortnight say how long they have sat untouched,\n  and the sort control orders by it. Size cannot tell a build folder for\n  today's work apart from one for a project abandoned two years ago; those\n  are the same number of bytes and opposite decisions. Simulator runtimes\n  take their date from `simctl`, which knows when one was last booted.\n- **What changed.** Each scan and deletion is written to a local file, so the\n  list can show growth beside each size, and a history view can answer three\n  things a single scan cannot: what came back, what grew most, and what you\n  deleted. A cache cleared on Monday that is 12 GB again by Friday is the\n  most useful thing this app can tell you. Switch it off and the file is\n  deleted; nothing leaves the machine either way.\n- **Breakdown.** Click a row to see its five largest entries before deciding.\n- **Filter.** A scan finds around 180 items across eighteen groups, so the\n  field under the header narrows the list by name, description or group. The\n  selection survives it, because ticking **Select safe** and then filtering\n  to untick two of them is how the two controls are meant to be used\n  together. Folding a category keeps it too. Neither one quietly edits the\n  batch: the footer says how many selected rows are not on screen, next to\n  the button that would take them.\n- **Batch delete.** Tick rows and use **Delete N selected**. **Select safe**\n  ticks everything regenerable that is on screen, and unticks it on a second\n  press. Root actions are folded into one script where they can be, and the\n  confirmation says so — including when they cannot, because a delete of\n  something you do not own is run on its own and asks again.\n- **Read the command first.** The confirmation shows every operation\n  verbatim before anything runs — `As administrator: rm -rf\n  \u002FLibrary\u002FLogs\u002FDiagnosticReports\u002F*`, not a count of items. The source is\n  published so you can see what this does to your machine; this is the same\n  promise at the moment it matters. **Copy** puts the whole plan on the\n  pasteboard, since a list that scrolls inside 120pt often has to be read\n  somewhere else.\n- **Low space warning.** Optional, off until you switch it on. The daily scan\n  knows the disk is nearly full a day before you do. It only ever tells you:\n  nothing this app could delete unattended is worth the one time it gets it\n  wrong. Fires on the way down and stays quiet until free space has been back\n  above the line.\n- **Hide.** The eye button removes an item from future scans (Ollama models\n  you want to keep, say). A footer link brings hidden items back.\n- **Purgeable space** is shown in the header, with a tooltip saying what it\n  is and what it is not. It is macOS's estimate of what it could give back,\n  not space you can plan around: writing 6.44 GB on the test machine cost\n  6.44 GB of real free space and took nothing from the 3.55 GB pool, which\n  then refilled itself. The measurement is in\n  [docs\u002Fpurgeable-measurement.md](docs\u002Fpurgeable-measurement.md), along with\n  why forcing macOS to evict is not a feature here.\n- **Faster shutdown.** A booted iOS simulator ignores the quit request and\n  makes macOS wait 33 seconds before killing it (`launchd`: \"Service did not\n  exit 33 seconds after SIGTERM\"). Because the app is running at power off,\n  it shuts every simulator down the moment the shutdown starts and only\n  quits once that is done. Switch in the footer, on by default. Measured on\n  a MacBook Air with three simulators booted: userspace teardown went from\n  33,074 ms to 5,842 ms, the remaining 5 s being macOS's own service timeout.\n  Check your own numbers after a restart with\n  `grep \"Userspace teardown took\" \u002Fvar\u002Flog\u002Fcom.apple.xpc.launchd\u002Flaunchd.log.2`.\n- **Four languages**, following the system: English, Turkish, Simplified\n  Chinese and Japanese. Every interface string is translated in all of them.\n- **`SysDataMenu --json`** prints the whole inventory for scripts.\n\n## What it finds\n\n| Category | Items | Badge |\n| --- | --- | --- |\n| Time Machine snapshots | local APFS snapshots (`tmutil`) | Safe |\n| Simulator devices | per-device caches, unavailable devices, erase a device; the system dyld cache is reported (macOS blocks deleting it, even as root) | Safe \u002F Review \u002F Manual |\n| Simulator runtimes | each installed runtime disk image | Review |\n| Xcode | DerivedData, DeviceSupport, preview devices, caches, Archives, inactive Xcode.app copies | Safe \u002F Review |\n| Package managers | brew, npm, pnpm, yarn, pip, uv, CocoaPods, Gradle, Cargo, SwiftPM, Go, Cypress, Playwright; the whole Homebrew prefix. A pnpm store left behind by an uninstalled pnpm is found by its default path, since `pnpm store path` is exactly what is missing then | Safe \u002F Review \u002F Manual |\n| Developer tool data | Ollama and Hugging Face models, nvm\u002Frustup\u002Fpyenv\u002Frbenv\u002FSDKMAN toolchains, conda, Maven, CocoaPods specs, Gradle distributions, Go modules, Bun, Deno, VS Code and Cursor extensions, Docker CLI, OrbStack, Lima, Colima; the AI coding tools (Claude Code, Codex, Grok, Copilot, Kilo, Gemini, Antigravity); any other hidden home folder over 100 MB | Safe \u002F Review |\n| Logs & diagnostics | unified log store (`log erase`), crash reports, ASL, `~\u002FLibrary\u002FLogs` | Safe |\n| Temporary files | `\u002Fprivate\u002Fvar\u002Ffolders` user cache and temp, files older than 3 days | Safe |\n| Docker | `docker system prune` reclaimable space | Review |\n| Virtual machines | Parallels, UTM, VMware Fusion, VirtualBox, Tart | Review |\n| Trash | `~\u002F.Trash` | Safe |\n| iOS device backups | each MobileSync backup with device name and date | Review |\n| Shared & other users | `\u002FUsers\u002FShared` app data (BlueStacks and friends), other accounts | Review \u002F Manual |\n| Android | AVD emulators, SDK system images, platforms, build tools, NDK, emulator, Android Studio caches | Review \u002F Safe |\n| App data & caches | Slack, Discord, Teams, Zoom, Spotify, Safari, Adobe, Steam, Epic, Photos, Quick Look and Final Cut render caches; Claude VM bundles; Chrome on-device model; any Application Support \u002F Containers \u002F Group Containers folder over 200 MB, caches over 100 MB | Safe \u002F Review |\n| Project build folders | `node_modules`, `.build`, `Pods`, `DerivedData`, and the web frameworks' output (`.next`, `.nuxt`, `.svelte-kit`, `.astro`, `.angular`, `.turbo`, `.parcel-cache`, `.expo`) under Desktop, Documents, Developer, Projects | Review |\n| System | macOS installers, device firmware, Mail downloads, `\u002FLibrary\u002FCaches`, `\u002FLibrary\u002FApplication Support`, Command Line Tools, cryptexes, Spotlight index, swap, iCloud local copies | Safe \u002F Review \u002F Manual |\n| Other large folders | catch-all: every folder over 500 MB under `~`, `\u002FLibrary`, `\u002Fprivate\u002Fvar`, `\u002Fopt`, `\u002Fusr\u002Flocal` and `\u002FUsers\u002FShared` that no category above explains, shown with its full path | Review |\n\nThe catch-all pass runs last and takes the longest (it walks the home folder\nonce, skipping everything another probe already explains). The header shows\nwhich phase the scan is in.\n\nFolders Finder attributes to Photos, Music, Movies, Messages, Mail, iCloud\nDrive and Applications are left out, because they are not System Data.\n**Desktop, Documents and Downloads are left out too**, for a second reason:\nStorage settings counts them as Documents, and what is in them is your own\nwork, which no delete regenerates. The things under them that *are*\nreclaimable — build folders, virtual machines, render files — still each get\ntheir own row, named for what they are.\n\n## What it writes down\n\nTwo files it writes, and two macOS makes for it. All four on the machine:\n\n| Path | What is in it |\n| --- | --- |\n| `~\u002FLibrary\u002FPreferences\u002Flocal.sysdata.menu.plist` | the switches, the sort order, hidden item ids |\n| `~\u002FLibrary\u002FApplication Support\u002FSysDataMenu\u002Fhistory.json` | each scan's item sizes, and each deletion with its paths |\n| `~\u002FLibrary\u002FCaches\u002Flocal.sysdata.menu` | macOS's own cache folder for the app |\n| `~\u002FLibrary\u002FHTTPStorages\u002Flocal.sysdata.menu` | what URLSession keeps for the update check |\n\nThe history file exists so the list can show what changed; it holds no more\nthan the window already shows, it is capped at six months, and turning\n**Remember what changed** off deletes it. Nothing is sent anywhere. The one\nnetwork request the app can make is the daily update check, which is off\nunless you switch it on — and the last two rows above are what making it\ncosts.\n\n[Uninstalling](#uninstall) removes all four.\n\n## Permissions, once\n\nTwo things can prompt, and both can be settled one time:\n\n- **Folder access.** One grant, **Full Disk Access**, in System Settings >\n  Privacy & Security. Until it exists the app leaves every protected place\n  alone — app containers, Desktop, Documents, Downloads, Music, Pictures,\n  Movies — rather than asking about them one at a time, so a first launch is\n  a single banner instead of a queue of dialogs naming each app whose\n  container it touched. The scan still runs and still finds plenty; the\n  banner says it is incomplete. Without the grant, Mail, Safari and Time\n  Machine data stay hidden too. macOS quits the app when the grant is\n  toggled, so reopen it afterwards. The grant\n  is remembered by code-signing identity, which is why `scripts\u002Fbuild-app.sh`\n  signs with your Developer ID or Apple Development certificate when one is\n  in the keychain. An ad-hoc signature changes on every build and macOS would\n  forget the grant each time. Override with `CODESIGN_IDENTITY=\"...\"`.\n- **Administrator password.** Needed for root actions. Batching folds them\n  into one script, so one password covers all of them — except a delete of\n  something you do not own, which is run on its own and asks again; the\n  confirmation says which case you are in rather than promising a single\n  prompt. Avoiding the prompt entirely would require a privileged helper\n  daemon, which is deliberately out of scope for a small tool.\n\n## Scripting\n\n```bash\n\u002FApplications\u002FSysDataMenu.app\u002FContents\u002FMacOS\u002FSysDataMenu --json > inventory.json\njq '.items[] | select(.safety == \"safe\") | [.name, .sizeBytes]' inventory.json\n```\n\nThe output has `freeBytes`, `purgeableBytes`, `totalBytes` and one record per\nitem with `id`, `category`, `name`, `detail`, `sizeBytes`, `safety`,\n`manual`, `path`, `lastModified` and `idleDays`. The last two are absent when\nthe item is not a folder this app measured — a `docker system prune` estimate\nor an APFS snapshot has no age.\n\n```bash\n# everything safe that nothing has touched in six months\njq '.items[] | select(.safety == \"safe\" and .idleDays > 180) | [.name, .sizeBytes]' inventory.json\n```\n\n`sysdata` is a bash script covering the Safe categories only, for machines\nwhere you would rather not run an app:\n\n```bash\n.\u002Fsysdata              # scan\n.\u002Fsysdata clean        # dry run\n.\u002Fsysdata clean --yes  # apply\n```\n\n## How it works\n\n`Sources\u002FSysDataMenu\u002FProbes` holds one `StorageProbe` per category. Each\nprobe measures its locations with a single filesystem enumeration\n(allocated blocks, no symlink traversal, the same numbers Finder uses) and\nreturns `StorageItem`s with a name, a size, a safety level and a\n`ReclaimAction`: remove paths, empty directories, prune by age, run a tool's\nown clean command, or run a script as root through the system authorization\ndialog. Probes never mutate anything; `Reclaimer` is the only place that\ndeletes.\n\nThe catch-all probe receives every path the other probes claimed and reports\nwhatever large folder is left, so the inventory stays complete on machines\nwith software the app has never heard of. Adding a category means adding one\nprobe and registering it in `ProbeRegistry`.\n\nInterface strings live in `Resources\u002FLocalizable.xcstrings`;\n`scripts\u002Fcompile-strings.sh` turns the catalog into the `.lproj` tables\nSwiftPM ships (en, tr, zh-Hans, ja), and a test checks that every key has a\nTurkish translation. `ci.sh` fails if a hand-edited `.lproj` drifts from what\nthe catalog would generate, so the catalog stays the single source of truth.\n\n## Checks\n\n```bash\nscripts\u002Fci.sh                        # build, tests, lint, bundle, strings\nSYSDATA_SCAN_TESTS=1 scripts\u002Fci.sh   # and the tests that walk the whole disk\n```\n\nRun before pushing; the release script runs it too. 92 tests. The\ndisk-walking set is gated because it measures this machine rather than a\nfixture: it scans the real disk, and it downloads the published release and\nputs it to Gatekeeper, which is the only way the updater's redirect handling\ncan be exercised at all.\n\n## Releasing\n\nWrite the version's section in [CHANGELOG.md](CHANGELOG.md) first — the\nrelease script refuses without one, and uses it as the release notes. A list\nof commit subjects says what was touched, not what changed for anyone using\nthe app.\n\n\nOne command bumps `VERSION`, runs the tests, builds a signed and notarized\napp, commits, tags, pushes, publishes the GitHub release with the changelog\nsection as its notes, and updates the Homebrew cask:\n\n```bash\nscripts\u002Frelease.sh          # patch\nscripts\u002Frelease.sh minor\n```\n\nIt expects `gh` to be logged in and a notarytool keychain profile (once:\n`xcrun notarytool store-credentials sysdata --key AuthKey.p8 --key-id ID --issuer ISSUER`).\n\n## Requirements\n\nmacOS 14 or later. Xcode 16 or later to build. Xcode command line tools for\nthe simulator and Xcode categories; other tools are optional and skipped when\nabsent.\n\n## License\n\nProprietary; see [LICENSE](LICENSE). The source is here to be read, not\nreused: you can build and run it yourself, but copying, redistributing or\nforking it for distribution needs written permission. Versions up to v0.3.7\nwere MIT and stay MIT.\n\nMade by [@yigitech](https:\u002F\u002Fx.com\u002Fyigitech).\n","这是一款 macOS 菜单栏工具，用于深入分析并逐项清理系统存储中“System Data”（系统数据）所包含的真实内容。它不自动扫描缓存，而是精准识别开发者常用但被系统归类为“系统数据”的各类冗余项，如 iOS 模拟器运行时、Xcode 符号缓存、包管理器本地仓库、虚拟机磁盘镜像、统一日志及独立应用数据目录等，并支持用户手动选择删除。基于 SwiftUI 开发，支持多语言，具备签名与公证，适用于 macOS 14+ 的开发者或高级用户进行精细化磁盘空间管理。",2,"2026-09-08 02:30:03","CREATED_QUERY"]