# Libghostty 1.0 ships a stable C ABI for terminal apps

URL: https://techaiwire.com/articles/libghostty-vt-1-0-stable-c-abi-build-test/

_By Claire Whitmore - Nov 7, 2026_

**By the numbers:**

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

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](https://mitchellh.com/writing/libghostty-1-0). 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](https://github.com/ghostty-org/ghostty/blob/vt-1.0.0/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](/articles/kwi-kde-terminal-emulator-libghostty-vt-konsole-3x-35x/). 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:

```sh
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
```

| Check | Result |
| --- | --- |
| Signatures on source, dependencies and SHA256SUMS | All three verified with minisign |
| Zig compiler | 0.17.0 (the release requires 0.17.x) |
| Build time, ReleaseFast | 117 seconds |
| Shared library | libghostty-vt.so.1.0.0, 11.5 MB, soname libghostty-vt.so.1 |
| Runtime dependencies | The C library only (musl) |
| Exported functions | 209, every one tagged GHOSTTY_VT_1.0 |
| pkg-config version | 1.0.0 |
| The docs' C example | Compiled 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](https://github.com/KDE/kwi/commit/f226e487f500a955304b8c64e80d663252709b57)" 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

- [Libghostty 1.0](https://mitchellh.com/writing/libghostty-1-0) - Mitchell Hashimoto
- [Packaging libghostty-vt for Distribution](https://github.com/ghostty-org/ghostty/blob/vt-1.0.0/PACKAGING-LIBGHOSTTY.md) - GitHub
- [libghostty-vt documentation](https://libghostty.tip.ghostty.org/) - Ghostty
- [feat(terminal): replace libvterm with libghostty-vt](https://github.com/neovim/neovim/pull/39773) - GitHub
- [Deps: Bump to libghostty-vt 1.0](https://github.com/KDE/kwi/commit/f226e487f500a955304b8c64e80d663252709b57) - KDE on GitHub
- [Libghostty 1.0 gives developers a stable terminal engine to embed](https://runtimewire.com/article/libghostty-1-0-mitchell-hashimoto-stable-c-abi) - RuntimeWire
