ghostty-web - Terminal web yang kompatibel dengan API xterm.js dengan Ghostty yang dikompilasi ke WASM
(github.com/coder)- Ghostty-web adalah emulator terminal kompatibel VT100 yang berjalan di browser, dan dapat digunakan dengan cara yang sama seperti API xterm.js
- Menggunakan parser Ghostty yang dikompilasi ke WASM sehingga menyediakan basis kode yang sama dengan aplikasi native, serta tanpa dependensi runtime
- Proyek xterm.js yang sudah ada dapat dimigrasikan hanya dengan mengganti
@xterm/xtermmenjadighostty-web - Menawarkan pemrosesan yang lebih akurat dibanding xterm.js dalam hal seperti rendering skrip kompleks dan dukungan urutan XTPUSHSGR/XTPOPSGR
- Alat yang dapat menyederhanakan implementasi terminal berperforma tinggi di lingkungan pengembangan berbasis browser atau cloud IDE
Gambaran umum
- ghostty-web adalah proyek yang memindahkan emulator terminal Ghostty ke lingkungan web, sambil mempertahankan kompatibilitas API xterm.js
- Menyediakan implementasi VT100 yang akurat di browser
- Memungkinkan pengguna xterm.js yang sudah ada untuk beralih dengan mudah
- Menggunakan parser Ghostty yang dikompilasi ke WASM, dan menjalankan kode yang sama seperti aplikasi native
- Tanpa dependensi runtime, terdiri dari bundel WASM berukuran sekitar 400KB
- Awalnya dibuat untuk Mux (aplikasi desktop untuk pengembangan paralel terisolasi), tetapi dapat digunakan di berbagai lingkungan
Demo dan menjalankan
- Demo langsung dapat dijalankan di ghostty.ondis.co
- Di lingkungan lokal, dapat dijalankan dengan perintah berikut
npx @ghostty-web/demo@next- Menjalankan shell nyata di
http://localhost:8080 - Bekerja optimal di Linux dan macOS
- Menjalankan shell nyata di
Perbandingan dengan xterm.js
- xterm.js digunakan di berbagai lingkungan seperti VS Code dan Hyper, tetapi memiliki masalah rendering dan fitur yang belum didukung
- Terjadi kesalahan rendering saat menangani skrip kompleks (Devanagari, Arab, dll.)
- Tidak mendukung urutan XTPUSHSGR/XTPOPSGR
- ghostty-web menyelesaikan masalah tersebut, serta menyediakan penanganan grapheme yang akurat dan dukungan urutan lengkap
- Sementara xterm.js mengimplementasikan ulang seluruh emulasi dalam JavaScript, ghostty-web menggunakan langsung kode Ghostty native yang telah teruji
Instalasi dan cara penggunaan
- Perintah instalasi
npm install ghostty-web - Dapat digunakan dengan API yang sama seperti 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); - Untuk contoh komunikasi klien–server, lihat demo/index.html
Pengembangan dan build
- Dibangun dari source Ghostty, dan menyertakan patch (
ghostty-wasm-api.patch) untuk mengekspos fitur tambahan - Membutuhkan Zig dan Bun
bun run build - Skala patch kecil berkat
libghosttyyang sedang dikembangkan oleh pembuat Ghostty, Mitchell Hashimoto - Ke depannya akan berbasis pada distribusi WASM Ghostty resmi, sambil mempertahankan API yang kompatibel dengan xterm.js
- Proyek ini dikembangkan oleh tim Coder sebagai bentuk dukungan mereka terhadap Ghostty
Lisensi
- Menggunakan lisensi MIT
2 komentar
Ghostty 1.0 dirilis - emulator terminal cepat lintas platform
libghostty akan hadir
Kondisi emulator terminal pada 2025: para juara yang mengembara
Komentar Hacker News
Patch-nya sangat berguna sehingga jadi jelas bagian mana yang bisa saya bantu
Sepertinya saat ini performanya belum lebih baik daripada xterm. Karena cara menangani viewport tampak agak mahal
Saya penasaran apakah sudah melakukan benchmark
Sepertinya akan lebih baik jika menggunakan RenderState API yang baru. Saat ini data diambil per baris, dan itu lambat. RenderState API mendukung delta rendering berperforma tinggi berbasis state
Renderer GPU yang sebenarnya juga berjalan di atas API ini. Cocok dengan renderer apa pun
Bahkan di tahap awal seperti ini, saya penasaran dengan perbandingan performanya dengan xterm.js. Kerja yang hebat
Dalam jangka panjang, saya berharap ini bisa menjadi pengganti drop-in untuk xterm.js
Saya akan segera beralih ke RenderState API dan membagikan benchmark-nya
Saya terkejut karena implementasinya ternyata lebih mudah dari perkiraan
Saya memakainya di opentui untuk mengimplementasikan fitur seperti TMUX
Saya berencana menangani rendering ANSI di dalam opencode
Tautan proyek ghostty-opentui
Bukankah Ghostty pada akhirnya juga hanya emulasi yang diimplementasikan dalam bahasa lain? Rasanya agak berlebihan
Hanya saja, sebagian memiliki tingkat kompatibilitas yang lebih tinggi dengan spesifikasi VT
Berfungsi cukup baik
Tautan proyek hot-notes
cowsay hello)Tautan demo
Untuk menjalankannya secara lokal, lakukan seperti di bawah ini Kode sumbernya bisa dilihat di webassembly.sh. Beralih dari xterm ke ghostty-web berjalan mulus
cowsay hellomaupunlstidak mengeluarkan outputMeskipun intinya ditulis dalam bahasa yang unik, ia tetap bekerja stabil seperti aplikasi Mac. Desainnya juga bagus
Saat pengguna terhubung kembali ke sesi, terminal state dan output dirender dengan ghostty
Pada dasarnya ini seperti tmux-lite sekitar 1k LoC
Tautan proyek zmx
Saat ini saya sedang membuat versi saya sendiri yang berjalan di dalam Unreal Engine 5
Kumpulan screenshot
Cukup menyenangkan menulis kode bersama Claude di dalam tab UE5 Editor. Lewat Remote Control API, saya juga bisa mengendalikan avatar, mengambil screenshot, dan lain-lain. Berguna untuk debugging game 3D
Claude juga bisa membuat shader Hyperspace GLSL, tetapi tidak bisa menyelaraskan header tabel di screenshot dengan benar
Jika webassembly.sh ditambahkan, sepertinya ini bisa menjadi lingkungan shell lengkap yang bahkan bisa menginstal paket di dalam browser
Saat ini hanya bisa dijalankan dari command line, jadi UX-nya masih kurang memuaskan