Files
viexp/docs/articles/file-manager-comparison.md

76 lines
4.2 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
type: article
status: published
created: 2026-10-17
updated: 2026-10-17
tags: [article, comparison, file-manager]
sources:
- "[[research/ranger-deep-dive]]"
- "[[research/competitor-landscape]]"
- "[[research/rust-preview-stack]]"
- "[[research/plugin-architecture]]"
---
# Terminal file managers in 2026: what viexp should learn from them
> **TL;DR** — Ranger defined the interaction vocabulary; yazi proved a Rust rewrite can be both
> faster and more extensible; nnn and lf showed that scripts-as-APIs beat embedded interpreters
> for Linux users; joshuto and hunter showed how scope and toolchain choices kill projects.
> viexp takes ranger's UX, yazi's architecture patterns, and an extension model that starts
> declarative and grows to scripts, then Lua.
## Introduction
Before writing viexp we studied nine terminal file managers (ranger, yazi, nnn, lf, joshuto,
felix, hunter, vifm, broot, mc). This article condenses the four research notes above into
the product decisions behind viexp. Full data lives in the linked research notes.
## The three eras
1. **The blueprint (ranger, 2009–)**. Miller columns, vim keys, `:bulkrename`, rifle opener
rules, `--choosefile`. Still the most feature-complete — and still slow for structural
reasons: a synchronous Python loop that stats every file inline, `statvfs` on every frame
(4–10 s j/k lag on network mounts, issue #1025), ~1 s interpreter startup, and an image
preview stack built on an abandoned X11 tool (ueberzug).
2. **The reaction (nnn, lf, vifm, 2015–)**. Minimalism and Unix philosophy. nnn fits in
150 KiB with zero config and extends through executables; lf keeps the UI responsive with
async I/O and pushes previews to an external script; vifm goes the opposite way and makes
config a programming language. Each proves a point: speed is a feature; process contracts
are a complete extension API; but none ships native graphics, so preview ecosystems
fragmented into incompatible script zoos.
3. **The synthesis (yazi, broot, 2023–)**. yazi is what happens when you take ranger's UX and
rebuild it on tokio + ratatui: paged preloading (only visible rows get work), prioritized
worker pools, three cancellation mechanisms, protocol auto-detection (kitty/iterm2/sixel/
ueberzug++/chafa), TOML config with `prepend_/append_` merge, and Lua plugins through the
same dispatch tables as built-ins. broot rethinks navigation itself around an interruptible,
composable tree search.
## The five decisions viexp takes from this
| # | Decision | Source | ADR |
|---|----------|--------|-----|
| 1 | ratatui + crossterm UI, single-threaded actor fed by background workers | yazi, felix | ADR-001 |
| 2 | Extension model in three phases: TOML rules → external script contract → Lua | yazi tables, nnn/lf contracts, joshuto's failure | ADR-002 |
| 3 | Every file-type module (image/video/audio/pdf/djvu/epub/md) is a registry entry with a runtime `enabled` switch; cargo features only trim binaries | yazi, Cargo book | ADR-003 |
| 4 | Image protocol chain: kitty → iterm2 → sixel → ueberzug++ → chafa/halfblocks, detected at runtime | yazi-adapter | ADR-004 |
| 5 | Async adopted gradually: sync core first, threads for previews, tokio for the full pipeline | lf (threads suffice) → yazi (tokio) | ADR-005 |
## What we deliberately do not copy
- **Full ranger parity in one release** — the joshuto trap (5 config files, half-built command
line, 14-month release gap). viexp ships a narrow polished core first.
- **Nightly Rust or linked C media frameworks** — the hunter trap. Stable toolchain; media via
spawned `ffmpeg`/`ffprobe` processes.
- **A bespoke config DSL** — the lf trap. TOML now, Lua later, never a private language.
- **GPL-linked crates in the binary** (`epub` crate) — spawned GPL tools (`pdftoppm`, `ddjvu`,
ueberzug++) are fine; statically linked GPL is not.
## Conclusions
The market gap viexp aims at: ranger's ergonomics with yazi-grade speed, a **script-first
extension model** (Lua last, not first), and documentation-driven module replaceability —
built as a learning project that teaches Rust and technical English at 20 hours per sprint.
## Sources
See the four linked research notes; each ends with its own verified source list.