Local inline review comments for AI-agent coding workflows.
This plugin lets you leave review comments at the line you are reading in Neovim, without modifying source files and without opening a GitHub or GitLab review. When you are done, it generates structured annotations that you can paste into Codex or another coding agent.
AI coding agents are good at making local changes, but reviewing those changes with localized comments is still awkward. Opening a remote pull request can be too public or too heavy for experimental work, while writing notes in a separate file loses the exact code location.
postilla.nvim keeps the review loop local:
- Let an agent modify code.
- Review the changes in Neovim.
- Leave inline comments without changing source files.
- Export structured RevDiff annotations.
- Paste the annotations back into the agent.
- Floating multiline markdown comment window.
- Inline virtual text markers without modifying source files.
- Quickfix list for collected review comments.
- Edit and delete review comments before export.
- RevDiff-compatible annotations copied to the clipboard.
- Session and output backups stored under Neovim's state directory.
- Automatic migration from the legacy
.local-review/project directory. :help postillaand:checkhealth postillasupport.
Experimental MVP.
The current version stores comments in memory and writes project-scoped backups
under stdpath("state")/postilla. :PostillaStart restores the current
project's session when it finds one.
- Neovim 0.10 or newer
- Git is optional, but recommended for project-relative file paths
- Clipboard support if you want
:PostillaDoneto copy to the system clipboard
If Git is unavailable or the current file is outside a Git repository, paths fall back to Neovim's current working directory when possible.
If clipboard support is unavailable, :PostillaDone still writes the output
under Neovim's state directory.
With lazy.nvim:
{
"eltonsst/postilla.nvim",
config = function()
require("postilla").setup({
keymap = "<leader>rc",
})
end,
}The plugin also works without calling setup(). In that case, use the commands
directly.
After installing, Neovim should generate help tags automatically through your plugin manager. If not, run:
:helptags ALLThen open the help page:
:help postillaYou can also check local requirements:
:checkhealth postilla:PostillaStart
:PostillaCommentWrite a multiline markdown comment in the floating window, then press <C-s>.
The reviewed line shows virtual text like:
💬 R1. Consider extracting this...
Inspect collected comments:
:PostillaListFinish and copy the generated annotations:
:PostillaDoneStart a review session:
:PostillaStartAdd a comment at the current cursor line:
:PostillaCommentThis opens a floating markdown buffer.
- Write your review comment.
- Press
<C-s>to save it. - Press
<Esc>in normal mode to cancel.
Saved comments are shown with virtual text at the reviewed line, such as:
💬 R1. Consider extracting this...
Finish the review:
:PostillaDoneThis command:
- builds RevDiff-compatible annotations
- copies it to the
+clipboard register - saves a backup under Neovim's state directory
- removes the active session backup
- clears the in-memory session and virtual text markers
Abort the review:
:PostillaAbortThis clears the in-memory session and virtual text markers without generating output. It also removes the active session backup.
Check current review state:
:PostillaStatusThis shows whether a session is active, how many comments are stored, the latest comment location, and the state path.
List current review comments:
:PostillaListThis opens the quickfix list with one item per stored comment. Press Enter on a quickfix item to jump back to the reviewed line.
Delete a review comment:
:PostillaDelete R1This removes the stored comment and clears its virtual text marker.
Edit a review comment:
:PostillaEdit R1This reopens the floating markdown buffer with the existing comment text. Saving updates the stored comment while keeping the same review ID and marker.
Default configuration:
require("postilla").setup({
context_lines = 5,
keymap = nil,
state_dir = nil,
})Options:
context_lines: number of lines captured before and after the reviewed linekeymap: optional normal-mode mapping for:PostillaCommentstate_dir: optional override for Postilla's Neovim state directory
Example:
require("postilla").setup({
context_lines = 3,
keymap = "<leader>rc",
})The output follows RevDiff's structured annotation format:
## path:line (type)for a line## path:start-end (type)for a range## path (file-level)for a file note
Example:
## lua/postilla/init.lua:42 ( )
Please simplify this branch.
## README.md:80 ( )
Tighten this section.
Keep it focused on users.Postilla currently comments on normal working buffers, so exported line
annotations use RevDiff's context type ( ). The internal format already
supports added (+), removed (-), ranges, and file-level notes for future
diff-aware integrations.
While a review is active, comments are stored in a project-specific directory below:
stdpath("state")/postilla/projects/
The session backup is updated when comments are added, edited, or deleted. It is
removed by :PostillaDone and :PostillaAbort.
If Neovim closes before the review is done, reopen the project and run:
:PostillaStartThe plugin restores the saved comments and recreates markers for files that
still exist locally. Run :PostillaStatus to see the exact session path.
When Postilla finds state produced by local-review.nvim in
.local-review/, it migrates valid files into Neovim's state directory and
removes the old directory when it is empty.
Postilla v0.2 is a clean rename. Update the plugin specification and setup:
{
"eltonsst/postilla.nvim",
config = function()
require("postilla").setup()
end,
}Commands now use the Postilla prefix:
LocalReviewStart → PostillaStart
LocalReviewComment → PostillaComment
LocalReviewDone → PostillaDone
The legacy Lua module and commands are not retained. Valid state from the old
.local-review/ directory is migrated automatically the first time
:PostillaStart runs for that project.
- The UI currently creates line-level context annotations only.
- There are no integrations with diffview.nvim, fugitive, or gitsigns yet.
MIT