docs: bootstrap vault, roadmap and research

This commit is contained in:
2026-10-17 21:14:19 +03:00
parent 749afadcd4
commit 8fa0632d69
34 changed files with 1508 additions and 0 deletions
+76
View File
@@ -0,0 +1,76 @@
---
type: research
status: analyzed
confidence: high
created: 2026-10-17
question: Which terminal file managers exist in 2026, what does each do best, and which ideas should viexp adopt or avoid?
tags: [research, file-manager, yazi, nnn, lf, vifm, broot]
---
# Competitor landscape (October 2026)
## Feature matrix
| Manager | Lang | TUI | Image preview | Extensions | Config | Async | State (last release) |
|---|---|---|---|---|---|---|---|
| **yazi** | Rust | ratatui | native kitty/iterm2/sixel/ueberzug++/chafa | Lua (mlua, vendored) + `ya pack` | TOML ×3 | tokio, fully | Very active, v26.9.1 (2026-09) |
| **nnn** | C | ncurses | via FIFO plugins | any executable; `NNN_PIPE`/`NNN_FIFO` protocol | none (flags+env) | no (tiny by design) | Active, v5.3 (2026-08) |
| **lf** | Go | own | sixel native; else scripts | shell cmds, `push`, remote socket API | lfrc DSL | async I/O | Active, r42 (2026-07) |
| **joshuto** | Rust | tui-rs/termion | external scripts | config only | 5 TOMLs | partial | Semi-stalled, v0.9.9 (2025-05) |
| **felix** | Rust | termion | chafa + bat | none | YAML | partial | Dormant since 2025-04 |
| **hunter** | Rust | own | halfblock/sixel/kitty | mime actions | conf+keymap | heavily threaded | Dead (2020/2022) |
| **vifm** | C | ncurses | community scripts only | vim-like `:commands` + Lua | vifmrc | no | Active, v0.14.4 (2026-05) |
| **broot** | Rust | crossterm+termimad | kitty graphics | verbs, skins | TOML | interruptible search | Very active, v1.61 (2026-10) |
| **mc** | C | own | none | extfs VFS helpers | menus | background ops | Active, 4.8.33 |
## What the winners do right
- **yazi** (~43k stars): ~25-crate workspace, everything on tokio; micro/macro worker pools with
priorities (mime/previews preempt copying); **paged preloading** — only visible rows get work;
three cancellation mechanisms (tokio abort, atomic tickets for CPU work, instruction-count
checks for Lua); two-pass image pipeline (downscale+cache → fit to terminal); DDS pub/sub
between instances without a daemon. v25.4 doubled startup speed via config parser rewrite.
- **nnn**: 150 KiB binary, zero config; plugins = executables with env-var contract
(`$1` hovered file, `$2` cwd, `$3` picker) and a tiny write-back protocol via `NNN_PIPE`;
`NNN_FIFO` streams hovered paths so external scripts render live previews.
- **lf**: external `previewer(file, w, h, x, y)` + `cleaner` contract with exit-code-controlled
caching; `push` simulates keystrokes making mappings composable; server model over Unix socket.
- **broot**: every keystroke interrupts the running search; fuzzy+regex+content combined with
boolean operators; collapsed tree respecting .gitignore.
- **felix**: built-in trash + undo/redo + zoxide `z` jump — small features with huge daily value.
## Ideas worth stealing (ranked)
1. yazi's paged task scheduling + prioritized workers + cancellation tickets (perceived speed)
2. Protocol auto-detection adapter layer behind one trait (kitty/iterm2/sixel/ueberzug++/chafa)
3. lf's previewer/cleaner argv contract — cheapest path to infinite formats
4. nnn's FIFO hover event stream for external live previews
5. yazi's TOML tables with `prepend_*`/`append_*` merge semantics for rules
6. TOML for config + (later) Lua for behavior + pinned plugin packages
7. broot's interruptible, composable search
8. lf's `push` key-simulation primitive
9. felix's trash + undo + `z` jump
10. Performance as a marketable feature (both nnn and yazi publish benchmarks)
## Anti-patterns to avoid
| Trap | Victim | Lesson |
|------|--------|--------|
| Full ranger parity alone | joshuto | 5 config files, janky command line, 14-month release gap → audience left for yazi. Ship narrow and polished. |
| Nightly compiler + heavy C deps | hunter | GStreamer + nightly = unbuildable for users. Stable Rust, spawned binaries for media. |
| No native graphics path | vifm, nnn, mc | Preview zoo of mutually incompatible scripts. Build the adapter layer early. |
| Bespoke config DSL | lf | A whole parser users must learn; standard TOML + scripting runtime beats it. |
| Doctrinal non-features | lf (no tabs) | Minimal defaults and power features are not contradictory (yazi proves it). |
| Monolith | mc | Thin core + clean contracts. |
| API churn without pinning | yazi (mild) | Plugin version pinning story from day one. |
| Silence without governance | felix, hunter | Release cadence = perceived life. |
## Outcome
Shaped ADR-001 (ratatui), ADR-002 (extension phases), ADR-004 (protocol chain), and the
roadmap order (core narrow first, previews second, plugins third, Lua last).
## Sources
- yazi: github.com/sxyazi/yazi, https://yazi-rs.github.io/blog/why-is-yazi-fast/, releases v25–v26
- nnn: github.com/jarun/nnn + plugins/README.md
- lf: github.com/gokcehan/lf + doc.md
- joshuto, felix, hunter, vifm, broot, mc: repos + release APIs (dates verified 2026-10-17)