Skip to content

Releases: crftwr/xefm

v1.10.1

Choose a tag to compare

@crftwr crftwr released this 26 Oct 00:17

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 sync and Tools → Advanced → Sync Python Packages failed because pip misread the Windows path to requirements.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

Choose a tag to compare

@crftwr crftwr released this 23 Oct 11:01

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 accepts github: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

Choose a tag to compare

@crftwr crftwr released this 22 Oct 13:28

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 your config.py has EVENT_HOOKS: every hook now takes (ctx, event) and reads event.pane, event.old_path, event.new_path or event.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.txt and choose Tools ▸ Advanced ▸ Sync Python Packages, or run xefm 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_CHARS in config.py stops 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 updates field in the manifest, installs from a subdirectory of a repository, a stricter xefm ext check that refuses names outside the public API, and an AI agent skill that covers editing config.py too.
  • Requirements: PuiKit 1.13.0 is required.

Full Changelog: v1.8.0...v1.9.0

v1.8.0

Choose a tag to compare

@crftwr crftwr released this 14 Oct 08:31

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_BINDINGS apply on top of either keymap.
  • Delete to the Trash, and keep working while files copy. K now moves files to the Trash (macOS, Linux) or the Recycle Bin (Windows), and Shift-K deletes 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, and Ctrl-G lists 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

Choose a tag to compare

@crftwr crftwr released this 04 Oct 08:00

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

Choose a tag to compare

@crftwr crftwr released this 27 Sep 09:59

XeFM 1.6.0

  • Any list of paths can become a pane — the output of a command (rg -l, git ls-files, Everything's es.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/.m3u8 playlist 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

Choose a tag to compare

@crftwr crftwr released this 22 Sep 02:25

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

Choose a tag to compare

@crftwr crftwr released this 20 Sep 20:12

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_SCHEMES in config.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

Choose a tag to compare

@crftwr crftwr released this 14 Sep 01:36

XeFM 1.4.1

  • 7z archives open past their first file — browsing a .7z and 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

Choose a tag to compare

@crftwr crftwr released this 07 Sep 18:49

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