Skip to main content

libghostty-py

This is a fork of pyghostty (from this commit).

Python bindings for libghostty-vt. libghostty is Ghostty's embeddable terminal emulation core, a headless, high-fidelity VT emulator. These bindings cover terminal state, screen and scrollback snapshots, kitty graphics, and everything else Ghostty's production terminal core handles.

The binding is Python-ABI-independent: pure Python (cffi ABI mode) over a bundled libghostty-vt shared library, so one wheel per platform covers every Python version. No compiler is needed at install time. Wheel builds cover Linux and macOS (x86-64 and ARM64) and Windows (x86-64).

Usage

from ghostty import Terminal

with Terminal(cols=80, rows=24) as t:
    t.feed('hello\r\nworld')
    t.cursor      # (x, y), 0-indexed
    t.text()      # plain text of the visible screen only
    t.contents()  # everything: scrollback plus screen, soft-wraps unwrapped
    t.resize(120, 24)  # reflows the primary screen

The base layer, ghostty._cdef/_ffi, exposes the complete generated C API as raw ffi/lib (regenerate with gen_cdef.py after updating the pinned Ghostty release).

ghostty.core.Terminal provides an ergonomic wrapper for commonly used parts.

Restoring a terminal on reconnect

serialize() returns VT bytes, rather than plain text or Ghostty's binary snapshot format. Feed the result to a terminal with the same columns, rows, and character-width rules, then forward subsequent PTY bytes in order:

with Terminal(cols=80, rows=24) as t:
    t.feed(b"hello\r\n\x1b[31mprompt> ")
    initial_output = t.serialize()
    # Send initial_output to the reconnecting terminal before live PTY output.

The snapshot resets the destination and restores screen content, scrollback, styles, cursor, modes, and the active alternate screen with its underlying primary screen. Use serialize(palette=True) to also export the palette.

Snapshots may end with incomplete UTF-8 or VT sequences: send bytes directly, or use a streaming decoder across the snapshot and live output. Serialize between feeds/resizes and send the snapshot before subsequent output. Unfinished input is limited by continuation_limit (1 MiB by default); exceeding it raises GhosttyError until the sequence completes.

Graphics, titles, default colors, inactive alternate screens, and arbitrary saved cursors are not exported. Rendering can differ between terminal emulators.

Building the library

The shared library is built from a Ghostty checkout with Zig 0.17.0. Install that Zig version on PATH, or download the pinned official toolchain with python install_zig.py (downloads are verified against recorded SHA-256 hashes):

GHOSTTY_SRC=/path/to/ghostty python build_lib.py

Without GHOSTTY_SRC, the build looks for a checkout in ghostty-src/ inside this project.

The checkout must be at the release tag for ghostty-version in pyproject.toml (currently v1.4.0), with that tag available locally. This runs zig build -Demit-lib-vt=true and copies the resulting shared library into ghostty/_lib/, where the package loader and wheel builds pick it up.

Using an external shared library

Wheel builds bundle libghostty-vt by default. To build a Python-only wheel without compiling or bundling Ghostty, pass --config-settings=bundle=false:

python -m pip install . --config-settings=bundle=false

The resulting wheel is platform-independent and does not need Zig to build. This also excludes any library left by an earlier bundled build. The loader checks the bundled library, then the active Python environment (sys.prefix):

  • Linux: lib/libghostty-vt.so
  • macOS: lib/libghostty-vt.dylib
  • Windows: Library/bin/ghostty-vt.dll

Libraries installed in these locations are found automatically. The external library must provide the ABI of Ghostty 1.4.0, pinned in pyproject.toml.

Bundled builds require Zig 0.17.0 on PATH or the local toolchain installed by python install_zig.py. Release CI installs the verified toolchain before building. The bundle setting accepts true or false and defaults to true.

Development

pip install -e .[dev]
python install_zig.py
GHOSTTY_SRC=/path/to/ghostty python build_lib.py
pytest -q

To test against headless xterm.js:

npm install --prefix /tmp/libghostty-xterm @xterm/headless@6.0.0
LIBGHOSTTY_XTERM_MODULE=/tmp/libghostty-xterm/node_modules/@xterm/headless pytest -q

Versioning

Version lives in ghostty/__init__.py as __version__.

Releases

Pushing a v* tag runs .github/workflows/release.yml, which builds and tests one Python-ABI-independent wheel for each supported platform and publishes the wheels to GitHub and PyPI. Releases are wheel-only; source remains available from the corresponding GitHub tag.

Metadata

Release files for libghostty-py 0.2.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Built distributions (wheels)

