Turning Supacode Into a Full IDE: Flexible Panes for Agents, Editor, File Management and Git, all using VIM Keybindings
Sign in<br>Subscribe
I've spent the last while collapsing my development environment into a single window. Not VS Code, not a raw Ghostty grid held together with a tmux config but Supacode. What started as "a nicer harness for running Claude Code, OpenCode or Copilot CLI in parallel" has quietly become the only thing I open when I sit down to work. This is the layout I've settled on and why each pane earns its place.<br>What Supacode actually is<br>Supacode is a native macOS app from supabitapp that bills itself as a "worktree coding agents command center." A few technical properties matter for what follows:<br>It's built in Swift on The Composable Architecture, with libghostty (GhosttyKit) as the terminal engine — the same GPU-accelerated core as Ghostty, not an Electron shell. Terminal surfaces are real native terminals, so there's no PTY-wrapper translation layer between me and the agent.<br>It reads the same Ghostty config I already maintain, so my fonts, theme, and keybindings carry over for free. Nothing to re-theme.<br>It's bring-your-own-agent . Any CLI coding agent runs in a surface as-is: Claude Code, Codex, OpenCode, and — since a recent release — GitHub Copilot CLI .<br>Each project's work happens in a git worktree , and the sidebar nests those worktrees under their repo with an agent badge on each active row.<br>Terminal state is split/tab-managed per worktree (one Ghostty surface per pane), and sessions survive quit/relaunch via a bundled zmx multiplexer.<br>Requirement worth stating up front: it targets macOS 26 . It's still beta, free, and open source (brew install supacode).<br>Everything below is built on top of those primitives. The parts that are mine — neovim, a file tree, lazygit — are just TUIs running inside panes. Supacode gives me the surfaces; I decide what runs in them.<br>The sidebar: projects and live agent sessions<br>The left rail holds several repos open at once, each expanded to show its worktrees. Every worktree that has an agent attached carries a badge, so a glance down the sidebar tells me who's working where: which projects have a Claude Code or Copilot CLI session mid-stream, which are idle, which are pinned. Active and pinned worktrees float to the top, so the thing I'm currently driving is never buried.<br>This is the piece that replaced my old "1,000 tabs" problem. Instead of a flat wall of terminal tabs I have to remember the meaning of, the sidebar is the project switcher, and switching worktrees swaps the entire pane layout with it. Because each worktree is genuinely isolated at the git level, an agent churning in one repo can't step on the tree I'm hand-editing in another.<br>The main pane: agent on top, editor below<br>Inside a single worktree I split the main area into two stacked panes :<br>Top pane — the coding agent. This is where Claude Code or Copilot CLI runs. It's the generator: I give it the task, it reads the tree, proposes and applies changes. Because it's a native terminal surface, the agent behaves exactly as it would in a bare terminal — same auth, same output, same tool calls, no wrapper quirks.<br>Bottom pane — neovim as the manual editor. neovim runs on the LazyVim configuration, so it isn't a bare editor — LazyVim ships a preconfigured LSP and Treesitter setup out of the box, which gives me automatic linting and diagnostics, proper code highlighting, and code hints/completions without me wiring any of that up per project. That's what makes the bottom pane a genuine review surface: I read what the agent did with full syntax highlighting and inline diagnostics, and take the wheel when a change needs a human hand — a tricky refactor, a config the agent keeps getting subtly wrong, a diff I want to reshape before it goes anywhere near a commit.<br>When I need actual file management rather than just editing — moving, renaming, bulk operations, navigating a tree — I reach for yazi , a fast terminal file manager, in a pane. neovim stays focused on editing; yazi handles the filesystem work.<br>Yazi running in SupacodeThe key point is that both panes point at the same worktree directory . The agent's edits land on disk; neovim (and yazi) are looking at that same disk. There's no sync step, no "reload from the assistant" — I :e and I'm looking at exactly what the agent produced. The top pane writes, the bottom pane reviews and corrects, and neither is a copy of the other.<br>The right column: lazygit, full height<br>Down the right side I keep one narrow, full-height pane running lazygit . This is the git surface for the worktree: staged/unstaged status, hunk-level staging, commit, push — all without leaving the window or dropping into raw gitincantations.<br>Supacode is itself GitHub-aware (it can surface PR check status natively), but for the actual mechanics of staging and shaping commits I want lazygit's granularity. So the division of labour is: Supacode owns which worktree/branch I'm on and...