레이아웃 저장 & 복원
브라우저를 닫거나 서버를 재부팅해도 탭이 정확히 그 자리에 돌아오는 이유.
purplemux는 "브라우저 탭을 닫는 것이 세션을 끝내는 것이어선 안 된다"는 전제로 설계됐습니다. 두 축이 함께 동작합니다 — tmux가 쉘을 살려두고, ~/.purplemux/workspaces.json이 레이아웃을 기억합니다.
저장되는 것
워크스페이스에서 눈에 보이는 모든 것:
- 탭과 그 순서
- 창 분할과 분할 비율
- 각 탭의 패널 타입 — Terminal, Claude, Diff, Web browser
- 모든 쉘의 작업 디렉토리
- 워크스페이스 그룹, 이름, 순서
workspaces.json은 레이아웃 변경 때마다 트랜잭션 단위로 업데이트되므로 파일은 항상 현재 상태를 반영합니다. 디스크 파일 구조는 데이터 디렉토리를 참고하세요.
브라우저 닫기
탭을 닫든, 새로고침하든, 노트북을 덮든 — 세션이 끝나지 않습니다.
모든 쉘은 전용 purple 소켓의 tmux 세션 안에 살아있습니다. 사용자의 ~/.tmux.conf와 완전히 격리됩니다. 한 시간 뒤에 http://localhost:8022를 다시 열면 WebSocket이 동일한 tmux 세션에 재연결되고, 스크롤백을 재생한 뒤 살아있는 PTY를 xterm.js로 넘겨줍니다.
복원이 아니라 재연결입니다.
서버 재부팅 후 복구
재부팅은 tmux 프로세스를 종료시킵니다 — 결국은 OS 프로세스니까요. purplemux는 다음 시작 시 이 상황을 처리합니다.
- 레이아웃 읽기 —
workspaces.json이 모든 워크스페이스, 창, 탭을 기술합니다. - 세션 병렬 재생성 — 각 탭마다 저장된 작업 디렉토리에서 새 tmux 세션이 생성됩니다.
- Claude 자동 재개 — Claude 세션이 돌고 있던 탭은
claude --resume {sessionId}로 다시 시작되어 대화가 끊긴 지점에서 이어집니다.
"병렬"이라는 점이 중요합니다 — 탭이 10개라면 10개 tmux 세션이 한 번에 올라옵니다. 차례대로가 아니라 동시에. 브라우저를 열 때쯤에는 이미 레이아웃이 준비되어 있습니다.
돌아오지 않는 것
몇 가지는 저장이 불가능합니다.
- 인메모리 쉘 상태 — 직접 설정한 환경변수, 백그라운드 잡, 진행 중이던 REPL
- 응답 대기 중이던 권한 프롬프트 — 서버가 죽을 때 Claude가 권한 결정을 기다리고 있었다면, 재개 시 같은 프롬프트가 다시 보입니다
claude외의 포어그라운드 프로세스 —vim버퍼,htop,docker logs -f. 쉘은 같은 디렉토리에 있지만 그 안에서 돌던 프로세스는 없습니다
이건 표준 tmux 계약입니다 — 쉘은 살아남지만 그 안의 프로세스는 반드시 그렇진 않습니다.
수동 제어
평소엔 건드릴 일이 없지만 호기심을 위해:
- tmux 소켓 이름은
purple입니다.tmux -L purple ls로 직접 확인할 수 있습니다. - 세션 이름 형식은
pt-{workspaceId}-{paneId}-{tabId}입니다. - 서버 실행 중에
workspaces.json을 직접 편집하는 것은 안전하지 않습니다 — 서버가 파일을 잡고 있고 변경을 즉시 써내려갑니다.
이진 프로토콜, 백프레셔, JSONL 워처 같은 더 깊은 이야기는 랜딩의 How it works 섹션을 참고하세요.
다음으로
- 워크스페이스와 그룹 — 워크스페이스 단위로 저장되는 것
- 탭 & 창 — 탭 단위로 저장되는 것
- 브라우저 지원 — 모바일 백그라운드 탭과 재연결의 알려진 이슈