Proč další čistič disku?
Trh je plný „Mac cleanerů" — CleanMyMac, MacKeeper a další. Většina z nich má dva
problémy: jsou drahé (50–100 USD ročně), jsou navržené pro běžné uživatele a často
klamou — slibují gigabyty zázračně získaného místa, které ve skutečnosti odstraňují
cache prohlížeče, jež se za hodinu vrátí. Pro vývojáře to nejsou dobré
nástroje, protože nevědí, kde se vývojářům data hromadí.
DiskForge cílí jinam. Skenuje 11 kategorií, které vývojářům reálně berou stovky GB:
- Xcode Derived Data — build artefakty po každém buildu, často 50–200 GB
- Xcode Archivy — archivy aplikací, které jste nikdy nesubmitli
- iOS Simulátory — runtime simulátorů iOS, které už nepoužíváte
- iOS Zálohy — backup zařízení skrytý v
~/Library/Application Support/MobileSync
- Docker — images, kontejnery a volumes (typicky desítky GB)
- LLM modely — Ollama, HuggingFace cache, LM Studio (GGUF, safetensors často 4–70 GB každý)
- Application Containers — datová úložiště sandboxovaných aplikací
- Cache, logy a Koš — klasická bezpečná kategorie
- Domovský adresář — vše ostatní v
~/ seřazené podle velikosti
Klíčová UX rozhodnutí
Bezpečnostní indikátor
Každá kategorie má jasný štítek: Bezpečné (cache, logy, koš),
Pozor (Derived Data — způsobí pomalý další build), nebo
Rizikové (iOS zálohy — ztráta dat z telefonu, pokud nemáte
cloud zálohu). Žádný čistič nemá nikdy dovolit „one-click clean all" bez
jasného varování.
Předvolby skenu
Tři rychlé profily: Rychlé čištění (jen bezpečné kategorie),
Vývojář (8 vývojářských kategorií), Plný sken
(všech 11). Plus Vlastní pro detailní výběr.
Mazání do Koše
DiskForge nikdy nemaže permanentně. Vše jde do Koše přes
FileManager.trashItem(at:resultingItemURL:). Uživatel může do
7 dnů vše vrátit. Pokud něco zlomí, je to reverzibilní.
Reveal in Finder
U každé položky jeden klik otevře Finder s vybraným souborem nebo složkou.
Klíčové pro „počkat, co to přesně je" před smazáním. Skutečné nástroje
pro pokročilé uživatele tohle musí mít.
Architektura a Swift Concurrency
DiskForge je showcase moderního Swiftu — kompletně postavený na
async/await a actors, bez Combine, bez completion handlerů.
Skenování je skutečně paralelní; cancelace funguje napříč všemi vlákny okamžitě.
Klíčové komponenty
DiskScanner — actor, který drží sken state a vystavuje async API scan(category:). Vnitřní implementace pouští paralelní task per kategorie přes TaskGroup
CleanupManager — actor zodpovědný za mazání do Koše. Vrací CleanupResult s počty smazaných souborů, velikostí, a chybami pro každou položku
ScanProgress — observable struct s aktuálním souborem, procenty, ETA
DiskCategory — enum s 11 kategoriemi, každá má vlastní scanPath, safetyLevel, icon, localizedName
- UI —
NavigationSplitView shell, Charts framework pro donut chart kategorií
Klíčové technické výzvy
1. Skenování stovek tisíc souborů bez zamrznutí UI
Plný sken domovského adresáře projde stovky tisíc souborů. Naivní implementace
zamrzne UI nebo vyplýtvá paměť. Klíče:
- FileManager.enumerator s
resourceKeys: [.fileSizeKey, .totalFileAllocatedSizeKey] a options: [.skipsHiddenFiles, .skipsPackageDescendants]
- Streamovací zpracování — výsledky se postupně publikují do
AsyncStream, UI se aktualizuje přes @MainActor hop
- Throttling progress updatů — UI dostává update max 30× za vteřinu, ne na každý soubor
- Cancellation token — actor sleduje
Task.checkCancellation() v každé iteraci enumerace
2. Práce mimo sandbox
Pro skutečně užitečný sken DiskForge potřebuje číst ~/Library/Developer/,
Docker storage v ~/Library/Containers/, iOS zálohy v
~/Library/Application Support/MobileSync/ — což jsou cesty mimo App
Sandbox výchozí oblasti. Řešení: User Selected File entitlement
+ onboarding, který uživatele provede grant access dialogem pro každou hlavní
kategorii. Bookmark URL ukládáme do user defaults (security-scoped), aby se
nemusel grant opakovat.
3. LLM modely — detekce neviditelných úložišť
Ollama ukládá modely do ~/.ollama/models/, HuggingFace do
~/.cache/huggingface/, LM Studio do
~/.cache/lm-studio/. Tyto cesty nikdo standardně nezná, ale 70B model
zabere 40 GB. DiskForge je má ve své knihovně cest a označuje je jako
LLM Modely kategorii. Pro pokročilé uživatele přidáváme detekci
podle file size threshold + extension matching (.gguf, .safetensors, .bin).
4. Donut chart bez Charts framework legacy bugů
Apple Charts framework (iOS 16+ / macOS 13+) je elegantní, ale donut chart s 11
kategoriemi má interaktivní hover, který v některých macOS verzích blbne. Vlastní
Path a Canvas implementace zajistí konzistentní render
napříč všemi podporovanými systémy.
Distribuce a release pipeline
DiskForge se distribuuje přes přímý web (Developer ID + notarizace + Sparkle) i Mac
App Store. Stejně jako u FocusForge — stejná codebase, dvě build configurations.
App Store verze má omezené entitlements (App Sandbox bez exception entitlements,
kde to jde) a chybí jí přímý přístup k Docker storage. Pro „pro" experience
doporučujeme web verzi.
Co si z projektu odnášíme
DiskForge byl pro nás projekt, kde jsme všechno modernizovali —
čistý Swift Concurrency místo Combine, NavigationSplitView místo NavigationView,
Charts místo custom drawing, async iteration místo block-based enumerace. Přístup,
který přebíráme do nových macOS projektů. Pro starší codebases (které musí
podporovat macOS 12 a starší) zůstáváme u Combine + GCD, protože actor isolation
tam nefunguje.