Repository navigation
Releases: crftwr/xefm
Release list
v1.10.1
XeFM 1.10.1
- Search inside the viewers with the Orthodox and OS native keymaps — the text viewer and the file diff viewer had no search key under these presets. Orthodox now searches with F7 and finds again with F3 / Shift-F3; OS native uses Ctrl-F and F3 / Shift-F3, or Cmd-F and Cmd-G / Cmd-Shift-G in the macOS app.
- Photos open upright, and images from archives and servers no longer freeze the viewer — in the macOS app, a phone photo taken upright is no longer drawn stretched. An image inside an archive, on S3 or SFTP, or in a format only Pillow reads now loads in the background, showing "Loading…" instead of blocking the window. (Opening a very large local photo can still pause briefly on macOS; that fix belongs to PuiKit and is tracked in #732.)
- Sync Python Packages works on Windows —
xefm deps syncand Tools → Advanced → Sync Python Packages failed because pip misread the Windows path torequirements.txt.
Also: installing one extension from a repository of several now downloads only that package from the release, and xefm ext check accepts the same sources as xefm ext install and lists what a package adds. The command palette's help names the extension an action comes from. The agent skill imports into hosts that reject HTML in SKILL.md (Amazon Quick). Documentation statements that no longer matched the code were corrected, in English and Japanese.
Full Changelog: v1.10.0...v1.10.1
v1.10.0
XeFM 1.10.0
- Keymap presets: OS native and Vim — besides the existing layouts, XeFM can now behave like Finder / Explorer or like Vim, including multi-key bindings such as
g g. The first launch offers the choice in a dialog, and Help now names the action behind each key. - Quitting works the platform's way — Cmd-Q, the Dock's Quit and the window's close button (macOS GUI), and the quit key in every preset, now go through XeFM's own quit: state is saved, and you are asked only while a task is still running.
- A stable extension API — the extension API is now declared stable as API version 1; parts still in flux are marked Preview. Extensions can be checked for updates and upgraded (
xefm ext outdated/upgrade, or Check for Extension Updates), and Install Extension acceptsgithub:owner/repo, a URL or a path.
Also: TAB completion now works for remote paths (ssh://, s3://, inside archives); new themes are picked up on reload; xefm try lists highlighted runs under each step; requires PuiKit 1.14.0; README demo GIF/video, contributing and security docs.
Full Changelog: v1.9.0...v1.10.0
v1.9.0
XeFM 1.9.0
- Extensions can run long jobs, show results you can copy, and add menu items. An extension can now run its work in the background, with the same progress dialog, Cancel and Run in background that a copy has. It can show its result in a dialog where every code block has a Copy button, and it can put its command in the File menu and the right-click menu. The first official extension is built on this: Compute Hash computes MD5 / SHA-1 / SHA-256 / SHA-512 / BLAKE2b digests of selected files, including files on SSH, S3 and in archives. Install it with
xefm ext install github:crftwr/xefm-extensions/compute-hash. If yourconfig.pyhasEVENT_HOOKS: every hook now takes(ctx, event)and readsevent.pane,event.old_path,event.new_pathorevent.path. A hook written for the old arguments is skipped, with a line in the log pane naming it. - Add Python libraries XeFM does not ship. List them in
~/.xefm/requirements.txtand choose Tools ▸ Advanced ▸ Sync Python Packages, or runxefm deps sync. This works for the macOS and Windows apps and Homebrew installs as well, and the libraries survive upgrades. Extensions can declare the libraries they need, and the same sync installs them. - Downloads are verified by your operating system on macOS and Windows. Installing an extension from GitHub used to fail in the macOS app on any Mac without python.org's Python. HTTPS is now checked through the system's own trust store, which also rejects revoked certificates, such as those from October's compromised eMudhra intermediate CA.
Also:
- Text and dialogs:
- Text in Help and File Details can be selected and copied, and the dialog's footer says what Tab reaches.
- Details opens tall enough for its whole content.
- Comparing two binary files reports the result in a message box.
WIDE_CHARSinconfig.pystops symbols like ○ □ ★ from overlapping the next character in terminals whose font draws them full-width.
- macOS:
- The app finds programs installed with Homebrew (ffmpeg, fpcalc).
- The desktop app no longer waits for the external editor to close.
- The minimum macOS version is now 12.
- Extensions for authors: an
updatesfield in the manifest, installs from a subdirectory of a repository, a stricterxefm ext checkthat refuses names outside the public API, and an AI agent skill that covers editingconfig.pytoo. - Requirements: PuiKit 1.13.0 is required.
Full Changelog: v1.8.0...v1.9.0
v1.8.0
XeFM 1.8.0
- Choose your keys: letters or function keys. On first launch, XeFM asks which keymap to use. AFX style runs a command from a single letter, as before. Orthodox follows the classic two-pane managers: F3 views, F5 copies, F8 deletes, and typing a letter searches. Tools → Keymap switches at any time. Lines you have in
KEY_BINDINGSapply on top of either keymap. - Delete to the Trash, and keep working while files copy.
Know moves files to the Trash (macOS, Linux) or the Recycle Bin (Windows), andShift-Kdeletes for good. A copy, move or delete can run in the background with Run in background. Background jobs run one at a time, the status bar shows their progress, andCtrl-Glists them. - Find duplicate and similar files. Tools → Find Similar Files… finds identical files, and similar images, videos and audio. Video and audio need ffmpeg and fpcalc. A scan runs on its own, so it can outlive XeFM. Its groups open in a new tab, where you choose what to keep.
Also:
- Folder tabs, quick view of the cursor item in the other pane, and a flat view of a whole tree.
- Directory sync (Update / Mirror) from the directory diff.
- Copy and paste files with Finder and Explorer.
- File tags, stored as the OS keeps them.
- The search dialog: Spotlight and Windows Search as a live mode beside file and content search, with Kind / Date / Size filters and recent searches on the query field.
- PDF, Office and EPUB documents shown as text.
- Editing files on SSH and S3, and renaming files in your editor.
- Select by pattern, a command palette, and a conflict dialog that shows sizes and dates.
- Extension packages, with a skill that helps AI agents write them.
- Many mouse improvements: modifier clicks, the back and forward buttons, and drag & drop that moves within a volume.
Full Changelog: v1.7.0...v1.8.0
v1.7.0
XeFM 1.7.0
- Context menus open from the keyboard —
/opens the menu for the row under the cursor, and?opens a new directory menu (New Directory, New File, Copy Full Path, Open in Finder/Explorer, Subshell Here, Sort, Show Hidden Files). The Menu key works too where the terminal delivers it, and right-clicking below the last row opens the directory menu. Help has moved to F1; a config that binds help to?keeps it. - Add favorites without editing config.py — press B (or use Go > Add to Favorites, or the context menu) to save the current directory or the file under the cursor as a favorite. Picking a file favorite opens its directory with the cursor on the file, and favorites added this way can be removed from the J picker.
- Large zip archives list every file — zips with more than 1000 members no longer hide files nested two or more levels deep, so they show up in the listing and are extracted.
Also: on Windows, Ctrl-O opens files whose names contain a full-width space, and a full-width space can now be typed. Selecting or deselecting from a row's context menu keeps the cursor on that row. For config scripts, there are new pane.activate() and focus_left / focus_right actions, and pane.cd() accepts a pathlib.Path without freezing the UI. XeFM now requires PuiKit 1.7.6.
Full Changelog: v1.6.0...v1.7.0
v1.6.0
XeFM 1.6.0
- Any list of paths can become a pane — the output of a command (
rg -l,git ls-files, Everything'ses.exe), a text file with one path per line, or the clipboard opens as a list you can browse and operate on like a folder. Find it under Go > Open List and Edit > Import List; Enter on an.m3u/.m3u8playlist opens it the same way. - Filters and commands remember what you typed — the Filter prompt and Import List from Command are now a text field over their history, so Enter always uses what you typed, and a filter can name several patterns at once (
*.jpg *.png). - The macOS app runs on macOS 11 and later again instead of requiring macOS 26 (Apple silicon), and the download is smaller. In the desktop app, the subshell and terminal-bound programs now open in a terminal window instead of being refused.
Also: Shift-Space selects the run of files between the last mark and the cursor; hidden files are drawn faded so they stand out, including on Windows; the Details dialog shows On disk next to Total size; the rename field shows what it is about to delete; lists a config builds get a real search field; config.py can import modules from ~/.xefm/extensions, and an action can hand the terminal to a program; command output on Windows keeps non-English file names; the terminal version on Windows needs PuiKit 1.7.4, which is now the minimum.
Full Changelog: v1.5.1...v1.6.0
v1.5.1
XeFM 1.5.1
- The macOS app runs on macOS 26 again — 1.5.0 was built on a Mac running
macOS 27 and would not start on anything older, showing "You can't use this
version of the application with this version of macOS". The version the app
requires is now something the build decides on purpose, instead of whatever
the machine that produced the release happened to be running.
Also: the DMG reports the macOS version it actually needs rather than a
long-stale 10.13, and the download table in the desktop guide says the same.
Nothing here affects Windows, so this release ships no Windows build — the
1.5.0 zip and the
Microsoft Store package
remain current.
Full Changelog: v1.5.0...v1.5.1
v1.5.0
XeFM 1.5.0
- Connect to a NAS without opening Finder or Explorer — Shift-D opens
Connect to Server: XeFM finds the file servers on your network, asks for the
account once, and mounts the share through the operating system, leaving the
pane inside it. The password comes from the keychain on macOS and from the
Windows credential store, so the second visit asks for nothing. The mount is a
real one, so viewers, archives, copy and move, drag and drop and automatic
reloading all work on it unchanged. macOS and Windows; on Linux, mount with
your distribution's tools and open the share through the Drives dialog. - The image viewer opens what your machine can actually read — HEIC, JPEG XL
and camera RAW are drawn by the system's own decoder, the same one Preview and
Quick Look use on macOS and whichever imaging codecs are installed on Windows,
so a photo off your phone opens with nothing to set up. XeFM asks at startup
instead of assuming, and never offers a format it cannot show. The terminal app
answers alike: run XeFM in a terminal on a Mac and that HEIC still appears. - A config can define a place of its own —
PATH_SCHEMESinconfig.py
turns a class you write into a browsable location, so a bookmark database, a
device list or a REST API opens in a pane like a directory, with the cursor,
sorting, filtering, incremental search and Jump to Path all working. This one
is a preview and may still change.
Also: a menu item no longer reaches the file list under an open dialog; on macOS
a drag out of XeFM starts on the first press instead of first bringing the window
forward; Copy Name(s) copies the row you are looking at; the Favorites picker no
longer touches the disk to draw itself, and a jump to a directory that is gone
leaves the pane where it was; Esc now reaches a directory listing that is still
being read; TEXT_EDITOR accepts the list its own template documents; the help
dialog names the key you just bound after a config reload; and the Windows build
survives a stripped shell handoff.
Full Changelog: v1.4.1...v1.5.0
v1.4.1
XeFM 1.4.1
- 7z archives open past their first file — browsing a
.7zand opening or copying out anything but its first member failed with "Truncated 7-Zip file body", because 7z holds every member in one compressed stream. Creating one had its own blind spot: a folder containing a directory symlink — any macOS framework — died on the first one, and the link is now stored as an empty directory rather than followed into a cycle. - One progress bar for a whole batch of archives — extracting several archives no longer rewinds the bar to zero at each one, and progress is weighted by bytes, so a 4 GiB member no longer goes past at the same speed as a 4 KiB one. Creating an archive is now shown the way extraction is, whatever the format.
- The cursor stays on the file you were on — deleting, moving or renaming used to send it back to the top of the pane. It now follows its file, and when that file is the one that went away it lands on whatever took its place.
Also: navigating into a directory on a network mount could freeze the app for seconds, and browsing S3 leaked sockets and memory until it ran out of both — both are fixed. A pane that hit a directory it could not watch stayed stale for the rest of the session; the file viewer drew the wrong line for a file starting with a blank one, so clicking and copying picked up its neighbour; and the help dialog no longer lists keys the running frontend refuses. The PuiKit floor rises to 1.5.4.
Full Changelog: v1.4.0...v1.4.1
v1.4.0
XeFM 1.4.0
- Six more archive formats open in place, and 7z can now be created. RAR,
ISO, CAB, cpio, RPM and Zstandard-compressed tar join zip and tar: cursor on
the file, Enter, and you are browsing it. Copying a member out streams it
instead of reading the whole archive into memory, so a single file comes out
of a large archive without the wait. Windows builds now carry libarchive
themselves, so the formats are there out of the box rather than only where a
system library happened to be installed. - A surface's search and sort options open on one key. They used to take a
key each; now one key opens the options for what you are looking at, every
option is a switch you can click as well as type, and the band across the
bottom of every modal says what the keys in front of you do — including what
Enter actually does, which in the search dialogs is feed the results to the
pane rather than open a file. - Extract acts on what you selected. With files marked, extraction used to
follow the cursor instead of the marks; it now extracts the selection, and
falls back to the cursor only when nothing is marked.
Also: --ui-watchdog logs the stack the UI thread was stuck in whenever the app
stops repainting for longer than a moment — a developer diagnostic, off unless
asked for, aimed at the freezes that were previously only reportable as "it
froze". Help lists the archive formats this build can actually read, and says
correctly what stops an encrypted 7z from opening. The suite runs on Linux in
Docker against both libcs, with targets to drive the TUI there by hand. Key
bindings documentation now names the keys that exist.
Full Changelog: v1.3.0...v1.4.0