Terminal file managers make navigating directories and handling files faster in the shell. Instead of typing cd and ls repeatedly, you move through folders visually, keep selections persistent, and preview file contents instantly. For regular terminal users, they are a practical productivity tool.
Among the most popular implementations is Ranger (github.com/ranger/ranger). Its three-column view, with parent folder, current folder, and a preview panel, became a common design. Its Vim-like key bindings and Python plugin system made it accessible and extensible. Ranger is mature and still widely used.
Ranger uses synchronous I/O, so previewing large directories or network drives can freeze the interface. Development has slowed in recent years, and this has opened the door to alternatives that address these limitations while building on the ideas Ranger popularised.
Yazi (github.com/sxyazi/yazi) is written in Rust and uses asynchronous I/O with multithreaded task scheduling. The interface stays responsive even when preview generation and other background operations run concurrently.
Image previews are built in and support Kitty, iTerm2, Sixel, and most other modern terminals without external helper scripts. Yazi includes multi-tab support, a task system with progress bars, and a built-in package manager for plugins and themes. The plugin system is based on Lua and supports custom previewers, UI components, and functional extensions.
Yazi is feature-rich. The configuration surface is wide, and users who prefer a minimal setup may find the built-in package manager and task system excessive. Image previews work out of the box, but tuning them for specific terminal setups can still require effort.
Vifm (github.com/vifm/vifm) is written in C and presents a dual-pane interface. Its keybindings are designed to replicate Vim's modal editing precisely, including registers, marks, and command-line behaviour. If you use Vim, Vifm gives you complete keyboard control over your files without learning a new set of commands.
The defining feature is undo and redo support for file system operations. Vifm maintains a log of changes, allowing users to revert moves, copies, and deletions. Configuration is managed through a vifmrc file with Vimscript-like syntax. Extensions are defined as mappings and commands within that file; there is no separate plugin system. Vifm does not include built-in graphical previews and relies on external viewers for images and other media.
Vifm is specialised. Vim power users will find an environment that behaves identically to their editor. For others, the learning curve is steep. The interface is minimal, and the absence of client-server capabilities limits integration with external scripts.
lf (github.com/gokcehan/lf) is written in Go and compiles to a single binary with no runtime dependencies. The feature set is deliberately small: the core handles navigation and selection, and leaves everything else to external tools.
Configuration is a plain text file where keybindings are mapped to shell commands. This means previews, file operations, and other behaviours are defined using the tools you already know. There is no separate plugin system or embedded scripting language to learn. You extend lf by adding small scripts to its configuration file.
lf includes a client-server mechanism that lets external scripts control a running instance, making it easy to integrate with other command-line utilities. It can also function as a file picker for other applications. Startup is fast, and resource usage stays low.
The tradeoff is the absence of built-in tabs, task progress, or native image previews. These are provided through external commands, which the user configures as needed. This keeps the core focused and avoids feature bloat.
Yazi offers a comprehensive, integrated experience with built-in previews and a Lua plugin system, though its complexity may not suit everyone. Vifm provides Vim semantics and undo support, but its appeal is mostly limited to Vim users.
lf takes a different path: a minimal core that delegates to shell commands, allowing users to assemble features like previews and tab management using existing tools. This approach keeps the core small and makes integration with other command-line utilities straightforward, without imposing a specific workflow or requiring a new language for extensions. Users familair with Ranger can also find an easy transition guide on the lf wiki.