A pure-Rust native GUI coding agent using iced and genai for multi-provider LLM.
Most coding agents today run inside a terminal as TUIs. Crabot is built on the belief that a carefully designed GUI is easier and more efficient to operate: switch the AI model, toggle the work mode, turn tools on/off, and show/hide the right pane with one click, with dropdown menus for preamble, skills, workspaces, AGENTS.md, session list, and prompt recipes.
- No TUI — just a GUI, easy for everyone to use.
- Multi-tab sessions view — switch between concurrent sessions, or let the agent delegate subtasks to new tabs.
- Prompt attachments — attach text and image files to a prompt, with clickable inline previews in the conversation.
- Configure through dialogs — a settings dialog with 8 tab pages (User Interface, AI Models, Prompt Recipes, Builtin Tools, Custom Tools, MCP Servers, Tool Playground, About), no need to write config files by hand.
- An explicit context window, with every detail customizable.
- Native, high-performance built-in tools.
- Custom CLI tools and MCP server tools, defined and managed in-app.
- Built in pure Rust — single native binary, no runtime dependency, zero GC pauses.
- Each session is saved as a JSONL file in the workspace
.agent/sessionsfolder, appended message by message so nothing is lost if the app closes mid-turn.
If you know the structure of the LLM context window, you will appreciate the UI design of crabot.
| Tool | Params | Description |
|---|---|---|
read |
path, offset, limit |
Read any file in your workspace, with smart truncation for large files; image files are sent to the model as pictures instead of bytes, downscaled and re-encoded to the image limits |
write |
path, content |
Create or overwrite files, creating missing parent directories automatically |
edit |
path, edits [{old_text, new_text}] |
Make precise text replacements in existing files, with conflict detection for overlapping edits |
find |
pattern, path |
Locate files by name pattern, skipping ignored files (.gitignore) |
search |
pattern, path |
Search file contents with regular expressions, skipping ignored files (.gitignore) |
bash |
command, timeout |
Run shell commands in your workspace via an in-process interpreter (host-bash fallback), with a timeout and instant cancellation; detach requests (&, nohup) are refused — use the process tool |
process |
action, command, pid, cwd, env, timeout, input, lines, follow, signal |
Manage long-running processes across tool calls — start, list, status, logs, input, wait, stop, restart by OS pid |
ask |
question, options |
Pause and ask you a question when it needs your input or approval |
todo |
items [{text, depth, status}] |
Track its task list, shown live in the right pane |
task |
title, prompt, mode, difficulty |
Delegate a subtask to a separate session and continue once the final report comes back |
renew |
prompt |
Hand off to a fresh session seeded with a summary when the context window is nearly full |
fetch |
url, format |
Download web pages and convert them to clean Markdown |
screenshot |
monitor, window |
Capture a monitor or window as a picture attached to the conversation; omit both targets to list monitors and windows |
Beyond the built-ins, you can add your own custom CLI tools and connect MCP servers (Stdio or HTTP) to expose their tools — everything is managed in-app and toggleable per session tab.
The screenshot tool is backed by XCap. On Linux, building Crabot needs pkg-config libclang-dev libxcb1-dev libxrandr-dev libdbus-1-dev libpipewire-0.3-dev libwayland-dev libegl-dev, and the binary needs the PipeWire, XCB, and XRandR runtime libraries. On macOS, grant Crabot Screen Recording permission.
Grep-style tool output is normalized before it enters the conversation: a run of lines that share a file path (path:12:text, plus path-12-text context lines from -A/-B/-C) collapses into a path: heading followed by the original line numbers and text, so no repetition is paid for twice. What you read in the UI, in the session file, and in the HTML export is exactly what was sent to the model; the live stream stays raw.
The prompt editor's Attachment ▾ menu adds text or image files to the next prompt (up to 20 files). Text files are inserted into the request up to the read limit and truncated with a marker; images go through the same downscaling and re-encoding pipeline as the read tool, and the selected model must accept image input. The chat lists every attachment with a clickable preview, while history keeps only the file path, so attachments are read again when a session is reloaded.
Crabot's most distinctive feature is the explicit context window: every component — preamble, skills, tools, workspace, rules, date — is visible and independently toggleable. Requests are append-only, keeping the request prefix stable across turns so the provider's server-side prompt cache is reused. The center-pane conversation view also lets you follow the model's chain of thought, which is handy for important tasks.
To keep context lean, a few habits help:
- Start a new session when the context fill ratio reaches about 20%~25%, or whenever you start a new topic.
- For the rare long task that cannot fit a single session, the
renewtool hands off to a fresh session seeded with a summary of the progress — the task then finishes like a relay race, with the context compressed at each hand-off. - The
tasktool is like calling a function in a program: pass a prompt and get the final report back, while the subtask runs in a separate session without polluting the parent context.
| Shortcut | Action |
|---|---|
Ctrl+N |
Start a new session (new tab) |
Ctrl+W |
Close the current tab (disabled while the session is running) |
Ctrl+0–Ctrl+9 |
Switch to the Nth tab (Ctrl+0 switches to the last tab) |
Ctrl+F |
Toggle the search bar |
Ctrl+E |
Expand or collapse all dialogs |
Ctrl+Z / Ctrl+Y |
Undo / redo in the prompt editor |
Ctrl+= / Ctrl+- |
Zoom the font in / out |
↑ / ↓ |
Scroll the message view; navigate the session list while the session picker is focused |
Home / End |
Scroll the message view to the top / bottom |
PageUp / PageDown |
Scroll the message view up / down by one page |
Space |
Scroll the message view down by one page |
Esc |
Close the settings dialog or search bar, or exit selectable-text mode |
| Gesture | Action |
|---|---|
| Double-click a message | Toggle the message between rendered Markdown and plain selectable text (double-click again to switch back; Esc exits selectable mode for all messages) |
Ctrl+Click a link |
Open the link in your default browser |
| Shortcut | Action |
|---|---|
Enter |
Send the prompt (or submit the ask-tool answer) |
Shift+Enter |
Insert a newline in the prompt editor |
Enter (search bar) |
Jump to the next search match |
| Shortcut | Action |
|---|---|
↑ / ↓ |
Move the selection |
PageUp / PageDown |
Jump one page |
Home / End |
Jump to the first / last item |
Enter |
Confirm the highlighted item |
Esc |
Close the dropdown |
Download the latest release from GitHub Releases.
Choose the archive matching your platform:
- Linux (x86_64):
crabot-linux-x86_64.tar.gz - macOS (x86_64):
crabot-macos-x86_64.tar.gz - macOS (ARM64):
crabot-macos-aarch64.tar.gz - Windows (x86_64):
crabot-windows-x86_64.zip
Extract and place the binary in your PATH.
cargo install crabot --lockedcargo install --git https://github.com/J-F-Liu/crabotpython/python3 use the host interpreter. To bundle CPython 3.14 (Wasm,
~45 MB larger binary) for hosts without one:
cargo install --git https://github.com/J-F-Liu/crabot --features python


