CodeIsland
Real-time AI coding agent status panel in your MacBook notch — live status, approvals & replies for 30+ AI coding tools, with iPhone & Apple Watch companions
Links
README
From the repo.
CodeIsland
Your AI coding agents, live in the MacBook notch.
See what every agent is doing, approve tool calls and answer its questions — without leaving the window you're in.
Install •
Highlights •
Supported tools •
How it works •
Build
English | 简体中文
Why CodeIsland?
Coding agents spend a lot of time either working or waiting on you — and you only find out by switching to their window. CodeIsland turns the notch into a live status bar for all of them: which session is thinking, which one needs an approval, which one just finished. Approve the tool call or answer the question right there, or click once to jump to the exact terminal tab.
It works with 30+ AI coding tools, installs its hooks for you, and keeps everything on your Mac.
Highlights
|
👀 See everything at a glance
|
✋ Act without switching windows
|
|
🧘 Stays out of your way
|
🌐 Beyond this Mac
|

Approve a tool call without leaving your editor…

…or answer the agent's question right in the notch.
Supported tools
Claude Code | Codex | Gemini CLI | Cursor | Grok CLI | OpenCode |
Qoder | Trae | Copilot CLI | Factory Droid | CodeBuddy | Qwen Code |
Kimi Code CLI | Cline | Pi / Oh My Pi | Hermes | OpenClaw | Google Antigravity |
Kiro CLI | StepFun | WorkBuddy | DeepSeek Harness | AiWork | + more see below ↓ |
Also covered: Trae CN, Trae CLI / Trae CLI Next, Qoder CN, QoderWork and Qoder CLI, Cursor CLI, CodeBuddy CN, Claude Desktop (Code tab, and Cowork), ZCode — plus any tool with Claude-style hooks, added as a custom CLI in Settings → Hooks.
Several accounts? Register extra Claude Code, Codex and Grok config directories (e.g. a second CLAUDE_CONFIG_DIR) in Settings → Hooks; each gets its own hooks and status, and sessions, transcripts and usage cover all of them.
Knows where it runs: sessions inside tmux, zellij, Herdr or T3 Code get a chip next to the terminal badge, and click-to-jump goes to the right pane or thread.
Approvals & questions can be answered from the island for tools whose hooks wait for a decision — Claude Code, Codex, Gemini CLI, Qoder, Qwen Code, Trae CLI Next, ZCode, OpenCode, Pi / Oh My Pi, DeepSeek Harness and others. Tools whose hooks can't carry a decision (Google Antigravity, AiWork) are shown read-only, and approvals stay in their own UI.
Where each integration is installed
CodeIsland writes these for you on launch (and repairs them if they drift); each can be switched off in Settings → Hooks.
| Tool | Installed into |
|---|---|
| Claude Code | ~/.claude/settings.json (honours $CLAUDE_CONFIG_DIR) |
| Codex | ~/.codex/hooks.json — needs a one-time review |
| Gemini CLI | ~/.gemini/settings.json |
| Google Antigravity | ~/.gemini/config/hooks.json |
| Cursor / Cursor CLI | ~/.cursor/hooks.json |
| Grok CLI | ~/.grok/hooks/codeisland.json |
| Qoder / Qoder CN / QoderWork | ~/.qoder/, ~/.qoder-cn/, ~/.qoderwork/ settings.json |
| Trae / Trae CN | ~/.trae/hooks.json, ~/.trae-cn/hooks.json (turn on global hooks in Trae) |
| Trae CLI / Trae CLI Next | ~/.trae/traecli.yaml, ~/.trae/cli/hooks.json |
| Factory, CodeBuddy, StepFun, WorkBuddy, Qwen Code | ~/.<tool>/settings.json |
| Copilot CLI | ~/.copilot/hooks/codeisland.json |
| Kimi Code CLI | ~/.kimi-code/config.toml (or legacy ~/.kimi/) |
| Kiro CLI | ~/.kiro/agents/codeisland.json — launch with kiro --agent codeisland |
| Hermes | ~/.hermes/config.yaml |
| ZCode | ~/.zcode/cli/config.json |
| Cline | ~/Documents/Cline/Hooks |
| OpenCode | plugin at ~/.config/opencode/plugins/codeisland.js |
| Pi / Oh My Pi | extension at ~/.pi/agent/extensions/codeisland.ts / ~/.omp/agent/extensions/codeisland.ts |
| OpenClaw | plugin at ~/.openclaw/codeisland-plugin/ |
| DeepSeek Harness | dsh-island plugin — see below |
| AiWork | nothing to install — read from AiWork's local daemon |
Installation
Homebrew (recommended)
brew tap wxtsky/tap
brew install --cask codeisland
Manual download
- Download
CodeIsland.dmgfrom the latest release - Drag
CodeIsland.appinto Applications - Launch it — hooks are installed automatically for every AI tool it detects
The app is signed and notarized, and keeps itself up to date through Sparkle.
iPhone & Apple Watch Buddy
Code Island Buddy — free on the App Store, no account, no server — mirrors your Mac sessions to the Dynamic Island, Lock Screen, StandBy and Apple Watch, and lets you approve or answer from the phone.
- On the Mac, open Settings → Buddy → iPhone Buddy and turn on Allow iPhone Buddy to discover this Mac.
- Open the app on the same Wi-Fi to pair; connected devices are listed under the toggle.
- When macOS asks, allow both Local Network and Bluetooth. Local Network carries full snapshots while the app is open; Bluetooth carries the compact summaries that keep the Live Activity and the Watch fresh once it's in the background.
The companion source lives in this repository under ios/CodeIslandCompanion and apple-companion.
Hardware Buddy (ESP32)
A small ESP32 screen on your desk, driven over Bluetooth: it sleeps when your agents are idle, types while they work, and waves at you when one needs an approval or an answer. Board, parts list, firmware and pairing are in hardware/README.md (in Chinese). The Mac-side switch is in Settings → Buddy.
Setup notes
Codex — trust the hooks once
Codex won't run a hook it hasn't been shown. After installing, Codex prints 1 hook needs review before it can run. — run /hooks, review the CodeIsland entries and trust them. Until you do, Codex silently ignores them, which looks exactly like CodeIsland not supporting Codex. Codex stores a hash per trusted hook in ~/.codex/config.toml under [hooks.state], so if a CodeIsland update rewrites ~/.codex/hooks.json, review them once more.
While a Codex turn runs, the collapsed bar shows the agent's latest public output when no tool is active. Hidden reasoning, encrypted content, tool results and internal subagent messages are never displayed.
OpenCode 1.x and 2
A single JS plugin talks to the socket directly — no bridge binary. The same file serves OpenCode 1.x (server()) and OpenCode 2 (setup()); OpenCode 2 auto-loads it from ~/.config/opencode/plugins/. Under OpenCode 2's shared background service, click-to-jump reaches the terminal app but not the exact tab, and questions are answered through the service's local HTTP API.
DeepSeek Harness
DSH is plugin-native, so CodeIsland installs nothing. The dsh-island plugin listens to DSH's built-in events and writes them to CodeIsland's socket:
dsh plugin --profile <profile> add github:cdxiaodong/dsh-island
Google Antigravity
Antigravity's PreToolUse hook can refuse a tool call but can't approve one, so the island observes Antigravity: it shows the running tool and hands every decision straight back to Antigravity's own permission prompt, so your grants and "Always Allow" keep working.
SSH remote hosts
Add a host in Settings → Remote. CodeIsland installs a small helper and the hooks on the server (merged into your existing config, never replacing it), and forwards events back over SSH. An optional working-directory filter keeps other people's sessions off your island on shared machines. If a tool shows skipped, the status line says why — usually its config directory doesn't exist on that host yet.
Claude Desktop Cowork
Cowork runs inside Claude Desktop's sandbox, where hooks never fire, so CodeIsland reads the session files Claude Desktop keeps on your Mac instead (~/Library/Application Support/Claude/local-agent-mode-sessions/, read-only — nothing is installed or written there). Cowork conversations get a card with their title, live status, the running tool, the latest reply and a completion sound; a pending permission request lights up as waiting. Approvals are still answered in Claude Desktop — click the card to open that conversation. Only sessions active in the last few minutes appear, so old ones never come back as ghost cards. Toggle it under Settings → Hooks → Claude Desktop.
Phone & chat pushes
Settings → Behavior → Push notifications sends approvals, questions (with numbered options), finished turns, turn errors and follow-up reminders to Bark, ntfy, DingTalk, Lark / Feishu, WeCom, Slack or Telegram — several at once, each with its own event choices and a Send test button that shows the service's real reply. By default a push only goes out while you're away (screen locked, screen saver, displays asleep, or no keyboard / mouse input for 5 minutes), and subagent turns are never pushed. Commands and messages go through the same credential redaction as the rest of the app. Pushes answer nothing: approve on the Mac.
How it works
AI tool (Claude Code / Codex / Gemini / Cursor / …)
└─ hook fires ─→ codeisland-bridge (native Swift binary)
└─ Unix socket /tmp/codeisland-<uid>.sock
└─ CodeIsland updates the notch in real time
└─ optional: iPhone / Watch / ESP32 Buddy, push, webhook
CodeIsland installs lightweight hooks into each tool's own config. When the tool fires an event — session start, tool call, permission request, question, stop — the bridge forwards it as JSON over a local Unix socket, and the island updates instantly. For events that wait on you, the answer travels back the same way.
Privacy: events never leave your Mac unless you opt in. The only network requests CodeIsland makes are Sparkle update checks, plus — only if you turn them on — Claude plan-limit lookups (sent to api.anthropic.com with your own Claude Code login), webhook forwarding to the URL you configure, and pushes to the services you set up.
Settings
| Page | What's there |
|---|---|
| General | Language, launch at login, display selection |
| Behavior | Auto-expand (approvals and questions separately), hover delay, smart suppress, completion style, follow-up reminders, session cleanup, silence rules, auto-approve, push notifications, webhook |
| Appearance | Panel size, notch width, font size, reply lines, open/close speed, project name, git branch, task progress, session recap, model label, usage stats, plan limits |
| Mascots | Preview every character and its animations |
| Sound | 8-bit sounds per event, volume, quiet hours, mute while away |
| Shortcuts | Global hotkeys for toggle, approve, deny, always-allow, skip, jump |
| Remote | SSH hosts and per-host directory filters |
| Hooks | Install status per tool, reinstall / uninstall, extra config directories, Claude Desktop Cowork, custom CLIs |
| Buddy | iPhone / Apple Watch pairing, ESP32 hardware buddy |
| About | Version, this version's release notes, updates, diagnostics export |
Keyboard shortcuts
| Shortcut | Action | Default |
|---|---|---|
| ⌘⇧I | Toggle the island open / closed | On |
| ⌘⇧A | Approve the request on screen | Off |
| ⌘⇧D | Deny the request on screen | Off |
Every shortcut can be rebound in Settings → Shortcuts, where you can also bind always allow, skip question and jump to terminal. Enabled approve/deny bindings appear as badges on the approval card.
Build from source
Requires macOS 14+ and Swift 5.9+.
git clone https://github.com/wxtsky/CodeIsland.git
cd CodeIsland
# Development: debug build + launch (Buddy Bluetooth needs the .app below)
swift build && ./.build/debug/CodeIsland
# Release: universal binary (Apple Silicon + Intel)
./build.sh
open .build/release/CodeIsland.app
# Tests
swift test
Requirements
- macOS 14 Sonoma or later
- Best on a MacBook with a notch; external and notch-less displays work too
Acknowledgments
Inspired by claude-island by @farouqaldori — thanks for the original idea of putting AI agent status in the macOS notch. And thanks to everyone who has contributed integrations, fixes and bug reports.
Star history
License
MIT — see LICENSE.
Collected info
- ★ 2,426 stars
- ⎇ 295 forks
- Language: Swift
- Source updated: 9/24/2026
Config for your environment
Replace {MCP_ENDPOINT_URL} with this MCP’s endpoint URL (from its repo or docs above). No API key — you connect directly.
Tool
OS
Config file: ~/.cursor/mcp.json
{
"mcpServers": {
"mcp-server": {
"url": "{MCP_ENDPOINT_URL}"
}
}
}Paste into mcpServers in the config file. Restart Cursor after saving.
If this MCP is also published on mcpchannel.ai, you can subscribe from Browse and use the gateway config there instead.