@muhammad_zihad/prless
v1.0.0
Published
Local GitHub-style code review tool with agent-agnostic AI handoff
Maintainers
Readme
Why PRless?
When you ask an AI agent to fix something, your feedback is usually disconnected from the code: you describe a change in prose, or push a branch and open a PR just to review it.
PRless gives AI code review the thing human review already has: comments pinned to exact lines. You review a diff like a GitHub PR, leave inline comments, then export them as a clipboard-ready prompt for Claude Code, Codex, or any CLI agent. No remote, no PR, no API keys. The whole loop stays on your machine.
Features
- 🧩 GitHub-style diff view for any local git repo — working tree, staged, or branch compare; split or unified layout.
- 💬 Inline comments anchored to exact lines, plus multi-line range comments (drag the line numbers) and whole-file comments — resolve / reopen / delete.
- 🧭 Durable comments — anchored with surrounding context, with drift ("code changed") and orphaned-comment detection as the agent rewrites the code.
- 🤖 One-click AI handoff — copies agent-ready instructions to your clipboard and writes
.prless/review.md; export everything or just the comments you select. - 🔍 Built for big diffs — file search, single-file view, "commented only" / "hide
generated" filters,
.prlessignore, path scoping, and auto-collapse of generated/large files. - ⌨️ Keyboard-driven — shortcuts for navigation and most actions, rebindable from a help modal.
- 🎨 12+ syntax themes in a live-preview modal, light & dark app themes; preferences persist.
- 🖥️ Local-only & cross-platform — macOS, Linux, Windows; binds to
127.0.0.1, no accounts, no API keys.
Installation
Requires Node.js 18+.
npm install -g @muhammad_zihad/prlessThis adds a prless command to your PATH (on Windows, npm generates the .cmd /
PowerShell shims automatically). Prefer not to install globally? Run it on demand:
npx @muhammad_zihad/prless open .Updating
PRless checks npm on startup and tells you when a newer version is published. To update:
npm install -g @muhammad_zihad/prless@latest(With npx, you always get the latest — append @latest to be sure: npx @muhammad_zihad/prless@latest.)
The update check is a single best-effort request for the latest version number and sends no
data. Disable it by setting PRLESS_NO_UPDATE_CHECK=1.
Quick start
cd your-project
prless open .- Your browser opens with the diff of your uncommitted changes.
- Click a line's gutter to leave a comment, just like a GitHub PR.
- Hit Export for AI — the instructions are copied to your clipboard. Paste them into your agent:
claude # then paste, or: "address the comments in .prless/review.md"
# or
codex "address the comments in .prless/review.md"The agent reads each comment, makes the change, and you re-review. That is the whole loop.
Commands
prless # start with no repo; pick a folder in the browser
prless open # review the current directory (same as: prless open .)
prless open ~/projects/my-app # review a repo by path
prless open . --port 4200 # serve on a custom port (default 4100)
prless open . --no-open # don't launch a browser automatically
prless open . -- src app tests # limit the review to specific paths
prless ls # list running prless servers (port + folder)
prless stop 4100 # stop the server on a port
prless stop all # stop every running server
prless help # show usage
prless --version # show the installed versionIf a port is busy, prless automatically uses the next free one (up to 10). When all are taken it shows the running servers so you can stop one and reuse its port, pick a different folder, or cancel.
| Option | Description |
| --- | --- |
| --port <n> | Port to serve on (default 4100, or $PRLESS_PORT). |
| --no-open | Skip auto-opening the browser. |
| -- <paths…> | Limit the review to the given paths (everything after --). |
Hiding files with .prlessignore
Drop a .prlessignore file (gitignore syntax) at your repo root to keep generated/noisy
files out of the review:
dist/
build/
coverage/
package-lock.json
*.min.jsMatching files are excluded from the diff and the export. The diff view also has a file search box, a Commented filter, and a Hide generated toggle; generated and very large files collapse by default.
How it works
┌──────────┐ review ┌───────────┐ export ┌─────────────────┐ apply ┌───────────┐
│ git diff │ ──────────▶ │ PRless │ ──────────▶ │ .prless/review.md │ ───────▶ │ AI agent │
└──────────┘ inline │ (browser)│ + clipboard │ (open comments) │ └───────────┘
comments └───────────┘ └─────────────────┘- Comments persist in
.prless/comments.jsonin your repo. PRless never shows its own.prless/files in the diff, and you can add.prless/to.gitignoreto keep them out of commits. .prless/review.mdgroups every open comment by file, with the target line and the requested change. Resolved comments are kept in the JSON but left out of the export, so the agent never spends tokens on them.- The handoff is a plain file plus a clipboard copy, so it works with any agent. No MCP, no API keys.
The exported review.md opens with a short summary and groups comments by file. It contains
only unresolved comments. Tick individual comments to export just those.
Local-only & privacy
PRless runs entirely on your machine. It does not send your code, diffs, or comments to any external server.
- The server binds to
127.0.0.1only — it is not reachable from your network. - Everything is stored under
.prless/in your repo:comments.json(your comments) andreview.md(the exported handoff). - The only outbound request is the startup version check (latest version number from npm,
no data sent) — disable it with
PRLESS_NO_UPDATE_CHECK=1. - The only thing that leaves PRless is what you paste into your AI agent.
Configuration
PRless remembers your preferences per browser — app theme, syntax theme, split/unified view, single-file vs all-files, and the filter toggles all persist across reloads.
- App theme — light or dark, defaults to your OS setting.
- Syntax theme — pick from a modal with live previews: Auto plus GitHub Light/Dark, One Dark, Dracula, Nord, Monokai, Tokyo Night, Catppuccin Mocha, Gruvbox Dark, Night Owl, Ayu Dark, and Solarized Light/Dark. The diff renders as a self-contained editor surface, so any code theme looks right regardless of the app theme.
- View — split or unified (icon toggle in the toolbar).
- Layout — drag the divider to resize the sidebar, and switch between all-files and a single-file view to skip the scrolling on large diffs.
- Keyboard shortcuts —
j/kto move between files,mod+]/mod+[for split / unified,/to search,fsingle-file view,eexport, and more. Press?for a help modal that lists every shortcut and lets you rebind them (saved per browser).
Development
git clone https://github.com/muhammadZihad/prless.git
cd prless
npm install # builds automatically via the prepare script
npm run dev # Vite UI on :5174 (proxying /api) + API on :4100 with reload
npm test # vitest: server + web unit tests and an end-to-end suite
npm run typecheck
npm run build # bundle the web app and compile the server into dist/Project structure
src/
shared/ # types shared by the server and web app
server/ # Fastify API + CLI: git diff, comment store, review.md export
web/ # React + Vite UI (react-diff-view, syntax highlighting, theming)Scope
PRless is intentionally local and single-user: no GitHub PR ingestion, no accounts, no database, no MCP. The handoff is the exported file. These are deliberate non-goals that could be layered on later.
License
MIT © Muhammad AR Zihad
