
rust commander is an in-progress Rust TUI file manager inspired by GNU Midnight
Commander. I'm already using it as a daily driver and, even after 20 years of using mc,
I find it improves over the original in multiple ways:
/)The goal is to provide mc-inspired behavior and keymaps, with a modern internal architecture that keeps the UI responsive while long operations run, without requiring a strict 1:1 reimplementation of every mc subsystem.
This repository is actively developed with AI assistance but human oversight and already usable for core workflows.
Implemented milestones:
/ opens Quick CD and > is reserved for a future explicit
shell-command promptRecent Milestone 4 and reliability progress:
Ctrl-X H quick-add.~, Unix ~user, and per-panel
cd - history. Arbitrary case-insensitive substrings search directories from the
current directory, home, and filesystem root in a bounded, cancelable background scan;
ranked results stream into an arrow-selectable list.The remaining inactive Left/Right entries are explicitly later work: user-defined listing formats in Milestone 5, FTP/SFTP in Milestone 8, Shell links in Milestone 9, and lossless legacy filename transcoding in Milestone 10.
Planned next major milestones include mc.ext.ini, user menu, command-based diff
integration (difftastic/diff), optional remote VFS, and subshell integration.
See doc/roadmap.md.
Requirements:
Install Rust Commander from crates.io:
cargo install rust-commander --locked
Then launch it with:
rc
The package is named rust-commander; the installed executable is intentionally named
rc.
To build and run from a local checkout instead:
cargo run -p rust-commander --locked
Optional arguments:
rc --path /some/start/dir --tick-rate-ms 200
Select an mc skin:
rc --skin modarin256
rc --skin julia256 --skin-dir /path/to/mc/skins
rc embeds its bundled original skins in the binary and also discovers custom and system
skins in locations such as /usr/share/mc/skins and Homebrew paths.
Options menu now follows MC categories: Configuration, Layout, Panel options,
Confirmation, Appearance, Display bits, Learn keys, Virtual FS, and
Save setup.
Settings are loaded with deterministic precedence: built-in defaults -> persisted config -> environment overrides -> CLI flags.
Save setup persists to:
~/.config/rc/settings.ini for rc-owned settings.~/.config/mc/ini for MC-compatible skin key.Skin discovery uses ordered search roots: custom configured dirs, then bundled/system MC skin directories.
Main file manager:
Tab: switch active panelEnter / F3: open directory or open file in viewerF4: edit file using editor_command, $EDITOR, $VISUAL, or PATH probes (hx,
nvim, vim, vi, emacs)Space / Insert / Ctrl-T: toggle selected itemBackspace: go to parent directory/ or Alt-C: Quick CD; enter an exact path (~, Unix ~user, relative,
absolute, or - for previous) or any substring, then choose ranked matches with
Up/Down>: reserved for a future explicit shell-command prompt; rc has no always-live shell
inputF2: reserved for the MC-compatible user menu coming in Milestone 5F5 copy, F6 rename/move, F7 mkdir, F8 deleteCtrl-J: open jobs screenAlt-J: cancel latest/selected jobAlt-F, M-?, Ctrl-/: open find dialogAlt-T: open treeAlt-H: open hotlistAlt-P / Ctrl-P or Ctrl-X then !: open external panelizeF9: open menus; Left/Right configure either panel's view, format, sort, and filterCtrl-X i / Ctrl-X q: show Info / Quick view in the passive panelAlt-Shift-T: cycle Full, Brief, and Long formats on the active panelLeft / Right: move across responsive columns in Brief formatShift-F6 / Shift-F8: cycle sort field / toggle reverse orderq / Esc: quitMilestone 4 screens:
F4 search again, F5 panelize, F6 pause/continue, Alt-J cancel
the exact search.F2 rescan, F3 forget subtree, F4 static/dynamic mode,
F5/F6/F7/F8 copy/move/mkdir/delete.a add, e/F4 edit, d/Delete remove, Enter open.Tab custom command, F2 add, F4 edit, F8 remove,
Enter run. The side-panel Panelize menu entry restores that panel's latest results.Viewer:
F7 / Ctrl-S: searchShift-F7: search backwardn / Shift-n: continue search forward/backwardg / Alt-L: gotow: toggle wraph: toggle hex/text modeEsc / q / F10: close viewerNotes:
crates/core/assets/mc.default.keymap.crates/app (rust-commander): terminal app entrypoint, event loop, input normalizationcrates/core (rust-commander-core): domain model, commands, routes, operations, jobscrates/ui (rust-commander-ui): ratatui rendering and bundled skin supportcrates/shell (rust-commander-shell): cancelable process backend primitivesdoc/roadmap.md: feature plan and milestone breakdowndoc/architecture/: bounded contexts, crate contracts, ownership mapdoc/adr/: architecture decision recordsRuntime tracing is written to ~/.config/rc/rc.log instead of the terminal so
diagnostics cannot corrupt the alternate-screen UI. Set RC_LOG_FILE to use a
different path and RUST_LOG to change the default warn filter. Logs at or
above 8 MiB are reset on the next startup.
Run baseline checks locally:
cargo fmt --all -- --check
cargo clippy --workspace --all-targets --all-features --locked -- -D warnings
cargo test --workspace --all-targets --all-features --locked
Additional local equivalents of CI policy/perf checks (requires extra cargo tools):
cargo +1.88.0 check --workspace --all-targets --locked
cargo nextest run --workspace --all-targets --all-features --locked
./scripts/validate_rust_advisory_waivers.sh
cargo deny check bans licenses sources
./scripts/run_cargo_deny.sh \
--manifest-path Cargo.toml --all-features --locked \
check --config deny.toml advisories
./scripts/verify_release_packages.sh
cargo +nightly udeps --workspace --all-targets --all-features --locked
mkdir -p target/coverage
cargo llvm-cov --workspace --all-targets --all-features --locked --json --output-path target/coverage/llvm-cov.json
./scripts/coverage_trend.sh target/coverage/llvm-cov.json .github/coverage-baseline.json
CI runs all required gates on pushes and pull requests via:
.github/workflows/ci.yml.github/workflows/rust-security.yml, which also runs weekly against the latest RustSec
advisory databaseGPL-3.0-or-later, as this project is derived from the original midnight commander. See LICENSE for the complete terms.
261 commits
Rust
98.4%
Python
1.3%

