A tab holds a tree
Vertical and horizontal splits nest, so any mix is just what happens when you press the second key. Closing a pane collapses its parent and gives the space back to its sibling.
You do not run one command and watch it any more. You run four agents in four panes, and none of them finishes while you are looking. Marlin is built for that.
A working mock, running in this page. Nest a couple of splits, rotate the tab bar, click a file to watch it take over the tab, right-click a pane, double-click a tab to rename it. It behaves the way the real app behaves.
Vertical and horizontal splits nest, so any mix is just what happens when you press the second key. Closing a pane collapses its parent and gives the space back to its sibling.
Top, side, or hidden, cycled with one key. Long branch names fit down the side of a wide display where they never fit across the top of one.
Branch, ahead count, merge conflicts, staged and changed, with stage, unstage and discard on each row. Diffs render unified or side by side. It runs your git.
A directory holding several repositories shows as repositories rather than pretending to be one project, which is what a working directory usually is.
Click a file and you get three columns: tree, file, terminal. Escape puts your exact layout back. Syntax highlighting across 30 languages, and files are editable.
A dot per pane and per tab, driven by real shell marks rather than guesswork: running, finished, failed. A dot appears only when a pane knows something you do not.
Marlin running Claude Code in a real repository with nine repos in the sidebar, which is what it was built for. Every competitor's hero is a mockup; this one is a screenshot.
A terminal sees everything: your keys, your tokens, your employer's source. That makes the interesting question not what a terminal can do, but what it refuses to do. Marlin's answers are deliberate, and they are checkable, because the source is right there.
| Promise | What that actually means |
|---|---|
| No cloud, no account, no sign-in | Marlin has no backend. There is nothing to log into, and no service that could be down or shut off. |
| No telemetry, of any kind | Not opt-out, not anonymised, not “just crash counts”. There is no analytics code in the app. |
| Your terminal output is never stored or sent | Scrollback lives in memory in your session, and the diagnostics log deliberately contains none of it, because scrollback holds passwords and private source. |
| Error reports are a button, not a background job | Problems are written to a local file. Reporting opens a GitHub issue pre-filled and editable, so you read exactly what you are sending before you send it. |
| No AI in the loop | Marlin does not read your commands, does not send them anywhere, and has no model in it. It runs agents; it is not one. |
| Your shell stays your shell | Marlin never parses your command line. Completion, history and autosuggestions remain fish’s and zsh’s job, so your history file is never duplicated somewhere new. |
| Your git is your git | The sidebar shells out to the git binary you already have, with your config, your credentials and your hooks. No second implementation with its own idea of what your repository contains. |
| The webview is locked down | It can receive terminal output and move its own window. No filesystem, shell or network permission, and a content security policy that blocks outbound requests, so nothing the terminal prints can call home. |
| Links open in your browser, and only http and https | A UI that can be navigated by something the terminal printed is a class of problem worth closing before it exists. |
| Settings are a file you own | ~/.config/marlin/marlin.toml, plain text, editable by hand, safe to keep in a dotfiles repo. |
One honest caveat. Builds are not yet signed with an Apple Developer ID, so macOS will warn you about an unidentified developer. The instructions below say how to get past it. Building from source avoids the question entirely, and is the option we would pick if we were you.
$ git clone https://github.com/ehsangazar/marlin $ cd marlin $ pnpm install $ pnpm tauri build
Needs Node, pnpm and a stable Rust toolchain.
The app lands in src-tauri/target/release/bundle.
# zsh $ echo 'source ~/path/to/marlin/shell/marlin.zsh' >> ~/.zshrc # fish $ echo 'source ~/path/to/marlin/shell/marlin.fish' \ >> ~/.config/fish/config.fish
Optional. It emits standard prompt marks so the status dots and directory tracking work. Without it you get a working terminal with no dots, which is degraded rather than broken.
Open an issue with what you did and what happened. Agents triage every issue, reproduce what they can, and open a pull request where the fix is obvious. A human reviews everything before it ships, so nothing lands unread.
Marlin is free and always will be. Sponsorship is monthly and cancellable on purpose, because this is an early project and you should be able to stop as easily as you started.