libghostty-vt 1.0 is here. libghostty is a portable, high-performance C archive for terminal emulation, extracted directly from the center of Ghostty. The 1.0 publish method the two the library itself and the C ABI are now stable.
A small complete a twelvemonth ago, I wrote that libghostty is coming. At the time, the Zig component had fair been merged, the C API didn't exist, and nobody but Ghostty was a consumer. Today, the C API is a complete terminal emulator, it runs in manufacturing for millions of group throughout hundreds of products, both liberated and commercial, and it has a real, enforced ABI stability policy.
This article is concerning how we got current and what 1.0 really means.1
Who Is Already Using It
Since starting the Ghostty project in 2022, the most average inquiry I've been asked is "why?". I already answered this in the libghostty is coming post, so awareness liberated to peruse that if you wish. Today, I'd fairly answer this by showing the broad industry effect libghostty has already had. I believe this powerfully validates its existence.
A twelvemonth ago, I used a bug in JediTerm, the terminal emulator in JetBrains IDEs, as an example of why terminal emulation is difficult to get right. A twelvemonth later, the terminal in JetBrains IDEs now runs on libghostty. Every IntelliJ, PyCharm, GoLand, etc. person now has a libghostty-powered terminal. Based on a study by JetBrains, that's complete 12.5 million active users.
Neovim has an approved drag request replacing libvterm alongside libghostty-vt. Among another things, it closes a 10-year-old issue about reflowing scrollback on resize. The maintainers are waiting on a tagged publish before merging so that distributions can bundle the dependency separately, and the publish today should allow that.
KDE developers are experimenting alongside a Konsole replacement built on it. Vercel's Turborepo uses it to render project output in its TUI. devenv uses it to run shells. Antithesis used it to fuzz TUI programs and established genuine bugs in btop and others. Ghostel brings it to Emacs. ghostty-web is the WASM build alongside an Xterm.js-compatible API. Commercial products like OrbStack embed it. And a entire motion of new terminals and "agentic" coding tools, specified as herdr and cmux, have been built on it rather than penning yet another emulator.
There are community bindings for Rust, Go, JavaScript, Swift, Python, .NET, Elixir, Dart, Java, and more, and the awesome-libghostty list tracks fine complete a hundred projects.
More group today use a terminal powered by libghostty than use Ghostty the application, by a extremely ample multiple. And libghostty is having a much larger effect than being "just" a terminal emulator.2
ABI Stability
1.0 method libghostty-vt follows semantic versioning and has strict ABI compatibility promises so that packagers throughout distributions and functioning systems can be assured packaging libghostty-vt and program developers can be confident dynamically linking against it.
Beyond providing helpful features, I accept the hallmark of a high-quality and enduring C archive is ABI stability. So from the start, I took inspiration from C libraries I enjoyed operating alongside and designed the API to have a strong, stable ABI that allows for forthcoming additions.
Every entity is an opaque handle. The hundreds of values you power peruse or write go through a small set of enum-keyed getters and setters, so we can add new values effortlessly without introducing a new symbol. Programs with newer headers connected against an older libghostty get GHOSTTY_UNSUPPORTED results alternatively of crashes or undefined behavior. The few non-opaque structs we have transport their size so that sectors can be appended later, or contain reserved padding. Enums are pinned to int on all compiler, as much as the C norm allows.
Our CI enforces our ABI policy. Every alter is checked with libabigail against a committed baseline on Linux, and against aureate category manifests on macOS and WebAssembly.
On ELF platforms, all exported sign is additionally versioned, so the dynamic loader refuses to burden a mismatched archive by name fairly than failing in some mysterious way later.
Packaging
In supplement to ABI stability, the 1.0 publish brings alongside the proper build tooling, tarballs, dependency licensing manifests, documentation, and additional to allow all important functioning scheme and allocation to package libghostty-vt through norm authoritative tooling.
Libghostty has its own publish cycle, distinct from Ghostty the application. And it has its own tarballs alongside lone the records and dependencies libghostty needs, resulting in smaller sizes and simpler licensing verification and compatibility.
Each publish publishes a signed origin tarball alongside alongside a companion dependencies tarball containing all Zig bundle in Zig's own cache layout, so a allocation can build the archive entirely offline. The build installs the shared and fixed libraries alongside a appropriate SONAME, headers, pkg-config files, and a CMake bundle config, and it honors --prefix, DESTDIR, and lib64. Debug info is kept by default so distros can divided it out. All of this is documented in PACKAGING-LIBGHOSTTY.md, which ships alongside the tarball.
Dependencies and Licensing
libghostty-vt is MIT licensed. At runtime it needs nothing beyond libc, and it can be built completely freestanding if you don't desire that either.3
The archive compiles in a small figure of permissively licensed dependencies: simdutf and Google Highway for SIMD, a compact Unicode array for grapheme data, and Wuffs for depiction decoding in the Kitty graphics protocol. Both simdutf and Highway are built without libc++, so there is no C++ standard archive dependency.
There is no copyleft code anyplace in the dependency tree. Every dependency is listed in a machine-readable manifest alongside its version, SPDX license, and hash, specifically so distros can inhabit in their bundled-library metadata additional easily.
If a distro would fairly dynamically nexus the scheme simdutf or Highway, there's a build emblem for that.
Portability
libghostty-vt is extremely portable. The array below lists all the platforms and architectures that we build and test (full component tests affirmative operating all examples) in CI:
| Platform | Architectures |
|---|---|
| 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) |
There is a second set of platforms we build in CI but do not run tests for. These systems all have known users; we fair haven't set up the machinery for automated testing:
| Platform | Architectures |
|---|---|
| Bare metal | riscv32, thumb |
| WebAssembly (WASI) | wasm32 |
| Windows | arm64 |
| illumos | x86_64 |
| 32-bit x86 | x86 |
Each of the tested platforms gets the artifacts it expects:
- Linux and FreeBSD get a shared archive alongside a appropriate SONAME and versioned symbols, a fixed library, headers, pkg-config files, and a CMake bundle config.
- macOS and iOS get a dylib alongside an @rpath instal name and compatibility version, affirmative an XCFramework covering macOS, iOS, and the iOS simulator that drops direct into Xcode or Swift Package Manager.
- Windows gets a DLL alongside a .pdb, an import library, and a static library. The archive is built alongside the GNU ABI, but MSVC programs link against it through the import archive and CI verifies this.
- Android gets a shared archive built against the NDK alongside 16 KB page size support, as required by Android 15+.
- WebAssembly ships in two flavors, one optimized for speed and one for size, and the small one is under a megabyte alongside all feature enabled. If you lone need a read-only viewer, subsystems akin input encoding, search, selection, and Kitty graphics can be compiled out with a build flag, which approximately halves the module. Every function stays exported and merely returns GHOSTTY_UNSUPPORTED so your code doesn't have to change.4
Portability isn't fair concerning the capability to build and run. It's also about asset use and being capable to activity in a broad assortment of resource environments.
For asset usage, the archive creates no threads, allocates lone through an allocator you can customize, and uses minimal compute and memory. I've run 10,000 energetic terminals, all alongside a live casing producing output, on a Linux server alongside 4 cores and 8 GB of RAM. In this test, I had to use dash since attack used far additional RAM than libghostty-vt and wouldn't fit into the 8 GB budget.
What's Next
Libghostty 1.0 is a important milestone.
You can now create a terminal in ~1,500 lines of C that has additional features and improved achievement than fair concerning any terminal that existed in 2025, and most today in 2026.5 And gratitude to the rich ecosystem of tongue bindings, you can do this in all important programming language. You get this for free. For nearly no effort. You can fair do it.
libghostty-vt is a generalized library, so we volition concentration on stability while implementing as many terminal protocols as exist (giving options to enable/disable them, of course) so that embedders have the luxury of choice.
Every bug any libghostty-vt embedder reports makes everyone alternatively in the ecosystem better. Every characteristic we container in libghostty-vt becomes available to everyone quickly and safely. Terminals can move faster with less fragmentation.
Thank you to everyone who contributed to the library, wrote bindings, filed bugs, and shipped item on top of it during the API was still experimental. As alongside all open source, this was the activity of a large community.
Docs, examples, and downloads are at lib.ghostty.org.
Boo. 👻