1 stable release
Uses new Rust 2024
| 1.0.0 | Mar 20, 2026 |
|---|
#2281 in Filesystem
185KB
4.5K
SLoC
Vocofo
A fast, lightweight terminal-based file manager written in Rust with dual-panel layout, vim-style navigation, and remote filesystem support (SFTP/FTP/SCP).
Features
- Dual-Panel Layout: Side-by-side or stacked panels (auto/horizontal/vertical)
- Vim-Style Navigation:
j/k/h/l,g/G, search with/ - File Operations: Copy, cut, paste, delete, rename, chmod — all with Ctrl+ shortcuts to prevent accidents
- Remote Filesystems: SFTP, FTP, and SCP fallback with connection bookmarks
- Command Palette:
F1opens searchable list of all available actions - Settings UI:
F2for panel layout, hidden files, preview, default path - File Preview:
F3toggle preview panel with file contents/directory listing - Bulk Selection: Space to select,
Ctrl+Aselect all, batch operations - Progress Tracking: Transfer progress shown for cross-backend file copies
- Reconnect: Automatic keep-alive and reconnection for remote connections
- Configurable: Settings persisted to
~/.config/vocofo/config.toml
Quick Start
cargo install vocofo
vocofo
Note: SFTP support requires
libssh2andopensslsystem libraries. See Installation for details. To install without remote support:cargo install vocofo --no-default-features
Installation
From crates.io
cargo install vocofo
From Source
Prerequisites:
- Rust 1.85+ (rustup.rs)
libssh2andopenssldev libraries (for SFTP support)
# Debian/Ubuntu
sudo apt install libssh2-1-dev libssl-dev pkg-config
# Fedora
sudo dnf install libssh2-devel openssl-devel
# Arch
sudo pacman -S libssh2 openssl
# macOS (via Homebrew)
brew install libssh2 openssl
git clone https://github.com/VoCoufi/Vocofo.git
cd Vocofo
cargo install --path .
Feature Flags
SFTP and FTP are enabled by default. To build without remote support:
cargo build --release --no-default-features
Keyboard Shortcuts
Navigation
| Key | Action |
|---|---|
↑/↓ or j/k |
Move selection |
Enter or l |
Open file/folder |
Backspace or h |
Parent directory |
Tab |
Switch panel |
g g |
Go to first item |
G |
Go to last item |
PageUp/PageDown |
Page scroll |
/ |
Search / filter |
. |
Toggle hidden files |
= |
Sync panels |
File Operations
| Key | Action |
|---|---|
Ctrl+C |
Copy |
Ctrl+X |
Cut |
Ctrl+V |
Paste |
Del |
Delete (with confirmation) |
Ctrl+R |
Rename |
Ctrl+N |
New file |
Ctrl+P |
New folder |
Ctrl+M |
chmod (change permissions) |
Space |
Toggle selection |
Ctrl+A |
Select all |
Ctrl+D |
Deselect all |
Application
| Key | Action |
|---|---|
F1 |
Command palette (all actions) |
F2 |
Settings |
F3 |
Toggle preview |
F5 |
Connect to remote server |
F6 |
Disconnect |
F7 |
Bookmarks |
Q / Esc |
Quit |
Remote Connections
Vocofo supports browsing remote filesystems via SFTP, FTP, and SCP:
- Press
F5to open the connection dialog - Select protocol (SFTP/FTP), enter host, port, username, password
- Press
Enterto connect — the active panel switches to the remote filesystem - All file operations work — copy/move files between local and remote panels
- Press
F6to disconnect
Bookmarks
Ctrl+Sin the connection dialog saves the current connection as a bookmarkF7opens the bookmark list to quickly reconnect (passwords are never saved)
SCP Fallback
When an SSH server doesn't have the SFTP subsystem enabled, Vocofo automatically falls back to SCP mode using SSH exec commands for browsing and SCP for file transfers.
Configuration
Settings are stored in ~/.config/vocofo/config.toml:
[general]
show_hidden = false
default_path = "."
show_preview_on_start = false
panel_layout = "auto" # "auto", "horizontal", or "vertical"
[[connections]]
name = "My Server"
protocol = "sftp"
host = "example.com"
port = 22
username = "user"
Testing
270 tests covering file operations, UI state, remote backends, and integration workflows:
cargo test # Run all tests
cargo test --test sftp_integration_test -- --ignored # SFTP integration (needs local sshd)
Architecture
src/
├── main.rs # Entry point, terminal setup, main loop
├── context.rs # Central app state (Context, PanelState, UiState)
├── backend.rs # FilesystemBackend trait
├── local_backend.rs # Local filesystem implementation
├── sftp_backend.rs # SFTP via ssh2
├── ftp_backend.rs # FTP via suppaftp
├── scp_backend.rs # SCP fallback (SSH exec + SCP)
├── config.rs # Config loading/saving (TOML)
├── file_operation.rs # File ops, preview, paste resolution
├── background_op.rs # Background threads for copy/move/delete
├── event_handler/ # Keyboard input handling (6 modules)
├── render/ # UI rendering (panels + popups)
├── ui.rs # Layout, status bar, popup routing
└── messages_enum.rs # UI text constants
Contributing
- Fork the repository
- Create a feature branch:
git checkout -b feature/my-feature - Make changes and add tests
- Run
cargo test && cargo clippy && cargo fmt --check - Commit and open a Merge Request
License
MIT License — see LICENSE for details.
Built with ratatui, crossterm, ssh2, and suppaftp.
For issues and suggestions: GitHub Issues
Dependencies
~7–23MB
~312K SLoC