Review what your agent wrote.

A local proof desk for code written by coding agents. Read every hunk, stage what holds up, commit.

echo reviewing main.go in a split diff. The change trace runs across the title bar, and each hunk is headed with the function it sits in.

A review loop you can run without the mouse.

Agents change a lot of files quickly. echo keeps your hands on four keys while you read.

  1. jk

    Step through hunks

    Every hunk is headed with the function or section it sits in, so you know where you are without counting lines.

  2. np

    Move between files

    The review follows the same path order as the sidebar, and untracked files are not pushed to the end.

  3. s

    Stage what holds up

    Staging jumps to the next file with work left, and the lists update before Git has even answered. u takes it back.

  4. ⌘↵

    Commit the staged set

    The button says exactly what it will commit, such as "Commit 2 staged files". With nothing to commit, it tells you why.

Made for reading agent diffs.

The change trace

Your whole diff as one strip: a segment per file, a tick per hunk. Additions rise, deletions drop, and the amber playhead follows you. Click a tick to jump.

The change trace strip in echo's title bar, showing a tick for each hunk across two files

Hunks that name their place

Git's heading rules for Go, CSS, Markdown, Python, Rust and more, shown as a readable pill.

Split diff hunks headed with buildVersion, main and runningFor

A Git drawer, on demand

Commit, History and Branches live in a drawer. ⌘J opens it, and the diff keeps the full width.

32 themes

Twelve light, twenty dark, all embedded in the binary.

It remembers where you were

Switch repositories and come back to your open tabs, unsaved edits, scroll position and half-written commit message.

Measured, not promised

Small enough to leave running.

Memory at idle
12.3MB
CPU at idle
0.0%
Peak memory under load
17.9MB
Binary size
8.9MB
# echo-desk release build, Apple M4 Pro, macOS. ps sampled once per second.
# idle, 10 samples
cpu=0.0% rss=12.3MB   x10

# 400 page loads + 400 /api/status calls, 8 in parallel
cpu=6.6%  rss=16.5MB
cpu=11.0% rss=17.6MB
cpu=9.6%  rss=17.9MB
cpu=10.4% rss=17.9MB

# load finished
cpu=0.0% rss=17.9MB

Served a repository with uncommitted changes across Go, JavaScript, CSS and Markdown files. Your numbers will vary with repository size, but echo is one Go binary with no Electron, no bundler and nothing else to install.

Your code stays on your machine.

127.0.0.1 only
The server never binds to another interface.
One repository per process
Open another repository and it gets the next free port, 6030 to 6049.
Symlinks stay inside
A link in your repository cannot be followed to a file outside it.
.git is off limits
The page cannot write into the Git directory.
Strict headers
A content security policy, nosniff, frame and referrer protections on every response.
Verified releases
The install script checks the SHA-256 from each release's checksums file.

macOS, Apple Silicon and Intel

Install echo.

curl -fsSL https://raw.githubusercontent.com/sidkhuntia/echo/main/install.sh | sh

Then run it inside any repository:

cd ~/code/my-project && echo-desk

The command is echo-desk, so it never collides with your shell's echo. It opens at http://127.0.0.1:6030.

Questions

Does echo send my code anywhere?

No. echo runs as a local process bound to 127.0.0.1 and serves one repository. It uses your system git and does not launch, drive or talk to agents.

Which coding agents does it work with?

Any of them. echo reads the Git working tree, so it reviews what Claude Code, Cursor, Codex or any other tool left on disk, and it watches for changes while the agent keeps working.

Does echo run on Linux or Windows?

Not yet. echo is macOS only, for both Apple Silicon and Intel.

How is echo different from git diff or a pull request?

You review before anything is pushed. echo shows staged and unstaged changes side by side, lets you stage per file, edit a line in place and commit, all from the keyboard, without opening a pull request.

Why is the command called echo-desk?

So it never collides with the echo command built into your shell. The product is echo, the binary is echo-desk.

How do I update echo?

Run the install script again, or brew upgrade echo-desk. Open pages reload themselves when the new version starts.