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.

$ cargo install --git https://github.com/mitama987/cpnest

No Rust toolchain? Grab the pre-built cpnest.exe from the latest Release.

~/projects/cpnest — cpnest
cpnest notes Ctrl+D:┃ Ctrl+E:━ Ctrl+T:tab Ctrl+F:files F2:rename
[1] copilot.exe ◉ focused
───────────────────────────────────
❯  refactor the keymap to use
  a single table instead of match_
  thinking…
[2] copilot.exe
Running tests...
18 passed (0.09s)
clippy clean
───────────────────────────────────
❯ cargo build --release
   Compiling cpnest v0.1.0
cwd: ~/projects/cpnest

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.

Sibling to ccnest

Same multiplexer, different assistant. If you live in Claude Code, try ccnest.

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.

KeyAction
Ctrl+DSplit the focused pane vertically (new copilot to the right)
Ctrl+ESplit the focused pane horizontally (new copilot below)
Ctrl+TNew tab with a fresh copilot pane
Ctrl+WClose the focused pane
Alt+← / Alt+→Previous / next tab
Ctrl+Tab / Ctrl+Shift+TabPrevious / next tab (alias)
F2Rename the active tab (Enter to commit, Esc to cancel)
Ctrl+← / Ctrl+→ / Ctrl+↑ / Ctrl+↓Move pane focus
Ctrl+FToggle the file tree (opens to Files, closes when already on Files)
Ctrl+BToggle the entire left sidebar
Ctrl+1 .. Ctrl+3Jump 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+QQuit cpnest
Forwarded to the focused pane
Shift+TabSent as back-tab (CSI Z) — drives Copilot CLI's mode cycle
Shift+Enter / Ctrl+EnterInsert a newline in the prompt instead of submitting (sent as ESC + CR)
Scrollback (2000 lines per pane)
Mouse wheelScroll history in the pane under the cursor (3 lines / tick)
Shift+PageUp / Shift+PageDownScroll the focused pane one screen of history
Shift+↑ / Shift+↓Scroll the focused pane one line of history
any keystrokeSnaps 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

To make it persistent, set the same variable via [Environment]::SetEnvironmentVariable("CPNEST_COPILOT_BIN", "C:\path\to\copilot.exe", "User").

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.

File issues and PRs on GitHub.