@realfxw: Who says terminal file managers can only rely on full keyboard shortcuts? Today, I found an amazing open-source project on GitHub: tfm-tui — a modern terminal file manager focused on mouse interaction (Mouse-First). It not only retains the lightweight and efficient features of terminals but also brings the smooth experience of modern GUI file managers into the terminal…
Summary
Introduction to the open-source project tfm-tui, a modern terminal file manager centered on mouse interaction, combining terminal efficiency with graphical interface intuitiveness.
View Cached Full Text
Cached at: 09/19/26, 07:10 PM
Who says terminal file managers have to rely entirely on keyboard shortcuts? Today on GitHub I discovered a very impressive open-source project: tfm-tui — a modern terminal file manager that centers its design around mouse interaction (Mouse-First).
It retains the lightweight, efficient nature of terminal apps while bringing the smooth experience of modern GUI file managers directly into the terminal:
Modern mouse interactions: Supports rubber-band selection, right-click context menus, inline quick renaming, and even file dragging! On the Kitty terminal, it can even drag files directly across applications.
Dual-pane & multi-tab: Features a dual-pane layout similar to Total Commander or Midnight Commander, with independent paths, search, and tabs on each side. Press Tab to switch focus, and use F5/F6 to copy or move files directly between panes.
Multimedia & smooth animations: Leverages the Kitty Graphics Protocol for true-color image and video thumbnails. The sidebar, preview, and built-in terminal also feature smooth auto-hide edges and slide-in/slide-out animations.
Network locations & built-in terminal: Integrates gvfs, allowing direct connections to SFTP, SMB, WebDAV, or FTP from the sidebar. Right-click anytime in the current directory to open a built-in terminal.
TypeScript plugin system: Supports hot-reloading, custom shortcuts, context menus, event interception, and rendering custom OpenTUI components in the status bar/sidebar.
The project is built with TypeScript + Bun, currently supports Linux systems, and is in Beta stage.
One-click installation command:
Bash
curl -fsSL https://raw.githubusercontent.com/clarkarch/tfm-tui/main/install.sh | bash
If you regularly work in the Linux terminal and miss the intuitive drag-and-drop and multimedia previews of modern GUI file managers, I highly recommend giving this project a try: https://github.com/clarkarch/tfm-tui
Source: https://raw.githubusercontent.com/clarkarch/tfm-tui/main/install.sh
#!/usr/bin/env bash
# tfm installer: downloads a prebuilt binary for your arch.
# usage: curl -fsSL https://raw.githubusercontent.com/clarkarch/tfm-tui/main/install.sh | bash
# env: TFM_INSTALL_DIR (default ~/.local/bin), TFM_VERSION (default latest),
# TFM_NO_VERIFY=1 to skip checksum verification (not recommended).
set -euo pipefail
REPO="clarkarch/tfm-tui"
DEST="${TFM_INSTALL_DIR:-$HOME/.local/bin}"
VERSION="${TFM_VERSION:-latest}"
case "$(uname -m)" in
x86_64) ARCH="x86_64-linux" ;;
aarch64|arm64) ARCH="aarch64-linux" ;;
*) echo "tfm install: unsupported arch: $(uname -m)" >&2; exit 1 ;;
esac
mkdir -p "$DEST"
TMP="$(mktemp -d)"
trap 'rm -rf "$TMP"' EXIT
if [ "$VERSION" = "latest" ]; then
BASE="https://github.com/$REPO/releases/latest/download"
else
BASE="https://github.com/$REPO/releases/download/$VERSION"
fi
echo "tfm: downloading $ARCH ($VERSION)..."
curl -fsSL --retry 3 --proto '=https' "$BASE/tfm-$ARCH.gz" -o "$TMP/tfm.gz"
# checksum: fail closed when the release ships one, fail open (with a loud
# warning) only when the artifact has no published checksum at all.
#
# NOTE: compare digests directly, never `sha256sum -c`: the published sidecar
# embeds the release filename (tfm-.gz) while we save as tfm.gz, so -c
# looks for a file that isn't there and fails every install.
if curl -fsSL --retry 3 --proto '=https' "$BASE/tfm-$ARCH.gz.sha256" -o "$TMP/tfm.gz.sha256" 2>/dev/null; then
want=$(cut -d' ' -f1 < "$TMP/tfm.gz.sha256")
got=$(sha256sum < "$TMP/tfm.gz" | cut -d' ' -f1)
[ -n "$want" ] && [ "$want" = "$got" ] \
|| { echo "tfm install: CHECKSUM MISMATCH, refusing to install $TMP/tfm.gz" >&2; exit 1; }
echo "tfm: checksum verified"
elif [ "${TFM_NO_VERIFY:-}" = "1" ]; then
echo "tfm: WARNING: no checksum published, installing unverified (TFM_NO_VERIFY=1)" >&2
else
echo "tfm install: no checksum published for tfm-$ARCH.gz — refusing to install." >&2
echo " Re-run with TFM_NO_VERIFY=1 to override, or pin TFM_VERSION to a release with checksums." >&2
exit 1
fi
gunzip -f "$TMP/tfm.gz"
chmod +x "$TMP/tfm"
# never silently clobber: keep one backup of the previous binary
if [ -e "$DEST/tfm" ]; then
mv -f "$DEST/tfm" "$DEST/tfm.bak"
echo "tfm: previous binary backed up to $DEST/tfm.bak"
fi
mv "$TMP/tfm" "$DEST/tfm"
ln -sf "$DEST/tfm" "$DEST/terminal-file-manager"
echo "tfm: installed -> $DEST/tfm (run it via \"tfm\" or \"terminal-file-manager\")"
# make sure 'tfm' resolves — but only with explicit user consent (asked on the
# tty, since stdin belongs to the curl|bash pipe). No tty = just print instructions.
# Note: we only ever touch the user's own rc file — never /usr/local/bin.
if ! command -v tfm >/dev/null 2>&1; then
if ! { true >/dev/null; then
echo "tfm: note: $DEST is not in your PATH — run: export PATH=\"$DEST:\$PATH\""
else
printf "tfm: add %s to PATH automatically? [Y/n] " "$DEST"
DECLINE="tfm: ok — later: export PATH=\"$DEST:\$PATH\""
if ! IFS= read -r REPLY >/dev/null 2>&1; then
echo "$DECLINE"
else
case "$REPLY" in
Y|y|'') ;;
*) echo "$DECLINE"; exit 0 ;;
esac
fi
RCFILE="$HOME/.bashrc"
if [ -f "$HOME/.zshrc" ]; then
RCFILE="$HOME/.zshrc"
fi
if ! grep -qs "$DEST" "$RCFILE" 2>/dev/null; then
printf '\n# tfm: added by tfm installer\nexport PATH="%s:$PATH"\n' "$DEST" >> "$RCFILE"
echo "tfm: PATH entry added to $RCFILE — open a new shell or run: source $RCFILE"
else
echo "tfm: $DEST already in $RCFILE — open a new shell or run: source $RCFILE"
fi
fi
fi
# tfm degrades gracefully without these, but each one disables something
have() { command -v "$1" >/dev/null 2>&1; }
MISSING=""
add_missing() { MISSING="${MISSING} - $1\n"; }
have rsvg-convert || add_missing "rsvg-convert — theme-tinted icons and SVG thumbnails"
have magick || add_missing "magick — raster image thumbnails (fallback)"
have ffmpeg || add_missing "ffmpeg — video thumbnails & previews"
have gio || add_missing "gio — starred-file metadata (trash itself needs no gio)"
have xdg-open || add_missing "xdg-open — opens files in their default app (required)"
have udisksctl || add_missing "udisksctl — mount/eject removable drives"
if ! have wl-paste && ! have wl-copy && ! have xclip; then
add_missing "wl-paste/wl-copy or xclip — copy/paste between tfm and GUI apps"
fi
if [ -n "$MISSING" ]; then
RED=""; RST=""
[ -t 1 ] && { RED=$'\033[31m'; RST=$'\033[0m'; }
printf '%s\n' "${RED}tfm: missing helpers — install these for full functionality:${RST}"
printf '%s%b%s' "$RED" "$MISSING" "$RST"
fi
Similar Articles
@LuBtc888: Seriously, I barely touch tmux for multi-terminal management anymore. With http://herdr.dev and http://muxy.app, these two tools kick tmux's cumbersome configuration out of the game. No need to memorize complex shortcuts, no need to fiddle with config files—ready to use out of the box, a blessing for the lazy. Productivity tools...
Introduces two terminal multi-window management tools, Herdr and Muxy. Herdr is a Rust-based native terminal proxy runtime that supports persistence, mouse operations, and proxy state management, serving as a tmux alternative.
@VincentLogic: Found an incredible open-source desktop AI tool from ByteDance! UI-TARS Desktop, with 31k stars, truly lives up to the hype. It can actually understand your screen and automate computer operations for you. Just tell it "Enable auto-save in VS Code and set the delay to 500ms", and it will automatically: -…
ByteDance's open-source desktop AI automation tool, UI-TARS Desktop, supports local execution and screen visual understanding. It can autonomously control your computer to handle daily tasks through natural language commands.
@GitTrend0x: A Killer Open-Source Gem for 100% Local Desktop AI Agents https://github.com/bytedance/UI-TARS-desktop… This is UI-TARS-desktop, a multi-modal desktop automation agent open-sourced by ByteDance with 31k stars! …
UI-TARS-desktop is a highly popular open-source tool by ByteDance that enables 100% local multimodal desktop automation, allowing users to control apps and browsers via natural language without cloud data leaks.
@vintcessun: At noon I saw a tool that solves the chaos in download directories, a bit unbelievable—a system tray file organizer written in Rust+Tauri, memory usage only 5MB, and just added Linux support. The core is file monitoring plus a rule engine, automatically classifying by extension or regex, SQLite records operation history for one-click undo. Privacy-wise zero reporting, …
Introduces an open-source desktop file organizing tool Mouzi, built with Rust and Tauri, memory usage only 5MB, supports file monitoring and rule engine for automatic classification, emphasizes zero reporting for privacy.
@billtheinvestor: ByteDance open-sources UI-TARS Desktop (3.6k stars). Core logic: 100% local execution, pixel-only, no API calls. Compared to OpenAI/Anthropic cloud-based approaches, it solves two pain points: 1. Data privacy (data stays on machine); 2. Zero-cost zero-latency (no API fees). Build private…
ByteDance open-sources UI-TARS Desktop, a 100% local desktop automation tool that operates purely on pixels with no API calls, resolving the two major pain points of data privacy and API costs, providing an efficient open-source solution for building private automation workflows.