Skip to content

Libghostty 1.0 ships a stable C ABI for terminal apps

Libghostty-vt 1.0 shipped on November 6 with a stable C ABI. A Tech AI Wire build test found 209 versioned functions and a version number that went down.

By

4 min read

XLinkedIn

Drafted with AI from the sources linked in this article, then fact-checked and edited by Claire Whitmore before publishing. How we work

Screenshot of the libghostty-vt documentation's C example, which creates an 80x24 terminal with ghostty_terminal_new and writes colored text into it.
Photo: Ghostty project

By the numbers

exported functions, all tagged GHOSTTY_VT_1.0, in a Tech AI Wire build
209
to build from the signed tarballs in a Tech AI Wire Linux container test
117 s
live terminals on a 4-core, 8 GB Linux machine in one user's test, per the docs
10,000

Mitchell Hashimoto released libghostty-vt 1.0 on November 6, 2026. It is the first stable version of the terminal engine inside his Ghostty terminal. Version 1.0 freezes the library's C ABI, the binary interface that compiled programs link against. An app built on 1.0 today should keep running when later 1.x releases replace the library underneath it. That matters because JetBrains IDEs already run their built-in terminal on it, and Neovim is waiting on this release to drop its old terminal code.

What libghostty-vt 1.0 promises

A terminal engine reads the bytes a program prints, including the escape codes for color and cursor moves. It then keeps track of the screen, the cursor and the scrollback. It does not draw anything. Drawing is left to the app, which is why a KDE terminal, an IDE and a web page can all share it.

"1.0 means libghostty-vt follows semantic versioning and has strict ABI compatibility promises," Hashimoto writes in his announcement post. He describes how the project enforces that:

  • Code built with newer headers gets a GHOSTTY_UNSUPPORTED error from an older library, instead of a crash.
  • Every exported function carries a version tag on Linux and other ELF systems, so the system refuses a mismatched library by name when a program starts.
  • Continuous integration compares the ABI against a saved baseline with libabigail on Linux, and against fixed type lists on macOS and WebAssembly.

The library now has its own release cycle, separate from the Ghostty app. Each release ships a signed source tarball plus a second tarball with every Zig dependency, so Linux distributions can build offline. The rules are in PACKAGING-LIBGHOSTTY.md. The code is MIT-licensed and needs only the C library at runtime.

Who already runs on it

JetBrains now runs the terminal in IntelliJ, PyCharm, GoLand and its other IDEs on the library, Hashimoto says. He cites JetBrains' own figure of 12.5 million recurring users for those IDEs. The project's documentation estimates that tens of millions of people use libghostty-vt daily, and notes that it does no tracking.

Neovim has an approved pull request, #39773, that replaces libvterm with libghostty-vt, according to Hashimoto. It was waiting for a tagged release, and it was still open on November 7. It would close a 10-year-old bug where terminal text gets clipped after a window resize. Other users include Vercel's Turborepo, OrbStack, the Ghostel terminal for Emacs and KDE's experimental Kwi terminal. Community bindings exist for Rust, Go, Python, Swift, .NET and more.

Tested: building 1.0 from the signed tarballs

In a Tech AI Wire test on November 7, on macOS 26.6.2 with Docker 28.4.0, an Alpine Linux 3.22 container (arm64) built the release. It followed the steps the packaging guide gives distributions:

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
CheckResult
Signatures on source, dependencies and SHA256SUMSAll three verified with minisign
Zig compiler0.17.0 (the release requires 0.17.x)
Build time, ReleaseFast117 seconds
Shared librarylibghostty-vt.so.1.0.0, 11.5 MB, soname libghostty-vt.so.1
Runtime dependenciesThe C library only (musl)
Exported functions209, every one tagged GHOSTTY_VT_1.0
pkg-config version1.0.0
The docs' C exampleCompiled with gcc and printed "Hello, world!"

The first attempt failed. Zig's bundled C++ runtime needed the header linux/futex.h, which a bare Alpine image lacks. Installing Alpine's linux-headers package fixed it.

The version number went down

Before 1.0, libghostty-vt took its version from the Ghostty app. In Ghostty 1.4.0's build files, the library's version is the app's version, 1.4.0. The stable release reports 1.0.0. In the Tech AI Wire build, pkg-config --atleast-version=1.4.0 libghostty-vt answered no.

KDE's Kwi had to adjust. On November 7, developer Eike Hein's commit "Deps: Bump to libghostty-vt 1.0" changed the README from "libghostty-vt 1.4.0+" to "libghostty-vt 1.0+". The same commit shows the C API itself changed before the freeze. ghostty_formatter_terminal_new() lost its options argument, which is now set with ghostty_formatter_set(). Two cursor-style types were replaced by one, GhosttyCursorStyle.

What this means for developers

  • Lower old version checks to 1.0. A CMake or pkg-config check for 1.4 or later will reject the stable library. Kwi now asks for find_package(Ghostty 1.0 REQUIRED).
  • Recompile code written against a pre-1.0 build. The ABI promise starts at 1.0. Expect renamed types and changed function signatures, as in Kwi's port.
  • Packagers should use the release tarballs, not a Git checkout. The guide says a checkout or GitHub archive builds the Ghostty app instead, unless you add -Demit-lib-vt. Use a fresh, empty ZIG_GLOBAL_CACHE_DIR and Zig 0.17.x.
  • Link against the soname, libghostty-vt.so.1. Later 1.x releases keep that name, so programs built now pick up fixes without a rebuild.
  • Check your platform. Hashimoto lists Windows on Arm, illumos, 32-bit x86, WASI and bare metal as built in CI but not tested. He also does not claim full coverage of every terminal protocol.
  • Neovim users can wait. Nothing changes until pull request #39773 merges and ships in a release.

Sources

  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

Related articles

The weekly digest

One email every Friday with the week's top stories from all six desks: AI, dev tools, coding, the tech industry, startups and what's next. Free, no spam.

Unsubscribe anytime with one click.