Skip to content

ADR-014 — Mac Audit: Current State and Cleanup Opportunities

Date: 2026-04-16 Context: Full scan of installed apps, brew packages, shell config, SSH, LaunchAgents, and disk usage. Goal: identify what's dead weight, what's misconfigured, and what others do better.


1. Brew: Deprecated and Orphaned Packages

Deprecated (brew doctor flagged these)

Package Problem Action
[email protected] Deprecated, EOL. Nothing depends on it. brew uninstall [email protected]
icu4c@76 Deprecated. Only node depends on it. Will go away when node upgrades
icu4c@77 Deprecated. boost, mkvtoolnix, qt depend on it. Will resolve on next brew upgrade
aegisub (cask) Deprecated cask, project is dead. Uninstall if not actively using

Orphaned leaf packages (manually installed, questionable)

Package What it is Verdict
automake Build tool. Were you compiling something? Probably a one-time dep. Safe to remove unless you build C/C++
coreutils GNU coreutils (gls, gdate, etc.) Keep — useful for scripts that need GNU behavior
kompose Converts docker-compose to Kubernetes manifests Remove unless you're planning k8s migration
libksba Crypto library. Nothing depends on it. brew uninstall libksba
librsvg SVG rendering library. Leaf with no dependents. Probably pulled in by something you uninstalled. Safe to remove
libtool Build tool Same as automake — one-time build dep
media-info Media file metadata CLI Keep if you use it for media management
mkvtoolnix MKV video container tools Keep if you remux video
[email protected] See above Remove
pkgconf pkg-config replacement. Nothing depends on it. brew uninstall pkgconf
pwgen Password generator Keep — useful for homelab
sshpass Non-interactive SSH password auth Keep — Ansible uses it for password-based SSH
testdisk Data recovery tool Keep — useful for emergencies, small footprint
wget HTTP downloader Keep (or replace with curl which is built-in, but wget syntax is convenient)
zlib Compression library. Nothing depends on it. brew uninstall zlib

Quick cleanup command

brew uninstall [email protected] libksba pkgconf zlib
# Then review:
brew autoremove  # removes orphaned dependencies
brew cleanup     # removes old versions and cache

44 packages are outdated

Run brew upgrade — you have 44 outdated packages including ansible, git, node, terraform, and netbird. This is a lot of drift.


2. Applications: 87 Apps, Only 13 Managed by Brew

You have 87 apps in /Applications/ but only 13 brew casks. That means 74 apps were installed manually (drag-to-Applications, Mac App Store, or direct download). This is the biggest gap in reproducibility.

Apps that should be brew casks (easy wins)

These are in /Applications/ but not managed by brew. Adding them to brew makes them reproducible:

App Brew cask name Notes
Arc arc Browser
Bitwarden bitwarden Password manager
BetterDisplay betterdisplay Display management
Betterbird betterbird Thunderbird fork
Discord Already a cask OK
Dropbox dropbox Cloud sync
Firefox firefox Browser
Google Chrome google-chrome Browser
IINA iina Media player
Jellyfin jellyfin-media-player Media client
Joplin joplin Note-taking
LibreOffice libreoffice Office suite
Obsidian obsidian Notes
Proton Mail proton-mail Email
Proton Mail Bridge proton-mail-bridge IMAP bridge
qBittorrent qbittorrent Torrent client
RustDesk rustdesk Remote desktop
Spark spark Email client
Steam steam Gaming
Termius termius SSH client
Thunderbird thunderbird Email
WhatsApp whatsapp Messaging
WireGuard wireguard-tools Already a formula, cask also available
balenaEtcher balenaetcher USB flashing
Spacedrive spacedrive File manager

Apps that look abandoned or redundant

App Concern
Criptext Email service shut down in 2023. Dead app. Delete.
Omnivore Read-it-later service shut down Jan 2025 (acquired by ElevenLabs). You have Karakeep now. Delete.
Pocket / Pocket Sync You use Karakeep for bookmarks. Redundant. Delete unless actively using.
Raindrop.io / Save to Raindrop.io Another bookmark manager. Redundant with Karakeep. Delete?
Folx Download manager — when was the last time you used this?
MacDroid Android file transfer — Android File Transfer also installed. Pick one.
Android File Transfer Google's own tool, buggy and abandoned. MacDroid is better if you need it.
Habbo Launcher The hotel game?
DittoDex Pokemon app?
Pale Moon / Waterfox You have Arc, Firefox, Chrome, Safari. Five browsers is a lot.
Paperparrot What is this for? Might be unused.
Duplicate File Finder One-time-use tool. Keep only if actively deduplicating.
Disk Drill Data recovery. Testdisk does the same thing (CLI). Redundant?
Listy Spotlight replacement? Questionable value.
QSpace File manager. You have ForkLift and Commander One already. Three file managers?
Push to Kindle Niche. Keep if used.
Google Docs/Sheets/Slides PWA wrappers — just use the browser. These are unnecessary apps.
Tuta Mail Another email client. You have Proton Mail + Bridge + Betterbird/Thunderbird. How many email apps?
Things3 Todo app. Are you using it or Obsidian/Drafts for tasks?
Fantastical Calendar. Are you using this or Apple Calendar?

