Was macht mac-declutter?
Ein erprobtes Handbuch zur Bereinigung eines Entwickler-Macs: KI-Agenten-Wildwuchs, tote Hintergrunddienste, App-Überreste, Proxy-Fallen und Leistungsaudits.
Grundprinzipien:
- Vor dem Löschen inventarisieren. Niemals blind deinstallieren – zuerst Größe, letztes Nutzungsdatum und Ausführungszustand messen, dann den Benutzer wählen lassen.
- Niemals Sitzungsaufzeichnungen oder Benutzerdaten berühren, es sei denn, es wird explizit darum gebeten. Caches regenerieren sich; Sitzungen nicht.
- Nach jeder Mutation verifizieren – Prozess weg, Port geschlossen, Anmeldeobjekt entfernt.
- System Integrity Protection (SIP) ist eine harte Grenze. Root-eigene Apps, Sandbox-Container und DriverKit-Erweiterungen haben jeweils einen sanktionierten Entfernungspfad; kämpfen Sie nicht gegen das Betriebssystem.
Phase 0 – Netzwerk-Triage (zuerst durchführen)
Das Symptom „Alles ist getrennt“ ist fast immer ein toter lokaler Proxy, nicht defekte Apps:
scutil --proxy # Wohin zeigt der System-Proxy?
nc -z -w 2 127.0.0.1 <port> # Hört überhaupt jemand?
lsof -nP -iTCP:<port> -sTCP:LISTEN # Wer ist der Besitzer?
Die klassische Falle: Clash/V2Ray-artige Tools setzen den macOS-System-Proxy auf 127.0.0.1:PORT, dann stirbt der Kern – der Regelmodus spielt keine Rolle, der gesamte Verkehr stirbt an der Tür. Apps, die den System-Proxy beachten (die meisten GUI-Apps, einige CLIs), scheitern alle; curl funktioniert noch, weil es den System-Proxy umgeht, was die Diagnose in die Irre führt. Korrekturen: Starten Sie den Proxy-Kern neu, oder deaktivieren Sie den Proxy (networksetup -setwebproxystate Wi-Fi off + -setsecurewebproxystate + -setsocksfirewallproxystate + WPAD aus), oder setzen Sie die eigene Proxy-Einstellung der App auf nichts. Denken Sie daran: curl ignoriert den System-Proxy – testen Sie die App-ähnliche Konnektivität mit curl -x http://127.0.0.1:PORT.
Phase 1 – Inventarisierung (schreibgeschützt)
Führen Sie scripts/inventory.sh aus oder decken Sie diese Dimensionen manuell ab:
- Agent-Konfigurationsverzeichnisse:
~/.claude,~/.codex,~/.pi,~/.jcode,~/.config/opencode, usw. Für jedes: Größe (du -sh), letzte Aktivität (mtime der neuesten Datei), ob die CLI-Binärdatei noch existiert (which). - Anmelde-/Authentifizierungsstatus:
auth.json,openai-auth.json, Anmeldedatendateien – Schlüssel auflisten, niemals Geheimnisse ausgeben. - Hintergrunddienste:
launchctl list | grep -v com.appleund~/Library/LaunchAgents/*.plist– lesen Sie dieProgramArgumentsjeder plist, um zu erfahren, was tatsächlich ausgeführt wird. - Apps: Sammeln Sie für jede
.app, die nicht von Apple stammt, in/Applicationsund~/Applicationsdie Größe,kMDItemLastUsedDateübermdlsund das Vorhandensein von_MASReceipt(App-Store-Apps). „Nie geöffnet“ + groß = Hauptkandidat. - Caches:
~/Library/Caches,~/.npm, pip/bun-Caches – groß und immer sicher zu leeren.
Präsentieren Sie die Ergebnisse als Tabelle „Behalten/Entfernen“ und lassen Sie den Benutzer wählen. Kennzeichnen Sie kostenpflichtige/Abonnement-Apps (z. B. _MASReceipt, bekannte Abonnementprodukte), sodass der Benutzer die Abrechnung kündigt, bevor er sie löscht.
Phase 2 – Deinstallations-Playbook
Pro Ziel, in dieser Reihenfolge:
- Dienste stoppen:
launchctl remove <label>für jeden zugehörigen LaunchAgent/Daemon. - Plists löschen:
~/Library/LaunchAgents/<label>.plist. - App/CLI löschen:
rm -rfdie.app/npm uninstall -g <pkg>/ die Binärdatei entfernen.Permission denied→ root-eigen (pkg-installiert). Verwenden Sieosascript -e 'do shell script "rm -rf ..." with administrator privileges'(eine GUI-Passwortaufforderung). Niemals blindsudoverwenden.
- Überreste in der Library: Überprüfen und entfernen Sie
~/Library/{Application Support,Caches,Containers,HTTPStorages,Preferences}/<app-or-bundle-id>.- Sandbox-
Containers/*können selbst Root widerstehen (Container-Manager-Schutz). Wenn winzig, lassen Sie sie – das Betriebssystem räumt verwaiste Container auf; SIP zu deaktivieren ist es nie wert.
- Sandbox-
- Systemerweiterungen:
systemextensionsctl list. SIP blockiert die direkte Deinstallation – der einzige saubere Weg ist die Neuinstallation der Hersteller-App und die Ausführung ihres offiziellen Deinstallationsprogramms (suchen Sie nachuninstall.shunter/Library/Application Support/<vendor>/). DriverKit-.dext-Treiber entladen sich erst beim nächsten Neustart – teilen Sie dem Benutzer mit, dass sie nach dem Neustart verschwunden sind. - Veraltete Anmeldeobjekte: Nach dem Löschen einer App bleibt der Eintrag „Beim Anmelden öffnen“ oft als Zombie erhalten. Entfernen Sie ihn mit
osascript -e 'tell application "System Events" to delete login item "<name>"'. - Laufende Überreste: Gelöschte Apps können Prozesse hinterlassen, die aus temporären Update-Verzeichnissen laufen (z. B. Squirrel
ShipIt-Staging).ps aux | grep -i <name>, töten Sie sie und prüfen Sie auf ein Datenverzeichnis in$HOME(~/.<appname>) – von Updatern gestartete Daemons verstecken dort oft hunderte MB.
Phase 3 – Cache-Bereinigung (kein Risiko)
npm cache clean --force
rm -rf ~/Library/Caches/pip ~/.bun/install/cache
rm -rf ~/Library/Caches/<deleted-app>/*
Caches regenerieren sich. Sitzungsverläufe (sessions/, projects/, *.jsonl-Konversationsprotokolle) nicht – lassen Sie sie, es sei denn, der Benutzer sagt explizit etwas anderes.
Phase 4 – Leistungsaudit
memory_pressure | tail -2 # freier % und Druck
sysctl -n vm.swapusage # verwendeter Swap sollte bei einem gesunden Rechner ~0 sein
sysctl -n vm.loadavg
ps -axm -o rss,comm | awk 'NR>1 {rss=$1; $1=""; sub(/^ /,""); a[$0]+=rss} END {for (k in a) printf "%d\t%s\n", a[k]/1024, k}' | sort -rn | head -15
- „Belegter Arbeitsspeicher“ in der Aktivitätsanzeige enthält den Dateicache – beurteilen Sie die Situation anhand der Farbe des Speicherdrucks und des Swaps, nicht anhand der GB-Zahl.
- Nach einer Massenlöschung indiziert Spotlight (
mds_stores,corespotlightd) für einige Stunden neu – vorübergehend, nicht „reparieren“. - Gruppieren Sie den RSS nach App-Familie (Browser und Chat-Apps erzeugen viele Helfer); melden Sie Summen pro Familie, nicht prozessbezogenes Rauschen.
- Optimieren Sie nicht, was kein Problem ist: Auf einem Rechner mit null Swap und grünem Druck ist der Tausch eines täglich genutzten Tools (z. B. einer intelligenten Eingabemethode) gegen ein paar hundert MB ein schlechter Tausch – sagen Sie es.
Phase 5 – Abschließende Verifikation
- Gelöschte Labels fehlen in
launchctl list; Plists sind weg; keine Prozesse, die gelöschten Namen entsprechen (außer von Neustart ausstehenden Treibern). - Der lauschende Proxy-Port stimmt mit
scutil --proxyüberein; wichtige API-Endpunkte sind erreichbar (401= erreichbar, aber Authentifizierung erforderlich – das ist ein Bestehen). - Jeder überlebende Agent-CLI besteht einen echten End-to-End-Test (eine einzeilige Eingabeaufforderung senden, eine Antwort erwarten).
df -h /vorher/nachher für den Punktestand.