PrimoDev/ apps

Grau (G°)Work in progress

Free, open-source storage cleaner and disk inspector for the Mac

  • macOS
  • Free
  • Open source · MIT
View on GitHub

What is Grau (G°)?

Grau is a free, open-source, native macOS utility for cleaning, inspecting and managing your Mac's storage. It brings together a junk cleaner, an app uninstaller, a disk map, a duplicates finder and a developer mode, and moves everything to the Trash instead of deleting it.

It is free and open source (MIT license) and the code is at version 1.7.0. For now there is no DMG on GitHub Releases and no cask in official Homebrew, so to use it today you build it from source with Xcode 15 and xcodegen.

What it does

  1. 01Junk cleaner: caches, logs, browser data, dev caches and iOS backups
  2. 02Uninstaller that removes the app and its leftovers, like caches, preferences and support files
  3. 03Disk Lens: Top-N list or treemap to see what is using space
  4. 04Finds byte-identical duplicate files with SHA-256, cancellable mid-scan
  5. 05Dev mode: node_modules, package manager caches, Docker, Simulators and Xcode DerivedData
  6. 06Everything goes to the Trash with a manifest, and you can restore a whole batch in one click
  7. 07Auto-clean rules and configurable retention windows
  8. 08In-app notification history

FAQ

Is Grau free?
Yes. It is free and open source under the MIT license, meant as an alternative to CleanMyMac without a subscription.
Which macOS version does it need?
macOS 14 Sonoma or later, on Apple Silicon or Intel.
How do I install it?
There is no ready-made build to download today: GitHub Releases have no DMG and the Homebrew cask mentioned in the README is not in official Homebrew yet. To use it, clone the repo, run xcodegen generate and build the project in Xcode 15 or later.
What permissions does it need?
Full Disk Access, in System Settings > Privacy & Security > Full Disk Access. It uses it to read system caches and logs. Per the README, it makes no third-party network calls in v1.
Does it delete my files?
Not directly. Everything it cleans goes to ~/.Trash with a JSON manifest, and the app's Trash view lets you restore the whole batch. Every destructive action asks for confirmation first.
How is it different from what macOS already has?
macOS has the Storage pane in System Settings with basic recommendations. Grau goes further with per-category cleaning, uninstalling with leftovers, a disk map, a duplicates finder and a mode for development caches.

Documentation

README from the lucianodiisouza/grau repository, refreshed on every deploy.

A free, open-source, native macOS utility for cleaning, inspecting, and managing your Mac's storage. CleanMyMac for people who'd rather not pay $40/year.

Status: ✅ v1.7.0 (stable). All five features functional. Self-update via Sparkle with delta updates. Homebrew Cask formula shipped. Per-file parallel hashing in the duplicates scanner. Disk Lens has a treemap view. Duplicates scan is cancellable. Trash view has filters. In-app Notification Center. Dashboard reads real data and shows recent scans. New in 1.7: Configurable retention windows, user-defined auto-clean rules, per-rule notification cooldowns.

Grau icon

Features

  • 🧹 Junk cleaner — caches, logs, browser data, dev caches, iOS backups. Five categories with safe defaults; everything moves to ~/.Trash, never deleted.
  • 📦 App uninstaller — uninstalls .app bundles and their residual data (caches, preferences, app support, group containers).
  • 🔍 Disk lens — visualize your disk as a Top-N list or a squarified treemap. Drill down to see what's eating space.
  • 🪞 Duplicates finder — find byte-identical files anywhere. 3-phase pipeline (size → partial hash → full SHA-256). Cancellable mid-scan. Defaults to keeping the oldest copy.
  • 🛠 Dev mode — track node_modules, 16 package manager caches, Docker, iOS Simulators, Xcode DerivedData, and archives. Hidden behind a Settings toggle.
  • ↩️ Trash restore — every clean writes a JSON manifest. The in-app Trash view shows past operations and lets you restore a whole batch in one click.
  • 🔔 Notification Center — every alert Grau fires is also persisted to ~/.grau/notification-log.json. The in-app Notifications view shows the full history with per-rule cooldown status.
  • 🧹 Retention windows — configure how long Grau keeps notification log entries, trash manifests, and scan history. Defaults: 90d / 30d / forever. New in 1.7.
  • ⚙️ Auto-clean rules — user-defined "if X then Y" automations. Four condition kinds (trash size, junk size, disk usage, time of day) and three action kinds. New in 1.7.
  • ⏱ Per-rule notification cooldowns — each alert rule can be configured with a custom minimum gap between fires (no cooldown / 1h / 6h / 12h / 1d / 3d / 1w). New in 1.7.
  • 📦 Sparkle delta updates — patch releases download a small diff, not the full DMG. New in 1.7.

First principles

  1. The user owns their data. Grau never silently deletes anything. Everything goes to ~/.Trash, with a JSON manifest in ~/.grau/trash-manifests/.
  2. Be a good citizen. Reads what it needs, asks for Full Disk Access once, never exfiltrates. No third-party network calls in v1.
  3. Look and feel native. Sidebar, system materials, SF Symbols, smart dark mode, dynamic type.
  4. Be fast. Scans in seconds, not minutes. Six Dev-mode inspectors run in parallel.
  5. No surprise writes. Every destructive action is preceded by a confirmation; every confirmable category is classified safe or userCaution.

Install

# Homebrew (recommended)
brew install --cask grau

# Or: download the latest DMG from the Releases page and
# drag Grau.app to /Applications.

After install, launch Grau and grant Full Disk Access (System Settings → Privacy & Security → Full Disk Access). Grau uses this to read System Caches and Logs.

Updates are delivered automatically via Sparkle. Use the Grau → Check for Updates… menu item to check on demand.

Build

Native Swift + SwiftUI. macOS 14+ (Sonoma) and up. Apple Silicon and Intel. One third-party runtime dep in v1.1: Sparkle for self-update.

# Prereqs: Xcode 15+, Swift 5.9+, xcodegen
brew install xcodegen

# Clone
git clone https://github.com/lucianodiisouza/grau
cd grau

# Generate the Xcode project
xcodegen generate

# Run the graucore unit tests (177 tests)
cd graucore && swift test

# Build the macOS app
xcodebuild -project grau.xcodeproj -scheme grau -configuration Debug build

Package a release DMG

./scripts/make-dmg.sh 1.0.0
# → dist/Grau-1.0.0.dmg

# Optional: notarize for Gatekeeper
./scripts/notarize.sh dist/Grau-1.0.0.dmg \
    --team-id <TEAM_ID> \
    --keychain-profile <KEYCHAIN_PROFILE>

Project layout

grau/
├── grau/                       # App target (SwiftUI + AppKit)
│   ├── DesignSystem/           # Colors, spacing, 7 components
│   ├── Features/               # Dashboard, Clean, Uninstaller, DiskLens,
│   │                           # Duplicates, DevMode, Onboarding, Settings
│   ├── grauApp.swift           # @main
│   └── grau.entitlements
├── graucore/                   # Swift Package — pure logic, unit-testable
│   ├── Sources/graucore/       # 41 modules across 9 domains
│   └── Tests/graucoreTests/    # 155 tests
├── docs/                       # The full plan, architecture, design
├── scripts/                    # DMG + notarize helpers
├── .github/workflows/          # CI
├── project.yml                 # XcodeGen config
├── CHANGELOG.md
└── LICENSE                     # MIT

Documentation

Contributing

Issues and PRs welcome. See CONTRIBUTING.md.

License

MIT.