Minimal webapp for local code review of branches
TypeScript
10
318 commits
updated Sep 19, 2026
Review your coding agent's branch before you push it, and hand the feedback back as clean markdown.
Made for reading what a coding agent wrote before it goes anywhere. Point it at a folder of git repos, pick the agent's branch, and review it like a pull request: comment on lines, flag bugs, ask questions. Then hand the whole review back to the agent as one markdown document, each point with its file, lines, snippet and note. The agent replies through the local API, and its answers show up live beside your comments.
One binary: Go backend with the React frontend embedded. Nothing to install but git.
#id cross-references, and a summary that leads the export.dist/, snapshots) folded shut so they stop drowning the real changes, and
lazy rendering so a huge branch stays responsive.j/k between files, n/p between comments, v to mark
reviewed and jump to the next unread, / to search files, ? for the rest.mise picks the right binary from the GitHub releases:
mise use -g github:rosenbjerg/local-review
Or pin it in a project's mise.toml:
[tools]
"github:rosenbjerg/local-review" = "latest"
Grab the latest from Releases:
| Platform | Asset |
|---|---|
| macOS (Apple Silicon) | local-review-darwin-arm64 |
| macOS (Intel) | local-review-darwin-amd64 |
| Linux (x86-64) | local-review-linux-amd64 |
| Linux (ARM64) | local-review-linux-arm64 |
| Windows (x86-64) | local-review-windows-amd64.exe |
On macOS/Linux make it executable, and on macOS clear the download quarantine:
chmod +x local-review-darwin-arm64
xattr -d com.apple.quarantine local-review-darwin-arm64 # macOS only
Requires Go (see go.mod) and Bun 1.4+. The frontend
is embedded in the binary, so build it first:
bun install --cwd web
bun run --cwd web build
go build -o local-review .
./start.sh [path] does all three and starts the server; the path is a git repository
or a folder of them, defaulting to the current directory.
local-review -root /path/to/repo # one repository
local-review -root /path/to/folder-of-repos # every repository in the folder
Opens http://127.0.0.1:7777. From there:
main/master, else the remote's default) and the diff runs
from its merge-base with the branch. Override it with any ref.Press ? for the keyboard shortcuts. If the file count disagrees with your git
client, hover it: the client is usually comparing against HEAD rather than the
merge-base.
State lives in SQLite under ~/.local-review/, keyed by repo path, so one install
serves many repos and resumes each review where you left it. Draft reviews older than
-retention-days (default 30) are pruned at startup.
The export is plain markdown: your summary, then every open comment with its file path, lines, captured snippet and note, grouped by file. Resolved threads are left out. Agent prompts in the toolbar gives you a copyable prompt for each direction:
Both prompts are editable. Save keeps your version for that repo, for house rules or the test command to run. The review-specific parts are placeholders filled in when you copy, so a saved prompt works on the next review too. Reset restores the built-in one.
Prefer pasting? Export can bundle reply instructions so a paste-only agent can still post replies. Either way, replies appear live in the UI.
| Flag | Default | Purpose |
|---|---|---|
-root | . | A git repository, or a folder containing one or more of them |
-port | 7777 | Listen port |
-data-dir | ~/.local-review | Directory for the SQLite DB |
-retention-days | 30 | Prune draft reviews older than this on startup |
-no-open | false | Don't auto-open the browser |
-version | Print the version and exit |
One Go binary serves the API and the embedded React app, reads git by shelling out to
the real git, and keeps review state in SQLite. The backend is the source of truth:
comment staleness and reviewed state are derived on every read, never trusted from a
stored flag. It listens on localhost only and refuses browser writes from other
origins, so a site you happen to visit can't drive the API. curl and your agent are
unaffected.
For a map of the codebase, see CLAUDE.md.
Run the Go server and the Vite dev server side by side. Vite proxies /api to :7777:
local-review -root /path/to/repo -no-open # terminal 1
bun run --cwd web dev # terminal 2 → :5173
CONTRIBUTING.md covers the build order, checks and conventions. To report a vulnerability, see SECURITY.md rather than opening a public issue.
GPL-3.0 © Malte Rosenbjerg.
318 commits
TypeScript
63.3%
Go
29.2%
CSS
7.1%
Minimal webapp for local code review of branches
TypeScript
10
318 commits
updated Sep 19, 2026
Review your coding agent's branch before you push it, and hand the feedback back as clean markdown.
Made for reading what a coding agent wrote before it goes anywhere. Point it at a folder of git repos, pick the agent's branch, and review it like a pull request: comment on lines, flag bugs, ask questions. Then hand the whole review back to the agent as one markdown document, each point with its file, lines, snippet and note. The agent replies through the local API, and its answers show up live beside your comments.
One binary: Go backend with the React frontend embedded. Nothing to install but git.
#id cross-references, and a summary that leads the export.dist/, snapshots) folded shut so they stop drowning the real changes, and
lazy rendering so a huge branch stays responsive.j/k between files, n/p between comments, v to mark
reviewed and jump to the next unread, / to search files, ? for the rest.mise picks the right binary from the GitHub releases:
mise use -g github:rosenbjerg/local-review
Or pin it in a project's mise.toml:
[tools]
"github:rosenbjerg/local-review" = "latest"
Grab the latest from Releases:
| Platform | Asset |
|---|---|
| macOS (Apple Silicon) | local-review-darwin-arm64 |
| macOS (Intel) | local-review-darwin-amd64 |
| Linux (x86-64) | local-review-linux-amd64 |
| Linux (ARM64) | local-review-linux-arm64 |
| Windows (x86-64) | local-review-windows-amd64.exe |
On macOS/Linux make it executable, and on macOS clear the download quarantine:
chmod +x local-review-darwin-arm64
xattr -d com.apple.quarantine local-review-darwin-arm64 # macOS only
Requires Go (see go.mod) and Bun 1.4+. The frontend
is embedded in the binary, so build it first:
bun install --cwd web
bun run --cwd web build
go build -o local-review .
./start.sh [path] does all three and starts the server; the path is a git repository
or a folder of them, defaulting to the current directory.
local-review -root /path/to/repo # one repository
local-review -root /path/to/folder-of-repos # every repository in the folder
Opens http://127.0.0.1:7777. From there:
main/master, else the remote's default) and the diff runs
from its merge-base with the branch. Override it with any ref.Press ? for the keyboard shortcuts. If the file count disagrees with your git
client, hover it: the client is usually comparing against HEAD rather than the
merge-base.
State lives in SQLite under ~/.local-review/, keyed by repo path, so one install
serves many repos and resumes each review where you left it. Draft reviews older than
-retention-days (default 30) are pruned at startup.
The export is plain markdown: your summary, then every open comment with its file path, lines, captured snippet and note, grouped by file. Resolved threads are left out. Agent prompts in the toolbar gives you a copyable prompt for each direction:
Both prompts are editable. Save keeps your version for that repo, for house rules or the test command to run. The review-specific parts are placeholders filled in when you copy, so a saved prompt works on the next review too. Reset restores the built-in one.
Prefer pasting? Export can bundle reply instructions so a paste-only agent can still post replies. Either way, replies appear live in the UI.
| Flag | Default | Purpose |
|---|---|---|
-root | . | A git repository, or a folder containing one or more of them |
-port | 7777 | Listen port |
-data-dir | ~/.local-review | Directory for the SQLite DB |
-retention-days | 30 | Prune draft reviews older than this on startup |
-no-open | false | Don't auto-open the browser |
-version | Print the version and exit |
One Go binary serves the API and the embedded React app, reads git by shelling out to
the real git, and keeps review state in SQLite. The backend is the source of truth:
comment staleness and reviewed state are derived on every read, never trusted from a
stored flag. It listens on localhost only and refuses browser writes from other
origins, so a site you happen to visit can't drive the API. curl and your agent are
unaffected.
For a map of the codebase, see CLAUDE.md.
Run the Go server and the Vite dev server side by side. Vite proxies /api to :7777:
local-review -root /path/to/repo -no-open # terminal 1
bun run --cwd web dev # terminal 2 → :5173
CONTRIBUTING.md covers the build order, checks and conventions. To report a vulnerability, see SECURITY.md rather than opening a public issue.
GPL-3.0 © Malte Rosenbjerg.
318 commits
TypeScript
63.3%
Go
29.2%
CSS
7.1%