데이터 디렉토리
~/.purplemux/ 안에 무엇이 있고, 무엇을 지워도 되며, 어떻게 백업하는지.
purplemux가 유지하는 모든 영구 상태 — 설정, 레이아웃, 세션 히스토리, 캐시 — 는 ~/.purplemux/ 한 곳에만 저장됩니다. localStorage, 시스템 키체인, 외부 서비스 모두 사용하지 않습니다.
한눈에 보는 구조
~/.purplemux/
├── config.json # 앱 설정 (인증, 테마, 로케일, …)
├── workspaces.json # 워크스페이스 목록 + 사이드바 상태
├── workspaces/
│ └── {wsId}/
│ ├── layout.json # pane/tab 트리
│ ├── message-history.json # 워크스페이스별 입력 히스토리
│ └── claude-prompt.md # --append-system-prompt-file 내용
├── hooks.json # Claude Code 훅 + statusline 설정 (자동 생성)
├── status-hook.sh # 훅 스크립트 (자동 생성, 0755)
├── statusline.sh # statusline 스크립트 (자동 생성, 0755)
├── rate-limits.json # 가장 최근 statusline JSON
├── session-history.json # 완료된 Claude 세션 로그 (워크스페이스 횡단)
├── quick-prompts.json # 커스텀 quick prompts + 비활성 빌트인
├── sidebar-items.json # 커스텀 사이드바 항목 + 비활성 빌트인
├── vapid-keys.json # Web Push VAPID 키페어 (자동 생성)
├── push-subscriptions.json # Web Push 구독 정보
├── cli-token # CLI 인증 토큰 (자동 생성)
├── port # 현재 서버 포트
├── pmux.lock # 단일 인스턴스 락 {pid, port, startedAt}
├── logs/ # pino-roll 로그 파일
├── uploads/ # 채팅 입력바로 첨부된 이미지
└── stats/ # Claude 사용량 통계 캐시
비밀이 포함된 파일(설정, 토큰, 레이아웃, VAPID 키, 락)은 0600 모드로, tmpFile → rename 패턴으로 기록합니다.
최상위 파일
| 파일 | 저장 내용 | 삭제해도 되는가 |
|---|---|---|
config.json |
scrypt 해시 로그인 비밀번호, 세션 HMAC 시크릿, 테마, 로케일, 폰트 사이즈, 알림 토글, 에디터 URL, 네트워크 접근 정책, 커스텀 CSS | 가능 — 온보딩이 다시 진행됨 |
workspaces.json |
워크스페이스 인덱스, 사이드바 너비/접힘 상태, 활성 워크스페이스 ID | 가능 — 워크스페이스와 탭이 모두 사라짐 |
hooks.json |
Claude Code --settings 매핑 (이벤트 → 스크립트) + statusLine.command |
가능 — 다음 시작 시 재생성 |
status-hook.sh, statusline.sh |
x-pmux-token 헤더로 /api/status/hook·/api/status/statusline에 POST |
가능 — 다음 시작 시 재생성 |
rate-limits.json |
최신 Claude statusline JSON: ts, model, five_hour, seven_day, context, cost |
가능 — Claude 동작 시 다시 채워짐 |
session-history.json |
마지막 200개의 완료된 Claude 세션 (프롬프트, 결과, 시간, 도구, 파일) | 가능 — 히스토리 초기화 |
quick-prompts.json, sidebar-items.json |
빌트인 위에 얹는 { custom: […], disabledBuiltinIds: […], order: […] } 오버레이 |
가능 — 기본값으로 복원 |
vapid-keys.json |
첫 실행 시 생성되는 Web Push VAPID 키페어 | 권장 안 함 — 함께 push-subscriptions.json도 지워야 함 (기존 구독 깨짐) |
push-subscriptions.json |
브라우저별 푸시 엔드포인트 | 가능 — 각 디바이스에서 다시 구독 필요 |
cli-token |
purplemux CLI와 훅 스크립트가 사용하는 32바이트 hex 토큰 (x-pmux-token 헤더) |
가능 — 다음 시작 시 재생성. 이미 만들어진 훅 스크립트는 서버가 덮어쓸 때까지 옛 토큰 사용 |
port |
평문 현재 포트, 훅 스크립트와 CLI가 읽음 | 가능 — 다음 시작 시 재생성 |
pmux.lock |
단일 인스턴스 가드 { pid, port, startedAt } |
purplemux 프로세스가 살아있지 않을 때만 |
워크스페이스별 디렉토리 (workspaces/{wsId}/)
각 워크스페이스는 자동 생성된 ID를 이름으로 갖는 폴더 하나를 사용합니다.
| 파일 | 내용 |
|---|---|
layout.json |
재귀적 pane/tab 트리: leaf pane은 tabs[], split은 ratio와 children[]. 각 탭은 tmux 세션 이름(pt-{wsId}-{paneId}-{tabId}), 캐시된 cliState, claudeSessionId, 마지막 resume 커맨드를 보관 |
message-history.json |
워크스페이스별 Claude 입력 히스토리. 최대 500건 |
claude-prompt.md |
해당 워크스페이스의 모든 Claude 탭에 전달되는 --append-system-prompt-file 내용. 워크스페이스 생성/이름변경/디렉토리 변경 시 재생성 |
특정 워크스페이스의 레이아웃만 초기화하려면 다른 워크스페이스를 건드리지 않고 workspaces/{wsId}/layout.json만 삭제하면 됩니다 (기본 pane으로 복원).
logs/
pino-roll 출력. UTC 기준 하루에 한 파일, 크기 한도를 넘으면 숫자 접미사가 붙습니다.
logs/purplemux.2026-04-19.1.log
기본 레벨은 info. LOG_LEVEL로 전체를, LOG_LEVELS로 모듈별로 조정합니다 — 자세한 내용은 포트 & 환경변수 참고.
로그는 7일 분량까지 자동 로테이트됩니다. 언제든 지워도 괜찮습니다.
uploads/
채팅 입력바에 첨부한 이미지(드래그/붙여넣기/클립 버튼):
uploads/{wsId}/{tabId}/{timestamp}-{rand}-{name}.{ext}
- 허용 MIME:
image/png,image/jpeg,image/gif,image/webp - 최대 10 MB, 모드
0600 - 서버 시작 시 자동 청소: 24시간 이상 된 파일은 삭제
- 수동 청소: 설정 → 시스템 → 첨부 이미지 → 지금 정리
stats/
순수 캐시. ~/.claude/projects/**/*.jsonl을 기반으로 계산하며, purplemux는 해당 디렉토리를 읽기만 합니다.
| 파일 | 내용 |
|---|---|
cache.json |
일별 집계: 메시지, 세션, 도구 호출, 시간대별 카운트, 모델별 토큰 사용량 |
uptime-cache.json |
일별 uptime/액티브 분 집계 |
daily-reports/{YYYY-MM-DD}.json |
AI 생성 데일리 브리프 |
폴더를 통째로 지우면 다음 통계 요청 시 재계산됩니다.
리셋 매트릭스
| 초기화 대상 | 삭제 |
|---|---|
| 로그인 비밀번호 (재온보딩) | config.json |
| 모든 워크스페이스와 탭 | workspaces.json + workspaces/ |
| 한 워크스페이스의 레이아웃 | workspaces/{wsId}/layout.json |
| 사용량 통계 | stats/ |
| 푸시 구독 | push-subscriptions.json |
| "already running" 멈춤 | pmux.lock (프로세스가 없을 때만) |
| 전체 (공장 초기화) | ~/.purplemux/ |
hooks.json, status-hook.sh, statusline.sh, port, cli-token, vapid-keys.json은 모두 다음 시작 시 자동 재생성되므로 지워도 무해합니다.
백업
전체가 평문 JSON과 몇 개의 셸 스크립트입니다. 백업:
tar czf purplemux-backup.tgz -C ~ .purplemux
새 머신에서 복원하려면 untar 후 purplemux를 시작합니다. 훅 스크립트는 새 서버 포트로 재작성되고, 워크스페이스·히스토리·설정은 그대로 옮겨집니다.
전체 삭제
rm -rf ~/.purplemux
먼저 purplemux가 실행 중이지 않은지 확인하세요. 다음 실행은 첫 실행 경험으로 다시 시작됩니다.