ghostty-web - Ghostty als WASM kompiliert: ein mit der xterm.js-API kompatibles Webterminal
(github.com/coder)- Ghostty-web ist ein im Browser ausgeführter VT100-kompatibler Terminal-Emulator, der wie die xterm.js-API genutzt werden kann
- Es nutzt einen mit WASM kompilierten Ghostty-Parser und bietet damit dieselbe Codebasis wie die native App, außerdem keine Laufzeit-Abhängigkeiten
- Bestehende xterm.js-Projekte lassen sich migrieren, indem man lediglich
@xterm/xtermdurchghostty-webersetzt - Bei der Verarbeitung von komplexem Skript-Rendering und der Unterstützung von XTPUSHSGR/XTPOPSGR-Sequenzen wird die Verarbeitung genauer als bei xterm.js bereitgestellt
- Ein Werkzeug, mit dem sich die Implementierung eines leistungsfähigen Terminals für browserbasierte Entwicklungsumgebungen oder Cloud-IDEs vereinfachen lässt
Überblick
- ghostty-web ist ein Projekt, das den Terminal-Emulator von Ghostty in die Web-Umgebung portiert und dabei die xterm.js-API-Kompatibilität beibehält
- Bietet eine exakte VT100-Implementierung im Browser
- Bestehende xterm.js-Nutzer können problemlos wechseln
- Es verwendet einen mit WASM kompilierten Ghostty-Parser und führt denselben Code wie die native App aus
- Keine Laufzeit-Abhängigkeiten, bestehend aus einem etwa 400 KB großen WASM-Bundle
- Ursprünglich für Mux (eine Desktop-App für isolierte parallele Entwicklung) entwickelt, ist es für verschiedene Umgebungen einsetzbar
Demo und Ausführung
- Eine Live-Demo ist unter ghostty.ondis.co verfügbar
- Lokal kann es mit dem folgenden Befehl ausgeführt werden
npx @ghostty-web/demo@next- Führe eine echte Shell auf
http://localhost:8080aus - Läuft optimal unter Linux und macOS
- Führe eine echte Shell auf
Vergleich mit xterm.js
- xterm.js wird in verschiedenen Umgebungen wie VS Code oder Hyper eingesetzt, weist jedoch Rendering-Probleme und fehlende Funktionen auf
- Bei der Verarbeitung von komplexen Skripten wie Devanagari, Arabisch usw. treten Renderfehler auf
- XTPUSHSGR/XTPOPSGR-Sequenzen werden nicht unterstützt
- ghostty-web behebt diese Probleme und bietet präzise Grapheme-Verarbeitung sowie vollständige Sequenzunterstützung
- Während xterm.js alle Emulatorfunktionen in JavaScript neu implementiert, verwendet ghostty-web direkt den bewährten nativen Ghostty-Code
Installation und Verwendung
- Installationsbefehl
npm install ghostty-web - Verwendung mit derselben API wie 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); - Beispiel für die Client-Server-Kommunikation: siehe demo/index.html
Entwicklung und Build
- Build erfolgt aus den Ghostty-Quellen mit eingebautem Patch (
ghostty-wasm-api.patch) zur Freigabe zusätzlicher Features - Zig und Bun sind erforderlich
bun run build - Die Patchgröße bleibt gering, weil Mitchell Hashimoto, der Ghostty-Entwickler,
libghosttybereitstellt - Künftig soll die xterm.js-kompatible API auf Basis der offiziellen Ghostty-WASM-Distribution beibehalten werden
- Das Projekt wurde von Coder entwickelt, wobei das Team seine Unterstützung für Ghostty bekundet hat
Lizenz
- MIT-Lizenz
2 Kommentare
Ghostty 1.0 erschienen – schneller, plattformübergreifender Terminal-Emulator
libghostty kommt
Stand der Terminal-Emulatoren 2025: die umherziehenden Champions
Hacker-News-Kommentare
Der Patch ist sehr aufschlussreich, sodass klar geworden ist, wobei ich helfen sollte
Ich vermute, die Performance ist derzeit nicht besser als bei xterm, weil die Art, wie der Viewport erfasst wird, etwas teuer aussieht
Ich frage mich, ob ihr schon Benchmarks gemacht habt
Es wäre vermutlich gut, die neue RenderState API zu verwenden. Aktuell werden die Daten zeilenweise geholt, und das ist langsam. Die RenderState API unterstützt zustandsbasiertes High-Performance-Delta-Rendering
Der eigentliche GPU-Renderer läuft ebenfalls auf dieser API. Sie ist mit jedem Renderer kompatibel
Mich würde selbst in diesem frühen Stadium ein Performance-Vergleich mit xterm.js interessieren. Großartige Arbeit
Langfristig hoffe ich, dass es ein Drop-in-Ersatz für xterm.js wird
Ich werde bald auf die RenderState API umstellen und Benchmarks teilen
Ich war überrascht, wie einfach sich das umsetzen ließ
Ich nutze es, um in opentui Funktionen ähnlich wie bei TMUX umzusetzen
Das ANSI-Rendering soll in opencode verarbeitet werden
Link zum ghostty-opentui-Projekt
Ist Ghostty am Ende nicht auch nur eine Emulation, die in einer anderen Sprache implementiert ist? Das wirkt etwas übertrieben
Manche haben lediglich ein höheres Maß an Kompatibilität mit der VT-Spezifikation
Funktioniert ziemlich gut
Link zum hot-notes-Projekt
cowsay helloeingeben)Link zur Demo
Um es lokal auszuführen, geht es so Den Quellcode gibt es unter webassembly.sh. Der Wechsel von xterm zu ghostty-web verlief problemlos
cowsay hellooderlsgeben nichts ausObwohl der Kern in einer ungewöhnlichen Sprache geschrieben ist, läuft es so stabil wie eine Mac-App. Auch das Design ist hervorragend
Wenn sich ein Nutzer erneut mit einer Sitzung verbindet, rendert ghostty den Terminalzustand und die Ausgabe
Im Grunde ist das ein tmux-lite mit 1k LoC
Link zum zmx-Projekt
Derzeit baue ich meine Version, die in Unreal Engine 5 läuft
Screenshot-Sammlung
Es macht ziemlich viel Spaß, mit Claude direkt in einem UE5-Editor-Tab zu programmieren. Über die Remote Control API kann man auch Avatare steuern, Screenshots aufnehmen usw. Das ist nützlich für das Debugging von 3D-Spielen
Claude kann auch Hyperspace-GLSL-Shader erzeugen, bekommt aber Tabellenüberschriften in Screenshots nicht sauber hin
Wenn webassembly.sh hinzugefügt wird, könnte das eine vollständige Shell-Umgebung werden, in der man sogar Pakete direkt im Browser installieren kann
Im Moment läuft es nur über die Kommandozeile, was der UX nicht guttut