Multi-engine AI coding desktop client (Tauri). Claude Code, Codex, Gemini, OpenCode, DeepSeek Harness and more in one GUI.
See the codeccgui is an open-source multi-engine AI coding desktop client. In plain words: it brings command-line AI coding runtimes — Claude Code, Codex CLI, Kimi CLI, Grok CLI, Pi CLI, OMP CLI, DeepSeek Harness (DSH), Antigravity, OpenCode, and Qoder — into one graphical interface.
No more staring at a black terminal. Open ccgui, pick a project, and chat with AI to write code, fix bugs, and commit to Git. Streaming output, thinking traces, and tool calls are visible as they happen; token usage appears when the engine reports it.
The app is built with Tauri 2 + React 18 + TypeScript + Rust and runs on macOS, Windows, and Linux. Settings and state are persisted locally. Content sent to an AI provider follows the boundary of the channel you configured for that CLI.
Every engine below is wired in through a dedicated protocol adapter in the Rust backend — streaming events, session history, and provider channels are handled natively, not scraped off a terminal screen.
Claude Code
Codex CLI
Kimi CLI
Grok CLI
Pi CLI
OMP CLI
DeepSeek Harness
Antigravity
OpenCode
Qoder
Legend: ✅ Supported · ⚠️ Partial · ❌ Not yet supported · 🔁 Not supported by the CLI, but ccgui has a GUI equivalent · ➖ N/A
| Feature | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Streaming output (per-token) | ✅ | ✅ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| Session history & resume | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| Interrupt (Stop) | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| Message queue | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| Image attachments | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | ✅ |
| Permission modes | auto·manual·plan·bypass | auto·manual·bypass | auto·plan·bypass | bypass only | auto only | auto·plan·bypass | auto only | auto·plan·bypass | auto·plan | bypass only |
| Model picker | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| Reasoning effort | ✅ | ✅ | ❌ | ❌ | ✅ | ✅ | ❌ | ⚠️ | ❌ | ✅ |
| Token usage & context window | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ⚠️ | ✅ |
| Todo list rendering | ✅ | ❌ | ❌ | ❌ | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ |
| Sub-agent display (dispatch panel) | ✅ | ✅ | ✅ | ❌ | ✅ | ✅ | ✅ | ⚠️ | ⚠️ | ⚠️ |
| Team mode (multi-agent orchestration) | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ |
/ slash commands & skills (picker) | ✅ | ✅ | ⚠️ | ⚠️ | ⚠️ | ⚠️ | ⚠️ | ❌ | ⚠️ | ⚠️ |
@ file mentions | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| Provider/channel switching | ✅ | ✅ | ✅ | ✅ | ⚠️ | ⚠️ | ⚠️ | ⚠️ | ⚠️ | ⚠️ |
| CC Switch import | ✅ | ✅ | ❌ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ |
| Fast mode (service tier) | ❌ | ✅ | ❌ | ❌ | ❌ | ✅ | ❌ | ❌ | ❌ | ❌ |
| Session rename | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
Native command /new (new session) | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
Native command /clear (clear context) | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
Native command /compact (compact context) | ✅ | ⚠️ | ⚠️ | ⚠️ | ⚠️ | ✅ | ⚠️ | ⚠️ | ⚠️ | ⚠️ |
Native command ask (question cards) | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | ❌ |
Native command /mcp | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ | ❌ | ❌ | ❌ | ❌ |
Native command /plugins | ➖ | ➖ | ➖ | ➖ | ❌ | ✅ | ➖ | ➖ | ➖ | ➖ |
Native command /goal (persistent goal) | ➖ | ➖ | ➖ | ➖ | ➖ | ❌ | ➖ | ➖ | ➖ | ➖ |
Kimi question cards use the local CLI's ACP form channel (verified with Kimi 2.0.2), including multiple questions, multiple selections, dismissal, and interruption. Kimi currently accepts declared options only, so these cards do not offer a free-text “Other” answer. WSL workspaces retain the non-interactive CLI fallback and do not support Kimi question cards or plan mode; prompt-mode launches never add incompatible interactive permission flags.
.gitignore-aware project file index; file links in replies handle URL-encoded paths and have a right-click menu.@ccgui/plugin-sdk) plus an in-app runtime, manager UI, and trust boundary.Grab the installer for your platform from the Releases page:
| Platform | Installer |
|---|---|
| macOS (Apple Silicon, signed) | aarch64.dmg |
| Windows | .exe (NSIS) |
| Linux | .AppImage, .rpm |
The .rpm is zstd-compressed and requires rpm ≥ 4.14 (Fedora 28+, RHEL 8+); on older rpm-based systems use the AppImage instead.
After installing, open Settings, configure a provider channel for the CLI you want (or sign in), add a project folder, and start chatting.
dsh web host or auto-start one.llm-pi-ai routes), ccgui declares image input on the route before sending — no manual DSH settings edit needed; official adapters report their own capabilities.Want to build it yourself or contribute? Three steps.
| Tool | Version | What for |
|---|---|---|
| Node.js | 20 or newer | Runs the frontend toolchain |
| pnpm | 10 (pinned via packageManager) | Installs dependencies |
| Rust | stable (install via rustup) | Compiles the backend |
Each OS also needs the standard Tauri prerequisites — see the official Tauri guide:
xcode-select --install.webkit2gtk and friends — copy the commands from the Tauri docs.git clone https://github.com/zhukunpenglinyutong/desktop-cc-gui.git
cd desktop-cc-gui
pnpm install
Note: this is a pnpm workspace (the plugin SDK lives in packages/plugin-sdk); the lockfile is pnpm-lock.yaml.
pnpm dev
A few tips:
1420.pnpm build:mac # macOS signed build (scripts/build-signed-macos.sh)
pnpm build:mac:skip-notarize # same, skipping notarization
Windows and Linux installers are produced by the CI workflows under .github/workflows/ (release.yml, build-windows-artifact.yml).
| Part | Technology |
|---|---|
| UI | React 18 + TypeScript + Tailwind CSS 4 + zustand |
| Build | Vite 6 |
| Desktop shell | Tauri 2 (Rust backend: git2, rusqlite, portable-pty, axum) |
| Tests | Vitest (frontend) + cargo test (Rust) |
desktop-cc-gui/
├── src/ # Frontend code
│ ├── features/ # ★ Feature modules: chat / files / git / terminal /
│ │ # settings / plugins / commands / update / open-app
│ ├── components/ # Shared UI components (incl. engine brand icons)
│ ├── i18n/ # zh + en locale bundles
│ ├── styles/ # Global styles
│ └── lib/ utils/ # Utility functions
├── src-tauri/ # Rust backend
│ └── src/ # engine/ (one module per CLI), history/, plugins/,
│ # git.rs, terminal.rs, web.rs (LAN bridge), ...
├── packages/plugin-sdk/ # @ccgui/plugin-sdk — plugin authoring kit
├── tests/ # Frontend integration-style tests (Vitest)
├── scripts/ # Build and packaging scripts
└── docs/ # Plugin development guide, engine mode notes
src/features/ and edit there. New components live inside that feature's own folder.#[tauri::command] in the matching src-tauri/src/ module and call it from the frontend via the Tauri API.src/i18n/zh.ts, src/i18n/en.ts) synchronized — hardcoded UI text is not allowed.| Command | What it does |
|---|---|
pnpm dev | Start the full app (Tauri dev mode) |
pnpm build | TypeScript check + frontend production build |
pnpm test | Run the Vitest suite |
pnpm preview | Preview the production frontend build |
cargo test --manifest-path src-tauri/Cargo.toml | Run Rust tests |
xxx.test.ts(x) files next to the source, plus heavier suites under tests/.cargo test --manifest-path src-tauri/Cargo.toml.Not many rules, but each exists for a reason:
pnpm build (typecheck) and pnpm test green locally, plus cargo test if you touched Rust.src/i18n/, and both shipped locale bundles must stay synchronized.src/components/ only once they're genuinely reused across features.any; write real types.Use Conventional Commits with a Chinese action phrase by default: type(scope): 中文动宾短句.
| type | When to use |
|---|---|
feat | New feature |
fix | Bug fix |
refactor | Refactoring (no behavior change) |
docs | Documentation |
test | Adding/updating tests |
chore | Housekeeping (version bumps, deps, scripts) |
perf / style / ci | Performance / formatting / CI |
Real examples from this repo:
feat(chat): 支持工具调用参数与结果展开、Git Diff/Bash美化及完成元数据展示
fix(codex): Windows .cmd shim 下多行提示词只送达第一行
perf(chat): reveal streamed text per frame without reparsing markdown
No emoji in commit messages, and no AI-generated signatures.
main, named like feat/xxx or fix/xxx.pnpm build + pnpm test green locally.main branch. Title in commit format; in the description, explain what changed, why, and how you verified it.Not sure where to start? Browse the Issues and pick one that interests you. Found a bug or have an idea? Open an issue and let's talk.
Thanks for the support and feedback from the friends at LINUX DO.
AtomGit: hosts this project in China, helping users in mainland China access the project and download Releases faster.
Thank you for AtomGit platform G-Star certification
Thanks to all the contributors who help make ccgui better.
This project originally started from CodexMonitor. Since v1.0.0 the codebase has been rewritten from scratch — no CodexMonitor code remains, but the original inspiration is gratefully acknowledged.
4,201 commits
1,430 commits
141 commits
117 commits
TypeScript
59.3%
Rust
38.8%
CSS
1.2%
Multi-engine AI coding desktop client (Tauri). Claude Code, Codex, Gemini, OpenCode, DeepSeek Harness and more in one GUI.
See the codeccgui is an open-source multi-engine AI coding desktop client. In plain words: it brings command-line AI coding runtimes — Claude Code, Codex CLI, Kimi CLI, Grok CLI, Pi CLI, OMP CLI, DeepSeek Harness (DSH), Antigravity, OpenCode, and Qoder — into one graphical interface.
No more staring at a black terminal. Open ccgui, pick a project, and chat with AI to write code, fix bugs, and commit to Git. Streaming output, thinking traces, and tool calls are visible as they happen; token usage appears when the engine reports it.
The app is built with Tauri 2 + React 18 + TypeScript + Rust and runs on macOS, Windows, and Linux. Settings and state are persisted locally. Content sent to an AI provider follows the boundary of the channel you configured for that CLI.
Every engine below is wired in through a dedicated protocol adapter in the Rust backend — streaming events, session history, and provider channels are handled natively, not scraped off a terminal screen.
Claude Code
Codex CLI
Kimi CLI
Grok CLI
Pi CLI
OMP CLI
DeepSeek Harness
Antigravity
OpenCode
Qoder
Legend: ✅ Supported · ⚠️ Partial · ❌ Not yet supported · 🔁 Not supported by the CLI, but ccgui has a GUI equivalent · ➖ N/A
| Feature | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Streaming output (per-token) | ✅ | ✅ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| Session history & resume | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| Interrupt (Stop) | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| Message queue | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| Image attachments | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | ✅ |
| Permission modes | auto·manual·plan·bypass | auto·manual·bypass | auto·plan·bypass | bypass only | auto only | auto·plan·bypass | auto only | auto·plan·bypass | auto·plan | bypass only |
| Model picker | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| Reasoning effort | ✅ | ✅ | ❌ | ❌ | ✅ | ✅ | ❌ | ⚠️ | ❌ | ✅ |
| Token usage & context window | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ⚠️ | ✅ |
| Todo list rendering | ✅ | ❌ | ❌ | ❌ | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ |
| Sub-agent display (dispatch panel) | ✅ | ✅ | ✅ | ❌ | ✅ | ✅ | ✅ | ⚠️ | ⚠️ | ⚠️ |
| Team mode (multi-agent orchestration) | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ |
/ slash commands & skills (picker) | ✅ | ✅ | ⚠️ | ⚠️ | ⚠️ | ⚠️ | ⚠️ | ❌ | ⚠️ | ⚠️ |
@ file mentions | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| Provider/channel switching | ✅ | ✅ | ✅ | ✅ | ⚠️ | ⚠️ | ⚠️ | ⚠️ | ⚠️ | ⚠️ |
| CC Switch import | ✅ | ✅ | ❌ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ |
| Fast mode (service tier) | ❌ | ✅ | ❌ | ❌ | ❌ | ✅ | ❌ | ❌ | ❌ | ❌ |
| Session rename | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
Native command /new (new session) | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
Native command /clear (clear context) | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
Native command /compact (compact context) | ✅ | ⚠️ | ⚠️ | ⚠️ | ⚠️ | ✅ | ⚠️ | ⚠️ | ⚠️ | ⚠️ |
Native command ask (question cards) | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | ❌ |
Native command /mcp | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ | ❌ | ❌ | ❌ | ❌ |
Native command /plugins | ➖ | ➖ | ➖ | ➖ | ❌ | ✅ | ➖ | ➖ | ➖ | ➖ |
Native command /goal (persistent goal) | ➖ | ➖ | ➖ | ➖ | ➖ | ❌ | ➖ | ➖ | ➖ | ➖ |
Kimi question cards use the local CLI's ACP form channel (verified with Kimi 2.0.2), including multiple questions, multiple selections, dismissal, and interruption. Kimi currently accepts declared options only, so these cards do not offer a free-text “Other” answer. WSL workspaces retain the non-interactive CLI fallback and do not support Kimi question cards or plan mode; prompt-mode launches never add incompatible interactive permission flags.
.gitignore-aware project file index; file links in replies handle URL-encoded paths and have a right-click menu.@ccgui/plugin-sdk) plus an in-app runtime, manager UI, and trust boundary.Grab the installer for your platform from the Releases page:
| Platform | Installer |
|---|---|
| macOS (Apple Silicon, signed) | aarch64.dmg |
| Windows | .exe (NSIS) |
| Linux | .AppImage, .rpm |
The .rpm is zstd-compressed and requires rpm ≥ 4.14 (Fedora 28+, RHEL 8+); on older rpm-based systems use the AppImage instead.
After installing, open Settings, configure a provider channel for the CLI you want (or sign in), add a project folder, and start chatting.
dsh web host or auto-start one.llm-pi-ai routes), ccgui declares image input on the route before sending — no manual DSH settings edit needed; official adapters report their own capabilities.Want to build it yourself or contribute? Three steps.
| Tool | Version | What for |
|---|---|---|
| Node.js | 20 or newer | Runs the frontend toolchain |
| pnpm | 10 (pinned via packageManager) | Installs dependencies |
| Rust | stable (install via rustup) | Compiles the backend |
Each OS also needs the standard Tauri prerequisites — see the official Tauri guide:
xcode-select --install.webkit2gtk and friends — copy the commands from the Tauri docs.git clone https://github.com/zhukunpenglinyutong/desktop-cc-gui.git
cd desktop-cc-gui
pnpm install
Note: this is a pnpm workspace (the plugin SDK lives in packages/plugin-sdk); the lockfile is pnpm-lock.yaml.
pnpm dev
A few tips:
1420.pnpm build:mac # macOS signed build (scripts/build-signed-macos.sh)
pnpm build:mac:skip-notarize # same, skipping notarization
Windows and Linux installers are produced by the CI workflows under .github/workflows/ (release.yml, build-windows-artifact.yml).
| Part | Technology |
|---|---|
| UI | React 18 + TypeScript + Tailwind CSS 4 + zustand |
| Build | Vite 6 |
| Desktop shell | Tauri 2 (Rust backend: git2, rusqlite, portable-pty, axum) |
| Tests | Vitest (frontend) + cargo test (Rust) |
desktop-cc-gui/
├── src/ # Frontend code
│ ├── features/ # ★ Feature modules: chat / files / git / terminal /
│ │ # settings / plugins / commands / update / open-app
│ ├── components/ # Shared UI components (incl. engine brand icons)
│ ├── i18n/ # zh + en locale bundles
│ ├── styles/ # Global styles
│ └── lib/ utils/ # Utility functions
├── src-tauri/ # Rust backend
│ └── src/ # engine/ (one module per CLI), history/, plugins/,
│ # git.rs, terminal.rs, web.rs (LAN bridge), ...
├── packages/plugin-sdk/ # @ccgui/plugin-sdk — plugin authoring kit
├── tests/ # Frontend integration-style tests (Vitest)
├── scripts/ # Build and packaging scripts
└── docs/ # Plugin development guide, engine mode notes
src/features/ and edit there. New components live inside that feature's own folder.#[tauri::command] in the matching src-tauri/src/ module and call it from the frontend via the Tauri API.src/i18n/zh.ts, src/i18n/en.ts) synchronized — hardcoded UI text is not allowed.| Command | What it does |
|---|---|
pnpm dev | Start the full app (Tauri dev mode) |
pnpm build | TypeScript check + frontend production build |
pnpm test | Run the Vitest suite |
pnpm preview | Preview the production frontend build |
cargo test --manifest-path src-tauri/Cargo.toml | Run Rust tests |
xxx.test.ts(x) files next to the source, plus heavier suites under tests/.cargo test --manifest-path src-tauri/Cargo.toml.Not many rules, but each exists for a reason:
pnpm build (typecheck) and pnpm test green locally, plus cargo test if you touched Rust.src/i18n/, and both shipped locale bundles must stay synchronized.src/components/ only once they're genuinely reused across features.any; write real types.Use Conventional Commits with a Chinese action phrase by default: type(scope): 中文动宾短句.
| type | When to use |
|---|---|
feat | New feature |
fix | Bug fix |
refactor | Refactoring (no behavior change) |
docs | Documentation |
test | Adding/updating tests |
chore | Housekeeping (version bumps, deps, scripts) |
perf / style / ci | Performance / formatting / CI |
Real examples from this repo:
feat(chat): 支持工具调用参数与结果展开、Git Diff/Bash美化及完成元数据展示
fix(codex): Windows .cmd shim 下多行提示词只送达第一行
perf(chat): reveal streamed text per frame without reparsing markdown
No emoji in commit messages, and no AI-generated signatures.
main, named like feat/xxx or fix/xxx.pnpm build + pnpm test green locally.main branch. Title in commit format; in the description, explain what changed, why, and how you verified it.Not sure where to start? Browse the Issues and pick one that interests you. Found a bug or have an idea? Open an issue and let's talk.
Thanks for the support and feedback from the friends at LINUX DO.
AtomGit: hosts this project in China, helping users in mainland China access the project and download Releases faster.
Thank you for AtomGit platform G-Star certification
Thanks to all the contributors who help make ccgui better.
This project originally started from CodexMonitor. Since v1.0.0 the codebase has been rewritten from scratch — no CodexMonitor code remains, but the original inspiration is gratefully acknowledged.
4,201 commits
1,430 commits
141 commits
117 commits
TypeScript
59.3%
Rust
38.8%
CSS
1.2%