A terminal file manager that doesn't lose your project root.
A fork of Yazi with anchored navigation and dynamic panes — built for developers who want VSCode‑style file browsing in the terminal.
Installation · Quick Start · Keybindings · How It Works
As a developer in tmux + terminal land, I tried every file manager and they all had the same problem:
| Tool | The pain |
|---|---|
| Ranger / lf | Sliding window — go three folders deep and you forget where you started |
| broot | Tree view is powerful but expanding/collapsing nodes feels clunky |
| Yazi | Fast, gorgeous, async… but still scrolls your project root off‑screen |
I wanted VSCode's file explorer in the terminal: the project root pinned on the left, and the view grows as you go deeper instead of sliding.
So I forked Yazi. That's Jermi.
Traditional sliding window Jermi anchored view
────────────────────────────── ──────────────────────────────────────
src/ components/ Button.tsx project/ src/ components/ Button.tsx
↑ ↑
project root scrolled away anchor stays pinned
Every other terminal file manager treats your view as a sliding window over the filesystem — go three folders deep, and your project root has scrolled off the left edge. You lose context. You forget where you started.
Jermi's one big insight: pin the starting directory.
The directory you launched in becomes the anchor — a fixed left boundary that never moves. Pressing h at the anchor is a no‑op (you can't go above your project root). Every navigation rebuilds the visible chain as [anchor → … → current], so the root is always on screen, and so is the path that got you here.
This single decision is what makes Jermi feel like VSCode's file explorer instead of like ranger:
| Sliding window (ranger / lf / Yazi) | Anchored (Jermi) |
|---|---|
| Three columns, always the same | Columns grow as you go deeper |
| Root scrolls off when you dive deep | Root stays pinned on the left, forever |
| "Where am I?" requires the title bar | The breadcrumb is the layout |
| Project boundary is implicit | Project boundary is a first‑class object |
Two features fall out of this directly:
Dynamic panes — instead of a fixed 2 or 3‑pane slot count, the view grows with depth.
| Where you are | Panes shown |
|---|---|
| At anchor | 2 panes (current + preview) |
| 1 level deep | 3 panes (anchor + current + preview) |
| 2 levels deep | 4 panes (anchor + parent + current + …) |
| N levels deep | N + 2 panes |
Anchor isn't immutable — Shift+Left expands the anchor up to its parent, Shift+Right shrinks it down to wherever you are now. Treat your "project root" as a dial you can turn at runtime, not a CLI flag you set on launch.
There are two ways to install. Pick one.
If you don't know which to pick: choose Method 1. It's faster and doesn't require Rust.
Go to Releases → nightly and download the file matching your system:
| Your system | File to download |
|---|---|
| macOS — Apple Silicon (M1/M2/M3/M4) | yazi-aarch64-apple-darwin.zip |
| macOS — Intel | yazi-x86_64-apple-darwin.zip |
| Linux — x86_64 | yazi-x86_64-unknown-linux-gnu.zip |
| Linux — ARM64 | yazi-aarch64-unknown-linux-gnu.zip |
| Linux — musl (Alpine, etc.) | yazi-x86_64-unknown-linux-musl.zip |
| Windows — x86_64 | yazi-x86_64-pc-windows-msvc.zip |
Open a terminal in the folder where you downloaded the zip, then copy‑paste the block for your platform:
macOS — Apple Silicon (click to expand)
unzip yazi-aarch64-apple-darwin.zip
mkdir -p ~/.local/bin
cp yazi-aarch64-apple-darwin/yazi ~/.local/bin/jermi
chmod +x ~/.local/bin/jermi
# Required on Apple Silicon — clears the quarantine xattr and ad-hoc signs
# the binary so macOS (AMFI) doesn't kill it on launch.
xattr -c ~/.local/bin/jermi
codesign --force --sign - ~/.local/bin/jermimacOS — Intel
unzip yazi-x86_64-apple-darwin.zip
mkdir -p ~/.local/bin
cp yazi-x86_64-apple-darwin/yazi ~/.local/bin/jermi
chmod +x ~/.local/bin/jermi
xattr -c ~/.local/bin/jermi
codesign --force --sign - ~/.local/bin/jermiLinux (x86_64 / ARM64 / musl)
Replace <file> with the zip you downloaded.
unzip <file>.zip
mkdir -p ~/.local/bin
cp <file>/yazi ~/.local/bin/jermi
chmod +x ~/.local/bin/jermiWindows
Expand-Archive yazi-x86_64-pc-windows-msvc.zip -DestinationPath .
Copy-Item yazi-x86_64-pc-windows-msvc\yazi.exe $HOME\bin\jermi.exeMake sure $HOME\bin is in your PATH.
# zsh (default on macOS)
echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.zshrc
source ~/.zshrc
# bash
echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.bashrc
source ~/.bashrcThen launch:
jermiIf you see file panes — you're done.
Requires the Rust toolchain.
git clone https://github.com/JeremyDong22/Jermi.git
cd Jermi
./install.shinstall.sh will:
- Build the release binary with
cargo build --release - Copy it to
~/.local/bin/jermi - On macOS, automatically run the
xattr+codesignstep
Then add ~/.local/bin to your PATH (see Step 3 above) and run jermi.
zsh: killed jermi on Apple Silicon
macOS killed the binary because of a quarantine attribute. Re‑run:
xattr -c ~/.local/bin/jermi
codesign --force --sign - ~/.local/bin/jermijermi: command not found
~/.local/bin isn't in your PATH. Run Step 3 above, then open a new terminal window.
Build fails with "empty directory" errors
If your repo lives in ~/Desktop or ~/Documents (iCloud‑synced), iCloud may create empty yazi-* 2/ shadow directories that break the build:
rm -rf *" 2"*Long term: move the repo out of iCloud‑synced paths.
cd ~/your-project
jermiThat directory becomes the anchor. Navigate with j/k/h/l (or arrow keys). The root pane stays pinned no matter how deep you go.
| Key | Action |
|---|---|
h / Left |
Go to parent directory |
l / Right / Enter |
Enter directory / open file |
j / Down |
Move cursor down |
k / Up |
Move cursor up |
Shift+Left |
Expand anchor (move to parent) |
Shift+Right |
Shrink anchor (move to current) |
q |
Quit |
All other Yazi keybindings still work — see the Yazi docs.
- Anchor — the startup directory is saved as the "anchor" and defines the leftmost visible boundary.
Leaveblocked at anchor — pressingh/Leftat the anchor does nothing. You can't go above your project root.pane_urlsis auto‑derived — everycdrebuilds the chain[anchor, …, target]automatically; nothing is pushed/popped manually.Shift+Arrowadjusts the anchor — move the boundary up or down without restarting.
Jermi inherits everything that makes Yazi great:
- Async I/O — instant directory loads
- Built‑in image preview (Kitty, iTerm2, Sixel, …)
- Lua plugin system
- Syntax highlighting
- And much more
MIT — same as Yazi.