libghostty 1.0 とは — Ghosttyの端末エンジンを自作アプリに埋め込む安定版C ABI
libghostty-vt 1.0(2026年11月6日発表)は、Ghosttyの端末エミュレーションをMITのC ABIで切り出したライブラリ。semver互換の約束、公式の最小Cコード、Neovim・JetBrainsの採用、libvterm・xterm.js・VTEとの違いを整理した2026年版。
libghostty は、ターミナルエミュレータ Ghostty の中核(端末エミュレーション)を切り出し、他のアプリに組み込めるようにしたライブラリで、その最初のライブラリである libghostty-vt が 2026年11月6日に 1.0 になった。1.0 で約束されたのは、C ABI の安定とセマンティックバージョニングに基づく互換性であり、以後は「自分のアプリにターミナルを入れる」ための土台として、バージョン更新で壊れることを心配せずに採用できる。
発表は Ghostty の作者 Mitchell Hashimoto 氏の記事「libghostty 1.0」で、Hacker News では2026年11月7日にフロントページ1位(1045ポイント)になった。本稿は発表記事、公式サイト lib.ghostty.org、Neovim の PR #39773 を一次情報として、何ができるか・何を約束したのか・どう使い始めるか・既存の代替との違いを整理する(2026年11月時点)。確認できなかった事項は末尾の注記に分けて記す。
libghostty とは — 3行でわかる要点
- 何か: Ghostty の端末エミュレーション部分を、移植性と性能を重視した C ライブラリとして提供するもの。1.0 の対象は libghostty-vt(VT はテキスト端末のエスケープシーケンスの意味)
- 1.0 の約束: ライブラリと C ABI の両方が安定。semver に従い、ABI 互換を厳密に守る
- ライセンスと依存: MIT。既定のビルドは libc にリンクし、SIMD を無効にすれば freestanding(OS なし)でも動く
Ghostty 1.4 の解説でも触れたとおり、Ghostty はコアを Zig で書き、UI を各OSのネイティブ技術で作る構成をとっている。libghostty はその「コア」を外に開いたものと考えるとわかりやすい。Ghostty アプリと libghostty は別々のリリースサイクルで、専用の tarball も配布される。
何ができるか — 担当範囲を整理する
libghostty-vt の役割は、プログラムが端末に書き出すバイト列を受け取り、それを解釈して端末の状態(画面・カーソル・スクロールバックなど)を保持し、取り出せるようにすることである。公式サイトの説明では、バイト列の出どころは問わない。擬似端末(PTY)でも、ネットワーク越しでも、録画データでもよい。
| 役割 | libghostty-vt が担当 | 組み込む側が担当 |
|---|---|---|
| バイト列の解釈(エスケープシーケンス) | 担当 | — |
| 画面・カーソル・スクロールバックの状態管理 | 担当 | — |
| 状態の取り出し(プレーンテキスト等への整形) | 担当(Formatter API) | — |
| 入力のエンコード・検索・選択・Kitty graphics | 含む(ビルドフラグで除外可能) | — |
| 画面への描画(GPU・ウィジェット) | 発表記事・公式サイトに記載なし | 自前で実装する前提と読める |
| PTY の管理(シェルの起動) | 発表記事・公式サイトに記載なし | 自前で用意する前提と読める |
最後の2行は注意が必要である。公式サイトの最小例も「GUI なし・実 PTY なし」で書かれており、ライブラリの責務は状態エンジンに絞られている。描画とPTY(シェルとの接続)を誰が担当するかについて一次情報に明示はないが、例のコードから、少なくとも呼び出し側が行う設計であることは読み取れる。
公式サイトは用途として、ターミナルエミュレータやマルチプレクサ、Web ターミナルとリモートセッション、セッションの録画と再生、TUI アプリのテスト用ハーネス、そしてTUI の表示内容を読み取るエージェントや自動化を挙げている。AI エージェントが端末の画面を「見る」には、エスケープシーケンスを解釈して画面状態を再現する部品が要るため、後者は近年の需要に合っている。
リソース面では、ライブラリはスレッドを作らず、メモリ確保は組み込み側が差し替えられるアロケータ経由に限られる。作者は、4コア・8GB の Linux サーバーで有効なシェル付きの端末を1万個動かして試したと述べている(bash はメモリを使いすぎたため dash を使用)。性能の指標として語っているのは、パーサのスループットとメモリ使用量である。
1.0 で変わったこと — 安定性の中身
1.0 の主眼は新機能ではなく安定性の保証である。発表記事には、保証を支える具体的な設計が書かれている。
| 項目 | 内容(発表記事より) |
|---|---|
| バージョニング | semver。ABI 互換の約束は厳密 |
| オブジェクト | すべて不透明ハンドル。値はenumをキーにしたgetter/setterで読み書きし、新しい値の追加でシンボルが増えない |
| 新旧の食い違い | 新しいヘッダーで古いライブラリを使うと、クラッシュせず GHOSTTY_UNSUPPORTED が返る |
| 構造体・列挙型 | 不透明でない構造体はサイズまたは予約パディングを持つ。enumは int に固定 |
| ABI の検査 | CIで、Linuxは libabigail、macOSとWebAssemblyは型マニフェスト(golden)で確認。ELFのエクスポートシンボルにバージョンを付与 |
| リリースサイクル | Ghostty アプリとは独立。専用の tarball を配布 |
要するに、「後から機能を足しても既存の呼び出しが壊れない」ことを、設計(不透明ハンドルと getter/setter)と検査(CI の ABI チェック)の両面で担保している。C ABI はほぼあらゆる言語から呼べるため、ここが安定したことで各言語のバインディングも追従しやすくなる。
配布物の構成も整っている。各リリースには署名付きのソース tarball と依存関係の tarballが含まれ、ネットワークなしで(オフラインで)ビルドできる。出力は SONAME 付きの共有ライブラリと静的ライブラリ、ヘッダー、pkg-config ファイル、CMake のパッケージ設定で、--prefix・DESTDIR・lib64 にも対応する。Linux ディストリビューション向けのパッケージ手順は、tarball に同梱された PACKAGING-LIBGHOSTTY.md に書かれている。
依存関係とライセンス — 組み込む前に見るところ
ライセンスは MIT で、依存関係にコピーレフト(GPL 系)のコードは含まれないと発表記事は述べている。各依存のバージョン・SPDX ライセンス・ハッシュを列挙した機械可読のマニフェストも提供される。依存は、SIMD のための simdutf と Google Highway、書記素(grapheme)判定のための小さな Unicode テーブル、Kitty graphics protocol の画像復号のための Wuffs である。システムの simdutf や Highway を動的リンクするビルドフラグもある。
対応プラットフォームは広い。CI で構築とテストまで行うのは、Linux(glibc・musl、x86_64・aarch64)、macOS 13 以上(x86_64・aarch64)、iOS 13 以上(aarch64)、FreeBSD(x86_64・aarch64)、Windows(x86_64)、Android(aarch64・x86_64・arm)、WebAssembly(wasm32、freestanding)である。ベアメタル(riscv32・thumb)、WASI、Windows arm64、illumos、32bit x86 は CI でビルドのみ確認している。成果物には Apple 向けの XCFramework、Windows の DLL とインポートライブラリ、16KB ページサイズ対応の Android ビルドも含まれる。
導入方法 — 取得・ビルド・最小コード
取得先は公式サイト lib.ghostty.org である。リポジトリは github.com/ghostty-org/ghostty で、パッケージ手順書もここにある。発表記事には具体的なビルドコマンドの記載がないため、ここでは手順の流れだけを示す。詳細は公式サイトの Installing ページ(Doxygen 生成のドキュメント内)を参照されたい。
1. lib.ghostty.org から署名付きのソース tarball と依存関係の tarball を入手する
2. PACKAGING-LIBGHOSTTY.md に従ってビルドする(依存を同梱しているのでオフラインで可能)
3. 生成された共有/静的ライブラリ、ヘッダー(ghostty/vt.h)、pkg-config/CMake の設定を自分のプロジェクトから参照する
4. SIMD や入力エンコード・検索・選択・Kitty graphics などが不要なら、ビルドフラグで外してサイズを抑える
言語バインディングについて、発表記事は Rust・Go・JavaScript・Swift・Python・.NET・Elixir・Dart・Java などのコミュニティ製バインディングがあると述べ、関連プロジェクトの一覧 awesome-libghostty が100件を超える規模になっていると紹介している。C ABI 直接呼び出しに比べ、型の安全性や所有権の扱いはバインディングごとに異なるため、採用時は各バインディングの更新状況を確認したい。
最小の使い方は、公式サイトに載っている次の C の例が最も確実である(公式の例を引用。MIT)。80×24 の端末を作り、太字・緑の文字を含むバイト列を書き込み、画面をプレーンテキストで読み出す。PTY も GUI も使わない。
#include <stdio.h>
#include <string.h>
#include <ghostty/vt.h>
int main(void) {
// Create an 80x24 terminal. NULL selects the default allocator.
GhosttyTerminal terminal;
ghostty_terminal_new(NULL, &terminal, 80, 24);
// Write the bytes a program would send. They can come from anywhere: a pty,
// a network connection, a recording. The escape sequences make "world" bold
// and green.
const char *text = "Hello, \x1b[1;32mworld\x1b[0m!\r\n";
ghostty_terminal_vt_write(terminal, (const uint8_t *)text, strlen(text));
// Read the screen back. A new formatter emits plain text, so the styles
// don't appear in the output, but you can set options to enable that.
GhosttyFormatter formatter;
ghostty_formatter_terminal_new(NULL, &formatter, terminal);
uint8_t *buf = NULL;
size_t len = 0;
ghostty_formatter_format_alloc(formatter, NULL, &buf, &len);
fwrite(buf, 1, len, stdout);
putchar('\n');
ghostty_free(NULL, buf, len);
ghostty_formatter_free(formatter);
ghostty_terminal_free(terminal);
return 0;
}流れは3段階である。①ghostty_terminal_new で端末を作る(第1引数 NULL は既定アロケータ)。②ghostty_terminal_vt_write に、プログラムが出力するバイト列を渡す。③Formatter(ghostty_formatter_terminal_new と ghostty_formatter_format_alloc)で画面を取り出す。後始末として ghostty_free・ghostty_formatter_free・ghostty_terminal_free を呼ぶ。出力は Hello, world! で、スタイルは既定ではテキストに現れず、オプションで有効にできると例のコメントにある。
実際のターミナルエミュレータを作る場合は、ここに PTY からの読み取りと画面描画のループを足すことになる。作者が最小の応用例として挙げる「Ghostling」は、約1,500行の C で書かれたターミナルで、ghostty-org/ghostling で公開されている。ライブラリの使い方を知る入口として参考になる。
採用事例 — 発表記事が挙げるもの
発表記事は、すでに使っている(または移行中の)プロジェクトとして次を挙げている。内容は記事の記述に基づき、各プロジェクトの現状は個別に確認されたい。
| プロジェクト | 発表記事の記述 |
|---|---|
| JetBrains の IDE | IDE のターミナルで採用。記事は同社の報告書にある1,250万人超の継続的なアクティブユーザーという数字を引いている |
| Neovim | libvterm を置き換える PR(#39773)が進行中。タグ付きリリースを待っている段階 |
| KDE | 開発者が Konsole の代替を実験中(発表記事のリンク先の名称は「KWI」) |
| Vercel Turborepo/devenv/Antithesis | 採用例として列挙(用途の詳細は各リンク先を参照。devenv はシェル対応、Antithesis は TUI のファジングの記事) |
| Ghostel/ghostty-web/OrbStack | Emacs 向け端末、xterm.js 互換 API を持つ WebAssembly 版、コンテナ/VM ツール |
| herdr/cmux | AIエージェント向けのターミナル系ツール |
Neovim の PR #39773(「libvterm を libghostty-vt に置き換える」)は、2026年10月27日にレビュー準備完了となった。PR の記述では、フォーカス報告、ブラケットペースト、マウスとキーボードのエンコード、端末への問い合わせ応答、文字描画、スクロールバック処理を移植し、リサイズ時にスクロールバックが正しく再フローされるようになるという。同PRは Zig 0.17 への更新も伴う。メンテナーは、Zig の更新と次の 0.13 リリースの後にマージし、0.14 までフル1サイクルのナイトリーを経る方針で、依存はコミット固定ではなくタグ付きリリースから取る必要があると述べている。1.0 はこの条件を満たす節目になる。
既存の代替との違い
ターミナル部品には既存の選択肢が多い。下表は、位置づけの違いをまとめたものである。libghostty 以外の各プロジェクトについて、この記事の一次情報では確認していない項目は「—」にしている。
| ライブラリ | 言語/形態 | 位置づけ | ABI 安定・semver の明示 | 備考 |
|---|---|---|---|---|
| libghostty-vt | C ライブラリ(コアはZig製のGhosttyから) | 状態エンジン。描画・PTYは持たない | 1.0 で明示(semver・厳密なABI互換) | MIT。スレッドなし、アロケータ差し替え可、WebAssembly・iOS・Android・ベアメタルまで対応 |
| libvterm | C ライブラリ | 端末エミュレーションの部品。Neovim が採用してきた | — | Neovim が置き換えを検討中(PR #39773) |
| xterm.js | JavaScript/TypeScript(ブラウザ向け) | ブラウザ内のターミナル部品(描画込み) | — | ghostty-web が xterm.js 互換 API を備える(発表記事) |
| JediTerm | Java/Kotlin 系(JVM) | JetBrains 系の端末部品 | — | JetBrains は libghostty を採用(発表記事は jediterm の PR #311 にリンク。内容は未確認) |
| VTE | C(GTK のウィジェット) | GTK アプリ向けの端末ウィジェット | — | GTK に依存する |
| alacritty_terminal | Rust クレート | Alacritty の端末状態を扱う部分 | — | Rust プロジェクト向け |
表から読み取れる違いは3点ある。第一に、libghostty-vt はウィジェットではなく状態エンジンで、描画の自由度が高い反面、自前で描画する手間がかかる。第二に、C ABI で言語を選ばず、ビルド対象も WebAssembly やベアメタルまで広い。第三に、ABI の安定を1.0で明文化した点である。他のライブラリが安定でないという意味ではなく、この記事の一次情報で確認できていないため空欄にしている。
誰が使うべきか
- 自作のターミナルエミュレータやマルチプレクサを作る人: 端末状態の管理を任せ、描画と UI に集中できる
- IDE やエディタのターミナルを改善したい人: Neovim や JetBrains の事例が参考になる
- TUI のテスト・録画・再生をしたい人: PTY なしでバイト列から画面状態を再現して検証できる
- AI エージェントに TUI の画面を読ませたい人: エスケープシーケンスを解釈した画面状態を取り出せる
- 見送ってよい人: 普通にターミナルを使うだけの人。Ghostty アプリを使えば足りる。アプリ側の最新の変更は Ghostty 1.4 の解説を参照
導入前に確認したいのは、①描画と PTY を自前で用意できるか、②対象プラットフォームが CI でテスト済みの範囲か(ベアメタルや WASI などはビルドのみ)、③使う言語のバインディングが活発に保守されているか、の3点である。
よくある質問
libghostty と libghostty-vt は同じものですか?
発表記事で1.0になったのは libghostty-vt(端末エミュレーションの C ライブラリ)です。libghostty は Ghostty の中核を部品化する構想の名前で、発表記事は他のライブラリの計画に触れていません。
1.0 で何が保証されますか?
ライブラリと C ABI の安定です。semver に従い、ABI 互換を厳密に守ると発表記事にあります。不透明ハンドルとenum キーの getter/setter で、機能追加でも既存の呼び出しが壊れない設計です。新しいヘッダーで古いライブラリを使うと GHOSTTY_UNSUPPORTED が返ります。
ライセンスは商用利用に問題ありますか?
ライブラリは MIT ライセンスで、依存関係にコピーレフトのコードはないと発表記事は述べています。依存ごとのライセンスは機械可読のマニフェストで確認できます。実際の採用判断では、同梱物のライセンスも確認してください。
描画や PTY の管理も含まれますか?
発表記事・公式サイトに記載がなく、公式の最小例も GUI と PTY なしで動いています。ライブラリの責務は端末状態の管理で、描画とシェルとの接続は組み込む側が用意する設計と読めます。
Neovim はもう libghostty-vt を使っていますか?
まだです。PR #39773 は進行中で、メンテナーは Zig 0.17 の更新と次のリリースの後にマージし、依存はタグ付きリリースから取る方針を示しています。
※ 本稿では、一次情報で確認できなかった事項(JetBrains の対応する IDE のバージョン、各言語バインディングの個別の品質、他ライブラリの ABI 安定性やライセンス、Ghostty アプリと libghostty の版の対応関係など)は記載していない。
この記事に関連する無料ツール(登録不要・その場で結果)
お気軽にご相談ください
お問い合わせ