# purplemux
**Claude Code et Codex, plusieurs tâches en même temps. En plus rapide.**
Toutes vos sessions sur un seul écran. Sans coupure, même depuis le téléphone.
Français | English | 한국어 | 日本語 | 简体中文 | 繁體中文 | Deutsch | Español | Русский | Português (Brasil) | Türkçe


## Installation
```bash
npx purplemux@latest
```
Ouvrez [http://localhost:8022](http://localhost:8022) dans votre navigateur. C'est tout.
> Nécessite Node.js 20+ et tmux. macOS ou Linux.
Vous préférez une app native ? Récupérez la build Electron macOS depuis la [dernière release](https://github.com/subicura/purplemux/releases/latest) (`.dmg` pour Apple Silicon et Intel).
## Pourquoi purplemux
- **Tableau de bord multi-session** — Visualisez d'un coup d'œil l'état « en cours / en attente d'entrée » de toutes vos sessions Claude Code et Codex
- **Suivi des limites** — Solde 5 heures / 7 jours avec compte à rebours de réinitialisation
- **Notifications push** — Alertes desktop et mobiles lorsqu'une tâche se termine ou attend une entrée
- **Mobile et multi-appareil** — Accédez à la même session depuis un téléphone, une tablette ou un autre poste
- **Vue de session en direct** — Plus besoin de faire défiler la sortie CLI : la progression est présentée sous forme de chronologie
Et aussi
- **Sessions ininterrompues** — Basé sur tmux. Fermez le navigateur, tout reste en place. À la reconnexion, vos onglets, panneaux et répertoires sont exactement là où vous les aviez laissés
- **Auto-hébergé et open source** — Le code et les données de session ne quittent jamais votre machine. Aucun serveur externe
- **Accès distant chiffré** — HTTPS depuis n'importe où via Tailscale
## Différences avec le Remote Control officiel
> Le Remote Control officiel se concentre sur le contrôle distant d'une session unique. Utilisez purplemux lorsque vous avez besoin de gestion multi-session, de notifications push et de persistance des sessions.
## Fonctionnalités
### Terminal
- **Panneaux scindés** — Découpe horizontale / verticale libre, redimensionnement par glisser
- **Gestion des onglets** — Onglets multiples, réorganisation par glisser, titres automatiques basés sur les noms de processus
- **Raccourcis clavier** — Découpe, changement d'onglet, déplacement du focus
- **Thèmes du terminal** — Mode sombre / clair, plusieurs palettes de couleurs
- **Workspaces et groupes** — Sauvegardez et restaurez la disposition des panneaux, onglets et répertoires par workspace. Organisez les workspaces en groupes par glisser-déposer
- **Flux de travail Git** — Side-by-side / Line-by-line avec coloration syntaxique, expansion des hunks en ligne et un onglet d'historique paginé. Fetch / pull / push depuis le panneau, avec indicateurs ahead/behind — si la synchronisation échoue (dirty worktree, conflits), Ask Claude ou Codex en un clic
- **Panneau navigateur web** — Navigateur intégré à côté du terminal pour vérifier le rendu du développement (Electron). Pilotable depuis la CLI `purplemux` et changement de viewport via un émulateur d'appareil intégré
- **Onglets d'agents** — Lancez Claude, Codex ou une liste de sessions combinée depuis le menu nouvel onglet
### Intégration Claude Code et Codex
- **État en temps réel** — Indicateurs en cours / en attente d'entrée, bascule entre sessions
- **Vue de session en direct** — Messages, appels d'outils, tâches, demandes de permission, blocs thinking
- **Onglets Codex** — Lancez des sessions Codex CLI avec la même persistance basée sur tmux que Claude
- **Liste de sessions** — Parcourez et reprenez les sessions Claude et Codex récentes depuis une vue combinée
- **Reprise en un clic** — Reprenez une session Claude ou Codex suspendue directement depuis le navigateur
- **Reprise automatique** — Restauration automatique des sessions Claude au démarrage du serveur
- **Prompts rapides** — Enregistrez vos prompts récurrents et envoyez-les en un clic
- **Pièces jointes** — Déposez des images dans le champ de chat, ou attachez des fichiers pour insérer leur chemin. Fonctionne aussi sur mobile
- **Historique des messages** — Réutilisez vos anciens messages
- **Statistiques d'usage** — Tokens Claude + Codex, coût, ventilation par projet, rapports IA quotidiens
- **Rate limits** — Solde 5 heures / 7 jours avec compte à rebours de réinitialisation pour les fournisseurs pris en charge
### Mobile et accessibilité
- **Interface responsive** — Terminal et chronologie sur téléphone et tablette
- **PWA** — Ajoutez à l'écran d'accueil pour une expérience proche d'une application native
- **Web Push** — Recevez des notifications même après avoir fermé l'onglet
- **Synchronisation multi-appareil** — Les modifications de workspace sont répercutées en temps réel
- **Tailscale** — Accès HTTPS externe via un tunnel chiffré WireGuard
- **Authentification par mot de passe** — Hachage scrypt, sûr même en exposition publique
- **Multilingue** — 11 langues dont 한국어, English, 日本語, 中文
## Plateformes prises en charge
| Plateforme | État | Notes |
|---|---|---|
| macOS (Apple Silicon / Intel) | ✅ | Application Electron incluse |
| Linux | ✅ | Sans Electron |
| Windows | ❌ | Non pris en charge |
## Détails d'installation
### Prérequis
- macOS 13+ ou Linux
- [Node.js](https://nodejs.org/) 20+
- [tmux](https://github.com/tmux/tmux)
Requis pour les onglets Claude. Installez Claude Code et connectez-vous avant de démarrer un onglet Claude :
```bash
curl -fsSL https://claude.ai/install.sh | bash
# ou avec le canal latest de Homebrew
brew install --cask claude-code@latest
```
Optionnel pour les onglets Codex. Installez Codex CLI et connectez-vous avant de démarrer un onglet Codex :
```bash
npm i -g @openai/codex
# ou
brew install --cask codex
```
### npx (le plus rapide)
```bash
npx purplemux@latest
```
### Installation globale
```bash
npm install -g purplemux
purplemux
```
### Exemples CLI
```bash
purplemux tab create -w WS -t codex-cli -n "fix auth"
purplemux tab create -w WS -t agent-sessions
```
### Depuis les sources
```bash
git clone https://github.com/subicura/purplemux.git
cd purplemux
pnpm install
pnpm start
```
Mode développement :
```bash
pnpm dev
```
#### Niveau de log
Définissez le niveau global avec `LOG_LEVEL` (par défaut `info`).
```bash
LOG_LEVEL=debug pnpm dev
```
Pour n'activer que certains modules, listez les paires `module=niveau` séparées par des virgules dans `LOG_LEVELS`. Niveaux disponibles : `trace` / `debug` / `info` / `warn` / `error` / `fatal`.
```bash
# Trace uniquement le comportement des hooks Claude Code en debug
LOG_LEVELS=hooks=debug pnpm dev
# Plusieurs modules simultanément
LOG_LEVELS=hooks=debug,status=warn pnpm dev
```
Les modules absents de `LOG_LEVELS` reprennent la valeur de `LOG_LEVEL`.
## Accès externe (Tailscale Serve)
```bash
tailscale serve --bg 8022
```
Accédez à `https://..ts.net`. Pour désactiver :
```bash
tailscale serve --bg off 8022
```
## Sécurité
### Mot de passe
Définissez un mot de passe au premier accès. Il est haché avec scrypt et stocké dans `~/.purplemux/config.json`.
Pour le réinitialiser, supprimez `~/.purplemux/config.json` puis redémarrez : l'écran d'onboarding réapparaît.
### HTTPS
Par défaut, le protocole est HTTP. Utilisez impérativement HTTPS en exposition publique :
- **Tailscale Serve** — Chiffrement WireGuard et certificats automatiques
- **Nginx / Caddy** — Doit transmettre les en-têtes d'upgrade WebSocket (`Upgrade`, `Connection`)
### Répertoire de données (`~/.purplemux/`)
| Fichier | Description |
|---|---|
| `config.json` | Identifiants (hachés) et paramètres de l'application |
| `workspaces.json` | Dispositions des workspaces, onglets, répertoires |
| `vapid-keys.json` | Clés VAPID Web Push (générées automatiquement) |
| `push-subscriptions.json` | Informations d'abonnement push |
| `hooks/` | Hooks définis par l'utilisateur |
## Architecture
```
┌─────────────────────────────────────────────────────────────┐
│ Browser │
│ ┌───────────┐ ┌───────────┐ ┌──────────┐ ┌─────────────┐ │
│ │ xterm.js │ │ Timeline │ │ Status │ │ Multi-device│ │
│ │ Terminal │ │ │ │ │ │ Sync │ │
│ └─────┬─────┘ └─────┬─────┘ └────┬─────┘ └──────┬──────┘ │
└────────┼─────────────┼────────────┼──────────────┼──────────┘
│ws │ws │ws │ws
│/terminal │/timeline │/status │/sync
▼ ▼ ▼ ▼
┌─────────────────────────────────────────────────────────────┐
│ Node.js Server (:8022) │
│ ┌──────────┐ ┌───────────────┐ ┌─────────────────────┐ │
│ │ node-pty │ │ JSONL Watcher │ │ Status Manager │ │
│ │ PTY↔WS │ │ File watch → │ │ Process tree + │ │
│ │ Binary │ │ Parse → Send │ │ JSONL tail analysis │ │
│ └────┬─────┘ └───────┬───────┘ └──────────┬──────────┘ │
└───────┼────────────────┼─────────────────────┼──────────────┘
▼ ▼ ▼
┌─────────────────────────────────────────────────────────────┐
│ System │
│ tmux (purple socket) Agent CLIs │
│ ┌────────┐ ┌────────┐ ┌────────────────────────────┐ │
│ │Session1│ │Session2│ ... │ Claude Code │ │
│ │ (shell)│ │ (shell)│ │ ~/.claude/projects/*.jsonl │ │
│ └────────┘ └────────┘ │ Codex │ │
│ │ ~/.codex/sessions/*.jsonl │ │
│ └────────────────────────────┘ │
└─────────────────────────────────────────────────────────────┘
```
**E/S du terminal** — xterm.js se connecte à node-pty via WebSocket, puis node-pty s'attache aux sessions tmux. Un protocole binaire gère stdin/stdout/resize avec contrôle de backpressure.
**Détection d'état** — Les hooks d'événements des agents envoient des mises à jour immédiates en HTTP POST. Claude Code utilise `SessionStart`, `Stop` et `Notification`; Codex utilise `SessionStart`, `UserPromptSubmit`, `PreToolUse`, `PostToolUse`, `Stop` et `PermissionRequest`. Toutes les 5–15 s, l'arbre de processus est inspecté et les 8 derniers Ko des fichiers JSONL sont analysés.
**Chronologie** — Surveille les logs de session JSONL sous `~/.claude/projects/` et `~/.codex/sessions/`, parse les nouvelles lignes à chaque changement et diffuse des entrées structurées vers le navigateur.
**Isolation tmux** — Utilise un socket `purple` dédié, totalement séparé de votre tmux existant. Pas de touche préfixe ni de barre d'état.
**Reprise automatique** — Au démarrage du serveur, les sessions Claude précédentes sont restaurées via `claude --resume {sessionId}`. Les sessions Codex peuvent être reprises depuis la liste des sessions ou avec `codex resume {sessionId}`.
## License
[MIT](LICENSE)