새로 장만한 128GB M5 MacBook Pro는 로컬 LLM을 구동하기에 충분히 강력한 성능을 갖춘 것으로 보인다. 기본 제공되는 Activity Monitor에 답답함을 느낀 나는 바이브 코딩으로 직접 성능 모니터링 도구를 만들어봤고, 그 결과에 꽤 만족하고 있다.
macOS 앱 바이브 코딩은 이번이 두 번째 시도다. 첫 번째는 몇 주 전에 만든 프레젠테이션 앱이었다.
Claude Opus 4.6과 GPT-5.4 모두 SwiftUI를 꽤 잘 다룬다는 걸 알게 됐다. SwiftUI 앱 전체를 파일 하나에 담을 수 있기 때문에, Xcode를 열지 않고도 이 모델들로 뚝딱 만들어낼 수 있다.
지금까지 두 가지 앱을 만들었다. 앱별 네트워크 대역폭 사용량을 보여주는 Bandwidther와 GPU 상태를 보여주는 Gpuer다. Claude의 제안에 따라 두 앱 모두 메뉴 바 아이콘 형태로 바꿨고, 아이콘을 클릭하면 상세 정보 패널이 열린다.
Dropbox가 뭘 하고 있는지 확인하고 싶어서 이 앱을 먼저 만들었다. 완성된 모습은 다음과 같다.

첫 번째 버전을 만들 때 사용한 전체 대화 내용을 공유한다. 프롬프트는 꽤 단순했다.
이 컴퓨터에서 로컬 LAN이 아닌 인터넷으로 나가는 네트워크 대역폭이 얼마나 되는지 보여줘
(처음에 궁금했던 건 Dropbox가 파일을 이전 컴퓨터에서 LAN으로 전송하는지, 아니면 인터넷에서 새로 내려받는지였다.)
mkdir /tmp/bandwidther 하고 거기에 네이티브 SwiftUI 앱 작성해줘. 방금 그 내용을 실시간으로 계속 보여주는 앱으로
이 프롬프트만으로 첫 번째 버전이 나왔고, 더 발전시킬 가치가 있다는 확신이 생겼다.
git init하고 지금까지 작성한 코드 git commit해줘
새로운 기능을 추가하기 전에 커밋부터 해두기 위해서였다.
이제 이 앱에 추가할 만한 기능을 제안해줘. 앱별 네트워크 사용량을 포함해서 네트워크 사용 현황을 최대한 상세하게 보여주는 게 목표야
Claude에게 기능을 제안받으면 좋은 점은, 내가 모르는 것까지 무엇이 가능한지 훨씬 잘 파악하고 있다는 것이다.
이후 버그를 몇 가지 주고받으며 수정했고, 프롬프트를 몇 번 더 입력해서 위에 보이는 2단 레이아웃을 완성했다.
프로세스별 대역폭 추가하고, 완료되면 앱 다시 실행해줘
이제 역방향 DNS 기능도 추가해줘. 단, 원래 IP 주소도 계속 보이게 해줘. 조금 작은 글씨체로
앱을 더 넓게 재설계해줘. 2단 컬럼으로 만들고 싶어. 왼쪽에는 프로세스별 정보, 오른쪽에는 나머지
이제 태스크바 아이콘 방식으로 바꿔줘. 아이콘 클릭하면 앱이 나타나게. 아이콘 자체는 깔끔하고 미니멀하게
소스 코드와 빌드 방법은 simonw/bandwidther에서 확인할 수 있다.
Gpuer
Bandwidther를 만들던 세션과 별도로, GPU 상태를 확인하는 유사한 도구를 만드는 세션을 동시에 진행했다. 최종 결과물은 다음과 같다.
대화 내용은 여기서 볼 수 있다. 이미 만들던 Bandwidther를 참고 예시로 활용할 수 있었기 때문에 프롬프트가 훨씬 적게 들었다.
이 컴퓨터의 RAM과 GPU 사용량을 알고 싶어. Activity Monitor에서는 GPU나 RAM에 올라간 항목이 제대로 안 보이는 것 같아서 파악하기가 어렵거든
system_profiler과memory_pressure를 활용해 정보를 수집하고 답변을 내놨다. 무엇보다 이런 게 가능하다는 걸 확인했으니, 바로 이어서 말했다./tmp/bandwidther를 참고해서 /tmp/gpuer에 비슷한 앱 만들어줘. 위 정보를 실시간으로 보여주거나, 더 잘 보여줄 수 있으면 더 좋고
Bandwidther 앱에 변경 사항을 몇 가지 더 적용한 뒤, Gpuer도 따라오도록 했다.
/tmp/bandwidther의 최근 변경 사항을 확인해봐. 그 앱은 이제 시스템 트레이 아이콘 방식을 쓰고 있거든. 똑같이 적용해줘
이건 코딩 에이전트를 활용할 때 내가 가장 즐겨 쓰는 방법 중 하나다. 다른 프로젝트의 요소를 가져와 재조합하게 하는 것이다.
Gpuer의 코드는 GitHub의 simonw/gpuer에서 확인할 수 있다.
이 앱들을 그대로 믿으면 안 된다
두 앱 모두 전형적인 바이브 코딩의 산물이다. 나는 Swift를 모르고, 작성된 코드도 거의 들여다보지 않았다.
더 중요한 문제는, 이 도구들이 측정하는 값과 같은 macOS 내부 동작에 대한 경험이 거의 없다는 점이다. 출력되는 수치와 차트가 신뢰할 만한지, 정확한지 판단할 능력이 내게는 없다.
이 점을 명시한 경고 문구를 두 GitHub 저장소 모두에 추가해뒀다.
오늘 아침에는 Gpuer가 남은 메모리를 5GB로 표시하는 걸 발견했는데, Activity Monitor로 확인해보니 명백히 틀린 수치였다. Claude Code에 스크린샷을 붙여넣었더니 계산 방식을 조정해줬고 수정된 수치는 맞아 보이긴 하지만, 여전히 완전히 신뢰하기는 어렵다.
그럼에도 GitHub에 공개한 건 Claude가 SwiftUI로 무엇을 할 수 있는지 보여주는 사례로서 흥미롭다고 생각했기 때문이다.
앱 자체의 신뢰도에는 확신이 없지만, 이 프로젝트들을 통해 몇 가지 유용한 사실을 배웠다.
- SwiftUI 앱은 파일 하나로도 꽤 많은 걸 구현할 수 있다. GpuerApp.swift(880줄)와 BandwidtherApp.swift(1063줄)가 그 예다.
- 다양한 터미널 명령을 Swift로 깔끔한 UI에 감싸는 건 어렵지 않다.
- SwiftUI 애플리케이션 디자인에 있어 Claude의 감각은 예상보다 훨씬 뛰어나다.
- 앱을 메뉴 바 앱으로 전환하는 데도 코드 몇 줄이면 충분하다.
- 이런 앱을 만드는 데 Xcode를 열 필요조차 없다!
두 앱을 만드는 데 시간이 거의 들지 않았고, 이 경험을 통해 SwiftUI로 macOS 앱을 만드는 것이 앞으로 프로젝트에서 충분히 활용할 수 있는 새로운 선택지라는 확신이 생겼다.
이 블로그의 장문 아티클만 보고 계신 분들께: /atom/everything/을 구독하면 모든 포스트를 받아볼 수 있으며, 다른 구독 옵션도 확인해보세요.