나는 macOS 메뉴 바 앱을 만들어 내 모든 Claude Code 세션을 모니터링했습니다 — 작동 방식은 다음과 같습니다

발행: (2026년 3월 1일 오후 05:50 GMT+9)
8 분 소요
원문: Dev.to

It looks like only the source citation was provided. Could you please share the article text you’d like translated? Once I have the content, I’ll translate it into Korean while preserving the formatting, markdown, and code blocks as requested.

What it does

c9watch은 macOS 메뉴 바에 기본으로 탑재된 앱으로, 머신에서 실행 중인 모든 Claude Code 세션을 자동으로 탐지합니다. 플러그인이나 설정이 필요 없으며, OS 수준에서 프로세스를 스캔하므로 현재 사용 중인 터미널이나 IDE와 관계없이 작동합니다.

Dashboard

세션은 상태별로 그룹화됩니다 — Working, Needs Permission, Idle, Done — 권한 요청이 상단에 표시됩니다. 또한 프로젝트별(git 브랜치 정보 포함)로 그룹화할 수 있고, 세션을 확장해 전체 대화를 읽거나, 세션을 중지·이름 변경하고, 바로 상위 터미널로 이동할 수 있습니다.

A few other things it does:

  • Tray popover — 메뉴 바 아이콘을 클릭하면 전체 대시보드를 열지 않고도 간단히 개요를 확인할 수 있습니다
  • Conversation viewer — 포맷된 마크다운, 코드 블록, 인라인 이미지, 그리고 탐색용 사이드바를 제공합니다
  • Session history — 키워드로 모든 과거 세션을 검색할 수 있습니다
  • Cost tracker — 일별, 프로젝트별, 모델별 지출 내역을 분류해 보여줍니다
  • Mobile client — QR 코드를 스캔해 WebSocket을 통해 휴대폰에서 세션을 확인할 수 있습니다
  • macOS notifications — 에이전트가 사용자의 주의를 필요로 할 때 알림을 받습니다

How it works under the hood

Process discovery

배경 스레드가 2초마다 sysinfo를 사용해 폴링하면서 실행 중인 claude 프로세스를 스캔합니다. 각 프로세스는 경로 인코딩과 타임스탬프 연관성을 통해 ~/.claude/projects/에 있는 세션 파일과 매핑됩니다.

각 세션의 JSONL 파일에서 마지막 N 항목을 파싱해 상태를 판단합니다:

  • Working — Claude가 응답을 생성하거나 도구를 실행 중
  • Needs Permission — 도구 호출이 사용자 승인을 기다리는 중
  • Idle — 다음 프롬프트를 기다리는 중

상태 업데이트는 Tauri 이벤트를 통해 Svelte 프론트엔드로 푸시됩니다. UI는 반응형으로 업데이트되며 우선순위에 따라 세션을 정렬합니다.

c9watch는 ~/.claude/history.jsonl을 읽어 세션 인덱스를 만든 뒤, 모든 프로젝트 디렉터리의 개별 JSONL 파일을 스캔해 깊은 내용 검색을 수행합니다. 텍스트 추출 로직은 사용자 프롬프트와 도구 결과를 신중히 구분하여 실제 사용자가 입력한 내용만 인덱싱합니다. 이를 통해 메타데이터에 대한 잡음 매치를 방지합니다.

검색 결과는 대화 뷰어와 연결되며, 매치된 부분으로 스크롤‑투‑하이라이트가 적용됩니다.

Cost tracking

JSONL 파일에 포함된 Assistant 메시지 메타데이터에는 모델 사용량과 토큰 수가 들어 있습니다. 비용 계산기는 모델별 가격표를 사용하고 파일 mtime을 기준으로 결과를 캐시하므로, 변경되지 않은 세션은 다시 스캔되지 않습니다.

특이한 점: Anthropic의 모델 ID는 claude-sonnet-4-5-20250929와 같이 날짜 접미사를 포함합니다. 가격 조회 시 이 접미사를 제거해 정규화한 뒤 가격표와 매칭합니다.

The tray popover (NSPanel)

메뉴 바 팝오버는 macOS NSPanel을 사용하며, full_screen_auxiliary(), can_join_all_spaces(), stationary()와 같은 특정 컬렉션 동작을 설정합니다. 이를 통해 전체 화면 앱 위에 표시되면서 포커스를 빼앗지 않게 됩니다. 제목 표시줄의 클릭 가능한 탭 버튼과 드래그 영역을 동시에 사용하려면 개별 버튼에 -webkit-app-region: no-drag를 지정하고, 주변 영역은 드래그 가능하게 유지해야 합니다.

기술 스택

계층기술
데스크톱 프레임워크Tauri 2
프론트엔드SvelteKit + Svelte 5
백엔드Rust
프로세스 탐색sysinfo
디자인 시스템Vercel Noir (true black, Geist fonts)

왜 Tauri를 Electron보다 선택하는가

이미 메모리를 많이 차지하는 Claude Code 에이전트들을 여러 개 실행하고 있습니다. 모니터링 도구가 그에 추가로 부담을 주어서는 안 됩니다. Tauri는 최소한의 오버헤드를 가진 네이티브 바이너리를 제공합니다 — Rust가 (프로세스 스캔, JSONL 파싱)과 같은 무거운 작업을 네이티브 속도로 처리하고, Svelte는 프론트엔드에서 프레임워크 오버헤드를 컴파일 단계에서 제거합니다.

Development process

저는 c9watch를 Claude Code 자체로 만들었습니다. 대부분의 Rust 백엔드와 Svelte 프런트엔드는 AI‑assisted였으며 — 제가 원하는 것을 설명하고, 출력물을 검토하고, 테스트하고, 반복했습니다. 아키텍처 결정(Tauri를 Electron보다 선택, OS‑level 스캐닝, JSONL 파싱 전략)은 제가 했지만, 구현의 무거운 작업은 Claude Code가 담당했습니다.

Open source

MIT 라이선스, 텔레메트리 없음, 완전 오픈 소스.

  • GitHub:
  • Demo:
  • Install:
curl -fsSL https://raw.githubusercontent.com/minchenlee/c9watch/main/install.sh | bash

여러 개의 Claude Code 세션을 실행하면서 상황을 파악하기 어려우시다면 한 번 사용해 보세요. 피드백, 이슈, 그리고 PR을 언제든 환영합니다.

0 조회
Back to Blog

관련 글

더 보기 »

일이 정신 건강 위험이 될 때

markdown !Ravi Mishrahttps://media2.dev.to/dynamic/image/width=50,height=50,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fu...