A lightweight, transparent desktop overlay for Claude Code on macOS. Clui CC wraps the Claude Code CLI in a floating pill interface with multi-tab sessions, a permission approval UI, voice input, and a skills marketplace.
▶ Watch the full demo on YouTube
- Floating overlay — transparent, click-through window that stays on top. Toggle with
Alt+Space. - Multi-tab sessions — each tab spawns its own
claude -pprocess with independent session state. - Permission approval UI — intercepts tool calls via PreToolUse HTTP hooks so you can review and approve/deny from the UI.
- Conversation history — browse and resume past Claude Code sessions.
- Skills marketplace — install plugins from Anthropic's GitHub repos without leaving Clui CC.
- Voice input — local speech-to-text via Whisper (no cloud transcription).
- File & screenshot attachments — paste images or attach files directly.
- Dual theme — dark/light mode with system-follow option.
- Claude Code, but visual — keep CLI power while getting a fast desktop UX for approvals, history, and multitasking.
- Human-in-the-loop safety — tool calls can be reviewed/approved in-app before execution.
- Session-native workflow — each tab runs an independent Claude session you can resume later.
- Mostly local-first — core behavior runs through your local Claude CLI, with minimal network dependency.
Clui CC is an Electron app with three layers:
Renderer (React UI) -> Preload bridge -> Main process (ControlPlane/RunManager/PermissionServer)
Flow:
- UI sends a prompt from a tab.
- Main process starts
claude -pfor that tab. - Stream events are normalized and rendered live.
- Tool permission requests are intercepted and shown in the approval UI.
- Session state is tracked so you can resume work.
See docs/ARCHITECTURE.md for the full technical deep-dive.
Run these commands one at a time:
1) Clone the repo
git clone https://github.com/lcoutodemos/clui-cc.git2) Enter the project folder
cd clui-cc3) Start the app
./start.commandOptional (install voice dependency automatically first):
./start.command --with-voicestart.command runs environment checks first and prints exact fix commands if something is missing. If checks pass, it installs dependencies, builds, and launches the app.
To close the app:
./stop.commandYou can also double-click start.command and stop.command from Finder.
Toggle the overlay: Alt+Space (or Cmd+Shift+K as fallback).
Setup Prerequisites (Detailed)
You need macOS 13+. Then install these one at a time — copy each command and paste it into Terminal.
Step 1. Install Xcode Command Line Tools (needed to compile native modules):
xcode-select --installStep 2. Install Node.js (recommended: current LTS such as 20 or 22; minimum supported: 18). Download from nodejs.org, or use Homebrew:
brew install nodeVerify it's on your PATH:
node --versionStep 3. Make sure Python has setuptools (needed by the native module compiler). On Python 3.12+ this is missing by default:
python3 -m pip install --upgrade pip setuptoolsStep 4. Install Claude Code CLI:
npm install -g @anthropic-ai/claude-codeStep 5. Authenticate Claude Code (follow the prompts that appear):
claudeStep 6. Verify Claude Code is working (should print 2.1.x or higher):
claude --versionOptional: Install Whisper for voice input:
brew install whisper-cliNo API keys or
.envfile required. Clui CC uses your existing Claude Code CLI authentication (Pro/Team/Enterprise subscription).
Development Commands
If you are actively developing:
npm installnpm run devRenderer changes update instantly. Main-process changes require restarting npm run dev.
npm run buildnpx electron .Architecture and Internals
Clui CC is an Electron app with three layers:
┌─────────────────────────────────────────────────┐
│ Renderer (React 19 + Zustand + Tailwind CSS 4) │
│ Components, theme, state management │
├─────────────────────────────────────────────────┤
│ Preload (window.clui bridge) │
│ Secure IPC surface between renderer and main │
├─────────────────────────────────────────────────┤
│ Main Process │
│ ControlPlane → RunManager → claude -p (NDJSON) │
│ PermissionServer (HTTP hooks on 127.0.0.1) │
│ Marketplace catalog (GitHub raw fetch + cache) │
└─────────────────────────────────────────────────┘
See docs/ARCHITECTURE.md for the full deep-dive.
src/
├── main/ # Electron main process
│ ├── claude/ # ControlPlane, RunManager, EventNormalizer
│ ├── hooks/ # PermissionServer (PreToolUse HTTP hooks)
│ ├── marketplace/ # Plugin catalog fetching + install
│ ├── skills/ # Skill auto-installer
│ └── index.ts # Window creation, IPC handlers, tray
├── renderer/ # React frontend
│ ├── components/ # TabStrip, ConversationView, InputBar, etc.
│ ├── stores/ # Zustand session store
│ ├── hooks/ # Event listeners, health reconciliation
│ └── theme.ts # Dual palette + CSS custom properties
├── preload/ # Secure IPC bridge (window.clui API)
└── shared/ # Canonical types, IPC channel definitions
- Each tab creates a
claude -p --output-format stream-jsonsubprocess. - NDJSON events are parsed by
RunManagerand normalized byEventNormalizer. ControlPlanemanages tab lifecycle (connecting → idle → running → completed/failed/dead).- Tool permission requests arrive via HTTP hooks to
PermissionServer(localhost only). - The renderer polls backend health every 1.5s and reconciles tab state.
- Sessions are resumed with
--resume <session-id>for continuity.
Clui CC operates almost entirely offline. The only outbound network calls are:
| Endpoint | Purpose | Required |
|---|---|---|
raw.githubusercontent.com/anthropics/* |
Marketplace catalog (cached 5 min) | No — graceful fallback |
api.github.com/repos/anthropics/*/tarball/* |
Skill auto-install on startup | No — skipped on failure |
No telemetry, analytics, or auto-update mechanisms. All core Claude Code interaction goes through the local CLI.
For setup issues and recovery commands, see docs/TROUBLESHOOTING.md.
Quick self-check:
npm run doctor| Component | Version |
|---|---|
| macOS | 15.x (Sequoia) |
| Node.js | 20.x LTS, 22.x |
| Python | 3.12 (with setuptools installed) |
| Electron | 33.x |
| Claude Code CLI | 2.1.71 |
- macOS only — transparent overlay, tray icon, and node-pty are macOS-specific. Windows/Linux support is not currently implemented.
- Requires Claude Code CLI — Clui CC is a UI layer, not a standalone AI client. You need an authenticated
claudeCLI. - Permission mode — uses
--permission-mode default. The PTY interactive transport is legacy and disabled by default.