Email clients — you have 5

  1. Proton Mail (desktop app)
  2. Proton Mail Bridge + Betterbird
  3. Thunderbird
  4. Spark
  5. Tuta Mail

Pick one or two. Most people use Bridge + one desktop client (Betterbird or Thunderbird, not both).

Browsers — you have 5

  1. Arc
  2. Firefox
  3. Google Chrome
  4. Pale Moon
  5. Waterfox (+ Safari)

Unless you're testing web compatibility, 2-3 is plenty.

File managers — you have 3

  1. Commander One (brew cask)
  2. ForkLift (brew cask)
  3. QSpace

Pick one. ForkLift is generally the best macOS file manager.


3. Shell Config: Nearly Empty

.zshrc (current)

# Add RVM to PATH for scripting. Make sure this is the last PATH variable change.
export PATH="$PATH:$HOME/.rvm/bin"
export PATH="/opt/homebrew/opt/ruby/bin:$PATH"

Problems: - RVM PATH is loaded but RVM has zero rubies installed (~/.rvm/rubies/ is empty). This is dead weight. - No prompt customization - No aliases - No completion - No history configuration - No tool integrations (fzf, zoxide, etc.) - ~/bin/ is not in PATH (your scripts exist but can't be called without ./ or full path)

.bashrc (current)

# Add RVM to PATH for scripting. Make sure this is the last PATH variable change.
export PATH="$PATH:$HOME/.rvm/bin"

Same problem — RVM reference to nothing. This file is irrelevant since you use zsh.

.zprofile (current)

eval "$(/opt/homebrew/bin/brew shellenv)"

This is correct. Homebrew init belongs in .zprofile.

.gitconfig (current)

[user]
    name = miltongz
    email = [email protected]

Missing (what others configure): - core.editor — defaults to vim, set to your preference - init.defaultBranch = main - pull.rebase = true (or false, but set it explicitly to avoid the warning) - push.autoSetupRemote = true — auto-tracks remote branches - credential.helpernot set! You're probably getting prompted for passwords - diff.colorMoved = default — highlights moved lines differently - Git aliases (optional but common: st, co, br, lg) - Forgejo remote config (insteadOf for URL shortcuts)

Suggested .gitconfig

[user]
    name = miltongz
    email = [email protected]

[init]
    defaultBranch = main

[pull]
    rebase = true

[push]
    autoSetupRemote = true

[core]
    editor = code --wait

[diff]
    colorMoved = default

[credential "https://git.eva-00.network"]
    helper = store

[url "[email protected]:"]
    insteadOf = forgejo:

The insteadOf lets you clone with: git clone forgejo:holo/chizuru-v2


4. SSH Config: Minimal

Current

Host *
  AddKeysToAgent yes
  UseKeyChain yes
  IdentityFile ~/.ssh/id_ed25519_github

Host code.eva-00.network
  HostName code.eva-00.network
  User git
  IdentityFile ~/.ssh/id_ed25519_forgejo

Problems

  • No homelab host aliases. You type ssh [email protected] every time instead of ssh chizuru.
  • No ServerAliveInterval. SSH sessions to homelab drop after idle timeout.
  • Default key for everything. The GitHub key is sent to every host (wildcard IdentityFile). Not a security risk per se, but messy.
  • 4 SSH keys but only 2 configured:
  • id_ed25519_github — configured (wildcard)
  • id_ed25519_forgejo — configured
  • id_ed25519_cajitanot in config (only used in backup script via -i flag)
  • homelab_claudenot in config (Claude's key, loaded in agent)
  • 110 entries in known_hosts — probably full of stale LXC entries from recreated containers. Consider trimming.

5. RVM: Dead Installation

RVM is installed (~/.rvm/ exists, function is loaded via shell init) but: - Zero rubies installed (~/.rvm/rubies/ is empty) - Brew Ruby 3.4.2 is what's actually used (/opt/homebrew/opt/ruby/bin/ruby) - Both .zshrc and .bashrc add RVM to PATH for nothing

Action: Remove RVM entirely.

rvm implode                    # removes ~/.rvm
# Then remove these lines from .zshrc and .bashrc:
# export PATH="$PATH:$HOME/.rvm/bin"


6. Joplin: Abandoned Config

~/.config/joplin-desktop/ exists with a 23MB SQLite database, last modified March 2024 (over 2 years ago). You use Obsidian now. The Joplin app is also installed.

Action: If you've migrated everything to Obsidian, delete the config and app:

rm -rf ~/.config/joplin-desktop/
# And remove Joplin.app from /Applications


7. Dropbox: Still Active?

Dropbox is running with LaunchAgents (com.dropbox.DropboxUpdater.wake.plist, etc.) and has data in ~/Dropbox/ (emulator saves, a screenshot). Google Drive is also mounted (~/Library/CloudStorage/[email protected]).

Question: Are you actively using Dropbox and Google Drive, or are these leftover from before your homelab storage setup? You now have Filebrowser, NFS/SMB mounts, and restic backups.


8. LaunchAgents

Agent Status Notes
com.holo.backup-to-cajita Loaded, exit 127 Failing silently. Exit 127 = command not found. Likely restic not in PATH when launchd runs it (launchd doesn't source .zprofile).
com.homelab.mount-nfs-wake Loaded, exit 0 Working
com.homelab.mount-smb-wake Not loaded Not running. Needs launchctl load or check if it errors on load
Proton Mail Bridge Loaded OK
com.dropbox.* (3 agents) Loaded See Dropbox question above
com.valvesoftware.steamclean Loaded Steam cleanup agent. Fine.

backup-to-cajita exit 127 fix

The plist calls /Users/gabriel/bin/backup-to-cajita.sh which uses restic, but launchd doesn't have Homebrew in its PATH. Fix by using the full path in the script:

# In backup-to-cajita.sh, change:
#   restic backup ...
# To:
#   /opt/homebrew/bin/restic backup ...

Or add a PATH export at the top of the script:

export PATH="/opt/homebrew/bin:$PATH"


9. Disk Usage: 701GB / 926GB Used (80%)

Location Size Notes
~/Pictures 173GB Largest. Photos? Screenshots? Check if this overlaps with Immich.
~/Library 147GB App caches, mail, etc. brew cleanup + clear caches can help.
~/Downloads 73GB Probably old downloads never cleaned up.
~/Documents 67GB Check for large files that should be on NAS.
~/Desktop 1.2GB Fine
~/git 728MB Fine

Quick wins:

# See what's eating ~/Library
du -sh ~/Library/Caches ~/Library/Application\ Support ~/Library/Mail ~/Library/Containers 2>/dev/null | sort -hr

# Clear brew cache
brew cleanup --prune=all

# Check ~/Downloads for old large files
find ~/Downloads -size +100M -mtime +90 -exec ls -lh {} \;

At 80% disk usage, you should consider offloading ~/Pictures to Immich or NAS if not already mirrored.


10. compare_old_unohana.sh

This script compares old storage migration data between unohana and dlbox mounts. The storage migration completed on 2026-04-05. If the comparison showed everything matched, this script is done — delete it.


Summary: Priority Actions

High priority (fix broken things)

  1. Fix backup-to-cajita LaunchAgent (exit 127 — add PATH)
  2. Load mount-smb-wake LaunchAgent (not running)
  3. Run brew upgrade (44 outdated packages)

Medium priority (cleanup dead weight)

  1. Remove RVM (rvm implode, clean .zshrc/.bashrc)
  2. Uninstall deprecated brew packages: [email protected], libksba, pkgconf, zlib
  3. Run brew autoremove && brew cleanup
  4. Delete dead apps: Criptext, Omnivore, Google Docs/Sheets/Slides
  5. Delete Joplin config if fully migrated to Obsidian
  6. Delete compare_old_unohana.sh if migration verified

Lower priority (improve setup)

  1. Decide on email clients (pick 2 from 5)
  2. Decide on browsers (pick 2-3 from 5)
  3. Decide on file managers (pick 1 from 3)
  4. Move manually-installed apps to brew casks (25 candidates listed above)
  5. Expand .gitconfig (credential helper, default branch, rebase, etc.)
  6. Expand .ssh/config with homelab aliases
  7. Investigate ~/Pictures 173GB — offload to Immich/NAS?
  8. Clean ~/Downloads (73GB, likely stale files)