박준 · PARK JOON
프로젝트 / 웹앱·대시보드
웹앱·대시보드AI 에이전트 운영세션 복구FastAPImacOS 메뉴바관제 대시보드

AI 코딩 세션 수십 개 관제·복구 대시보드

동시에 도는 Claude Code 세션 중 나를 기다리는 것을 찾고, 강제 종료 뒤 고른 것만 부하 없이 되살리는 도구

기간
2026.07–2026.10
형태
사이드 프로젝트
상태
배포·운영 중
역할
기획·백엔드·웹 UI·메뉴바 앱 개발, 실사용 운영 (1인)
실제 화면 녹화 · 개인정보와 내부 주소는 가렸습니다클릭하면 멈춤·재생
158/158세션배터리 방전 종료 뒤 단계 복원으로 되살린 Claude 세션(창 8/8)
2.51→0.25GB보존 정책·압축 적용 후 스냅샷 저장 용량(21,284건→7,003건)
12개한 번에 자동 실행하는 세션 상한(메모리 보호)
6단계세션 상태 분류(승인 대기·질문 대기·작업 중·뒤에서 진행·대기·유휴)

문제

Claude Code 세션을 터미널 앱의 창·워크스페이스·탭에 수십 개씩 띄워 두고 일하다 보니 두 가지 문제가 생겼습니다. 첫째, 강제 종료 뒤 앱이 창 7개·워크스페이스 60개·탭 100개를 한꺼번에 되살리면서 CPU가 치솟아 다시 꺼지는 일이 세 번 반복됐습니다. 전부 되살리는 기능은 이미 있었고, 필요한 것은 고른 것만 부하 없이 되살리는 기능이었습니다.

둘째, 수십 개 탭 중 도구 승인이나 질문 답변을 기다리며 멈춘 세션은 출력도 진행도 없어서 직접 찾지 않으면 계속 멈춰 있었습니다.

접근

  • 읽기·복구 경로는 앱 소켓 없이 디스크 파일(앱 세션 저장본, 대화 기록, 프로세스 환경, 알림 기록)만으로 동작하게 했습니다. 소켓 제어를 켜려면 앱을 재시작해야 하는데, 그 재시작이 막으려는 사고였기 때문입니다.
  • 30초마다 상태를 읽어 변화가 있을 때만 스냅샷을 남기고, 최근 7일은 전부·30일까지는 시간당 1개·그 이전은 4시간당 1개로 성기게 보존하며 zlib으로 압축했습니다.
  • 복원은 워크스페이스를 하나씩 순차 생성하고, 세션 자동 실행은 배치당 12개로 제한해 초과분은 재개 명령만 연결해 두었습니다.
  • 세션 상태 정의를 서버의 한 곳에만 두고 웹과 메뉴바는 그 값을 받아 그리기만 하게 해, 두 화면의 상태 목록이 어긋나지 않게 했습니다.
  • 앱이 성공 응답만 주고 실제로는 다르게 처리하는 경우(인덱스 클램프, 그룹 이동 무시)를 겪은 뒤, 모든 제어 결과를 다시 읽어 계획과 대조하고 불일치를 화면에 표시하게 했습니다.

구조

수집앱 세션 파일·대화 기록·프로세스·알림 기록을 30초마다 읽습니다.
스냅샷변화가 있으면 창·그룹·워크스페이스·탭·재개 명령을 압축 저장하고 사람이 읽는 복구표를 따로 씁니다.
상태 판정세션마다 승인 대기·질문 대기·작업 중 등으로 분류하고 막힘 수를 합산합니다.
표시창별 컬럼 보드와 메뉴바 배지로 막힌 세션을 보여 주고, 클릭하면 해당 탭으로 이동합니다.
복원스냅샷 시점을 골라 창·그룹·워크스페이스·탭 단위로 체크한 것만 순차 복원합니다.

주요 기능

선택 복원스냅샷의 배치를 다단계 체크박스로 펼쳐 창 전체부터 탭 하나까지 골라 복원합니다.
부하 제어 복원순차 생성과 자동 실행 상한으로 복원 자체가 시스템을 멈추지 않게 합니다.
막힘 우선 관제 보드창 하나를 컬럼 하나로 두고 승인·질문 대기 카드만 움직임으로 강조하며, 카드 클릭으로 해당 탭을 활성화합니다.
메뉴바 배지Swift로 만든 메뉴바 앱이 막힘 수를 배지로 보여 주고, 팝오버에서 목록과 이동을 제공합니다.
편집 모드워크스페이스 순서·그룹 소속을 끌어서 바꾸면 실제 앱 배치에 적용되고, 적용 결과를 다시 읽어 대조합니다.
데모 모드합성 데이터로 창 5개·워크스페이스 96개·탭 85개 화면을 바로 띄워 볼 수 있습니다.

결과

  • 배터리 방전으로 종료된 뒤 스냅샷 기준 창 8개·워크스페이스 133개·Claude 탭 163개 구성을 단계 복원해 창 8/8, 워크스페이스 132/133을 되살리고, 대화 기록이 있어 기동 대상으로 잡은 세션 158개를 모두 원래 탭에 붙여 살렸습니다. 복원 직후 메모리 여유는 81%였습니다.
  • 보존 정책 변경으로 30일이 지나면 스냅샷이 지워지던 문제를 해결하면서 저장 용량을 2.51GB에서 0.25GB로 줄였습니다.
  • 대시보드가 꺼져 있어도 사람이 읽는 복구표 파일로 세션별 재개 명령을 확인할 수 있습니다.
  • 7월 첫 사고 이후 10월까지 실제 작업 환경에서 상시 사용하고 있으며, 개발 과정과 사고 원인을 기록으로 남겼습니다.

포인트

«전부 되살리기»가 사고의 원인이었기 때문에, 복원은 되살리는 일이면서 동시에 시스템을 멈추지 않게 하는 일로 설계해야 했습니다. 순차 생성과 자동 실행 상한은 성능 최적화가 아니라 이 도구의 핵심 요구였습니다.

외부 앱이 «OK»를 돌려줘도 실제로는 다르게 처리하는 경우가 반복됐습니다. 성공 문구를 그대로 보여 주면 사용자가 화면을 믿고 다시 헤매게 되므로, 모든 제어는 다시 읽어 대조하고 어긋나면 어긋났다고 표시하는 것을 원칙으로 삼았습니다. 막힘 강조 애니메이션도 «움직이고 있다»가 아니라 «움직이는 게 보인다»를 기준으로 네 번 고쳤습니다.

기술

PythonFastAPISQLitezlibVanilla JavaScriptSwift(macOS 메뉴바 앱)pm2Claude Codecmux

상단 영상은 실제 화면을 녹화한 것입니다.