Reviewing changes in a browser
Use sand land NAME PATH --review to review a checkout's diff in your
browser, including uncommitted and unpushed changes. The review server runs
inside the VM. Your browser displays the diff, and your comments are saved
back into the checkout for the agent to read.
The browser interface comes from @self-review/serve, part of the
self-review project. sand starts the server, forwards its port,
opens your browser, and stops the session when you finish.
Getting a VM that has it
The review tool is included in every base image and runs only when you open a review. There is no installation flag to enable.
If your base image predates the tool, the next sand create updates the base
before cloning a new VM. Existing VMs need to be reset from an updated base
or replaced to get it.
Opening a review
The VM must be running. Run sand land NAME to list its known checkouts,
then use a path from that list:
In the TUI, press l on the VM's tile to open the
Landing pane, select a checkout, and press v.
The CLI keeps the terminal occupied until the review ends. The TUI marks the
row reviewing… and adds the URL when the server is ready.
A review does not require a pushed branch, a configured remote, or gh.
-
sandchooses the diff's base commit. It uses the parent of the oldest commit absent from all remote-tracking branches in the guest. If it cannot use that parent, it tries the nearest common ancestor withmain,master, or the checkout's recorded default branch. If neither method finds a base, the review server uses its default range. The diff also includes uncommitted and untracked files.Before starting the server,
sandprints the base commit, its date, and the number of commits and files to review. For example:everything since 6ac1f20b1e77 (2026-09-18, 5 commits, 12 files). If the range is too large for the review tool,sandstops and names the base commit so you can check it. 2.sandstarts the server in the checkout. The server chooses a free port inside the VM.sandmakes that port reachable from your workstation (see Reachability), waits for a response, and opens your default browser. 3. The browser displays the checkout's file tree and diff.
If no browser opens, open the printed URL yourself. The review stays running.
You can run multiple CLI reviews at once, on the same VM or different VMs. The TUI runs one review at a time. Trying to review another checkout while a session is running or still shutting down leaves a message in the session log.
Reviewing only part of a branch
By default, sand chooses a base commit for the review and includes all
changes since that commit plus any uncommitted work. You can instead review
just the commits or staged changes you specify, with precise control over the
reviewed range.
From the CLI
Add -- followed by git diff arguments after the --review flag:
This reviews the working tree against the last two commits (equivalent to
git diff HEAD~2). Other examples:
| Command | What it reviews |
|---|---|
sand land NAME PATH --review -- HEAD~2...HEAD |
Only the last two commits, no uncommitted changes |
sand land NAME PATH --review -- --staged |
Only the changes you have staged for commit |
sand land NAME PATH --review -- HEAD~10 |
The last ten commits plus uncommitted work |
When you provide a range, sand skips its automatic base selection and the
file-count guard. A saved review is still carried in, so comments you wrote
earlier are there to keep, edit, or drop, and --clean still discards it
first.
From the TUI
Press R (capital R) on the Landing pane's checkout row to open a one-line
prompt. Type your git diff arguments exactly as you would on the command line:
Arguments are split on spaces with no quoting support — git revisions and
flags don't need it. Leaving the prompt blank is the same as pressing v and
reviews the whole branch with the automatic base selection.
You can cancel the prompt with esc. Once you submit, the review follows the
same rules as the v key: it carries in any saved comments and clears the
reviewing… state when you finish.
Finishing a review
Leave comments in the browser, then click Finish Review. The server
writes review.xml into the checkout inside the VM and exits. The CLI
reports the path and returns control of your terminal; the TUI clears the
row's reviewing… state.
Closing the browser tab does not finish the review or save your comments. Comments stay in the page until you submit them. Pressing Ctrl-C in the CLI stops the session without saving them.
In the TUI, leaving the Landing pane does not end the review. You can
press esc, open a shell with S, or visit another VM while the browser
review stays open. To cancel, return to the checkout's row and press v;
the footer reads v cancel review. Quitting sand also stops the review,
with a confirmation naming the checkout.
Picking up where you left off
A finished review leaves review.xml in the checkout. When you open another
review there, sand loads the saved comments and viewed-file markers:
carrying in the comments already in review.xml
[serve] Resumed 7 comments and 4 viewed files from /home/claude/…/review.xml
You can keep, edit, or delete the comments. Finish Review overwrites the same file with the result.
To discard the saved review and start over:
| Where | How |
|---|---|
| TUI's Landing pane | Press V (shift-V) on the checkout's row, labelled clean review in the footer. |
| CLI | Run sand land NAME PATH --review --clean. |
Both delete review.xml and the accompanying review.guide.xml before
starting the server. The TUI asks for confirmation, even if neither file
exists. The CLI deletes them without a prompt.
The assistant skills
When provisioning includes an initial project clone, sand installs three
self-review skills into that checkout before you start an agent session:
| Skill | What it does |
|---|---|
self-review-critique |
Drafts review comments for you to check and edit. |
self-review-guide |
Writes a review.guide.xml walkthrough that groups files in reading order. |
self-review-apply |
Reads a finished review.xml, prioritises the comments, and makes the changes. |
The skills go in .agents/skills/ inside the checkout, with links under
.claude/skills/ so Claude Code discovers the same copies. Their instructions
refer to schema files under .agents/skills/. They are included in the base
image and match the review server's version, so installing them needs no
network access.
For a repository you clone later, run the installer inside the VM:
The command installs or refreshes the skills and Claude Code links, then adds the review artifacts, skill directories, and links to your active global Git excludes file. It leaves a path unchanged when the repository tracks its own copy.
A typical workflow inside the guest:
Press v in the Landing pane to review and edit those comments, then run:
Skills tracked by your project are kept
If the repository already tracks its own .agents/skills/self-review-* or
.claude/skills/self-review-* files in Git, sand leaves those paths
unchanged.
Keeping review files out of commits
self-review-install-skills adds review.xml, review.guide.xml, and the
three skill directories and their Claude Code links to the guest user's active
global Git excludes file. That is ~/.config/git/ignore by default, or the
path selected by core.excludesFile. It does not change your project's
.gitignore.
Ignore rules do not hide files that Git already tracks.
Feeding it back to the agent
Tell the agent to read review.xml in the checkout, or use
/self-review-apply review.xml. The saved feedback is already inside the VM,
where the agent is working. You do not need to download or copy it.
Reachability
The server listens on the VM's loopback address, 127.0.0.1. sand makes
it reachable at a loopback address on your workstation:
- Local Lima automatically forwards the guest port to the same port on your workstation. See Web Servers and Ports.
- Remote Lima uses a temporary SSH tunnel from your workstation to the remote host's loopback port, where Lima has forwarded the guest port.
- Proxmox uses a temporary SSH tunnel directly to the guest's loopback port.
The guest server and any SSH tunnel stop when you finish or cancel the
review. The diff and your comments travel between the VM and your browser.
sand does not copy a checkout onto your workstation or push it to a forge.
Other users of a shared remote Lima host can read the review
Lima forwards the review port to 127.0.0.1 on the host running the VM.
Anyone logged into that host can access the review while it is open,
including the full diff and uncommitted work. The server does not require
authentication.
For local Lima, that host is your workstation. Proxmox connects directly to the guest, with no review port on the Proxmox host. If other users of a remote Lima host should not see your work, review it on a host you do not share.
If the review never becomes reachable
Local Lima must use the same port number on the guest and workstation. If
another application on your workstation already uses the port the guest
selected, forwarding fails and the review times out. sand reports the
port. Run the review again to select another port; the review server has no
option to request a specific one.
Limits
Automatic resumption uses only the default review.xml path. If you set
output-file in .self-review.yaml or
~/.config/self-review/config.yaml, sand does not load the saved review
automatically. A clean review also deletes only the default review.xml
and review.guide.xml files.
The browser uses self-review's interface, including extra context around
changes, image and attachment previews, suggestions, and walkthroughs from
review.guide.xml beside the output file.