A Zig terminal emulator with a LuaJIT runtime and Ghostty's VT core. Fully configurable via Lua — inspired by the Lua APIs from WezTerm and Neovim — with a plugin system for custom panes, overlays, and widgets.
A personal side project — built for around my personal workflow, but completely customizable for anyone else.
If you are new to the repo, start with the docs index.
- Zig + LuaJIT runtime with a full Lua API (
hollow.config,hollow.term,hollow.events,hollow.keymap,hollow.ui,hollow.htp, and more) - Ghostty's VT core for fast, accurate terminal emulation
- Tabs, split panes, floating panes, maximized panes, workspaces, customizable top bar
- Keyboard quick select for visible links, IPs, paths, filenames, and quoted text
- Scrollback, selection, clipboard, hyperlink handling, font discovery, ligature, nerd fonts and emoji support
- Basic support for Kitty images and Sixel
- Windows domains for
pwsh,powershell,cmd, and*WSL, it will populate domains automatically for all wsl distros installed on the system. eg: (UbuntuWSL,DebianWSL,AlpineWSL,FedoraWSL, etc.) - Agent-backed WSL, SSH and container panes via a bundled Linux
hollow-agent(full escape sequence support; WSL falls back to ConPTY automatically) - Cross-platform targets: Windows and WSL (primary); Linux/X11 (basic support); macOS (planned)
- Plugin system with Lua API for custom panes, overlays, and widgets (
hollow.plugins) - Sensible default UX but fully customizable via Lua config and plugins
Paste uses Ghostty's mode-aware encoding and safety checks. Unbracketed multiline text and embedded bracketed-paste terminators are rejected with a "Paste blocked" notification; there is currently no override prompt.
Download a release: github.com/sudo-tee/hollow/releases
Windows builds include the Linux hollow-agent bundle (agents/), auto-deployed
into WSL for pane PTYs (falls back to ConPTY automatically if unavailable). Linux builds
require an X11 session or XWayland; see Linux.
Customize: %APPDATA%\hollow\init.lua (Windows) or
~/.config/hollow/init.lua (other). Use conf/init.lua as a reference for the default config.
Build from source:
Zig version: 0.17.0 only. If you use asdf or mise, run
asdf install or mise install from the repo root — .tool-versions is
already pinned.
make setup # fetch and patch dependencies
make dev # incremental Windows cross-build + run
make run # non-Windows build + run
Run make help for build, test, and benchmark commands. Pass options with
ARGS, for example make dev ARGS="--build-only" or
make bench ARGS="scroll 100". Existing scripts remain available directly.
Full build docs in Development.
The full guide set lives in docs/:
| Section | Start here |
|---|---|
| Guides | Getting started, Configuration, Keybindings, Panes/tabs/workspaces |
| Platforms | Windows, WSL, Linux, macOS |
| Reference | Lua API, CLI, Keymap actions |
| Examples | Config snippets, UI recipes, Plugin authoring |
Companion files: conf/init.lua (default config),
types/hollow.lua (LuaLS typings).
All keymaps are defined in conf/init.lua. The leader key is
<C-Space> (1200ms timeout). See the file for the full bindings or override
them in your user config via hollow.keymap.set.
- Hollow is still an active project and the API surface is still moving.
- The docs in this repo are meant to describe the current product, not a future roadmap.
- Windows/WSL remain main tested targets. Linux/X11 has basic runtime support and release artifacts, with compositor-dependent window chrome behavior.



