A small, fast, minimalist three-panel file explorer for the terminal, written in Rust with Ratatui and Crossterm.
It is deliberately simple — it does not try to compete with ranger, lf or yazi. It is meant to be a pleasant, Unix-like place to move around a source tree.
- Three panels: parent directory on the left (with the current directory highlighted), current directory listing in the center, and details + preview on the right.
- Columns: name, size and type for every entry. Directories are shown first, sorted alphabetically.
- Text preview: the right panel shows metadata plus the start of text files. Binary files are detected by content sniffing and show metadata only.
- Image preview: images render inside the right panel using the
Kitty graphics protocol
when
TERM=xterm-kitty(kitty, wezterm). Other terminals show metadata plus a hint. PNG/JPEG/GIF stream as-is; BMP/WebP/TIFF/ICO are re-encoded to PNG. - Hidden files toggled with
.. - Fullscreen help with
h.
| Key | Action |
|---|---|
↑ / ↓, j/k |
Move the selection |
Enter / → |
Enter the selected directory |
Backspace / ← |
Go to the parent directory |
g / G |
Jump to first / last entry |
Home / End |
Jump to first / last entry |
h |
Toggle help |
. |
Toggle hidden files |
q |
Quit |
| Key | Action |
|---|---|
n |
Create directory (type the name, press Enter) |
N |
Create file |
r |
Rename the selected entry |
d |
Delete the selected entry (asks confirmation y/n) |
c |
Copy the selected entry to the clipboard |
m |
Move the selected entry (cut to the clipboard) |
p |
Paste the clipboard into the current directory |
Copies are never overwritten: if the name exists a .copy1, .copy2, … suffix
is appended. In dialogs, Enter confirms, Esc cancels, and Backspace /
Delete edit the text.
cargo build --release
target/release/filetui # starts in the current directory
target/release/filetui /some/path # or start somewhere specificDestructive operations (d) always require confirmation. Errors such as
insufficient permissions, missing files, or failing cross-device moves are
reported in the status bar or a dialog and never crash the app. Symlinks are
shown and entered transparently. The terminal is always restored on exit, even
after an error.
The code is split into clearly separated modules; render code never touches the filesystem.
| Module | Responsibility |
|---|---|
fsops |
Every filesystem operation (list, create, rename, delete, copy, move) |
state |
Application state: cwd, parent, entries, selection, dialogs, clipboard, navigation |
input |
Key events → state transitions |
dialogs |
Dialog business logic (submitting mutations, confirms) |
preview |
Text/binary preview content |
img |
Kitty graphics protocol: image placement, fitting, base64 chunking, delete |
ui |
All Ratatui rendering (panels, help, dialogs, status) |
Run the tests with cargo test.
Questions, ideas and feedback about this project live in the Low Noise Discord (channel #build). The videos are on YouTube.
