J’ai trois sessions de Claude Code ouvertes en ce moment. Une traduit des posts de blog. Une autre écrit des tests pour une CLI. La troisième m’aide à déboguer un pipeline de données. Chacune dans son propre worktree, chacune dans son propre split de Ghostty, et moi je navigue entre elles avec Cmd+Alt+Flèches.
Je n’ai pas ouvert iTerm2 depuis des mois. Je n’ai pas touché tmux depuis des semaines. Tout vit dans une seule fenêtre Ghostty.
Est-ce le setup parfait ? Non. Est-ce celui qui me rend le plus productif que j’aie jamais eu ? Sans aucun doute.
Pourquoi Ghostty et pas un autre terminal
Je vais être direct : Ghostty bouffe la batterie comme s’il minait du Bitcoin. Je l’ai déjà raconté en détail dans le post sur les terminaux GPU et la batterie. Ça n’a pas changé et c’est son plus gros défaut. Si je suis sur batterie, je ferme Ghostty et j’ouvre Terminal.app sans réfléchir.
Mais quand je suis branché — ce qui représente 80% du temps à mon bureau avec le Studio Display — Ghostty gagne pour deux raisons qui n’ont rien à voir avec des fioritures esthétiques :
1. Il ne scintille pas. Ça semble idiot jusqu’à ce que tu passes huit heures par jour à regarder un terminal. iTerm2 a des micro-scintillements lors du scroll rapide, des artefacts au redimensionnement, un flicker subtil au changement d’onglet. Terminal.app est pire. Ghostty, en rendant avec le GPU, a une fluidité visuelle qui ne fatigue pas les yeux. Quand Claude Code te crache 200 lignes d’output et que tu fais du scroll pour le réviser, la différence entre un terminal qui scintille et un qui ne scintille pas, c’est la différence entre lire un livre et lire un livre avec quelqu’un qui allume et éteint la lumière.
2. Tu peux lui donner un buffer énorme. Avec scrollback-limit = 50000 j’ai 50'000 lignes d’historique par panneau. Claude Code est verbeux : il génère du code, l’explique, l’exécute, montre l’output, et parfois se lance pendant des centaines de lignes. Avec iTerm2 ou Terminal.app, le scrollback par défaut est insuffisant et tu perds le contexte. Avec Ghostty, je peux faire du scroll jusqu’au début d’une session d’il y a deux heures et trouver exactement ce dont j’ai besoin.
Ensuite il y a des extras sympas — splits natifs avec Cmd+D, Quick Terminal style Quake avec `Ctrl+`` — mais c’est la cerise. Le gâteau, c’est ne pas scintiller et ne pas perdre l’historique.
L’anatomie de ma fenêtre
Quand je suis en mode “parallèle” — plusieurs tâches indépendantes à la fois — ma fenêtre Ghostty ressemble à ça :
┌──────────────────────────────────┬──────────────────────────────────┐
│ │ │
│ Claude Code (worktree A) │ Claude Code (worktree B) │
│ feature/nouvelle-validation │ chore/traductions │
│ │ │
│ │ │
├──────────────────────────────────┴──────────────────────────────────┤
│ │
│ Repo principal (main) — tests, builds, git log │
│ │
└─────────────────────────────────────────────────────────────────────┘
Deux splits en haut, chacun avec un agent dans son worktree. Un split en bas avec main où je lance les tests, regarde les diffs, et fais les merges quand les agents terminent.
Le Quick Terminal (Ctrl+``) je l'utilise pour des trucs qui durent trois secondes : regarder le *backlog* dans Linear, vérifier l'état d'un deploy, lancer un make validate` rapide.
Comment monter ça étape par étape
1. Configurer Ghostty pour le développement
Mon ~/.config/ghostty/config a l’indispensable pour ce flux :
# Shell
command = /opt/homebrew/bin/fish
shell-integration = fish
# Police lisible pour les sessions longues
font-family = JetBrainsMono Nerd Font
font-size = 15
font-thicken = true
# Quick Terminal (dropdown style Quake)
keybind = global:ctrl+grave_accent=toggle_quick_terminal
quick-terminal-position = bottom
quick-terminal-animation-duration = 0.15
# Splits
keybind = cmd+d=new_split:right
keybind = cmd+shift+d=new_split:down
keybind = cmd+alt+left=goto_split:left
keybind = cmd+alt+right=goto_split:right
keybind = cmd+alt+up=goto_split:top
keybind = cmd+alt+down=goto_split:down
# Zoom split (toggle fullscreen d'un panneau)
keybind = cmd+shift+enter=toggle_split_zoom
# Sauter entre prompts de Claude Code (game changer)
keybind = cmd+up=jump_to_prompt:-1
keybind = cmd+down=jump_to_prompt:1
# Transparence fonctionnelle
background-opacity = 0.92
background-blur = 20
# Scrollback généreux (Claude crache beaucoup d'output)
scrollback-limit = 50000
# Sans scintillements inutiles
cursor-style-blink = false
La plupart sont des valeurs par défaut raisonnables, mais il y en a deux qui méritent une mention spéciale.
jump_to_prompt c’est ce qui te permet de sauter entre les réponses de Claude Code avec Cmd+Haut et Cmd+Bas. Quand une session dure depuis 40 minutes et que tu veux réviser quelque chose que Claude a dit il y a un moment, au lieu de faire du scroll pendant une demi-minute, tu sautes directement au prompt précédent. C’est génial.
toggle_split_zoom te permet de faire du fullscreen d’un split spécifique sans fermer les autres. Tu révises un diff long dans le split gauche, tu appuies sur Cmd+Shift+Enter, il s’étend à toute la fenêtre. Tu révises, tu rappuies, et tout reste où c’était.
2. Créer les worktrees
J’ai déjà écrit sur ce que sont les worktrees et sur les astuces de Claude Code avec eux. Voici le résumé de ce que je fais chaque matin :
# Depuis le repo principal
cd ~/code/mon-projet
# Créer des worktrees pour les tâches du jour
git worktree add ../mon-projet-feat-a -b feature/validation
git worktree add ../mon-projet-traductions -b chore/traductions
Convention de nommage : le repo original sans suffixe c’est main. Chaque worktree porte le nom du repo plus un suffixe descriptif. Un ls ~/code/mon-projet* me montre tout d’un coup d’œil.
3. Ouvrir les splits et lancer les agents
# Split 1 (je suis déjà là) : repo principal
cd ~/code/mon-projet
# Cmd+D → split vertical
cd ~/code/mon-projet-feat-a
claude
# Cmd+Alt+Left → retour au split original
# Cmd+Shift+D → split horizontal en dessous
cd ~/code/mon-projet-traductions
claude
En moins d’une minute j’ai la fenêtre montée avec trois splits et deux agents qui bossent.
4. Superviser et merger
Le split de main est le centre de commande. De là :
# Voir quels worktrees sont vivants
git worktree list
# Voir les changements d'un agent (sans changer de split)
git diff feature/validation
# Quand un agent termine : merge
git merge feature/validation
# Nettoyer
git worktree remove ../mon-projet-feat-a
git branch -d feature/validation
Je n’ai pas besoin de changer de split pour voir les diffs. Tous les worktrees partagent la même base de données git, donc depuis main je peux voir toutes les branches et leurs changements.
Ce que j’ai appris après deux mois avec ce setup
Le zoom de split sauve des vies
Quand un agent génère un diff de 200 lignes et que tu veux le réviser tranquillement, le split devient trop petit. Cmd+Shift+Enter l’étend à toute la fenêtre. Tu révises, tu approuves ou demandes des changements, et tu reviens au layout à trois splits. Sans perdre aucune session.
Le Quick Terminal c’est pour ce qui ne mérite pas un split
Au début je mettais tout dans des splits. Erreur. Je finissais avec cinq panneaux minuscules où on ne voyait rien. Maintenant la règle est simple : si la tâche dure plus d’une minute, elle mérite un split. Sinon, Quick Terminal.
Ctrl+` → git log --oneline -5 → Ctrl+`
Il apparaît, tu exécutes, il disparaît. Sans salir le layout.
Pas plus de trois splits simultanés
J’ai essayé avec quatre et cinq splits. Ça ne marche pas. Sur un écran de 27 pouces, trois c’est le maximum avant que chaque panneau soit si étroit que l’output de Claude devient illisible. Sur un portable de 14 pouces, deux c’est la limite pratique.
Si j’ai besoin de plus de trois tâches en parallèle, j’utilise Cmd+T pour un nouvel onglet et je répète le layout là. Ghostty maintient l’état de tous les onglets, donc je peux fermer l’écran et à l’ouverture tout est exactement comme je l’ai laissé (window-save-state = always).
Les worktrees ont besoin de leur .env
Chaque worktree est un répertoire de travail indépendant. Ça veut dire que ton .env.local, ton .claude/settings.json local, n’importe quel fichier qui n’est pas dans git… n’existe pas dans le nouveau worktree.
Mon petit hack : un script Fish qui copie le nécessaire à la création d’un worktree :
function wt --description "Crée worktree avec fichiers locaux"
set -l branch $argv[1]
set -l dir (basename (pwd))-$branch
git worktree add ../$dir -b $branch
# Copier fichiers locaux qui ne sont pas dans git
for f in .env.local .claude/settings.json
if test -f $f
cp $f ../$dir/$f
end
end
echo "Worktree prêt dans ../$dir"
end
Ce n’est pas élégant, mais ça marche. Je pourrais utiliser des symlinks, mais je préfère des copies indépendantes : si un agent change quelque chose dans .env.local (ce qu’il ne devrait pas, mais on ne sait jamais), je ne veux pas que ça affecte les autres.
Ghostty + Claude Code a une astuce cachée
L’intégration de shell de Ghostty (shell-integration = fish) permet au terminal de savoir où commence et finit chaque prompt. C’est ce qui rend possible jump_to_prompt. Mais l’effet de bord c’est que tu peux sélectionner l’output d’une commande complète avec un seul clic dans la marge gauche.
Quand Claude Code te crache un bloc de code et que tu veux le copier, au lieu de sélectionner manuellement (et risquer d’inclure le prompt ou de couper une ligne), tu cliques dans la marge et tout l’output de la dernière commande se sélectionne. Cmd+C et c’est bon.
Ce n’est documenté nulle part, mais une fois que tu le découvres tu ne peux plus vivre sans.
Quand je N’utilise PAS ce setup
Sur batterie. C’est le prix de Ghostty et il n’y a pas de solution : le rendu GPU consomme ce qu’il consomme. Je l’ai mesuré en détail dans Ton terminal brûle la batterie comme s’il minait du Bitcoin et les chiffres sont obscènes. Si je suis dans un café avec le portable, je ferme Ghostty et j’ouvre Terminal.app. Le flux est moins bon, mais la batterie dure trois fois plus longtemps.
Pour des tâches séquentielles. Si la tâche B dépend de la tâche A, je ne gagne rien avec les worktrees. Un seul split avec un seul agent suffit. Les worktrees c’est pour du parallélisme réel, pas pour se sentir productif.
Quand je ne connais pas bien le problème. Si je ne sais pas exactement ce que je veux que chaque agent fasse, lancer trois agents en parallèle c’est une recette pour le chaos. D’abord j’explore dans un seul split, je comprends le problème, et seulement quand j’ai des tâches claires et indépendantes je monte le layout à trois.
La vue d’ensemble
flowchart LR
subgraph Ghostty[" Ghostty "]
direction TB
subgraph Splits[" Splits Cmd+D / Cmd+Shift+D "]
direction LR
S1[" Split 1 \nClaude Code\nworktree A"]
S2[" Split 2 \nClaude Code\nworktree B"]
S3[" Split 3 \nmain\ntests + merges"]
end
QT[" Quick Terminal Ctrl+` \ngit status, linear, make validate"]
end
subgraph Git[" Git "]
direction TB
G1[".git/\n(partagé)"]
W1["worktree A\nfeature/x"]
W2["worktree B\nchore/y"]
W3["main"]
end
S1 --> W1
S2 --> W2
S3 --> W3
W1 --> G1
W2 --> G1
W3 --> G1
style Ghostty fill:#1a1a2e,stroke:#4a9eed,color:#fff
style Git fill:#1a2e1a,stroke:#4aed5c,color:#fff
style Splits fill:#2d3748,stroke:#4a9eed,color:#fff
Ghostty comme multiplexeur visuel. Worktrees comme multiplexeur git. Claude Code comme force de travail. Chaque pièce fait une chose et la fait bien.
Je n’ai pas besoin de tmux parce que Ghostty multiplexe déjà. Je n’ai pas besoin de cloner des repos parce que les worktrees partagent déjà. Je n’ai pas besoin de changer de branche parce que chaque split est un répertoire différent.
C’est la première fois depuis des années que je sens que mon terminal ne me gêne pas. Que le flux de pensée — “je veux faire avancer trois trucs à la fois” — se traduit directement en actions sans cérémonie, sans boilerplate, sans frictions.
Est-ce parfait ? Non. La batterie reste un problème. Cinq splits c’est trop. Et de temps en temps un worktree reste orphelin et je dois faire git worktree prune.
Mais on ne vit pas de perfections. On vit de ce qui marche. Et ça, ça marche du tonnerre.
TL;DR : Ghostty pour les splits et Quick Terminal (sans tmux). Git worktrees pour avoir plusieurs checkouts en parallèle (sans cloner). Claude Code dans chaque split, chacun dans son worktree. Cmd+D pour diviser, Cmd+Alt+Flèches pour naviguer, Cmd+Shift+Enter pour le zoom, `Ctrl+`` pour le terminal rapide. Trois splits c’est le maximum pratique sur 27 pouces. Sur batterie, utilise Terminal.app et oublie le GPU.