The toSdkMcpConfig() function only handled stdio transport, discarding the type, url, and headers fields. This meant SSE and HTTP MCP servers configured through the Extensions page were silently converted to broken stdio configs. Changes: - Import McpSSEServerConfig, McpHttpServerConfig, McpServerConfig types from the Claude Agent SDK - Rewrite toSdkMcpConfig() to dispatch on config.type (stdio/sse/http) - SSE configs: pass type, url, and optional headers to the SDK - HTTP configs: pass type, url, and optional headers to the SDK - stdio configs: pass command, args, env (unchanged behavior) - Skip servers with missing required fields (url for SSE/HTTP, command for stdio) with a console warning instead of passing broken configs - Do not include empty headers objects - Add 11 unit tests covering all transport types, mixed configs, missing fields, and edge cases (all passing) This aligns the implementation with the README which states: 'Supports stdio, sse, and http transport types.'
CodePilot
A native desktop GUI for Claude Code -- chat, code, and manage projects through a polished visual interface instead of the terminal.
Features
- 💬 Conversational coding -- Stream responses from Claude in real time with full Markdown rendering, syntax-highlighted code blocks, and tool-call visualization.
- 📂 Session management -- Create, rename, archive, and resume chat sessions. Conversations are persisted locally in SQLite so nothing is lost between restarts.
- 🎯 Project-aware context -- Pick a working directory per session. The right panel shows a live file tree and file previews so you always know what Claude is looking at.
- 🔒 Permission controls -- Approve, deny, or auto-allow tool use on a per-action basis. Choose between permission modes to match your comfort level.
- 🎭 Multiple interaction modes -- Switch between Code, Plan, and Ask modes to control how Claude behaves in each session.
- 🤖 Model selector -- Switch between Claude models (Opus, Sonnet, Haiku) mid-conversation.
- 🔌 MCP server management -- Add, configure, and remove Model Context Protocol servers directly from the Extensions page. Supports
stdio,sse, andhttptransport types. - ⚡ Custom skills -- Define reusable prompt-based skills (global or per-project) that can be invoked as slash commands during chat.
- ⚙️ Settings editor -- Visual and JSON editors for your
~/.claude/settings.json, including permissions and environment variables. - 📊 Token usage tracking -- See input/output token counts and estimated cost after every assistant response.
- 🌗 Dark / Light theme -- One-click theme toggle in the navigation rail.
- ⌨️ Slash commands -- Built-in commands like
/help,/clear,/cost,/compact,/doctor,/review, and more. - 🖥️ Electron packaging -- Ships as a native desktop app with a hidden title bar, bundled Next.js server, and automatic port allocation.
Screenshots
Prerequisites
Important
: CodePilot calls the Claude Code Agent SDK under the hood. Make sure
claudeis available on yourPATHand that you have authenticated (claude login) before launching the app.
| Requirement | Minimum version |
|---|---|
| Node.js | 18+ |
| Claude Code CLI | Installed and authenticated (claude --version should work) |
| npm | 9+ (ships with Node 18) |
Download
Pre-built releases are available on the Releases page.
Supported Platforms
- macOS: Universal binary (arm64 + x64) distributed as
.dmg - Windows: x64 distributed as
.zip
Linux builds are planned. Contributions welcome.
Quick Start
# Clone the repository
git clone https://github.com/op7418/CodePilot.git
cd codepilot
# Install dependencies
npm install
# Start in development mode (browser)
npm run dev
# -- or start the full Electron app in dev mode --
npm run electron:dev
Then open http://localhost:3000 (browser mode) or wait for the Electron window to appear.
Installation Troubleshooting
CodePilot is not code-signed yet, so your operating system will display a security warning the first time you open it.
macOS
You will see a dialog that says "Apple cannot check it for malicious software".
Option 1 -- Right-click to open
- Right-click (or Control-click)
CodePilot.appin Finder. - Select Open from the context menu.
- Click Open in the confirmation dialog.
Option 2 -- System Settings
- Open System Settings > Privacy & Security.
- Scroll down to the Security section.
- You will see a message about CodePilot being blocked. Click Open Anyway.
- Authenticate if prompted, then launch the app.
Option 3 -- Terminal command
xattr -cr /Applications/CodePilot.app
This strips the quarantine attribute so macOS will no longer block the app.
Windows
Windows SmartScreen will block the installer or executable.
Option 1 -- Run anyway
- On the SmartScreen dialog, click More info.
- Click Run anyway.
Option 2 -- Disable App Install Control
- Open Settings > Apps > Advanced app settings.
- Toggle App Install Control (or "Choose where to get apps") to allow apps from anywhere.
Tech Stack
| Layer | Technology |
|---|---|
| Framework | Next.js 16 (App Router) |
| Desktop shell | Electron 40 |
| UI components | Radix UI + shadcn/ui |
| Styling | Tailwind CSS 4 |
| Animation | Motion (Framer Motion) |
| AI integration | Claude Agent SDK |
| Database | better-sqlite3 (embedded, per-user) |
| Markdown | react-markdown + remark-gfm + rehype-raw + Shiki |
| Streaming | Vercel AI SDK helpers + Server-Sent Events |
| Icons | Hugeicons + Lucide |
| Testing | Playwright |
| Build / Pack | electron-builder + esbuild |
Project Structure
codepilot/
├── electron/ # Electron main process & preload
│ ├── main.ts # Window creation, embedded server lifecycle
│ └── preload.ts # Context bridge
├── src/
│ ├── app/ # Next.js App Router pages & API routes
│ │ ├── chat/ # New-chat page & [id] session page
│ │ ├── extensions/ # Skills + MCP server management
│ │ ├── settings/ # Settings editor
│ │ └── api/ # REST + SSE endpoints
│ │ ├── chat/ # Sessions, messages, streaming, permissions
│ │ ├── files/ # File tree & preview
│ │ ├── plugins/ # Plugin & MCP CRUD
│ │ ├── settings/ # Settings read/write
│ │ ├── skills/ # Skill CRUD
│ │ └── tasks/ # Task tracking
│ ├── components/
│ │ ├── ai-elements/ # Message bubbles, code blocks, tool calls, etc.
│ │ ├── chat/ # ChatView, MessageList, MessageInput, streaming
│ │ ├── layout/ # AppShell, NavRail, Header, RightPanel
│ │ ├── plugins/ # MCP server list & editor
│ │ ├── project/ # FileTree, FilePreview, TaskList
│ │ ├── skills/ # SkillsManager, SkillEditor
│ │ └── ui/ # Radix-based primitives (button, dialog, tabs, ...)
│ ├── hooks/ # Custom React hooks (usePanel, ...)
│ ├── lib/ # Core logic
│ │ ├── claude-client.ts # Agent SDK streaming wrapper
│ │ ├── db.ts # SQLite schema, migrations, CRUD
│ │ ├── files.ts # File system helpers
│ │ ├── permission-registry.ts # Permission request/response bridge
│ │ └── utils.ts # Shared utilities
│ └── types/ # TypeScript interfaces & API contracts
├── electron-builder.yml # Packaging configuration
├── package.json
└── tsconfig.json
Development
# Run Next.js dev server only (opens in browser)
npm run dev
# Run the full Electron app in dev mode
# (starts Next.js + waits for it, then opens Electron)
npm run electron:dev
# Production build (Next.js static export)
npm run build
# Build Electron distributable + Next.js
npm run electron:build
# Package macOS DMG (universal binary)
npm run electron:pack
Notes
- The Electron main process (
electron/main.ts) forks the Next.js standalone server and connects to it over127.0.0.1with a random free port. - Chat data is stored in
~/.codepilot/codepilot.db(or./data/codepilot.dbin dev mode). - The app uses WAL mode for SQLite, so concurrent reads are fast.
Contributing
Contributions are welcome. To get started:
- Fork the repository and create a feature branch.
- Install dependencies with
npm install. - Run
npm run electron:devto test your changes locally. - Make sure
npm run lintpasses before opening a pull request. - Open a PR against
mainwith a clear description of what changed and why.
Please keep PRs focused -- one feature or fix per pull request.
License
MIT
