The agentic engineering control plane for the posthuman future
C++ 72%
QML 21%
Python 2%
CMake 2%
Shell <1%
Nix <1%
C <1%
GLSL <1%
<1%

README.md

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.

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-wayland on Arch and on Debian/Ubuntu, qt6-qtwayland on Fedora.
  • macOS uses the same two routes. See AGENTS.md for the macOS details.