Případová studie · Vlastní macOS produkt

DiskForge — vývojářský čistič disku pro Mac

Nativní analyzátor a čistič disku napsaný přímo pro vývojáře. Najde, co běžné nástroje neumí — Xcode Derived Data, Docker images, iOS simulátory, LLM modely, application containers — a nabídne bezpečné uvolnění místa. SwiftUI s plně asynchronním scanningem.

macOS 14+ SwiftUI Swift Concurrency async/await Actors 11 kategorií Sandbox
DiskForge — ikona aplikace
Klient
Vlastní produkt Reactive Studia
Platforma
macOS 14 (Sonoma) a novější
Cílová skupina
Vývojáři, designéři, pokročilí uživatelé
Architektura
SwiftUI + Swift Concurrency (actors, async/await)
Mazání
Bezpečně do Koše (FileManager.trashItem)
Dependencies
Pouze Apple frameworky

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
  • UINavigationSplitView 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.

Hledáte vývojáře pro nativní macOS produkt?

Stavíme nativní macOS aplikace v moderním Swiftu — Swift Concurrency, SwiftUI, actors. Postaráme se o sandbox, App Store, notarizaci i přímou distribuci.