██████╗██████╗ ███╗ ██╗███████╗███████╗████████╗ ██╔════╝██╔══██╗████╗ ██║██╔════╝██╔════╝╚══██╔══╝ ██║ ██████╔╝██╔██╗ ██║█████╗ ███████╗ ██║ ██║ ██╔═══╝ ██║╚██╗██║██╔══╝ ╚════██║ ██║ ╚██████╗██║ ██║ ╚████║███████╗███████║ ██║ ╚═════╝╚═╝ ╚═╝ ╚═══╝╚══════╝╚══════╝ ╚═╝
Multiplex GitHub Copilot CLI.
Without the ceremony.
A terminal multiplexer built around the GitHub Copilot CLI.
Prefix-less splits, a structured sidebar, and panes that actually start in your
project with copilot already running.
No Rust toolchain? Grab the pre-built cpnest.exe from the latest Release.
Why cpnest
Prefix-less splits
Ctrl+D splits right, Ctrl+E splits down. No tmux leader-key dance.
Panes start with Copilot
Every new pane spawns copilot in your current folder. No setup.
Keyboard-first navigation
Alt+arrow tabs, Ctrl+arrow panes, F2 to rename. White-block selection cursor in the sidebar.
Install
You need the GitHub Copilot CLI on your PATH for the
integration to be useful. If copilot is not found, panes fall back to the
system shell so the multiplexer is still usable.
From source via cargo (recommended)
$ cargo install --git https://github.com/mitama987/cpnest
Builds everything (including libgit2-sys, which takes a minute)
and drops the binary in ~/.cargo/bin, which rustup adds to PATH.
Don't have cargo yet? — Windows setup (one-time)
You need two things: the Rust toolchain (rustup) and a C linker
(MSVC Build Tools, required by libgit2-sys).
1. Install rustup
# Option A: winget (fastest if your network allows it) > winget install --id Rustlang.Rustup # Option B: official installer — download & run in PowerShell > iwr https://win.rustup.rs/x86_64 -OutFile $HOME\Downloads\rustup-init.exe > & $HOME\Downloads\rustup-init.exe # Option C: no CLI access to rustup.rs (corporate proxy) # → open https://rustup.rs in your browser, click "64-bit", # save rustup-init.exe, then double-click it.
Accept the defaults (Proceed with standard installation). Rustup drops
cargo, rustc, and rustup under
%USERPROFILE%\.cargo\bin and adds it to your user PATH.
2. Install MSVC Build Tools
Rust needs a C linker on Windows. Download Build Tools for Visual Studio, run the installer, and tick "Desktop development with C++". This is ~3 GB but you only do it once per machine.
3. Verify and install cpnest
# open a fresh terminal so the new PATH is picked up > cargo --version # should print "cargo 1.xx.x ..." > cargo install --git https://github.com/mitama987/cpnest
If winget or the rustup installer itself is blocked by a corporate proxy
(symptom: 0x80190193 Forbidden (403)), rustup installation is effectively
unavailable — use the Manual download below instead.
From source via PowerShell script (clone + build + copy)
> git clone https://github.com/mitama987/cpnest > cd cpnest > pwsh .\scripts\install.ps1
Manual download (no Rust toolchain needed)
Grab cpnest.exe from
the latest GitHub Release
via your browser, then drop it on PATH:
# 1. Open in your browser and click cpnest.exe under Assets: # https://github.com/mitama987/cpnest/releases/latest # 2. Copy into ~/.local/bin > mkdir $HOME\.local\bin -Force > Copy-Item $HOME\Downloads\cpnest.exe $HOME\.local\bin\cpnest.exe # 3. Add to PATH (one-time; re-reads User scope only) > [Environment]::SetEnvironmentVariable( "PATH", [Environment]::GetEnvironmentVariable("PATH", "User") + ";$HOME\.local\bin", "User")
Open a new terminal after setting PATH and cpnest will be available
from any directory. The binary is unsigned — on first run Windows SmartScreen may warn; click
More info → Run anyway, or preemptively unblock with
Unblock-File $HOME\.local\bin\cpnest.exe.
Launch
$ cpnest # use cwd as the first pane's directory $ cpnest path/to/project
cpnest opens in an alternate screen. Press Ctrl+Q to exit, or
Ctrl+W to close individual panes. If the copilot binary is
at a non-standard location, set CPNEST_COPILOT_BIN to the absolute path.
Keybindings
cpnest intercepts a small set of modifier-combos before the pty sees them. Everything else passes straight through to the focused pane, so Copilot CLI keybindings keep working.
| Key | Action |
|---|---|
| Ctrl+D | Split the focused pane vertically (new copilot to the right) |
| Ctrl+E | Split the focused pane horizontally (new copilot below) |
| Ctrl+T | New tab with a fresh copilot pane |
| Ctrl+W | Close the focused pane |
| Alt+← / Alt+→ | Previous / next tab |
| Ctrl+Tab / Ctrl+Shift+Tab | Previous / next tab (alias) |
| F2 | Rename the active tab (Enter to commit, Esc to cancel) |
| Ctrl+← / Ctrl+→ / Ctrl+↑ / Ctrl+↓ | Move pane focus |
| Ctrl+F | Toggle the file tree (opens to Files, closes when already on Files) |
| Ctrl+B | Toggle the entire left sidebar |
| Ctrl+1 .. Ctrl+3 | Jump to sidebar section (Files / Git / Panes) |
| Tab (sidebar focused) | Cycle sidebar sections |
| ↑ / ↓ / j / k (sidebar) | Move selection cursor |
| Enter (on a file row) | Open in $EDITOR (falls back to code) |
| Ctrl+Q | Quit cpnest |
| Forwarded to the focused pane | |
| Shift+Tab | Sent as back-tab (CSI Z) — drives Copilot CLI's mode cycle |
| Shift+Enter / Ctrl+Enter | Insert a newline in the prompt instead of submitting (sent as ESC + CR) |
| Scrollback (2000 lines per pane) | |
| Mouse wheel | Scroll history in the pane under the cursor (3 lines / tick) |
| Shift+PageUp / Shift+PageDown | Scroll the focused pane one screen of history |
| Shift+↑ / Shift+↓ | Scroll the focused pane one line of history |
| any keystroke | Snaps the view back to the live tail (set_scrollback(0)) |
Heads-up: Ctrl+D is captured, so it will not send EOF to copilot. Use the CLI's own exit command, or Ctrl+W to close the pane from the outside. Plain PageUp / PageDown still pass through to copilot — only the Shift-modified variants drive cpnest's scrollback.
Troubleshooting
Real-world issues people have hit installing cpnest from corporate / proxied networks, with the error strings verbatim so you can find this page via search. Most of these aren't cpnest bugs — they're environment mismatches that resolve by switching to the manual-download path.
1. winget install fails with 403 Forbidden
Download request status is not success. 0x80190193 : Forbidden (403).
Cause: Your corporate proxy (Zscaler, Netskope, etc.) is blocking requests to static.rust-lang.org or other download hosts that winget reaches out to.
Fix: Skip winget. Grab cpnest.exe from the Releases page via your browser — the browser typically gets through the proxy while CLI fetches don't.
2. choco install fails with admin / lib-bad errors
Chocolatey detected you are not running from an elevated command shell パス 'C:\ProgramData\chocolatey\lib-bad' へのアクセスが拒否されました。
Cause: You don't have an elevated shell, or your workstation policy forbids Chocolatey from writing under C:\ProgramData\.
Fix: Don't use choco. Install cpnest from the manual download above (no admin needed, lives under your own profile).
3. PowerShell curl complains about arguments
Invoke-WebRequest : 引数 'C:/work/...' を受け入れる位置指定パラメーターが見つかりません。
Cause: In PowerShell, curl is an alias for Invoke-WebRequest, which has a completely different argument grammar from the real curl. Flags like --cacert are misinterpreted as positional args.
Fix: Call curl.exe explicitly to bypass the alias.
# NG (hits Invoke-WebRequest) > curl --cacert C:/work/cert.pem -L -o cpnest.exe https://... # OK (real curl) > curl.exe --cacert C:/work/cert.pem -L -o cpnest.exe https://...
4. Zscaler blocks the .exe download itself
You are downloading exe64 filetype from a site categorized as ...
Cause: Zscaler (or a similar secure-web-gateway) flags .exe downloads initiated by CLI clients like iwr / curl.exe. The same URL is often allowed via the browser after a user-acknowledgement prompt.
Fix: Open the Releases page in your browser, click through any warning, download cpnest.exe, then move it into ~/.local/bin:
> mkdir $HOME\.local\bin -Force > Copy-Item $HOME\Downloads\cpnest.exe $HOME\.local\bin\cpnest.exe > [Environment]::SetEnvironmentVariable( "PATH", [Environment]::GetEnvironmentVariable("PATH", "User") + ";$HOME\.local\bin", "User")
5. Panes open but the border is never violet (Copilot not found)
Cause: cpnest couldn't locate the copilot binary on your PATH, so each pane fell back to cmd.exe. The violet border is the indicator that Copilot is actually running.
Fix: Point cpnest straight at the binary.
> $env:CPNEST_COPILOT_BIN = "C:\path\to\copilot.exe" > cpnest
6. cargo is not recognized
The term 'cargo' is not recognized as a name of a cmdlet ...
Cause: Rust / rustup is not installed.
Fix A — install rustup: follow the "Don't have cargo yet?" section above (winget one-liner or the rustup-init.exe installer), reopen your terminal, then retry:
> cargo --version > cargo install --git https://github.com/mitama987/cpnest
Fix B — when the network won't let rustup through: if winget install Rustlang.Rustup or rustup-init.exe also 403s, you're stuck behind the same proxy policy as issue #1. Use the Manual download path — it needs no Rust toolchain, no MSVC Build Tools, not even git.
Status & roadmap
cpnest is v0.1 — Windows-first, Rust, single binary. The core loop (split / focus / sidebar) is stable and tested. Not production software; expect sharp edges around non-Windows terminals and exotic PTY configurations.
- v0.2 — macOS / Linux support, config file, themes, session save/restore.
- v0.3 — mouse support, plugins, git diff preview in the sidebar, per-pane Copilot usage indicator if the CLI starts exposing one.
File issues and PRs on GitHub.