rust commander is an in-progress Rust TUI file manager inspired by GNU Midnight
Commander. I'm already using it as a daily driver and, even after 20 years of using mc,
I find it improves over the original in multiple ways:
/)The goal is to provide mc-inspired behavior and keymaps, with a modern internal architecture that keeps the UI responsive while long operations run, without requiring a strict 1:1 reimplementation of every mc subsystem.
This repository is actively developed with AI assistance but human oversight and already usable for core workflows.
Implemented milestones:
/ opens Quick CD and > is reserved for a future explicit
shell-command promptRecent Milestone 4 and reliability progress:
Ctrl-X H quick-add.~, Unix ~user, and per-panel
cd - history. Arbitrary case-insensitive substrings search directories from the
current directory, home, and filesystem root in a bounded, cancelable background scan;
ranked results stream into an arrow-selectable list.The remaining inactive Left/Right entries are explicitly later work: user-defined listing formats in Milestone 5, FTP/SFTP in Milestone 8, Shell links in Milestone 9, and lossless legacy filename transcoding in Milestone 10.
Planned next major milestones include mc.ext.ini, user menu, command-based diff
integration (difftastic/diff), optional remote VFS, and subshell integration.
See doc/roadmap.md.
Requirements:
Install Rust Commander from crates.io:
cargo install rust-commander --locked
Then launch it with:
rc
The package is named rust-commander; the installed executable is intentionally named
rc.
To build and run from a local checkout instead:
cargo run -p rust-commander --locked
Optional arguments:
rc --path /some/start/dir --tick-rate-ms 200
Select an mc skin:
rc --skin modarin256
rc --skin julia256 --skin-dir /path/to/mc/skins
rc embeds its bundled original skins in the binary and also discovers custom and system
skins in locations such as /usr/share/mc/skins and Homebrew paths.
Options menu now follows MC categories: Configuration, Layout, Panel options,
Confirmation, Appearance, Display bits, Learn keys, Virtual FS, and
Save setup.
Settings are loaded with deterministic precedence: built-in defaults -> persisted config -> environment overrides -> CLI flags.
Save setup persists to:
~/.config/rc/settings.ini for rc-owned settings.~/.config/mc/ini for MC-compatible skin key.Skin discovery uses ordered search roots: custom configured dirs, then bundled/system MC skin directories.
Main file manager:
Tab: switch active panelEnter / F3: open directory or open file in viewerF4: edit file using editor_command, $EDITOR, $VISUAL, or PATH probes (hx,
nvim, vim, vi, emacs)Space / Insert / Ctrl-T: toggle selected itemBackspace: go to parent directory/ or Alt-C: Quick CD; enter an exact path (~, Unix ~user, relative,
absolute, or - for previous) or any substring, then choose ranked matches with
Up/Down>: reserved for a future explicit shell-command prompt; rc has no always-live shell
inputF2: reserved for the MC-compatible user menu coming in Milestone 5F5 copy, F6 rename/move, F7 mkdir, F8 deleteCtrl-J: open jobs screenAlt-J: cancel latest/selected jobAlt-F, M-?, Ctrl-/: open find dialogAlt-T: open treeAlt-H: open hotlistAlt-P / Ctrl-P or Ctrl-X then !: open external panelizeF9: open menus; Left/Right configure either panel's view, format, sort, and filterCtrl-X i / Ctrl-X q: show Info / Quick view in the passive panelAlt-Shift-T: cycle Full, Brief, and Long formats on the active panelLeft / Right: move across responsive columns in Brief formatShift-F6 / Shift-F8: cycle sort field / toggle reverse orderq / Esc: quitMilestone 4 screens:
F4 search again, F5 panelize, F6 pause/continue, Alt-J cancel
the exact search.F2 rescan, F3 forget subtree, F4 static/dynamic mode,
F5/F6/F7/F8 copy/move/mkdir/delete.a add, e/F4 edit, d/Delete remove, Enter open.Tab custom command, F2 add, F4 edit, F8 remove,
Enter run. The side-panel Panelize menu entry restores that panel's latest results.Viewer:
F7 / Ctrl-S: searchShift-F7: search backwardn / Shift-n: continue search forward/backwardg / Alt-L: gotow: toggle wraph: toggle hex/text modeEsc / q / F10: close viewerNotes:
crates/core/assets/mc.default.keymap.crates/app (rust-commander): terminal app entrypoint, event loop, input normalizationcrates/core (rust-commander-core): domain model, commands, routes, operations, jobscrates/ui (rust-commander-ui): ratatui rendering and bundled skin supportcrates/shell (rust-commander-shell): cancelable process backend primitivesdoc/roadmap.md: feature plan and milestone breakdowndoc/architecture/: bounded contexts, crate contracts, ownership mapdoc/adr/: architecture decision recordsRuntime tracing is written to ~/.config/rc/rc.log instead of the terminal so
diagnostics cannot corrupt the alternate-screen UI. Set RC_LOG_FILE to use a
different path and RUST_LOG to change the default warn filter. Logs at or
above 8 MiB are reset on the next startup.
Run baseline checks locally:
cargo fmt --all -- --check
cargo clippy --workspace --all-targets --all-features --locked -- -D warnings
cargo test --workspace --all-targets --all-features --locked
Additional local equivalents of CI policy/perf checks (requires extra cargo tools):
cargo +1.88.0 check --workspace --all-targets --locked
cargo nextest run --workspace --all-targets --all-features --locked
./scripts/validate_rust_advisory_waivers.sh
cargo deny check bans licenses sources
./scripts/run_cargo_deny.sh \
--manifest-path Cargo.toml --all-features --locked \
check --config deny.toml advisories
./scripts/verify_release_packages.sh
cargo +nightly udeps --workspace --all-targets --all-features --locked
mkdir -p target/coverage
cargo llvm-cov --workspace --all-targets --all-features --locked --json --output-path target/coverage/llvm-cov.json
./scripts/coverage_trend.sh target/coverage/llvm-cov.json .github/coverage-baseline.json
CI runs all required gates on pushes and pull requests via:
.github/workflows/ci.yml.github/workflows/rust-security.yml, which also runs weekly against the latest RustSec
advisory databaseGPL-3.0-or-later, as this project is derived from the original midnight commander. See LICENSE for the complete terms.
261 commits
Rust
98.4%
Python
1.3%