Каталог данных
Что лежит в ~/.purplemux/, что можно безопасно удалить и как сделать резервную копию.
Каждый кусочек устойчивого состояния, который держит purplemux — настройки, раскладки, история сессий, кэши — лежит в ~/.purplemux/. Больше нигде. Никаких localStorage, никакого системного keychain, никакого внешнего сервиса.
Раскладка с одного взгляда
~/.purplemux/
├── config.json # конфиг приложения (auth, тема, локаль, …)
├── workspaces.json # список рабочих пространств + состояние боковой панели
├── workspaces/
│ └── {wsId}/
│ ├── layout.json # дерево панелей/вкладок
│ ├── 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 # последний JSON statusline
├── session-history.json # лог завершённых сессий Claude (между рабочими пространствами)
├── quick-prompts.json # кастомные быстрые промпты + отключённые встроенные
├── sidebar-items.json # кастомные элементы боковой панели + отключённые встроенные
├── vapid-keys.json # пара VAPID-ключей Web Push (генерируется)
├── push-subscriptions.json # подписки Web Push на эндпоинты
├── cli-token # CLI auth-токен (генерируется)
├── port # текущий порт сервера
├── pmux.lock # блокировка единственного экземпляра {pid, port, startedAt}
├── logs/ # логи pino-roll
├── uploads/ # изображения, прикреплённые через строку ввода
└── stats/ # кэш статистики использования Claude
Файлы с секретами (config, токены, раскладки, VAPID-ключи, lock) пишутся с режимом 0600 через паттерн tmpFile → rename.
Файлы верхнего уровня
| Файл | Что хранит | Безопасно удалить? |
|---|---|---|
config.json |
scrypt-хеш пароля для логина, HMAC-секрет сессии, тема, локаль, размер шрифта, переключатель уведомлений, URL редактора, сетевой доступ, custom CSS | Да — перезапускает онбординг |
workspaces.json |
Индекс рабочих пространств, ширина / свернутость боковой панели, ID активного рабочего пространства | Да — стирает все рабочие пространства и вкладки |
hooks.json |
Маппинг --settings Claude Code (event → script) + statusLine.command |
Да — регенерируется при следующем старте |
status-hook.sh, statusline.sh |
POST на /api/status/hook и /api/status/statusline с x-pmux-token |
Да — регенерируется при следующем старте |
rate-limits.json |
Последний JSON statusline Claude: 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 |
Пара VAPID-ключей Web Push, генерируется при первом запуске | Не удаляйте без push-subscriptions.json (существующие подписки сломаются) |
push-subscriptions.json |
Push-эндпоинты по браузерам | Да — переподписаться на каждом устройстве |
cli-token |
32-байтовый hex-токен для CLI purplemux и скриптов хуков (заголовок x-pmux-token) |
Да — регенерируется при следующем старте, но уже сгенерированный скрипт хука сохраняет старый токен, пока сервер его не перезапишет |
port |
Текущий порт plain-text, читается скриптами хуков и CLI | Да — регенерируется при следующем старте |
pmux.lock |
Защита единственного экземпляра { pid, port, startedAt } |
Только если ни один процесс purplemux не жив |
Каталог рабочего пространства (workspaces/{wsId}/)
У каждого рабочего пространства своя папка, названная по сгенерированному ID.
| Файл | Содержимое |
|---|---|
layout.json |
Рекурсивное дерево панелей/вкладок: листовые узлы pane с tabs[], узлы split с children[] и ratio. Каждая вкладка несёт имя tmux-сессии (pt-{wsId}-{paneId}-{tabId}), кэшированный cliState, claudeSessionId, последнюю команду resume. |
message-history.json |
История ввода Claude в этом рабочем пространстве. Лимит — 500 записей. |
claude-prompt.md |
Содержимое --append-system-prompt-file, передаваемое каждой вкладке Claude в этом рабочем пространстве. Регенерируется при создании / переименовании / смене каталога. |
Удалите один workspaces/{wsId}/layout.json, чтобы сбросить раскладку только этого рабочего пространства до панели по умолчанию, не трогая остальные.
logs/
Вывод Pino-roll, по одному файлу на UTC-сутки, с числовым суффиксом при превышении лимитов размера:
logs/purplemux.2026-04-19.1.log
Уровень по умолчанию — info. Переопределите через LOG_LEVEL или попроще на модуль через LOG_LEVELS — см. Порты и переменные окружения.
Логи ротируются еженедельно (предел 7 файлов). Можно удалять в любое время.
uploads/
Изображения, прикреплённые через строку ввода (drag, paste, скрепка):
uploads/{wsId}/{tabId}/{timestamp}-{rand}-{name}.{ext}
- Разрешено:
image/png,image/jpeg,image/gif,image/webp - Максимум 10 МБ на файл, режим
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-подписки | push-subscriptions.json |
| Застрявшее «already running» | pmux.lock (только если процесс не жив) |
| Всё (factory reset) | ~/.purplemux/ |
hooks.json, status-hook.sh, statusline.sh, port, cli-token и vapid-keys.json все авто-регенерируются при следующем старте, поэтому удаление безвредно.
Резервные копии
Весь каталог — это plain JSON плюс несколько shell-скриптов. Чтобы забэкапить:
tar czf purplemux-backup.tgz -C ~ .purplemux
Чтобы восстановить на свежей машине, распакуйте и запустите purplemux. Скрипты хуков перепишутся с портом нового сервера; всё остальное (рабочие пространства, история, настройки) переезжает как есть.
Полная очистка
rm -rf ~/.purplemux
Сначала убедитесь, что purplemux не запущен. Следующий запуск снова будет первым.
Что дальше
- Порты и переменные окружения — каждая переменная, влияющая на этот каталог.
- Архитектура — как файлы связаны с работающим сервером.
- Поиск проблем — типичные проблемы и решения.