A modern dual-panel terminal file manager written in Go, inspired by Midnight Commander.
Midday Commander (mdc) brings the classic dual-panel file management paradigm into the modern terminal with fuzzy finding, bookmarks, archive browsing, themes and customizable keybindings.
Bookmarks — bookmarks for most visited locations

Themes — TOML-based themes with live preview

- Dual-panel file browsing with independent navigation and selection
- Archive browsing - enter ZIP, TAR, 7z, RAR, GZ, BZ2, XZ, LZ4 files as virtual directories
- Fuzzy finder - recursive file search with real-time fuzzy matching
- Bookmarks to quickly jump to most visited locations
- Configurable keybindings - every key is remappable via
config.toml - Smart autocomplete - path and command suggestions with
Tabcompletion in Go to path and Execute command - File operations - copy, move, delete, rename, mkdir with confirmation dialogs
- Live theme picker - browse and preview themes with Ctrl-T
- Multi-file selection - tag files with Insert or Shift+Arrow for batch operations
- Quick search - start typing to jump to matching files instantly
- External editor/viewer - opens files in
$EDITORand$PAGER - Quick view - preview the selected file in the other pane (read-only, follows the cursor) with Ctrl+Q
- Execute files - run executable files directly with Enter (configurable)
- Terminal access - open shell in current directory with Ctrl+O
- Mouse support - clickable menu bar and panel interaction
- Go to path - quickly jump to any directory with
~expansion - Single binary - no runtime dependencies
brew install kooler/apps/middaycommanderRun: mdc
Download a binary from the Releases in Github.
mise use --global github:kooler/MiddayCommanderRequires Go 1.21 or later.
git clone https://github.com/kooler/MiddayCommander.git
cd mdc
make buildThe binary will be at ./mdc. Move it to your $PATH:
sudo mv mdc /usr/local/bin/make build # Build the binary
make run # Build and run
make test # Run tests
make vet # Run go vet
make clean # Remove binarymdcThe left panel opens in the current directory, the right panel in your home directory. Navigate with arrow keys or j/k, switch panels with Tab.
With mdc -r the active panel's path is printed on stdout when you quit. Why is it needed? for example if you want to cd to that directory, add the following to your ~/.zshrc / ~/.bashrc:
mdcd() {
local dir
dir=$(mdc -r) && [ -n "$dir" ] && cd "$dir"
}Now mdcd launches mdc; when you quit, the shell cds into the directory the active panel was showing. Good way to navigate around.
| Key | Action |
|---|---|
F1 |
Help - show keybinding reference |
F2 |
Bookmarks |
F3 |
View file ($PAGER) |
F4 |
Edit file ($EDITOR) |
F5 |
Copy to other panel |
F6 |
Move to other panel |
F7 |
Create directory |
F8 |
Delete |
F9 |
Fuzzy finder |
F10 |
Quit |
Esc Esc |
Quit (double-press) |
Tab |
Switch active panel |
Ctrl-U |
Swap panels |
Ctrl-G |
Go to path (with directory autocomplete) |
Ctrl-R |
Execute command (with path/command autocomplete; inside overlay, Ctrl+E toggles exec-only mode) |
Ctrl-P |
Fuzzy finder |
Ctrl-B |
Bookmarks |
Ctrl-T |
Theme picker (live preview) |
Ctrl-H |
Toggle hidden files |
Ctrl-Q |
Quick view - preview selected file in the other pane |
| Key | Action |
|---|---|
Up / k |
Move cursor up |
Down / j |
Move cursor down |
PgUp / PgDn |
Page up / down |
Home / End |
Jump to first / last |
Enter |
Enter directory or edit file |
Space |
Preview file ($PAGER) |
Backspace |
Go to parent directory |
| Type any letter | Quick search - jump to matching file |
| Key | Action |
|---|---|
Insert |
Toggle selection on current file (and move down) |
Shift-Up |
Select and move up |
Shift-Down |
Select and move down |
+ |
Select group by shell pattern (e.g. *.go) |
- |
Deselect group by shell pattern |
* |
Invert selection of all entries |
Group selection uses standard shell globs (*, ?, [abc]) matched against
file names. The dialog opens with * pre-filled, so + Enter tags every
entry and - Enter clears the selection.
| Key | Action |
|---|---|
a |
Add current directory |
d |
Delete selected bookmark |
f |
Filter bookmarks |
0-9 |
Quick jump to bookmark |
Enter |
Navigate to bookmark |
Esc |
Close |
Press Ctrl-Q to turn the inactive pane into a live, read-only preview of the file selected in the active pane. As you move the cursor, the preview follows the selection. Press Tab to move focus into the preview and scroll it (Up/Down, PgUp/PgDn, Home/End), and Tab again to return to the listing. Press Esc (or Ctrl-Q again) to close it.
Non-text files stay visible in the preview with a short summary (binary, directory, empty) rather than garbled content. Only the head of large files is loaded.
Note: on some terminals
Ctrl-Qis reserved for XON/XOFF flow control and never reaches the application. If it does nothing, rebindquick_viewto another key inconfig.toml.
Press Enter on any supported archive file to browse its contents as a virtual directory. Backspace exits the archive.
Supported formats: .tar, .tar.gz, .tar.bz2, .tar.xz, .zip, .7z, .rar, .gz, .bz2, .xz, .lz4, .lz, .zst
Configuration lives at ~/.config/mdc/config.toml (respects XDG_CONFIG_HOME).
Copy the example to get started:
mkdir -p ~/.config/mdc
cp config.example.toml ~/.config/mdc/config.toml# Theme (loads from ~/.config/mdc/themes/<name>.toml)
theme = "catppuccin-mocha"
[behavior]
# What Enter does on a file: "edit", "preview", or "execute"
enter_action = "edit"
# What Space does on a file: "preview" or "edit"
space_action = "preview"
# Whether to ask for confirmation before executing a file.
confirm_execute = true
# Whether to pause and wait after execution before returning to Midday Commander.
pause_after_execute = false
[keys]
quit = ["f10", "ctrl+c"]
toggle_panel = "tab"
copy = "f5"
move = "f6"
mkdir = "f7"
delete = "f8"
fuzzy_find = ["f9", "ctrl+p"]
bookmarks = ["f2", "ctrl+b"]
help = "f1"
goto = "ctrl+g"
terminal = "ctrl+o"
quick_view = "ctrl+q"
# ... all keys are configurableSee config.example.toml for the full reference.
Themes are TOML files stored at ~/.config/mdc/themes/.
Press Ctrl-T to open the theme picker overlay. Use Up/Down to browse themes with live preview — the entire UI updates instantly as you navigate. Press Enter to apply the selected theme or Esc to cancel and revert to the previous theme.
mkdir -p ~/.config/mdc/themes
cp themes/*.toml ~/.config/mdc/themes/Themes use a [palette] section to define named colors, then reference them throughout:
name = "My Theme"
[palette]
bg = "#1e1e2e"
fg = "#cdd6f4"
blue = "#89b4fa"
green = "#a6e3a1"
[panel]
border_fg = "blue"
border_bg = "bg"
border_active_fg = "fg"
border_active_bg = "bg"
[panel.file]
normal_fg = "fg"
normal_bg = "bg"
dir_fg = "blue"
dir_bold = true
exec_fg = "green"
[statusbar]
fg = "bg"
bg = "blue"
[menubar]
fg = "bg"
bg = "blue"
fkey_hint_fg = "fg"
fkey_hint_bg = "bg"
fkey_label_fg = "bg"
fkey_label_bg = "blue"Colors can be hex values ("#89b4fa"), ANSI color numbers ("4"), or palette references ("blue"). Any missing values fall back to the built-in default theme.
Contributions are welcome. Please open an issue to discuss significant changes before submitting a pull request.
- Fork the repository
- Create your feature branch (
git checkout -b feature/my-feature) - Commit your changes (
git commit -am 'Add my feature') - Push to the branch (
git push origin feature/my-feature) - Open a Pull Request
git clone https://github.com/kooler/MiddayCommander.git
cd mdc
make build
make testMIT License. See LICENSE for details.

