https://github.com/dev-jonghoonpark/who-ate-my-space
macOS disk-usage visualizer β a native SwiftUI treemap app inspired by SpaceSniffer
https://github.com/dev-jonghoonpark/who-ate-my-space
disk-usage macos space-analyzer swiftui treemap
Last synced: 30 days ago
JSON representation
macOS disk-usage visualizer β a native SwiftUI treemap app inspired by SpaceSniffer
- Host: GitHub
- URL: https://github.com/dev-jonghoonpark/who-ate-my-space
- Owner: dev-jonghoonpark
- License: mit
- Created: 2026-06-21T18:49:38.000Z (about 1 month ago)
- Default Branch: main
- Last Pushed: 2026-06-21T19:22:26.000Z (about 1 month ago)
- Last Synced: 2026-06-21T21:13:23.080Z (about 1 month ago)
- Topics: disk-usage, macos, space-analyzer, swiftui, treemap
- Language: Swift
- Size: 1.17 MB
- Stars: 0
- Watchers: 0
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.ko.md
- License: LICENSE
Awesome Lists containing this project
README
# Who Ate My Space
> π¬π§ For English, see [README.md](README.md).
macOSμ© λμ€ν¬ μ¬μ©λ μκ°ν λꡬ β Windowsμ [SpaceSniffer](https://www.uderzo.it/main_products/space_sniffer/)μμ μκ°μ λ°μ λ€μ΄ν°λΈ SwiftUI μ±.
ν΄λλ λ³Όλ₯¨μ μ€μΊν΄ νμΌ/ν΄λλ₯Ό **μ©λμ λΉλ‘νλ νΈλ¦¬λ§΅(treemap)** μΌλ‘ 보μ¬μ€λλ€. 무μμ΄ λμ€ν¬λ₯Ό μ‘μλ¨Ήλμ§ νλμ νμΈνκ³ , λ°λ‘ ν΄μ§ν΅μΌλ‘ μ 리ν μ μμ΅λλ€.

> 루νΈ(`/`)λ₯Ό μ€μΊν λͺ¨μ΅. ν΄λ ν€λμ μ΄λ¦Β·μ©λμ΄ νμλκ³ , νμΌμ νμ
λ³ μμμΌλ‘ μ±μμ§λλ€.
> (μ: μ΄λ‘ = μ΄λ―Έμ§ `Docker.raw`, μν = λμ€ν¬ μ΄λ―Έμ§ `rootfs.img`)
## μ£Όμ κΈ°λ₯ (v1)
- ν΄λ/λ³Όλ₯¨ λ³λ ¬ μ¬κ· μ€μΊ (λμ€ν¬ ν λΉ μ©λ κΈ°μ€, `du`μ μ μ¬)
- Squarified νΈλ¦¬λ§΅ λ λλ§ (SwiftUI Canvas)
- νμΌ νμ
λ³ μμ + λ²λ‘
- λ λ¨κ³ νμ: ν΄λ ν΄λ¦μΌλ‘ νλ(zoom-in), λΈλ λν¬λΌ/ν λ¨κ³ μ λ²νΌμΌλ‘ μΆμ
- hover μ κ²½λ‘/μ©λ νμ, νμ΄λΌμ΄νΈ
- μ°ν΄λ¦ λ©λ΄: Finderμμ 보기 / μ΄κΈ° / κ²½λ‘ λ³΅μ¬ / ν΄μ§ν΅μΌλ‘ μ΄λ
- λ³Όλ₯¨ μ¬μ Β·μ 체 μ©λ νμ
- **μμ€ν
μ€μ β μ μ₯ 곡κ°** μΌλ‘ λ°λ‘ κ°λ λ²νΌ
- μμ΄ / νκ΅μ΄ λ‘컬λΌμ΄μ¦ (μμ€ν
μΈμ΄λ₯Ό λ°λ¦)
## μ€μκ°μ΄ μλλλ€ β κ°±μ νλ €λ©΄ λ€μ μ€μΊ
νΈλ¦¬λ§΅μ **μ€μΊ μμ μ μ€λ
μ·**μ΄λ©° μ€μκ° νλ©΄μ΄ μλλλ€. μ€μΊ μ΄ν λμ€ν¬μμ νμΌμ΄ λ°λμ΄λ(Finderμμ μμ , λ€μ΄λ‘λ μλ£, λΉλ μ°μΆλ¬Ό μμ± λ±) νΈλ¦¬λ§΅μ **μλμΌλ‘ κ°±μ λμ§ μμ΅λλ€.**
νμ¬ μνλ₯Ό λ³΄λ €λ©΄ ν΄λ°μ **λ€μ μ€μΊ**(β») λ²νΌμ λλ₯΄μΈμ β κ°μ 루νΈλ‘ μ€μΊμ λ€μ μ€νν©λλ€. λ¨, μ± μμμ νλͺ©μ ν΄μ§ν΅μΌλ‘ λ³΄λΈ κ²½μ°μλ μ±μ΄ κ·Έ λ³κ²½μ μκ³ μμΌλ―λ‘ νΈλ¦¬λ§΅μ΄ μ¦μ κ°±μ λ©λλ€. κ·Έ μΈμ λ³κ²½μ λ€μ μ€μΊμ΄ νμν©λλ€.
## μꡬ μ¬ν
- macOS 13 (Ventura) μ΄μ
- Xcode 15+
- [XcodeGen](https://github.com/yonyz/XcodeGen) (`brew install xcodegen`)
## λΉλ & μ€ν
```bash
# 1) Xcode νλ‘μ νΈ μμ±
xcodegen generate
# 2-a) Xcodeμμ μ΄μ΄ μ€ν
open WhoAteMySpace.xcodeproj
# β "My Mac" νκΉ μ ν ν Run (βR)
# 2-b) λλ 컀맨λλΌμΈ λΉλ
xcodebuild -scheme WhoAteMySpace -configuration Debug build
# ν
μ€νΈ
xcodebuild -scheme WhoAteMySpace -destination 'platform=macOS' test
```
## κΆν β μ 체 λμ€ν¬ μ κ·Ό, νμ©ν΄λ μμ ν©λλ€
μ΄ μ±μ λΉμλλ°μ€λ‘ λμν©λλ€. `ν΄λ μ ν`μΌλ‘ κ³ λ₯Έ ν΄λλ μΆκ° κΆν μμ΄ μ€μΊλμ§λ§,
**μμ€ν
λ³΄νΈ μμ(λ€λ₯Έ μ¬μ©μ ν΄λ, μΌλΆ μμ€ν
κ²½λ‘ λ±)** κΉμ§ μ€μΊνλ €λ©΄ μ 체 λμ€ν¬ μ κ·Ό κΆνμ΄ νμν©λλ€.
> μμ€ν
μ€μ β κ°μΈμ 보 λ³΄νΈ λ° λ³΄μ β **μ 체 λμ€ν¬ μ κ·Ό κΆν** β `WhoAteMySpace.app` μΆκ°
**λͺ¨λ μ μ₯μ/λμ€ν¬ κΆνμ νμ©ν΄λ μμ ν©λλ€.** μ΄ μ±μ΄ νμΌλ‘ νλ μΌμ νΈλ¦¬λ§΅μ 그리기 μν΄ *μ©λ*μ μ½λ κ²λΏμ
λλ€. **νλ‘μ νΈμ λ€νΈμν¬ μ½λκ° μ ν μμ΅λλ€** β 무μλ μ
λ‘λΒ·μ μ‘λκ±°λ κΈ°κΈ° λ°μΌλ‘ 볡μ¬λμ§ μμ΅λλ€. μμΌμ μ΄μ§λ, HTTP μμ²μ 보λ΄μ§λ μμΌλ©°, λΆμ/μ격 μμ§(telemetry)λ μμ΅λλ€. νμΌμ 건λ리λ λμμ μ¬μ©μκ° μ§μ μ€ννλ κ²λΏμ
λλ€: Finderμμ 보기, μ΄κΈ°, κ²½λ‘ λ³΅μ¬, ν΄μ§ν΅μΌλ‘ μ΄λ. μ€νμμ€μ΄λ―λ‘ λͺ¨λ νμΌ μμ
μ μ§μ νμΈν μ μμ΅λλ€ β
[`Sources/WhoAteMySpace/Utilities/FileActions.swift`](Sources/WhoAteMySpace/Utilities/FileActions.swift) μ
[`Scanner/DiskScanner.swift`](Sources/WhoAteMySpace/Scanner/DiskScanner.swift) μ°Έκ³ .
κΆνμ΄ μμΌλ©΄ μ κ·Ό λΆκ° νλͺ©μ 건λλ°κ³ κ³μ μ§νν©λλ€.
## λ°°ν¬ (App Store μΈλΆ β dmg)
App Storeκ° μλ μΈλΆ λ°°ν¬λ **Developer ID μλͺ
+ 곡μ¦(notarization)** μ΄ νμν©λλ€.
(Apple Developer Program λ©€λ²μ $99/λ
νμ.)
```bash
# 1) Release λΉλ β .app μ°μΆ
xcodebuild -scheme WhoAteMySpace -configuration Release \
-derivedDataPath build clean build
APP="build/Build/Products/Release/WhoAteMySpace.app"
# 2) Developer ID Application μΈμ¦μλ‘ μλͺ
(Hardened Runtime ν¬ν¨)
codesign --force --deep --options runtime \
--sign "Developer ID Application: YOUR NAME (TEAMID)" "$APP"
# 3) dmg ν¨ν€μ§
hdiutil create -volname "Who Ate My Space" -srcfolder "$APP" \
-ov -format UDZO WhoAteMySpace.dmg
# 4) κ³΅μ¦ (μ± μνΈ λλ ν€μ²΄μΈ νλ‘νμΌ μ¬μ©)
xcrun notarytool submit WhoAteMySpace.dmg \
--apple-id "you@example.com" --team-id "TEAMID" \
--password "APP_SPECIFIC_PASSWORD" --wait
# 5) κ³΅μ¦ ν°μΌ μ²¨λΆ (stapling)
xcrun stapler staple WhoAteMySpace.dmg
```
κ²μ¦:
```bash
spctl -a -vvv -t install WhoAteMySpace.dmg # Gatekeeper ν΅κ³Ό νμΈ
codesign -dvvv "$APP" # μλͺ
/λ°νμ νμΈ
```
> Apple Developer κ³μ μ΄ μμΌλ©΄ κ°λ°μ© μλͺ
μΌλ‘ λ‘컬 μ€νκΉμ§λ§ κ°λ₯ν©λλ€.
> μ΄ κ²½μ° dmgλ₯Ό λ°μ μ¬μ©μλ 첫 μ€ν μ μ°ν΄λ¦ β "μ΄κΈ°"λ‘ Gatekeeperλ₯Ό μ°νν΄μΌ ν©λλ€.
## λ€κ΅μ΄ (i18n)
UIλ **μμ΄μ νκ΅μ΄**λ₯Ό μ 곡νλ©° μμ€ν
μΈμ΄λ₯Ό λ°λ¦
λλ€. λ¬Έμμ΄μ `.lproj` λ²λ€μ λ€μ΄ μμ΅λλ€:
```
Resources/
βββ en.lproj/ Localizable.strings Β· InfoPlist.strings
βββ ko.lproj/ Localizable.strings Β· InfoPlist.strings
```
μΈμ΄λ₯Ό μΆκ°νλ €λ©΄ λ²μν `Localizable.strings` / `InfoPlist.strings`λ₯Ό λ΄μ `<μΈμ΄>.lproj` λλ ν 리λ₯Ό λ§λ€κ³ , κ·Έ κ²½λ‘λ₯Ό `project.yml`μ `resources` λΉλ νμ΄μ¦λ‘ μΆκ°ν λ€, `Resources/Info.plist`μ `CFBundleLocalizations`μ μΈμ΄ μ½λλ₯Ό λ±λ‘νμΈμ.
## ꡬ쑰
```
Sources/WhoAteMySpace/
βββ App/ μ± μνΈλ¦¬ + μ΅μμ λ μ΄μμ
βββ Models/ FileNode (νΈλ¦¬ λ
Έλ)
βββ Scanner/ DiskScanner (λ³λ ¬ μ¬κ· μ€μΊ)
βββ Treemap/ TreemapLayout (squarified) + TreemapRect
βββ Views/ TreemapView / Breadcrumb / Legend / ScanProgress
βββ ViewModels/ ScanViewModel (μν/λ€λΉκ²μ΄μ
/νμΌ μμ
)
βββ Utilities/ FileColor / FileActions / ByteFormat
```
## νκ³ / νμ (v2 ν보)
- νν°/κ²μ(ν¬κΈ°Β·νμ₯μΒ·λ μ§), μ μΈ ν¨ν΄
- μ€μκ° λͺ¨λν°λ§, λ€μ€ λ³Όλ₯¨, μ€λ
μ· λΉκ΅
- Quick Look 미리보기
- κ°μ λ³Όλ₯¨λ§ μ€μΊ(λ§μ΄νΈ κ²½κ³ μ²λ¦¬), νλλ§ν¬ μ€λ³΅ 보μ
## λΌμ΄μ μ€
[MIT License](LICENSE)λ‘ λ°°ν¬λ©λλ€. Β© 2026 Jonghoon Park.
## νμ
λμμ΄ λμλ€λ©΄ νλ‘μ νΈλ₯Ό νμν΄ μ£ΌμΈμ: