Repository navigation
Privacy and safety
SDTally looks at everything on your disk, so it holds itself to strict rules. This page lists them and how each is enforced.
| Never | Enforced by |
|---|---|
| Deletes, moves to Trash, or modifies your files |
tests/nunca_apaga.rs fails the build if production Rust or Swift code (including the helper) contains a delete, trash or remove-attribute API or command. The only allowed cases are listed with an exact count and only touch SDTally's own files: old saved measurements and the helper's temporary copy of sdtally
|
| Uses the network | The CI grep job fails on URLSession, NWConnection, NWListener, socket( in the app or TcpStream, UdpSocket in the Rust code. The app never checks for updates; See New Versions only opens the Releases page in your browser |
| Downloads cloud-only files |
sdtally disables materialization of dataless files for its own process before reading anything, and aborts if it cannot |
| Writes metadata while reading | Access-time updates are disabled for the process the same way |
| Reads file contents to measure | Sizes come from file system attributes, APFS counters and system tools. The root helper reads sizes, never contents |
| Guesses a number | Every number has a source; what is not measured is null with a reason, never 0
|
| Runs a recommended command | Commands come from a fixed list and are only offered as text to copy. AI tool descriptions say never to run one without explicit user confirmation |
| Uses alarming language | The G9 check (scripts/g9.sh, tests, CI) bans scareware words, red colors and badges outside narrow exceptions, and toggles in the recommendations screen |
- Touching
/System, or/Libraryoutside an explicit list. - Disabling System Integrity Protection.
- Deleting Time Machine local snapshots other than through Apple's
tmutil. - Deleting real user data that looks like a cache, such as iCloud Drive (
~/Library/Mobile Documents), cloud storage folders, or messaging apps' media.
Where a recommendation involves removal, it points to Finder, the owning app, or System Settings, and explains what is lost and whether macOS cleans it on its own.
The CLI writes nothing to disk.
The app keeps its data in ~/Library/Application Support/SDTally, on your Mac only:
| File | Content | Retention |
|---|---|---|
Medicoes/*.json |
Raw output of each full measurement, including real folder paths | 100 files or 50 MB |
pontos.jsonl |
Hourly totals: used, free, purgeable, System Data | 400 days |
pastas.jsonl |
Hourly samples of the largest folders | 90 days |
auto.json |
The last Automatic result | Overwritten |
This data is not redacted: it contains your user name and folder names, like Finder would show. Nothing is sent anywhere.
-
Export JSON / Export PDF (File menu): the save dialog has Replace Personal Names (Recommended for Sharing), on by default. With it on, the JSON is what
sdtally --redact names --stdinreturns, and the PDF is built from that redacted JSON. With it off, the JSON is the rawsdtallyoutput and the app warns you it contains your user name and home folder names. The PDF has no author field. -
CLI: add
--redact namesto any measurement JSON command, or redact a saved file withsdtally --redact names --stdin < file.json.
Redaction replaces the user name and personal folder names. Known folders (such as ~/Library/Caches) and app identifiers stay visible. Numbers are not changed and rows are not merged. Always review before posting.
-
--last,--history,--mcpand--verifyrefuse to run as root, and the AI path never measures as administrator. It reads what the app already saved, or the quick reading. - Over MCP, redaction is on by default.
- Strings that come from disk (
path,name,process,creator,reason,error) are marked as data, never instructions. Control, bidirectional and invisible characters are escaped and long strings are cut at 256 characters, so a crafted file name cannot smuggle hidden text to an agent. -
sdtallydoes not use the network, but your AI client does. Whatever it reads goes to the AI provider.
| Permission | Why | Optional |
|---|---|---|
| Full Disk Access | Read folders macOS protects even from administrators | No: without it the app shows only the steps to grant it (the CLI works without it, with an incomplete measurement) |
| Administrator password | Run one full measurement as root | Yes |
| Passwordless Root | Measure as root without a password | Yes. See Passwordless Root helper |
| Notifications | Warn about fast disk growth or low free space | Yes |
| Login Items | Open at Login; approve Passwordless Root | Yes |
Each comes from a real mistake observed in the audit that started the project.
| # | Requirement | Mistake it prevents |
|---|---|---|
| 1 | Measure allocated blocks (stat %b), never apparent size (%z) |
Reporting 100 GiB for a sparse disk that occupies 2.5 GiB |
| 2 | Detect dataless files (cloud placeholders) | Reporting 77 GiB of stubs that occupy 0 |
| 3 | Check for active sync before calling a cache disposable | Corrupting a chat backup that is uploading to iCloud |
| 4 | Scan dotfiles in the home folder | Missing ~/.ollama, ~/.npm, ~/.colima
|
| 5 | Explain each item in plain language | "19 GiB in redhat.java" is not actionable |
| 6 | Deduplicate by (device, inode)
|
Firmlinks make /Applications count twice |
| 7 | Treat Preferences over 100 MB as an anomaly |
Ignoring 4.5 GiB of assets in a folder meant for .plist files |
| 8 | Recognize orphaned trash folders (CloudStorage/*/.Trash) |
Ignoring gigabytes already discarded that still occupy disk |
| 9 | Defer to the owning app (Music, Photos, Mail) | Corrupting a library by deleting files underneath it |
| 10 | Count once per group of APFS clones | Promising space that will not be freed |
Getting started
Understanding
Reference
Trust
Development