보안과 인증
purplemux가 대시보드를 보호하는 방식 — scrypt 해시 비밀번호, 로컬 전용 데이터, 외부 접속 시 HTTPS.
purplemux는 셀프 호스팅 방식이며 모든 데이터가 사용자의 머신에 머무릅니다. 외부 서버도, 텔레메트리도, 클라우드 계정도 없습니다. 아래는 대시보드를 실제로 지키는 몇 안 되는 장치들입니다.
비밀번호 설정
처음 purplemux를 열면 온보딩 화면이 비밀번호를 입력받습니다. 제출 후:
- 비밀번호는 scrypt로 해싱됩니다 (랜덤 16바이트 salt, 64바이트 derived key).
- 해시는
~/.purplemux/config.json에scrypt:{salt}:{hash}형태로 저장됩니다 — 평문은 어디에도 저장되지 않습니다. - 별도의
authSecret(랜덤 hex)이 함께 생성되며, 로그인 후 발급되는 세션 쿠키 서명에 사용됩니다.
이후 접속에는 로그인 화면이 나타나고, crypto.timingSafeEqual로 저장된 해시와 비교합니다.
비밀번호 재설정
잊어버렸다면 호스트에 셸 접근만 있으면 됩니다.
rm ~/.purplemux/config.json
purplemux를 재시작하면 (pnpm start, npx purplemux 등 평소 실행 방법) 온보딩 화면이 다시 나타나 새 비밀번호를 설정할 수 있습니다.
이 작업은 같은 파일에 저장된 다른 설정(테마, 언어, 폰트 크기, 알림 토글 등)도 함께 초기화합니다. 워크스페이스와 탭은 workspaces.json과 workspaces/ 디렉토리에 들어 있으니 레이아웃은 영향받지 않습니다.
외부 접속에는 HTTPS
기본 바인드는 localhost이고 평문 HTTP로 서빙됩니다. 같은 머신에서 쓸 때는 문제가 없지만, 다른 기기에서 접근하는 순간부터는 HTTPS가 기본입니다.
- Tailscale Serve 권장 — WireGuard 암호화에 Let's Encrypt 인증서 자동 발급. Tailscale 접속 참고.
- 리버스 프록시 (Nginx, Caddy 등)도 가능 — WebSocket의
Upgrade,Connection헤더를 반드시 포워딩해야 합니다.
iOS Safari는 PWA 설치와 Web Push 등록에 HTTPS를 추가로 요구합니다. PWA 설정, 웹 푸시 참고.
~/.purplemux/에 있는 것
모두 로컬에 있습니다. 민감 파일의 권한은 0600입니다.
| 파일 | 내용 |
|---|---|
config.json |
scrypt 비밀번호 해시, 세션 secret, 앱 환경 설정 |
workspaces.json + workspaces/ |
워크스페이스 목록과 워크스페이스별 pane/탭 레이아웃 |
vapid-keys.json |
Web Push VAPID 키페어 (자동 생성) |
push-subscriptions.json |
기기별 푸시 구독 정보 |
cli-token |
훅과 CLI가 로컬 서버와 통신할 때 쓰는 공유 토큰 |
pmux.lock |
단일 인스턴스 락 (pid, port, startedAt) |
logs/ |
pino-roll 로그 파일 |
전체 목록과 리셋 표는 source-of-truth인 docs/DATA-DIR.md에 정리되어 있습니다.
텔레메트리 없음
purplemux 자체가 외부로 보내는 요청은 없습니다. 발생하는 네트워크 호출은 다음뿐입니다.
- 사용자가 구독한 Web Push 알림 — OS 푸시 서비스로 전달됩니다.
- Claude CLI 자체가 하는 통신 — Anthropic과 사용자 사이의 일이며 purplemux와 무관합니다.
코드와 세션 데이터는 머신을 벗어나지 않습니다.
다음으로
- Tailscale 접속 — 외부 HTTPS의 안전한 경로
- PWA 설정 — 인증 정리 후 홈 화면에 설치
- 웹 푸시 알림 — 백그라운드 알림