Skip to content

mullion-fileman — dual-pane TUI

A Norton Commander-style dual-pane file manager that ties the suite together: browse two directories side by side and run the CLI tools on them with a keypress or a click. The tools stay independent — mullion-fileman just launches them.

mullion-fileman

mullion-fileman [<left-dir>] [<right-dir>]     # defaults to the current directory

Built on FTXUI (MIT); see Building.

Keys

Key Action
Tab / / switch the active pane
/ j k, Enter, Backspace move · open dir (.. to go up) · go up
Space · + / - · * tag / advance · tag·untag by glob · invert tags
/ quick-filter the pane (type to narrow; Esc clears, Enter keeps)
s sort menu (name / ext / size / date / reverse)
t directory tree — jump to a subfolder
d change drive (Windows)
f find files under the active pane
x Tools menu — bulk rename, sort-into-other-pane, attributes, duplicates, disk usage, checksums, secret scan, shred
m System Monitor — live CPU/mem/GPU + process list (see below)
a ask the local AI agent (optional — see below)
: run a shell command in the active pane's directory
F3 view the selected file (text / hex)
F5 F6 F7 F8 copy · move · make dir · delete (selection or tag set)
r · c · k rename · compare panes · clean junk
F9 / F10 / q open Files menu · quit · quit

Features

  • Top menu bar (Left · Files · Commands · Options · Right) — click a category for a pull-down; F9 opens Files.
  • Mouse: click to select, double-click a folder to open, wheel to scroll, click the bottom F-key ribbon and the menus; right-click for a context menu. Click outside a menu (or Esc) to dismiss it.
  • Multi-select: tagged rows turn yellow with a *; copy/move/delete act on all tagged files (or the selection). Tags clear on directory change.
  • Columns: name, modified date, size; each pane shows its path, item count, tag total, and current sort on a status line.
  • Safe deletes: F8 shows a dry-run and asks y/N (toggle in Options).

Options (persisted)

The Options menu toggles three settings, saved to mullion-fileman.cfg beside the executable and restored next run:

  • Confirm deletes — show the dry-run + y/N before deleting.
  • Overwrite on copy/move — replace existing files instead of skipping.
  • Show hidden files — include dotfiles / Windows-hidden entries.

System Monitor

Press m (or Commands → System monitor…) for a live panel: CPU%, memory used/total, a best-effort GPU line, and the top processes by CPU usage, refreshed about once a second. It samples in-process via include/sysinfo.hpp (the same core folder_sysmon/folder_proc use) — no subprocess involved.

Within the panel: arrows/mouse select a row, k terminates the selected process (asks to confirm first), and l / n / h set its priority to low / normal / high. Esc closes the panel and stops the background refresh.

AI agent (optional)

Press a (or Commands → Ask AI…) for a local, offline AI assistant. Ask it about the current folders in plain language; it inspects them with read-only tools (list a directory, folder_find, folder_view, folder_parity compare) and then answers. It never modifies files — destructive actions stay on the F-keys with their confirmations. It is optional and off by default: in a normal build, invoking it shows a dialog explaining how to enable it. Enabling builds mullion-fileman with -DBUILD_MULLION_FILEMAN_AI=ON (which embeds llama.cpp) and uses a local Gemma 4 GGUF model — the small, CPU-friendly google/gemma-4-E2B-it-qat-q4_0. No data leaves your machine, and everything else in mullion-fileman works without it.

Get a model — auto-download (easiest). Options → Download AI model… lists several Gemma models (E2B → 31B); pick one and mullion-fileman downloads it from HuggingFace with a live progress bar (press Esc to cancel — partial data stays cached), caches it (so it's instant next time), selects it, and saves the path. There's also a Custom HuggingFace repo… entry for any GGUF repo. This uses llama.cpp's common_download_model over HTTPS (bundled LibreSSL — no system OpenSSL needed) and works only in the AI build.

Model path (manual). Or point mullion-fileman at a model you already have via Options → Set AI model path… (a .gguf file or a folder containing one — mullion-fileman picks the .gguf inside). Either way it's saved to mullion-fileman.cfg (modelPath=…) and reused next run. You can also set the MULLION_FILEMAN_MODEL environment variable, or drop a model.gguf next to the executable.

Voice input (talk to the AI)

Press V (or Commands → Speak to AI) to speak your request instead of typing it. mullion-fileman records from the default microphone (a ● REC indicator shows); press Enter to stop and send, or Esc to cancel.

The audio goes straight into Gemma 4's native audio encoder — there's no separate speech-to-text step. This uses llama.cpp's multimodal (mtmd) library and the model's mmproj (audio/vision projector), which the downloader fetches automatically alongside the GGUF. It only works with an audio-capable model (the Gemma 4 E2B/E4B GGUFs include the audio encoder); if the loaded model's mmproj is missing or vision-only, the dialog says so. Everything stays offline.

Your spoken request runs through the same tool-using agent loop as a typed question, so you can say things like "find the biggest log under this folder" and it will use folder_find and answer. The reply shows what it heard (🗣 You said: …) followed by the answer.

Speak replies (TTS). Turn on Options → Speak AI replies to have answers read aloud with the OS voice (Windows SAPI / macOS say / Linux espeak). It's a shell-out, so no extra dependency; the setting is saved in mullion-fileman.cfg.

GPU. mullion-fileman offloads all layers to the GPU when the build has a GPU backend and a device is present, otherwise it runs on CPU. Build with a backend to enable it, e.g. -DGGML_CUDA=ON (NVIDIA, needs the CUDA toolkit) or -DGGML_VULKAN=ON. Override the offload with MULLION_FILEMAN_GPU_LAYERS (0 forces CPU).