# nvibe: I wired Cursor Agent + CodeRabbit into Neovim, then fought the window manager until "it works!"

Source: https://www.michaelchurley.com/blog/nvibe-neovim-cursor-coderabbit-layout-until-it-works  
Published: 2026-06-22  
Author: Michael C. Hurley  
Tags: nvibe, neovim, nvim, lua, nvchad, cursor-agent, coderabbit, lazygit, vibe-coding, nvim-tree, terminal, ai-coding, michaelmonetized

![nvibe layout: left AI panel, editor, bottom tools](/blog/nvibe-neovim-cursor-coderabbit-layout-until-it-works/screenshots/layout-concept.png)

## Who

I wanted Cursor Agent and CodeRabbit **already open** when Neovim started: same frame as the buffer, no alt-tab to an Electron window, no extra tmux pane, no `<leader>` chord that makes me lose which split I was in.

If you run NvChad and keep AI CLIs on PATH, you already know the friction: leave for the agent, lose buffer context, come back, rebalance windows by hand. I wanted the layout to be the product.

## What

I built **nvibe**, a Lua Neovim plugin at [michaelmonetized/nvibe](https://github.com/michaelmonetized/nvibe). Version badge says **0.1.0**. Module lives at `lua/nvibe/init.lua` (~354 lines). Public. Stars: 0.

On `VimEnter`, if you are not already in a terminal buffer, `setup()` calls `create_terminal_split()`:

1. Hard-requires `nvchad.term` (ERROR notify + abort if missing).
2. Checks `vim.fn.executable` for `cursor_agent_cmd` / `coderabbit_cmd` (defaults `cursor-agent`, `coderabbit`).
3. Left panel width = `width_percent` x `$COLS` (or `vim.o.columns` fallback).
4. `nvchad.term.new` for Cursor Agent (top) and CodeRabbit (bottom) on that panel.
5. Bottom strip: LazyGit + two shells (`vim.o.shell`), with a pile of `wincmd` / `close` cleanup so empty buffers do not stick around.
6. `stopinsert` so the editor is not left in insert mode.

Config surface is small:

```lua
require('nvibe').setup({
  width_percent = 30,
  cursor_agent_cmd = "cursor-agent",
  coderabbit_cmd = "coderabbit",
})
```

Honesty check against the tree: the **code default** for `width_percent` is **20**, while README / `docs/API.md` / busted expectations still talk like **30**. LazyGit and the dual shells are **hardcoded**, not setup opts. ROADMAP still has "make bottom panel commands and sizes configurable" open.

![NvimTree #4/#5: height constrain + rebalance](/blog/nvibe-neovim-cursor-coderabbit-layout-until-it-works/screenshots/nvimtree-fix.png)

February fix (`6a931f6`, closes #4 and #5): opening NvimTree used to equalize windows and grow full height over the terminal panes. Plugin now caches editor-row height after layout, constrains `FileType NvimTree` windows to that height, and `rebalance_panels()` restores left-column terminal widths on open/close. README documents `preserve_window_proportions = true` as the paired NvimTree setting.

Tests: busted (`tests/test_nvibe.lua`, **18** `it(` cases) with mocked `vim` + `nvchad.term`. Makefile: `make test` / `lint` / `check` via busted + luacheck. CHANGELOG documents the early interactivity bug: raw `vim.cmd("terminal …")` vs NvChad's interactive `term.new`.

![CI added, then deleted for Vercel](/blog/nvibe-neovim-cursor-coderabbit-layout-until-it-works/screenshots/ci-vercel-irony.png)

CI subplot: `3ee0092` added `.github/workflows/build.yml` ("keep prod build green"). `5ab79db` corrected it for a Lua project. Next morning `365a17e` deleted **all** GitHub config with message **"Vercel is our only CI/CD"** on a Neovim Lua plugin with no web app in the tree. HEAD has no `.github/`. Local `make test` is the gate that remains.

Also true: MIT badge in README, **no LICENSE file**. Product Hunt badges link to producthunt.com root. PLAN.md still has Phase 3 "Product Hunt launch preparation." CHANGELOG dates 0.1.0 as 2025-01-17; git history starts **2025-10-17**.

## Where

Code: [github.com/michaelmonetized/nvibe](https://github.com/michaelmonetized/nvibe), **public**. No hosted demo.

Install path in README: Lazy.nvim or Packer snippets calling `require('nvibe').setup()`, after NvChad. Runtime needs Neovim 0.7+, NvChad (`nvchad.term`), and the CLIs you configured (plus `lazygit` for the bottom middle pane as written).

Checked-in `screenshot.png` (~948KB) from the Oct 18 roadmap commit is the visual proof the layout existed on a real session.

## When

- **2025-10-17 morning** `a65bb50` init, `e0766a4` initial plugin release, Product Hunt marketing README (`be96f88`), docs, tests, NvChad error handling, CodeRabbit PR cleanup, merge #2.
- **2025-10-17 evening to 2025-10-18** bottom panel / 3-column layout fight: auto-launch, separate creation paths, sizing context bugs, manual vim-cmd walking (`i've been using 1 not l but needed h`), then **`903e4d6` "it works!"**, merge #3 from `stage`, `5a790f2` roadmap + screenshot.
- **2026-02-21** `6a931f6` NvimTree height + panel width restore (closes #4, #5).
- **2026-02-27 to 28** Actions build gate, Lua workflow fix, delete GitHub config for Vercel; PLAN.md + `.hustlemc` land.
- **2026-06-22** `e7833a1` / HEAD `56d0152` nightlies. Last push `2026-06-22T22:17:08Z`. **35** commits total.

![35-commit arc highlights](/blog/nvibe-neovim-cursor-coderabbit-layout-until-it-works/screenshots/commit-arc.png)

## Why

"Vibe coding" for me means **terminals I already pay for**, laid out so the agent and the reviewer never leave the frame while I edit.

I also wanted the diary of actually making Neovim splits behave. The commit messages from Oct 18 are the product as much as the README ASCII: simplify, comment out close, walk the steps, use `h` not `1`, then ship **"it works!"** Same energy as deleting a brand-new Actions workflow because the org mantra said Vercel. Leave that commit in history instead of rewriting it.

## Engagement Q

Would you hard-depend on **NvChad's terminal module** to glue Cursor Agent + CodeRabbit into Neovim, or keep AI in separate panes forever? And does a commit titled **"it works!"** after a day of `wincmd` hell earn more trust than a polished 0.1.0 badge?
