本文へスキップ

Libghostty 1.0、ターミナルアプリ向けの安定したC ABIを提供

Ghostty(ゴーストティ)のターミナルエンジンlibghostty-vt 1.0が11月6日に公開され、C ABIが安定しました。Tech AI Wireのビルド検証では、バージョン付きの関数209個と、下がったバージョン番号を確認しました。

著者

4 分で読めます

英語の原文から機械翻訳したものです。原文はClaire Whitmoreが事実確認と編集を行いました。内容に相違がある場合は英語版が優先されます。 編集方針

libghostty-vtのドキュメントにあるCのサンプルコードのスクリーンショット。ghostty_terminal_newで80x24のターミナルを作り、色付きのテキストを書き込んでいます。
写真: Ghostty project

数字で見る

Tech AI Wireのビルドでエクスポートされた関数。すべてGHOSTTY_VT_1.0のタグ付き
209
Tech AI WireのLinuxコンテナ検証で、署名付きtarballからのビルドにかかった時間
117秒
ドキュメントによると、ある利用者の検証で4コア・8GBのLinuxマシンが動かしたターミナルの数
10,000

Mitchell Hashimoto氏は2026年11月6日、libghostty-vt 1.0を公開しました。同氏のターミナルGhosttyの中にあるターミナルエンジンの、初の安定版です。バージョン1.0では、ライブラリーのC ABIが固定されます。C ABIとは、コンパイル済みのプログラムがリンクするバイナリーのインターフェースです。今日1.0でビルドしたアプリは、後の1.xリリースでライブラリーが置き換わっても動き続けるはずです。これが重要なのは、すでに利用者がいるためです。JetBrainsのIDEは内蔵ターミナルをこのライブラリーで動かしています。Neovimも、古いターミナルコードを外すためにこのリリースを待っています。

libghostty-vt 1.0が約束すること

ターミナルエンジンは、プログラムが出力するバイト列を読み取ります。そこには、色やカーソル移動のためのエスケープコードも含まれます。そのうえで、画面、カーソル、スクロールバックの状態を管理します。描画は一切行いません。描画はアプリ側に任されます。だからこそ、KDEのターミナルもIDEもWebページも、同じエンジンを共有できます。

「1.0は、libghostty-vtがセマンティックバージョニングに従い、厳格なABI互換性を約束するという意味です」と、Hashimoto氏は発表記事に書いています。プロジェクトがそれをどう守るのか、同氏は次のように説明しています。

  • 新しいヘッダーでビルドしたコードが古いライブラリーに当たると、クラッシュではなくGHOSTTY_UNSUPPORTEDエラーが返ります。
  • LinuxなどのELFシステムでは、エクスポートされるすべての関数にバージョンタグが付きます。そのため、合わないライブラリーはプログラムの起動時に名前で拒否されます。
  • 継続的インテグレーション(CI)では、Linuxでlibabigailを使い、ABIを保存済みの基準と比べます。macOSとWebAssemblyでは、固定した型の一覧と比べます。

ライブラリーには、Ghosttyアプリとは別の独自のリリースサイクルができました。各リリースには、署名付きのソースtarballと、Zigの依存パッケージをすべて収めた2つ目のtarballが付きます。これにより、Linuxディストリビューションはオフラインでビルドできます。手順はPACKAGING-LIBGHOSTTY.mdにあります。コードはMITライセンスで、実行時に必要なのはCライブラリーだけです。

すでに使っているところ

Hashimoto氏によると、JetBrainsはIntelliJ、PyCharm、GoLandなど自社IDEのターミナルを、このライブラリーで動かしています。同氏は、これらのIDEの継続利用者が1250万人というJetBrains自身の数字を挙げています。プロジェクトのドキュメントは、libghostty-vtを毎日使う人を数千万人と見積もっています。ただし、利用状況の追跡はしていないとも記しています。

Hashimoto氏によると、Neovimには承認済みのプルリクエスト#39773があり、libvtermをlibghostty-vtに置き換えます。このプルリクエストはタグ付きリリースを待っており、11月7日の時点ではまだオープンでした。マージされれば、ウィンドウのリサイズ後にターミナルの文字が切れる、10年来のバグが解消されます。ほかの利用例には、VercelのTurborepo、OrbStack、Emacs向けのターミナルGhostel、KDEの実験的なターミナルKwiがあります。コミュニティによるバインディングは、Rust、Go、Python、Swift、.NETなど向けにあります。

検証:署名付きtarballから1.0をビルド

Tech AI Wireは11月7日、macOS 26.6.2とDocker 28.4.0の環境で検証しました。Alpine Linux 3.22のコンテナ(arm64)で、このリリースをビルドしました。手順は、パッケージングガイドがディストリビューション向けに示すものに従いました。

