An open API service indexing awesome lists of open source software.

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

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)** 으둜 λ³΄μ—¬μ€λ‹ˆλ‹€. 무엇이 λ””μŠ€ν¬λ₯Ό μž‘μ•„λ¨ΉλŠ”μ§€ ν•œλˆˆμ— ν™•μΈν•˜κ³ , λ°”λ‘œ νœ΄μ§€ν†΅μœΌλ‘œ 정리할 수 μžˆμŠ΅λ‹ˆλ‹€.

![Who Ate My Space μŠ€ν¬λ¦°μƒ· β€” 루트(/) μŠ€μΊ” κ²°κ³Ό](docs/screenshot.png)

> 루트(`/`)λ₯Ό μŠ€μΊ”ν•œ λͺ¨μŠ΅. 폴더 헀더에 μ΄λ¦„Β·μš©λŸ‰μ΄ ν‘œμ‹œλ˜κ³ , νŒŒμΌμ€ νƒ€μž…λ³„ μƒ‰μƒμœΌλ‘œ μ±„μ›Œμ§‘λ‹ˆλ‹€.
> (예: 초둝 = 이미지 `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.

## 후원

도움이 λ˜μ—ˆλ‹€λ©΄ ν”„λ‘œμ νŠΈλ₯Ό 후원해 μ£Όμ„Έμš”:

Sponsor