An LLM-driven Wayland desktop manager. Instead of traditional window management, Botnik presents a chat prompt. A locally-running LLM interprets your requests and controls the desktop — opening apps, arranging windows, managing files — via tool calls.
v0.1: A minimal Qt6 Wayland compositor that renders a fullscreen chat interface and streams responses from a local LLM via Ollama.
- Qt6 with Wayland Compositor module (
sudo apt install qt6-wayland-dev) - Ollama with a model pulled (e.g.
ollama pull qwen2.5:7b)
cmake -B build
cmake --build build
./build/botnikWhen running nested inside an existing X11 session:
QT_QPA_PLATFORM=xcb ./build/botnikRun botnik without a GUI window using the --headless flag or BOTNIK_HEADLESS=1 environment variable:
./build/botnik --headlessIn headless mode, the compositor runs against Qt's offscreen platform. Chat interaction happens via stdin/stdout: type a message on stdin (one line per message), and the assistant's response streams to stdout. Sending EOF (Ctrl-D or closing the pipe) triggers a clean exit.
A headless test script verifies the build and basic functionality:
bash scripts/test-headless.shExit code 0 means all tests passed. The script:
- Builds botnik (
cmake -B build && cmake --build build) - Tests startup and clean shutdown via EOF
- Tests that the process stays alive while stdin is open
- If Ollama is reachable, sends a chat message and verifies a response arrives
Tests that require Ollama are skipped (not failed) when Ollama is not running.
- Compositor (
src/compositor.*) — MinimalQWaylandCompositorsubclass. Owns the display output. - Chat UI (
qml/Main.qml) — Fullscreen QML chat log with text input. Solarized dark theme. - Chat model (
src/chatmodel.*) —QAbstractListModelbacking the message list. - Ollama client (
src/ollamaclient.*) — Streams responses from a local Ollama instance via HTTP.
The design intent is that the LLM will eventually control all window management through MCP tools. The compositor is a canvas the model paints on.