A calm desktop workbench for terminal coding agents.
Claude Code, Codex CLI and opencode side by side in one window,
with readable threads, clear approvals, git and a terminal beside every session.
Note
Kettu is a preview. It is built from the first milestone, M0, which is still in acceptance, so expect rough edges and please report them.
Coding agents like Claude Code, Codex and opencode can now plan a change, edit the code and run the tests on their own. Working with them in a terminal still means walls of scrolling text, approvals that are easy to miss, and sessions scattered across tabs and windows.
Kettu is a desktop home for that work. Every agent you use opens side by side in one window, each session sits under its project, and you can see at a glance which agent is working, which one is waiting for you and which one is done. Answers read like documents instead of logs, what the agent changed is shown as a diff, and a question from an agent comes to you as a card you answer with one key.
It drives the agents you already have, with your own installation, account and settings, so nothing about how they work changes: Kettu only gives them a better place to work in.
- Every agent, one window — Claude Code, Codex CLI and opencode sessions side by side in the same project. The sidebar shows which are running, which wait for you and which are done, with subagents under their parent; pin the sessions you come back to and archive the ones you are done with.
- Threads that read well — answers stream as Markdown with highlighted code, edits show as inline diffs, images the agent names show in place, and a run of steps folds into one line. Queue your next message while the agent works, or steer it mid-turn.
- Approvals at a glance — permission requests are cards you answer with a click or a number key, and a system notification tells you when a session needs you.
- Attach anything — paste images, attach files and folders, or mention a project file with
@, from the first message on. - Artifacts — agents publish HTML pages and multi-page canvases through Kettu's built-in artifacts service. Each one keeps its versions, opens in a viewer isolated from the app, and is collected on the Artifacts page and on New session.
- Each agent's own controls — mode, model and reasoning, slash commands, context usage, when the prompt cache expires and, where the agent reports them, your plan limits.
- Usage at a glance — tokens across every agent by day, model and project, with each plan's limits, from Kettu's own record and, if you choose, the agents' local logs.
- Sessions that last — every session is kept with its project, reopens with its full history, survives an agent crash, and can be imported from the agent.
- Git, files and a terminal — the branch, sync state and changes in the top bar, pull requests with their checks through the GitHub CLI, a files pane to read, preview and edit files, and a terminal for each project.
- Crafted details — light and dark themes, English and Simplified Chinese, restrained motion that honors reduce motion, and shortcuts for the common actions.
- Bring your own agents. Kettu implements no agent of its own. It drives Claude Code and Codex through their own interfaces and every other agent over the open Agent Client Protocol (ACP), so your models, settings, rules and tools stay exactly as you set them up.
- Sign in where you always do. Each agent signs in with its own flow, and Kettu never sees your credentials.
- Local by default. Kettu has no account and no server of its own and collects no telemetry. Your sessions stay on your computer, and each agent talks only to its own provider, as it does in your terminal.
Download the installer for your system from Releases. macOS builds are signed and notarized by Apple; Windows builds are not signed yet, so Windows asks once before the first launch.
- macOS: open
Kettu-<version>-arm64.dmgand drag Kettu to Applications. Kettu needs a Mac with Apple silicon. - Windows: run
Kettu-<version>-x64-setup.exe, orKettu-<version>-arm64-setup.exeon Arm. When SmartScreen says it protected your PC, choose More info, then Run anyway. - Linux: make
Kettu-x86_64.AppImage, orKettu-arm64.AppImageon Arm, executable withchmod +x, then run it. AppImages need FUSE 2:libfuse2, orlibfuse2t64on Ubuntu 24.04 and later.
New versions download in the background and install when Kettu restarts.
On a server or a development machine without a desktop, on Linux (x64 or Arm, with glibc 2.28 or later) or a Mac with Apple silicon, install Kettu as a daemon instead, which your other devices connect to:
curl -fsSL https://kettu.sh/install | shIt installs into your home without root and needs no Node.js, checks the download against the release's checksum, links ~/.local/bin/kettu and starts the daemon as a service with the system. kettu pair adds a device, and kettu update moves to a new release. In a container, pass sh -s -- --no-service and run kettu run instead.
Install at least one of these agents first; Kettu finds it on your system.
| Agent | How Kettu runs it |
|---|---|
| Claude Code | The Claude Agent SDK @anthropic-ai/claude-agent-sdk, installed on first use |
| Codex CLI | codex app-server, from your installed codex, or from @openai/codex installed on first use |
| opencode | Your installed opencode, as opencode acp |
| Pi | The ACP adapter pi-acp, installed on first use, with your installed pi |
| fast-agent | The ACP package fast-agent-acp, run with uvx from your installed uv |
| Minion Code | The ACP package minion-code, run with uvx from your installed uv |
| Auggie CLI | The ACP package @augmentcode/auggie, installed on first use, with --acp and auto-update off |
| Codebuddy Code | The ACP package @tencent-ai/codebuddy-code, installed on first use, with --acp |
| DeepAgents | The ACP package deepagents-acp, installed on first use |
| DimCode | The ACP package dimcode, installed on first use, with acp |
| Dirac | The ACP package dirac-cli, installed on first use, with --acp |
| GLM Agent | The ACP package glm-acp-agent, installed on first use |
| Nova | The ACP package @compass-ai/nova, installed on first use, with acp |
| Qoder CLI | The ACP package @qoder-ai/qodercli, installed on first use, with --acp |
| siGit Code | The ACP package @smbcloud/sigit, installed on first use |
| Agoragentic | The ACP package agoragentic-mcp, installed on first use, with --acp |
| Autohand Code | The ACP package @autohandai/autohand-acp, installed on first use |
| Cursor | Your installed cursor-agent, or Cursor's archive on first use |
| Kimi Code CLI | Your installed kimi, or its archive on first use |
| Amp | The ACP adapter amp-acp, downloaded on first use |
| goose | Your installed goose, or its archive on first use |
| Kilo Code | Your installed kilo, or its archive on first use |
| Gemini CLI | The ACP package @google/gemini-cli, installed on first use, with --acp |
| GitHub Copilot | The ACP package @github/copilot, installed on first use, with --acp |
| Qwen Code | The ACP package @qwen-code/qwen-code, installed on first use, with --acp |
| Grok | The ACP package @xai-official/grok, installed on first use, with agent stdio |
| Cline | The ACP package cline, installed on first use, with --acp |
| Factory Droid | The ACP package droid, installed on first use, with exec --output-format acp-daemon and self-updates off |
| OMP (Oh My Pi) | Your installed omp, as omp acp |
| Hermes Agent | Your installed hermes, as hermes acp |
| Muse Code | Your installed muse, as muse acp, with its experimental ACP mode |
| CodeWhale | Your installed codewhale, as codewhale serve --acp (a partial ACP adapter) |
| Bob | The ACP package @ibm/bob, installed on first use, with acp |
| MiniMax Code | The ACP package @minimax-ai/code, installed on first use, with acp |
| Harn | Your installed harn, or its archive on first use |
| Kimchi | Your installed kimchi, or its archive on first use |
| Google Antigravity | The ACP Registry's archive, as agy_acp_server |
| Devin CLI | Your installed devin, as devin acp, else the ACP Registry's archive |
| Cortex Code | Your installed cortex, as cortex acp serve, else the ACP Registry's archive |
| Corust Agent | The ACP Registry's archive, as corust-agent-acp |
| crow-cli | Your installed crow-cli, as crow-cli acp, else the ACP Registry's archive |
| Junie | Your installed junie, as junie --acp=true, else the ACP Registry's archive |
| Mistral Vibe | The ACP Registry's archive, as vibe-acp |
| Poolside | Your installed pool, as pool acp, else the ACP Registry's archive |
| Stakpak | Your installed stakpak, as stakpak acp, else the ACP Registry's archive |
| VT Code | Your installed vtcode, as vtcode acp, else the ACP Registry's archive |
The ACP packages and adapters need Node.js with npm, which Kettu finds through your login shell. The archive agents run the program itself: Kettu uses your copy when it finds one on PATH, and Install in Settings › Agents downloads its archive from the ACP Registry otherwise. fast-agent and Minion Code need uv instead of Node.js.
It rests on one belief, beauty is productivity: a tool you spend whole days in should be a pleasure to look at, and that pleasure is what lets you work faster.
- Start from the best. Study the strongest implementations of each piece, from terminals to diff viewers, and bring them together instead of reinventing them.
- Optimize to the limit. Quick to start and smooth through the longest transcript, with no dropped frames.
- Polish to the limit. A clear hierarchy, calm typography and restrained motion, so you see what the agent changed faster than in any scrollback.
Early feedback shapes Kettu the most, and ideas about design and workflow are especially welcome. Open an issue to report a bug or start a conversation, in any language; a screenshot helps. Security problems go through SECURITY.md, never a public issue.
Want to build Kettu yourself? CONTRIBUTING.md has the setup.
Kettu is released under the Apache-2.0 license.
Kettu is an independent project and is not affiliated with or endorsed by the makers of the agents it supports. All product names are trademarks of their respective owners.