Skip to content

Privacy and safety

Guilherme Selig edited this page Oct 24, 2026 · 2 revisions

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.

What SDTally never does

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

What SDTally will never recommend

  • Touching /System, or /Library outside 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.

What data SDTally keeps

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.

Sharing results

  • 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 --stdin returns, and the PDF is built from that redacted JSON. With it off, the JSON is the raw sdtally output and the app warns you it contains your user name and home folder names. The PDF has no author field.
  • CLI: add --redact names to any measurement JSON command, or redact a saved file with sdtally --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.

AI agents

  • --last, --history, --mcp and --verify refuse 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.
  • sdtally does not use the network, but your AI client does. Whatever it reads goes to the AI provider.

Permissions SDTally asks for

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

Design requirements

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

Clone this wiki locally