TL;DR: broot replaces the "open VS Code, Cmd+Shift+F, type, scroll" loop with a terminal-native workflow. You should install it if you navigate by discovery more than you navigate by path.
broot ships as one binary. The first time you run broot in a terminal, it will offer to install a small shell function called br and patch your shell init file. Both work as launchers — broot and br open the same TUI. The difference is that br also lets broot change your shell's directory on quit, using the :cd verb, or Alt+Enter from inside broot (Option+Enter on macOS). Note that if you only browse the directory tree in broot without making your shell follow, broot is enough. If you want the directory-change behavior, run broot once to install br, then use br from then on.
If broot didn't prompt you to install br (common when broot was installed by a setup script or a package manager that ran it non-interactively), run broot --install from a regular terminal prompt. That writes the function to your shell init file and makes br available after you source it (or open a new terminal window). Without this step, typing br returns "command not found" — but the TUI still works via broot.
The Modern CLI Stack PDF explains how to install broot. It does not spend time explaining when/why you would. Let's discuss that now.
Most readers who install broot will try it once, use the tree command instead, and conclude broot is overkill.
The point worth making is that broot is not a tree replacement. It is the file manager you open when you don't yet know what file you need. The Modern CLI Stack PDF cannot teach that workflow in two bullets because the workflow is multi-step and keyboard-driven. Here are two of those steps.
1. Browse the tree
Open broot with br and the tree fills the screen. Enter on a directory moves into it; step back with :parent or Esc. You can move around without committing to anything. The tree is the workspace, not a printout. broot is the tool you leave open while you decide what to do.
2. Filter the tree
Type .md and the tree collapses to matching files. broot's default mode is a fuzzy name search — you type, the tree filters as you go. To make it a regex, prefix with /: /rs$ matches files ending in rs. To search file contents instead of names, prefix with c/: c/memmap shows only files containing "memmap" in their content. Esc clears the current pattern.
The concrete case: "I want to see every markdown file in this repo and read three of them." Type .md, the tree collapses to the markdown files. Read the names in their directory context, pick the three you want. Different from find . -name '*.md' | fzf because you don't commit to a search upfront — the tree filters as you discover what's there, and you can keep narrowing by typing more.
broot's verb system (:copy, :mkdir, :rm, :mv, etc) will be featured in a follow-up issue. I want to test the keystrokes on more machines before I write that one — what works on my Terminal app today doesn't necessarily work on yours.
What broot is NOT
This paragraph matters more than the previous ones. If you skip it, you will misuse broot and conclude it is overkill.
Broot is not a replacement for tree. If you want to see the contents of a directory once and be done, run tree. broot is the wrong tool for that. It opens a TUI, holds terminal state, and you have to quit it. For one-shot listings, that overhead is wasted.
Broot is not a replacement for find . | fzf either. If you have a target in mind and just need to pick one file, the find | fzf combo exits the moment you pick. broot is for when you do not have a target yet.
If you only ever want to see the tree, run tree, and skip the install. broot's value is in the sustained navigation and features such as the commands and the verbs. Without those, it is just a slower tree.
One CLI trick
# Inside broot (after you launch it with `br`):
.md
If you want the full toolkit, The Modern CLI Stack is a free PDF covering mise, uv, starship, zoxide, fzf, ripgrep, fd, bat, eza, delta, tldr, atuin, lazygit, and broot. Get it on Gumroad.