ghostty-web - Un terminal web compatible avec l'API xterm.js, compilé en WASM depuis Ghostty
(github.com/coder)- Ghostty-web est un émulateur de terminal compatible VT100 qui s'exécute dans le navigateur, et peut être utilisé de la même manière que l'API xterm.js.
- Il utilise un parseur Ghostty compilé en WASM pour fournir une base de code identique à l'application native, avec aucune dépendance runtime.
- Les projets xterm.js existants peuvent migrer en remplaçant simplement
@xterm/xtermparghostty-web. - Il offre un traitement plus précis que xterm.js pour le rendu de scripts complexes et le support de séquences comme XTPUSHSGR/XTPOPSGR.
- Un outil qui permet de simplifier la mise en place d'un terminal haute performance dans des environnements de développement basés sur navigateur ou des IDE cloud.
Aperçu
- ghostty-web est un projet qui transpose l'émulateur de terminal de Ghostty vers le web, tout en conservant la compatibilité avec l'API xterm.js.
- Il fournit une implémentation précise de VT100 dans le navigateur.
- Les utilisateurs de xterm.js peuvent basculer facilement.
- Il utilise le parseur Ghostty compilé en WASM, avec une exécution basée sur le même code que l'application native.
- Aucune dépendance runtime, et un bundle WASM d'environ 400 Ko.
- Initialement conçu pour Mux (une application de bureau pour le développement isolé en parallèle), il peut être utilisé dans différents environnements.
Démo et exécution
- Une démo en direct est disponible sur ghostty.ondis.co.
- En local, il peut être lancé avec la commande suivante
npx @ghostty-web/demo@next- Lance un vrai shell sur
http://localhost:8080 - Fonctionne de manière optimale sur Linux et macOS
- Lance un vrai shell sur
Comparaison avec xterm.js
- xterm.js est utilisé dans VS Code, Hyper et d'autres environnements, mais il présente des problèmes de rendu et de fonctionnalités non prises en charge.
- Des erreurs de rendu peuvent apparaître avec des scripts complexes (Devanagari, arabe, etc.)
- Non prise en charge des séquences XTPUSHSGR/XTPOPSGR
- ghostty-web corrige ces problèmes en offrant un traitement précis des graphèmes et une prise en charge complète des séquences.
- Alors que xterm.js réimplémente toute l'émulation en JavaScript, ghostty-web utilise directement le code natif éprouvé de Ghostty.
Installation et utilisation
- Commande d'installation
npm install ghostty-web - Utilisation avec la même API que xterm.js
import { init, Terminal } from 'ghostty-web'; await init(); const term = new Terminal({ fontSize: 14, theme: { background: '#1a1b26', foreground: '#a9b1d6' } }); term.open(document.getElementById('terminal')); term.onData((data) => websocket.send(data)); websocket.onmessage = (e) => term.write(e.data); - Pour un exemple de communication client–serveur, voir demo/index.html.
Développement et build
- Construit à partir des sources de Ghostty, avec un patch pour exposer des fonctionnalités supplémentaires (
ghostty-wasm-api.patch). - Zig et Bun sont requis
bun run build - Grâce à
libghostty, développé par le créateur de Ghostty, Mitchell Hashimoto, le nombre de modifications reste réduit. - À terme, le projet prévoit de s'appuyer sur une distribution officielle WASM de Ghostty, tout en conservant la compatibilité avec l'API xterm.js.
- Le projet est développé avec le soutien de l'équipe Coder pour Ghostty.
Licence
- Licence MIT
2 commentaires
Sortie de Ghostty 1.0 - un émulateur de terminal rapide et multiplateforme
libghostty arrive
État des lieux des émulateurs de terminal en 2025 : des champions itinérants
Commentaire sur Hacker News
Le patch est très instructif, donc il m’a permis de voir clairement où je pourrais aider
Je ne pense pas que les performances soient meilleures que celles de xterm pour l’instant. La manière dont le viewport est géré semble un peu coûteuse
Je me demande si vous avez fait des benchmarks
Je pense qu’il vaudrait mieux utiliser la nouvelle API RenderState. Actuellement, les données sont récupérées ligne par ligne, et c’est lent. L’API RenderState est basée sur l’état et permet un rendu delta haute performance
Le véritable moteur de rendu GPU fonctionne aussi au-dessus de cette API. Elle est compatible avec n’importe quel moteur de rendu
Même à ce stade précoce, je serais curieux de voir une comparaison de performances avec xterm.js. Excellent travail
À long terme, j’aimerais que ce soit un remplaçant drop-in de xterm.js
Je vais bientôt passer à l’API RenderState et partager des benchmarks
J’ai été surpris de voir à quel point c’était plus simple à implémenter que je ne le pensais
Je m’en sers dans opentui pour implémenter des fonctionnalités de type TMUX
Je prévois de gérer le rendu ANSI dans opencode
Lien du projet ghostty-opentui
Ghostty n’est-il pas, au fond, lui aussi une émulation implémentée dans un autre langage ? Ça me semble un peu exagéré
La différence, c’est simplement que certains ont un niveau de compatibilité plus élevé avec la spécification VT
Ça marche plutôt bien
Lien du projet hot-notes
cowsay hello)Lien vers la démo
Pour l’exécuter en local, il suffit de faire comme ci-dessous Le code source est disponible sur webassembly.sh. La transition de xterm vers ghostty-web se fait sans difficulté
cowsay hellooulsn’affichent rienLe cœur est écrit dans un langage inhabituel, mais l’application fonctionne de façon très stable comme une vraie app Mac. Le design est aussi excellent
Quand l’utilisateur se reconnecte à une session, j’utilise ghostty pour restituer l’état du terminal et la sortie
C’est en pratique un tmux-lite de 1k LoC
Lien du projet zmx
En ce moment, je suis en train de faire ma propre version qui tourne dans Unreal Engine 5
Collection de captures d’écran
Coder avec Claude dans un onglet de l’éditeur UE5 est assez amusant. Via la Remote Control API, on peut aussi piloter un avatar, prendre des captures d’écran, etc. C’est utile pour déboguer des jeux 3D
Claude peut aussi générer des shaders GLSL Hyperspace, mais il n’arrive pas à bien aligner les en-têtes de tableau dans les captures d’écran
En ajoutant webassembly.sh, on pourrait en faire un environnement shell complet capable d’installer des paquets dans le navigateur
Pour l’instant, ça ne fonctionne qu’en ligne de commande, donc l’UX laisse à désirer