The Go gopher as a merman, in a Go cap and glasses and holding a trident, reviewing merge request #42 in mrman on an underwater monitor while fish look on.
> mrman_

Code review that stays in your terminal

A continuous diff with vim keybindings. Typed comments at line, range, file and review scope. Sessions that survive restarts. Submit the finished review to GitHub, GitLab, Azure DevOps or Forgejo — SaaS or on-premise.

Get StartedRead the DocsGitHub →
git clone https://github.com/infrashift/mrman && cd mrman && make installNeeds Go 1.25+ and git.Why not go install yet?
mrman -w  ·  tokyo-night-storm
 mrman                                                                                       git:master
╭ Files · 0/1 ─────╮╭ src/cache.go ────────────────────────────────────────────────────────────────────╮
▼ src/                ═══ Review Comments ════════════════════════════════════════════════════════════
  ▢ M cache.go        ═══ src/cache.go [M] ═══════════════════════════════════════════════════════════
                             ... 45 lines hidden ...
                             ... ↑ expand (20 lines) ...
                      @@ -46,12 +46,16 @@ func (c *Cache) Keys() []string {
                        46   
                        47   // Get returns the value for key.
                        48   func (c *Cache) Get(key string) (string, bool) {
                        49 ▌     c.mu.RLock()                                                         
                        50 ▌     defer c.mu.RUnlock()                                                 
                        49 ▌     c.mu.Lock()                                                          
                    ▶   50 ▌     defer c.mu.Unlock()                                                  
                        51       entry, ok := c.entries[key]
                        52       if !ok {
                        53           return "", false
                        54       }
                        55 ▌     if time.Now().After(entry.ExpiresAt) {                               
                          ╭── [@user] L55 ────────────────────────────────────────────────────────────
                          │  Deleting inside Get means the read path mutates the map.
                          ╰───────────────────────────────────────────────────────────────────────────
                        56 ▌         delete(c.entries, key)                                           
╭ Comments · 1 ────╮    57 ▌         return "", false                                                 
● cache.go:55 @...      58 ▌     }                                                                    
                        59       return entry.Value, true

 NORMAL                                                                                   Comment saved

An actual frame from a running mrman, not a mockup — hidden context collapsed above, a comment anchored inline at L55, the file tree and comment navigator on the left.

Why mrman?

⌨

Vim-Native Navigation

One continuous diff across every file. Count prefixes, hunk and file jumps, visual-range selection, search, `zz`/`zt`/`zb`. Context gaps expand on demand.

🌐

Four Forges, SaaS and On-Prem

GitHub, GitLab, Azure DevOps and Forgejo through their APIs — not by shelling out to gh or glab. Enterprise hosts, custom API bases and private CAs are first-class.

💬

Typed Comments, Four Scopes

Comment on a line, a range, a file, or the review itself. Define your own comment types — they drive the badge, the exported markdown, and the tag on submitted comments.

💾

Sessions That Survive

Reviewed marks and draft comments persist automatically. Close the terminal, come back tomorrow, pick up exactly where you stopped.

🤖

Live Agent Collaboration

An AI agent can follow your review as you write it, or add findings of its own, over a JSON CLI. Submitting to a forge needs a grant only a human at a terminal can issue.

🔧

Config That Never Crashes

TOML validated by embedded CUE schemas: a mistake drops one key and warns precisely. 24 bundled themes, and both markdown outputs are templates you can replace.

Review on the forge you actually use

Same keys, same review model. Capabilities are checked before mrman offers an action, so a submit never fails halfway through.

GitHubEvery capability, atomic submitGitHub EnterpriseOn-prem, custom CAGitLabSaaS and self-managedAzure DevOpsServices and ServerForgejo & GiteaSelf-hostedCodebergZero config

Reviewing an agent's patch?

mrman makes the review session a shared object: you read and comment in the TUI while an agent watches the stream, answers, and — only when you have said so — submits.

Agent CollaborationKeybindings