Claude Code를 위한 미션 컨트롤을 만들었습니다 (오픈 소스, 셀프 호스팅)
I built mission control for Claude Code (open source, self-hosted)
핵심 요약
여러 Claude Code 세션을 한곳에서 관리하고 모바일에서도 제어할 수 있는 셀프 호스팅 대시보드 Codeman을 소개합니다.
- 통합 대시보드 — 여러 셸과 기기에 흩어진 Claude Code 세션을 웹 브라우저 하나로 관리함
- 자동 재개 기능 — 사용량 제한에 걸려 멈춘 에이전트를 리셋 시간에 맞춰 자동으로 다시 시작함
- 모바일 최적화 — 모바일 환경에 특화된 UI와 푸시 알림, 음성 입력으로 원격 제어 지원
- 제로 지연 입력 — Mosh 방식의 로컬 에코를 구현해 원격 환경에서도 입력 지연 없는 타이핑 제공
파워유저라면 Claude Code 세션 하나만 돌리는 일은 없지. 셸, 창, 기기 여기저기에 여러 개를 동시에 띄워놓는데, 이걸 다 관리하거나 폰을 포함해서 어디서든 접근할 방법이 마땅치 않잖아. 그래서 내가 Codeman을 만들었어!
항상 켜져 있는 기기(창고에 박아둔 맥 미니, 리눅스 박스, WSL, VPS 등)에 한 번만 설치하면 되는 셀프 호스팅 웹 대시보드(TypeScript, Fastify, node-pty)야. 그 기기가 본진이 되는 거지. tmux 안에서 Claude Code, OpenCode, Codex CLI, Gemini CLI를 실행하고, SSE + xterm.js를 통해 실제 터미널 화면을 브라우저로 쏴주니까, 노트북은 잠재워도 에이전트들은 계속 일할 수 있어.
그래, 어쩔 수 없이 홍보글이야. 근데 100% 무료에 오픈소스라고: Codeman은 셀프 호스팅이고, MIT 라이선스에, 텔레메트리도 없고, 아래에 적힌 모든 기능은 네 하드웨어에서 돌아가.
반년 동안 1500번 넘게 커밋했고 기여자도 14명이나 붙었어. 내가 매일 쓰는 툴이기도 하고!
모든 게 한곳에 모여 있어. 케이스(프로젝트당 하나), 탭(실행 중인 에이전트당 하나), 기기가 버티는 만큼 병렬로 띄울 수 있고, 데스크톱이나 폰 어디서든 접속 가능해. 내가 매일 유용하게 쓰는 기능들은 이거야:
- 사용량 제한 시 자동 재개: 에이전트가 "제한 도달, 오후 8시 초기화"라며 멈추면, Codeman이 초기화 시간을 파악해서 기다렸다가 다시 실행해(세션별로 설정 가능). 밤새 돌려놔도 Claude의 5시간 제한 때문에 멈추지 않고 아침까지 알아서 돌아가.
- 사용량 한눈에 보기: 5시간/주간 플랜을 얼마나 썼는지, 호스트의 CPU와 RAM 상태는 어떤지 헤더 칩에 다 뜨니까, 일을 더 시킬지 말지 바로 판단 가능해.
- 브라우저에서 파일 확인: 에이전트가 방금 쓴 내용을 읽거나 이미지, PDF, Office 문서를 미리 볼 수 있는 뷰어가 내장돼 있어서, 굳이 SSH로 왔다 갔다 할 필요가 없어.
- 상태를 알려주는 깜빡이는 탭: 유휴 상태면 노란색, 답변 기다리느라 멈췄으면 빨간색으로 깜빡여. 탭 하나만 봐도 멈춘 에이전트 찾겠다고 터미널 창 수십 개를 뒤질 필요가 없지.
- 플로팅 윈도우로 뜨는 서브 에이전트: 에이전트가 작업을 분산하면, 각 서브 에이전트가 부모 탭에 연결선으로 이어진 플로팅 윈도우로 떠. 에이전트별 토큰 사용량도 다 보이고. 작업자 창을 들여다보거나 다시 탭으로 최소화할 수 있어.
- 자리를 비운 사이 기록: 모든 세션은 실행 이벤트와 건드린 파일의 타임라인을 기록해. 세션 간 통합 검색으로 다 찾아볼 수 있으니까, 밤새 무슨 일이 있었는지 1분 만에 파악 가능해.
- 제대로 된 모바일 경험: 폰으로 쓸 때 내가 써본 어떤 SSH 클라이언트보다 좋아. 범용 터미널 접속이 아니라 이 에이전트들을 위해 만들었거든. QR 로그인(1회용, 60초 TTL, 터치 키보드로 비번 칠 필요 없음), 에이전트가 사람 손길 필요할 때 푸시 알림, 세션 간 스와이프 전환, 음성 입력, 없는 키를 위한 액세서리 바, 위험한 명령어는 더블 탭으로 실행 등등.
- 입력 지연 제로, 이게 제일 만들기 힘들었어. 터널링을 거치면 키 입력 한 번에 200~300ms가 걸려서 원격 타이핑이 엄청 답답하거든. 그래서 Mosh에서 영감을 받은 로컬 에코 기능을 넣었어. 키를 누르면 즉시 화면에 뜨고, 실제 에코가 도착하면 자연스럽게 교체돼. 터미널 버퍼 안에서는 구현이 불가능해. 에이전트들의 TUI가 계속 화면을 다시 그리면서 주입된 내용을 다 깨뜨리거든(terminal.write()로 두 번 시도했다가 다 말아먹음). 그래서 xterm.js 위에 DOM 오버레이를 씌웠어. npm에 xterm-zerolag-input으로 따로 공개했으니까, 네트워크 기반 xterm.js 툴 만드는 사람들은 가져다 써.