minisign -V -P RWQlAjJC23149WL2sEpT/l0QKy7hMIFhYdQOFy0Z7z7PbneUgvlsnYcV -m libghostty-vt-1.0.0.tar.gz
ZIG_GLOBAL_CACHE_DIR=/tmp/build-cache zig build --prefix /usr \
  --system ../libghostty-vt-1.0.0-deps -Doptimize=ReleaseFast -Dcpu=baseline
objdump -T /usr/lib/libghostty-vt.so | grep -c GHOSTTY_VT_1.0
確認項目結果
ソース、依存パッケージ、SHA256SUMSの署名3つともminisignで検証済み
Zigコンパイラー0.17.0(このリリースには0.17.xが必要)
ビルド時間(ReleaseFast)117秒
共有ライブラリーlibghostty-vt.so.1.0.0、11.5MB、sonameはlibghostty-vt.so.1
実行時の依存Cライブラリー(musl)のみ
エクスポートされた関数209個、すべてGHOSTTY_VT_1.0のタグ付き
pkg-configのバージョン1.0.0
ドキュメントのCのサンプルgccでコンパイルでき、「Hello, world!」と出力

最初の試行は失敗しました。Zigに同梱されたC++ランタイムがlinux/futex.hというヘッダーを必要としましたが、素のAlpineイメージにはありません。Alpineのlinux-headersパッケージを入れると解決しました。

バージョン番号が下がった

1.0より前、libghostty-vtのバージョンはGhosttyアプリから取られていました。Ghostty 1.4.0のビルドファイルでは、ライブラリーのバージョンはアプリと同じ1.4.0です。安定版は1.0.0を名乗ります。Tech AI Wireのビルドでは、pkg-config --atleast-version=1.4.0 libghostty-vtの答えは「いいえ」でした。

KDEのKwiは対応を迫られました。11月7日、開発者Eike Hein氏のコミット「Deps: Bump to libghostty-vt 1.0」が、READMEの「libghostty-vt 1.4.0+」を「libghostty-vt 1.0+」に変えました。同じコミットからは、固定の前にC APIそのものが変わったこともわかります。ghostty_formatter_terminal_new()はオプション引数を失い、オプションはghostty_formatter_set()で設定するようになりました。カーソルスタイルの型は、2つからGhosttyCursorStyleの1つに統合されました。

開発者にとっての意味

  • 古いバージョンチェックは1.0に下げる。 CMakeやpkg-configで1.4以降を求めるチェックは、安定版を拒否します。Kwiは現在、find_package(Ghostty 1.0 REQUIRED)を求めています。
  • 1.0より前のビルド向けに書いたコードは再コンパイルする。 ABIの約束は1.0から始まります。Kwiの移行のように、型の名前変更や関数シグネチャーの変更を想定してください。
  • パッケージャーはGitのチェックアウトではなくリリースのtarballを使う。 ガイドによると、チェックアウトやGitHubのアーカイブでは、-Demit-lib-vtを付けない限りGhosttyアプリがビルドされます。新しい空のZIG_GLOBAL_CACHE_DIRと、Zig 0.17.xを使ってください。
  • soname、libghostty-vt.so.1にリンクする。 後の1.xリリースもこの名前を保つため、今ビルドしたプログラムは再ビルドなしで修正を受け取れます。
  • 自分のプラットフォームを確認する。 Hashimoto氏は、Windows on Arm、illumos、32ビットx86、WASI、ベアメタルについて、CIでビルドはするがテストはしていないとしています。また、すべてのターミナルプロトコルに対応したとは主張していません。
  • Neovimのユーザーは待ってかまわない。 プルリクエスト#39773がマージされ、リリースに入るまでは何も変わりません。

出典

  1. Libghostty 1.0 - Mitchell Hashimoto
  2. Packaging libghostty-vt for Distribution - GitHub
  3. libghostty-vt documentation - Ghostty
  4. feat(terminal): replace libvterm with libghostty-vt - GitHub
  5. Deps: Bump to libghostty-vt 1.0 - KDE on GitHub
  6. Libghostty 1.0 gives developers a stable terminal engine to embed - RuntimeWire
open-sourcelinuxterminalneovimzig

関連記事

A rack-mounted server with blinking status lights in a small server room, a laptop with an orange GitLab tanuki sticker on its lid open on a cart in front of it.
開発ツール

GitLabのCVE-2026-97229:Alpineが悪用の試みを報告

Alpine Linuxは、10月20日から21日にかけて、同プロジェクトのGitLab(ギットラボ)サーバーでCVE-2026-97229の悪用が試みられたと発表しました。GitLabのアップグレードだけでは直りませんでした。修正パッチはRuby(ルビー)の側にあります。