NEW개발기 · 09.27블로그를 갈아엎었다
← 포트폴리오
운영 중since 2026.09.24

Control Tower

집의 컴퓨터 네 대 상태와 로컬 LLM을 한 화면에서 보고 바꾸는 관제판

TypeScriptBunServer-Sent EventsSwiftnvidia-smi

무엇인가

집에 있는 컴퓨터 네 대(맥 스튜디오, 맥북, 윈도우 게이밍 PC, DGX Spark 계열 워크스테이션)의 CPU, 메모리, GPU, 디스크, 온도를 한 화면에서 실시간으로 보고, 각 기기에 올라간 로컬 LLM을 클릭 한 번으로 바꾸는 관제판이다. 지금 어떤 모델이 올라가 있는지, 추론 중인지가 카드마다 보인다. 맥에서는 데스크탑 앱과 메뉴바 아이콘으로 띄우고, 원격 켜기와 잠자기, 재시작 같은 전원 제어도 확인 창을 거쳐 할 수 있다.

왜 만들었나

기기마다 모델 런타임이 달랐다. 어떤 곳은 Ollama, 어떤 곳은 직접 만든 라우터, 어떤 곳은 OpenAI 호환 서버였다. 어느 기기가 한가한지, 어떤 모델이 메모리를 잡고 있는지 보려면 기기마다 들어가 봐야 했다. 모델 하나 바꾸려고 다른 방까지 걸어가는 일도 있었다. 한 탭만 열면 전부 보이는 관제탑 같은 벽이 필요했다.

어떻게 만들었나

Bun과 TypeScript로 허브와 에이전트 두 서버를 한 저장소에 만들었다. 에이전트는 기기마다 돌면서 macOS, 윈도우, 리눅스별 수집기로 지표를 모으고, 런타임을 자동으로 감지해 모델 목록과 로드, 언로드를 고정된 HTTP 계약으로 노출한다. 허브는 2초마다 에이전트를 조회하고 SSE로 화면을 갱신한다. 꺼진 기기는 오류 대신 회색과 마지막 접속 시각으로 보여 준다. 수집기 파서마다 테스트를 붙였고, 맥 앱은 Swift로 감쌌다.

배운 것

플랫폼 차이는 화면이 아니라 어댑터 안에 가둬야 한다는 걸 다시 확인했다. 런타임이 넷이어도 화면 코드는 하나로 충분했다. 연결이 끊긴 상태를 예외가 아니라 보여 줄 상태로 다루자 대시보드가 훨씬 안정적으로 느껴졌다. 요구사항을 체크리스트로 먼저 적고 하나씩 실측으로 지워 나간 방식이 긴 작업에서 길을 잃지 않게 해 주었다.