Table of built distributions (wheels) for libghostty-py 0.2.0
File Actions
libghostty_py-0.2.0-py3-none-win_amd64.whl Python 3 none Windows x86-64 Details for libghostty_py-0.2.0-py3-none-win_amd64.whl
libghostty_py-0.2.0-py3-none-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl Python 3 none Linux glibc 2.28+ x86-64, Linux glibc 2.27+ x86-64 Details for libghostty_py-0.2.0-py3-none-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
libghostty_py-0.2.0-py3-none-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl Python 3 none Linux glibc 2.28+ ARM64, Linux glibc 2.27+ ARM64 Details for libghostty_py-0.2.0-py3-none-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl
libghostty_py-0.2.0-py3-none-macosx_13_0_x86_64.whl Python 3 none macOS 13.0+ x86-64 Details for libghostty_py-0.2.0-py3-none-macosx_13_0_x86_64.whl
libghostty_py-0.2.0-py3-none-macosx_13_0_arm64.whl Python 3 none macOS 13.0+ ARM64 Details for libghostty_py-0.2.0-py3-none-macosx_13_0_arm64.whl

Total release size: 9.3 MB

Release files / libghostty_py-0.2.0-py3-none-win_amd64.whl

Download URL libghostty_py-0.2.0-py3-none-win_amd64.whl
Size 1.0 MB
Tags Python 3 Windows x86-64
SHA-256 checksum
How to use checksums
8c74630cc1d5004af185bd539ef4e7451e0836efbcf7790c7848e0127a2d1f4e
BLAKE2b-256 checksum
How to use checksums
8d57b8759e196925affb3874934906528fbacb33e090fdcebee3af2cef7216b2
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 30, 2026.

Transparency log

Release files / libghostty_py-0.2.0-py3-none-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl

Download URL libghostty_py-0.2.0-py3-none-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Size 3.4 MB
Tags Linux glibc 2.27+ x86-64 Linux glibc 2.28+ x86-64 Python 3
SHA-256 checksum
How to use checksums
1a768ba1d5355659fb25fd7204a39229c0ff199edba9e4ae8cd4241bb33e5e27
BLAKE2b-256 checksum
How to use checksums
da96c26eaafe2aee464eadcfa8843d03aee12873efccb9de45c6731950b1e999
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 30, 2026.

Transparency log

Release files / libghostty_py-0.2.0-py3-none-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl

Download URL libghostty_py-0.2.0-py3-none-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl
Size 3.1 MB
Tags Linux glibc 2.27+ ARM64 Linux glibc 2.28+ ARM64 Python 3
SHA-256 checksum
How to use checksums
7e7ec6cfa093672a18a1da64511f7eac367a106640456a9a5e653b5f898e40ef
BLAKE2b-256 checksum
How to use checksums
5a8fbf8f1a070d1420d104cb1f6a2ca8bb0be99a5e3b4da07aa37e0d8d637e11
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 30, 2026.

Transparency log

Release files / libghostty_py-0.2.0-py3-none-macosx_13_0_x86_64.whl

Download URL libghostty_py-0.2.0-py3-none-macosx_13_0_x86_64.whl
Size 884.5 kB
Tags Python 3 macOS 13.0+ x86-64
SHA-256 checksum
How to use checksums
50d1b9bcdf1d646b43d8ea2ef2b1eab9e0639b3e5c0a04ea13713765cf3ea86d
BLAKE2b-256 checksum
How to use checksums
69e517711eb8d05941e9b0c6251b17eeabaf27f4374cd383a56e2905a1d91762
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 30, 2026.

Transparency log

Release files / libghostty_py-0.2.0-py3-none-macosx_13_0_arm64.whl

Download URL libghostty_py-0.2.0-py3-none-macosx_13_0_arm64.whl
Size 841.2 kB
Tags Python 3 macOS 13.0+ ARM64
SHA-256 checksum
How to use checksums
ad754eacde4cf13016f8f2fdd0e48764061ecb6c284c29bf9dc924476023f3cd
BLAKE2b-256 checksum
How to use checksums
97f408327069e1fecded9ec9cd5ef19cc346d959f0ef3b26713d3b4bc95cf897
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 30, 2026.

Transparency log

Security for libghostty-py 0.2.0

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

Full provenance

All 5 files in this release have been uploaded with provenance metadata.

Select from 5 files

Attestation for libghostty_py-0.2.0-py3-none-win_amd64.whl

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 30, 2026.

Transparency log

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Release history Release notifications | RSS feed

This release

0.2.0 This release

5 release files Full provenance

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page