Xenomorphic #
Xenomorphic is a tiling terminal emulator for Qt 6 and QtQuick supporting macOS and Linux. Xenomorphic's long term goal is to become a fully-fledged Agentic Development Environment (ADE) that feels like an "desktop environment in a box" tuned and integrated for agentic development, but where other ADEs start with the fancy features, leaving the basics --- pane management, workspace management, and especially terminal emulation, font rendering, and performance --- as an afterthought, Xenomorphic recognizes that to make something truly pleasant to use and stand the test of time, you have to sweat the details and lock down the fundamentals.
As such, for the terminal component, Xenomorphic uses libghostty-vt
for the VTE backend, providing complete, comprehensive terminal
emulation supporting the latest protocols (e.g. Kitty graphics and
input protocols), plus a terminal renderer front end written in Qt's
low level QRhi graphics rendering abstraction, allowing it to
automatically use the preferred graphics driver on each platform
(Metal, Vulkan, OpenGL) without any sacrifice in performance or low
level control. The terminal renderer front end only redraws dirty rows
using libghostty-vt's damage tracking, caches rasterized glyphs,
shaped runs of text, per row geometry, and Kitty images, renders all
glyphs as a single batch, and keeps the batch as a persistant GPU
buffer with only updated rows streamed to GPU memory, to preserve
Ghostty-like performance.
Supported today:
- Truecolor.
- OSC 8 hyperlinks, with hover and click.
- Every SGR attribute: bold, faint, italic, all underline styles, strikethrough, overline, inverse, and conceal.
- All cursor shapes, with blinking.
- Block selection, copy mode, and scrollback search.
- Bracketed paste, focus reporting, mouse reporting, and the Kitty keyboard protocol.
- Kitty images, layered by
z. - Desktop notifications and progress reports through OSC 9.
- OSC 52 clipboard writes.
- Size and color-scheme queries.
- Ligatures, emoji, right-to-left writing, and all other Unicode wierdness, through Qt's font shaping system.
Additionally, Xenomorphic renders all tabs in all active project workspaces to separate GPU framebuffers using QML's GPU capabilities, allowing live workspace previews in the side pane and a full Misson Control view where you can select any pane in any tab of any project workspace and drag it anywhere else in the pane hierarchy, with full tiling zones.
Furthermore, Xenomorphic is actually split into a client/server architecture, with a thin server holding only the processes launched in each pane and their pseudoteletypes, and handling communication back and forth with the client over WebSockets on localhost, with terminal byte/resize replay to catch new clients up. Meanwhile, the Xenomorphic client holds all state regarding pane and workspace layout, saving it on exit to a JSON file that links each pane to the pane ID in the daemon, but also recording cwd and running command (whitelisted) in case the daemon is down, so that you can get seamless resumption no matter what, and your work doesn't get interrupted just because you restart the client.
Recommended: Install with Nix #
The flake pins Qt, ghostty, QWindowKit, and zig. No system Qt is necessary.
Run these commands in the repository root:
nix build # build the package into ./result
./result/bin/xenomorphic # run it
nix profile install . # install into your profile
xenomorphic # run it from PATH
If your Nix reports that flakes are disabled, add
--extra-experimental-features "nix-command flakes" to each command.
The install tree holds two binaries, xenomorphic and xenomorphicd. The app
starts the daemon from its own directory. Keep the two files together.
Run nix flake check for the static analysis gate.
Iterate in the dev shell #
nix develop
cmake -S app -B build -G Ninja -DCMAKE_BUILD_TYPE=Debug
cmake --build build
./build/bin/xenomorphic
The dev shell supplies Qt, Clang 21, and zig. It sets the Qt plugin and QML import paths too, so the unwrapped binary starts directly.
Build with CMake #
A plain CMake build needs no Nix. CMake clones ghostty and QWindowKit at the
revisions in app/cmake-content.json, then builds both in-tree.
Requirements #
- CMake 3.28 or newer, Ninja, and git.
- A C++26 compiler: GCC 15 or Clang 21.
- Qt 6.9 or newer, with private headers, ShaderTools, WebSockets, and Test.
- Zig 0.16.0 on
PATH. ghostty builds with zig. - Network access. The first configure clones ghostty, and the build takes several minutes.
Do not build against Qt 6.8 or older. The renderer needs
QTextOption::DisableEmojiParsing, which Qt 6.9 added.
Arch Linux #
sudo pacman -S --needed base-devel cmake ninja git zig \
qt6-base qt6-declarative qt6-shadertools qt6-websockets
Arch ships zig 0.16.0. Check the version with zig version. Use the download
below if the version differs.
Fedora #
sudo dnf install gcc-c++ cmake ninja-build git \
qt6-qtbase-devel qt6-qtbase-private-devel qt6-qtdeclarative-devel \
qt6-qtwebsockets-devel qt6-qtshadertools-devel
Debian and Ubuntu #
sudo apt install build-essential cmake ninja-build git \
qt6-base-dev qt6-base-private-dev qt6-declarative-dev \
qt6-declarative-private-dev qt6-websockets-dev qt6-shadertools-dev
On Debian and Ubuntu, install these QML modules for the app:
sudo apt install qml6-module-qtqml qml6-module-qtquick \
qml6-module-qtquick-controls qml6-module-qtquick-layouts \
qml6-module-qtquick-dialogs
Do not use Debian 13 or Ubuntu 25.04. Both ship Qt 6.8. Ubuntu 25.10 and Debian sid work.
Get zig 0.16.0 #
curl -LO https://ziglang.org/download/0.16.0/zig-x86_64-linux-0.16.0.tar.xz
tar -xf zig-x86_64-linux-0.16.0.tar.xz
export PATH="$PWD/zig-x86_64-linux-0.16.0:$PATH"
For aarch64, replace x86_64 with aarch64 in both names.
Build and run #
cmake -S app -B build -G Ninja -DCMAKE_BUILD_TYPE=Release
cmake --build build
./build/bin/xenomorphic
This project compiles ghostty in ReleaseFast mode in every configuration, including Debug. A Debug build therefore stays usable.
Install #
cmake --install build --prefix "$HOME/.local"
The install tree is bin/xenomorphic and bin/xenomorphicd. The build does not
bundle Qt. The target machine needs the Qt runtime and the QtQuick QML modules.
Notes #
- A Wayland session needs the Qt Wayland plugin:
qt6-waylandon Arch and on Debian/Ubuntu,qt6-qtwaylandon Fedora. - macOS uses the same two routes. See
AGENTS.mdfor the macOS details.