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

4.2 KiB
Raw Blame History

type, status, created, updated, tags, sources
type status created updated tags sources
article published 2026-10-17 2026-10-17
article
comparison
file-manager
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.