Why Godot 4 + godot-xterm over Tauri, egui, raylib, or SDL2
The pixel office needs a game-like rendering engine that supports sprite animation, tilemap layouts, and embedded terminal panels. The renderer must feel like a real-time game environment — not a web page dressed up with CSS tricks — while retaining the ability to host live PTY sessions inside individual office tiles. These two requirements together are what make this the most researched decision in the project.
| Capability | Godot 4 | Tauri | egui | raylib | SDL2 |
|---|---|---|---|---|---|
| Sprite animation | Yes | Partial | No | Yes | Yes |
| Tilemap system | Yes | No | No | Partial | No |
| Embedded PTY terminal | Yes | Yes | No | No | No |
| Visual scene editor | Yes | No | No | No | No |
| Integer pixel scaling | Yes | Partial | No | Yes | Yes |
| Hot-reload scripting | Yes | Yes | No | No | No |
| MIT / open license | Yes | Yes | Yes | Yes | Yes |
Godot 4 is the only option that satisfies both the pixel-art workflow requirement and the terminal embedding requirement simultaneously. Every alternative either has the game engine capabilities without a terminal (raylib, SDL2) or has a terminal without a game engine (Tauri). egui satisfies neither. This is not a close call.
The office world is built as a TileMap scene with a 16×16 tile atlas. Individual
agent tiles use AnimatedSprite2D nodes so state changes (idle, working,
waiting, error) map directly to named animation tracks — no bespoke animation
state machine needed. Window.content_scale_mode = integer enforces
pixel-perfect upscaling at every viewport size without blurring.
Pixelorama, a Godot-native pixel editor, opens directly within the engine so asset iteration never leaves the development environment. Changes to the sprite atlas hot-reload into the running scene in under a second.
godot-xterm exposes a Terminal node backed by libvterm. Any scene can
instantiate a Terminal child, set its PTY to an agent subprocess, and
receive live output as a standard Godot signal. The terminal panel that appears when
clicking on an agent tile is literally a Godot node — subject to the same
z-ordering, shader, and animation system as every other scene element.
Because the terminal is a first-class scene node, interactions like "slide the panel in from the right" or "shake the frame on error" are Tween animations, not custom compositor hacks. This integration depth is not achievable in any other evaluated option.
The Godot client communicates with the Go orchestrator over gRPC. Because there is no pure GDScript gRPC library, a thin GDExtension module in C++ wraps the official gRPC C core and exposes typed calls as Godot signals. The extension is compiled once and distributed as a shared library alongside the project binary.
The extension surface is deliberately minimal: connect(address),
send_command(type, payload), and a message_received signal.
All protocol buffer parsing happens in the C++ layer; GDScript only sees native
Godot Dictionary objects, keeping the scripting layer decoupled from the
wire format.
Terminal node renders output but the PTY layer is not implemented; the
subprocess pipe is display-only. This is acceptable for the initial target platform
(Linux developer workstations) but blocks a future Windows port unless an upstream
maintainer or a project contributor adds ConPTY support to godot-xterm.
addons/godot-xterm directory tracks a pinned commit via a git submodule
lock. Any upstream update requires an explicit review and re-pin rather than a passive
git submodule update.
display/window/stretch/mode = viewport and
display/window/stretch/scale_mode = integer in
project.godot. If either setting is absent, the engine uses fractional
scaling and pixel art becomes blurry at non-integer zoom levels. This must be guarded
in CI via a project settings lint step.
grpc, grpc++) and
the Godot headers for the target Godot version. The build is pinned to a specific
Godot minor version; upgrading Godot requires recompiling the extension. A pre-built
.so / .dylib is committed to the repository to avoid
requiring every contributor to have a C++ toolchain installed.