coxswain 1.20.0

Coxswain: a Norton Commander style file manager for the terminal
coxswain-1.20.0 is not a library.

Coxswain

The one at the helm, who steers the boat and keeps the crew in time.

Coxswain is a two-panel file manager in the Norton Commander tradition, built for developers. It comes as a terminal app (Rust + Ratatui) and a desktop app (Tauri + Svelte 5). Both run on one shared Rust core and read the same config file.

The desktop app in Cyber, its default theme: a green phosphor terminal with two panes, git status, color tags and the F-key bar The desktop app in Cyber, its default: a green phosphor terminal, glow and scanlines included. Seventeen more themes are one F9 away, from Norton Commander blue to Windows 95 and Mac OS 9; see themes.

  • Norton Commander at heart. Blue panels in the terminal, F-key bar, command line, and NC's keys by default.

  • Eighteen themes with the looks of their era. Cyber by default in the desktop app; Windows 3.11 to 11 and Mac System 7 to today come with their corners, bevels and fonts.

  • Git in every panel. oh-my-posh style branch, ahead/behind, staged/modified/untracked counts and stashes, plus a glyph per file (Nerd Font, or ASCII).

  • Deep search: find what you have the way you remember it. Ctrl+F searches at three depths, and Tab goes deeper:

    1. Names, every file on the machine, Everything-fast: 1.4M files answer in under 10 ms.
    2. Text inside your files: code, PDF, Word, spreadsheets, slides, mail, books, notebooks and diagrams; with tesseract installed, scans and screenshots too.
    3. Meaning: files about what you type, whatever words they use, in any language. "rocket fuel cost" finds a Danish budget. A small language model runs on your machine, or your own Ollama or Lemonade server does it on its GPU.

    It all stays on your machine, reads in the background at half speed, pauses on battery, and knows your removable disks wherever they are mounted. Both apps say when there is more to turn on. See deep search.

  • See before you open. The desktop app previews over 60 file types: code, Markdown with Mermaid diagrams and math, Jupyter notebooks, Word, spreadsheets, PDFs, SQLite databases, JSON/YAML/TOML as trees, Parquet, certificates, e-mail, calendars, EPUB books, fonts, images, video and audio, plus the git diff of any changed file.

  • Builds what needs building. LaTeX to PDF, Office and Visio files through LibreOffice, PlantUML, Graphviz, AsciiDoc and reStructuredText, with an installed tool or in a podman or docker container, so rarely used tools need not be installed. See the full list.

  • Folder sizes, without asking. In your home folder they are there at once: the search helper already knows every file's size. Other folders are measured in the background and filled in as they come, on two threads so the machine stays yours.

  • Plays well with the desktop. Delete goes to the trash, folders refresh themselves, files drag to and from other apps, and Ctrl+C / Ctrl+V share files with your other file manager.

  • Finds duplicates. Ctrl+D compares folders and whole disks, old backups included, and finds duplicate files and folders by content, whatever they are called: sizes first, then BLAKE3 hashes, kept for next time. The helper hashes your home folder's look-alikes ahead. Mark the extra copies by rule and move them to the trash. See finding duplicates.

  • Speaks your language. 18 languages, from British, Australian, Canadian and New Zealand English to Danish, Finnish, the Baltic languages, Catalan, Basque and Hebrew (right to left). Coxswain picks your system's language, or the nearest one it has; Settings changes it.

  • Configurable. Key bindings, color schemes, glyphs, user menu and fonts all live in one TOML file.

The terminal app: two panels, git status on the left

Find file searches every file on the machine Nine of the themes: Windows 3.11, 95, XP, 7 and 11, Mac System 7, Mac OS 9, Aqua and macOS
Find file: every file on the machine, in milliseconds Themes with the look of their era
Thumbnails and an image preview A PDF in the preview pane, next to a git repository
Thumbnails (Alt+V) with the preview pane (Space) PDFs preview in place; the left pane shows git status
The contents of a tar.gz archive in the preview Miller columns with a source file in the preview
Archives open like folders (Enter); F5 / F6 / F8 copy in and out, Ctrl+E extracts, Alt+F5 packs Miller columns with the preview pane

The preview pane showing Markdown with a Mermaid diagram and math, a Jupyter notebook, a spreadsheet, a Word document and a font The preview pane (Space): Markdown with a Mermaid diagram and math, a Jupyter notebook, a spreadsheet, a Word document and a font.

The preview pane showing a YAML tree, a SQLite database, a certificate and an e-mail YAML as a tree, a SQLite database's tables, a certificate about to expire, and an e-mail.

The preview pane showing a calendar, a git diff, a log file and an EPUB book A calendar, the git diff of a changed file, a log colored by level, and an EPUB book.

A LaTeX document with a pgfplots chart, built with tectonic and shown in the preview A LaTeX document, built with tectonic; the buttons pick the engine, an installed program or a container. Multi-file projects build from any of their files: Coxswain finds the main document (% !TEX root), the engine (% !TEX program) and the project folder, like a LaTeX editor.

A PlantUML sequence diagram, a Graphviz graph and an AsciiDoc guide PlantUML (in a container), Graphviz and AsciiDoc (both built in).

The Duplicates window with a duplicated folder, a PDF downloaded twice, a photo in three places and a document in an old backup Duplicates (Ctrl+D): a backed-up Pictures folder, a PDF downloaded twice, a photo in three places and a document in an old backup.

Install

Coxswain comes as a terminal app (coxswain, or cox for short) and a desktop app (coxswain-gui). Pick one or both. Both check once a day for a newer release and tell you the exact update command for the way you installed them.

macOS

How App Install Update
Homebrew Terminal brew install mwo-dk/coxswain/coxswain brew upgrade coxswain
Homebrew Desktop brew install --cask mwo-dk/coxswain/coxswain-gui brew upgrade --cask coxswain-gui
Download Desktop Coxswain_<version>_aarch64.dmg (Apple silicon) or _x64.dmg (Intel) from Releases; drag Coxswain to Applications Download the new .dmg and drag it over the old app
Download Terminal coxswain-terminal-<version>-aarch64-apple-darwin.tar.gz (or x86_64-…); put coxswain on your PATH Replace the file
Cargo Terminal cargo install coxswain cargo install coxswain again

Linux

How App Install Update
Homebrew Terminal brew install mwo-dk/coxswain/coxswain brew upgrade coxswain
Homebrew Desktop (x86-64) brew install --cask mwo-dk/coxswain/coxswain-gui brew upgrade --cask coxswain-gui
Debian, Ubuntu Desktop sudo apt install ./Coxswain_<version>_amd64.deb The same with the new .deb
Fedora, openSUSE Desktop sudo dnf install ./Coxswain-<version>-1.x86_64.rpm The same with the new .rpm
Any distro Desktop Coxswain_<version>_amd64.AppImage: chmod +x and run it Replace the file
Any distro Terminal coxswain-terminal-<version>-x86_64-unknown-linux-musl.tar.gz (or aarch64-…), a static binary; put coxswain on your PATH Replace the file
Cargo Terminal cargo install coxswain cargo install coxswain again

Windows

How App Install Update
Download Desktop Coxswain_<version>_x64_en-US.msi or _x64-setup.exe from Releases Run the new installer; it upgrades in place
Download Terminal coxswain-terminal-<version>-x86_64-pc-windows-msvc.zip; put coxswain.exe on your PATH Replace the file
Cargo Terminal cargo install coxswain cargo install coxswain again

The builds are not code-signed. The first start shows a warning: on Windows, click More info and then Run anyway. On macOS, if the app "is damaged" or "can't be opened", run xattr -cr /Applications/Coxswain.app once; the Homebrew cask does this for you.

From source (any platform)

git clone https://github.com/mwo-dk/coxswain.git
cd coxswain
./install/install.sh                                          # Linux, macOS
powershell -ExecutionPolicy Bypass -File install\install.ps1  # Windows

To update, git pull in that folder and run the script again. The script offers to install Rust and Node.js when they are missing, and asks first. See install/INSTALL.md. For development: cargo run -p coxswain, or cd gui && npm ci && npx tauri dev.

Fonts

Git glyphs need a Nerd Font. In the terminal, use one as your terminal font; the GUI picks up any installed Nerd Font listed in gui.icon_font. Without one, set glyphs = "ascii".

Keys (defaults)

Key Action Key Action
F1 Help Tab Other panel
F2 User menu Insert / Shift+Down Mark
F3 View + / - / * Select / unselect group, invert
F4 Edit Alt+F7 / Ctrl+F Find file
F5 Copy Ctrl+R Reread
F6 Rename/move Ctrl+U Swap panels
F7 Mkdir Ctrl+O Show command output
F8 / Delete Move to trash Alt+F1 / Alt+F2 Left/right panel: go to
Shift+F8 / Shift+Delete Delete permanently
F9 Command palette Ctrl+F3..F6 Sort by name/ext/time/size (again = reverse)
F10 Quit Alt+letter Quick search

Typing goes to the command line. Enter runs it in the panel's directory, and cd works. Both apps support the mouse: click, double-click, right-click to mark, and the wheel. The GUI also does Shift-click ranges, drag-and-drop between panels, and clickable column headers and paths.

Using Coxswain

Start either app with up to two folders: coxswain ~/src ~/Downloads or coxswain-gui .. A file opens its folder with the cursor on it, so coxswain-gui ~/Pictures/cat.jpg shows that picture. Without arguments both panels open in the current folder (the desktop app restores your last session).

The NC way. One panel is active. Move with the arrows, Enter opens a folder or file, and Backspace goes up. Mark files with Insert (or + with a pattern like *.rs), then F5 copies or F6 moves them to the other panel's folder. With nothing marked, the file under the cursor is used. F3 views, F4 opens your $EDITOR, F8 moves to the trash (after asking), and Shift+F8 deletes for good. F9 opens a searchable list of every command, so you never need to remember a key.

Reading the git line. Inside a repository the panel's bottom line shows the branch, commits ahead/behind the upstream, and counts of staged, modified and untracked files and stashes. Each file and folder gets the same glyph, so a changed file deep in src/ marks src too. Ignored files get a crossed-out eye.

Find file (Alt+F7 or Ctrl+F). Start typing; results update per key. Enter jumps to the file with the cursor on it, F3 and F4 view and edit it in place, and Tab limits the search to the current folder. The first start builds the index in the background; after that it is loaded from disk and kept current while Coxswain runs.

Desktop app extras (all rebindable, like everything else):

Key Action Key Action
Ctrl+T / Ctrl+W New / close tab Space Preview pane (see below)
Ctrl+Tab Next tab Alt+V Details, Miller columns or thumbnails
Ctrl+C / Ctrl+X / Ctrl+V Copy, cut, paste files (shared with other file managers) Alt+Enter Properties and permissions
Alt+Left / Alt+Right Back / forward Ctrl+E / Alt+F5 Extract an archive to the other pane / pack the marked files into a new one
Ctrl+B Sidebar Ctrl+D Find duplicates
Ctrl+, Settings (language, theme, fonts, ...) Ctrl+L Type a path
Ctrl+M Batch rename with regex, previewed Alt+T Color tag
Alt+N Notes for this folder Alt+. Hidden files

Archives are folders. Enter on a .zip (or .jar, .apk, .whl, .nupkg, .vsix), a .7z, or a .tar, plain or compressed (.tar.gz .tgz, .tar.bz2 .tbz2, .tar.xz .txz, .tar.zst .tzst) opens it like a folder, in both apps: the path shows the archive's name marked and the pane is tinted (the terminal app says [archive] in the panel title), so a copy out is never taken for a copy between folders. F5 copies files and folders out, into another folder or into another archive; F5 into an archive adds to it; F6 moves (also within the archive); F7 makes a folder inside; F8 takes things out of it (there is no trash inside an archive, so it asks first); Alt+F5 packs the marked files into a new archive of any of these kinds, by the name you give it. A locked zip (ZipCrypto or AES) or 7z (AES; one whose file names are locked too asks already when you open it) asks for its password; the app keeps it in memory until it closes, so you are asked once, and never writes it anywhere. RAR archives are not opened: their format may only be read with RAR's own code, under its own licence. Changing an archive writes it anew next to the old one, which it then replaces, so a failure leaves the archive as it was.

The preview pane (Space) follows the cursor. At a glance:

Files Preview
Code, config, logs Highlighted; logs colored by level. A changed file gets File / Diff
Markdown, .mmd Rendered, with Mermaid diagrams and math; Rendered / Source
HTML .html .htm The page as a browser shows it, with its own styles and pictures; no script runs and nothing is fetched from the web; Rendered / Source
JSON, YAML, TOML A collapsible tree; Tree / Source
.ipynb, .docx, .epub, .eml, PDF Notebook with outputs, Word document, first chapter, e-mail, pages
Spreadsheets, CSV, JSON Lines, SQLite Tables, a button per sheet; database tables with row counts and schema
.ics, .vcf, .plist, certificates Events, contact cards, property lists, certificate details with expiry
Images, video, audio, fonts Shown or played; photo EXIF, audio tags, font samples
LaTeX, Office/Visio/RTF, PlantUML, .rst Built to PDF, SVG or HTML by an installed tool or a container; buttons pick the engine. Slides and documents render by themselves. PowerPoint decks show at once, drawn in the app, and LibreOffice's exact rendering replaces that when it is ready
draw.io .drawio .dio Drawn by draw.io's own viewer, built in: pages, zoom, layers; nothing to install
Graphviz, AsciiDoc, Parquet, .duckdb Graphs, rendered documents, tables with schema
Archives, programs, folders Contents; the platform a binary is built for; folder counts, sizes, notes

docs/previews.md lists every format, what it shows and how it works. Where there is a choice, buttons at the top of the preview pick it, and the choice sticks. Ctrl+O, or the button next to the view switcher, toggles one or two panes.

Duplicates. Ctrl+D (or coxswain-gui --duplicates <folders>) scans the folders and drives you tick for duplicate files and whole duplicate folders, and lists them by wasted space. "Mark all but the newest / oldest / the one under a folder" marks the extra copies; at least one copy of each always stays, and marked copies go to the trash. docs/duplicates.md explains how it works and stays fast.

Columns and folder sizes. Folders show their size without being asked: each is measured in the background as you open its parent, in both apps. Right-click the column header (or F9, "Columns and folder sizes") to add Files and Created columns, hide Type, or switch the measuring off.

The details view with every column and automatically measured folder sizes

Folders reread themselves when something changes in them. Drag files to the other pane, to another application, or in from one; Coxswain asks whether to copy or move.

The sidebar holds places, drives with free space, favorite groups (right-click a group, then "Add current folder") and the git repositories you visited recently.

Themes

Pick a theme from the F9 command list (type "theme") or in Settings. Besides Cyber, a green phosphor terminal and the desktop default, and Norton Commander blue, the terminal default, there are modern ones (dark, light, Nord, Tokyo Night) and period looks from Windows 3.11 to 11 and Mac System 7 to today, each with the corners, bevels and fonts of its era.

Windows 3.11, 95, XP, 7 and 11, Mac System 7, Mac OS 9, Aqua and macOS

Languages

Both apps speak English (British, Australian, Canadian, New Zealand), Dansk, Svenska, Suomi, Eesti, Latviešu, Lietuvių, Deutsch, Français, Italiano, Nederlands, Español (Argentina), Català, Euskara and עברית (Hebrew, laid out right to left in the desktop app).

  • Automatic by default. Coxswain uses your system's language, or the nearest one it has: Norwegian gets Danish, any Spanish gets Argentinian Spanish, US English gets Canadian, any other English gets British.
  • Your choice, remembered. Pick a language in Settings (Ctrl+,), where each is listed by its own name and flag, or set language = "da" in the config. It is saved in config.toml and used by both apps.
  • All of it: menus, the F-key bar, dialogs, previews, the duplicate finder, messages, sizes (Ko in French) and numbers (1.234,5 in German).

Coxswain in Danish, previewing a picture Danish: the F-key bar, sidebar, columns and preview all in Danish.

Coxswain in Hebrew, laid out right to left, previewing a PDF Hebrew: the whole window is mirrored; file names, sizes and paths stay left to right.

docs/languages.md has the full list, how the language is chosen, and how to correct or add a translation.

Settings

Ctrl+, (or F9 → Settings, or coxswain-gui --settings[=search] from a terminal) opens the desktop app's settings:

The Settings window: languages with their flags, appearance, behaviour and previews

Section Settings
Language Automatic, or any of the 18, each with its flag
Appearance Theme, Nerd Font glyphs or plain ASCII, text size, fonts
Behaviour Show hidden files, ask before deleting, check for updates
Previews made by tools Installed programs or containers, podman or docker, LaTeX image, timeout; each container image with its size, and Pull (which also updates it) and Remove

Every change applies at once and is written to config.toml, keeping your comments and layout; a change that would make the file invalid is refused rather than saved. The terminal app reads the same file. Everything else (keys, colour themes, the user menu) is set in config.toml directly; see Configuration.

Find file: deep search

Alt+F7 or Ctrl+F opens it in both apps. Results update as you type, and typing is never held up by a search. The three depths are side by side at the top; Tab goes to the next:

Depth Finds Needs Turn on
Everywhere / In this folder Files and folders by name, with a query syntax nothing always on
Text in files Files whose text has your words, each with the passage that matched nothing on by default; Settings → Search inside files
… scans and pictures The words in screenshots, scans and scanned PDFs tesseract (and pdftoppm) installed by itself once installed
… older Office files .doc, .ppt, Publisher, Visio, Pages, Keynote LibreOffice installed by itself once installed
Meaning (in text mode) Files about your words, in any language, marked similar to a one-time 471 MB download Settings → Search by meaning, or coxswain --meaning on

The window's title shows the version and the depths that are on, e.g. Coxswain 1.15.0 · search: names · text · meaning, and both apps say once, in the status line, when a depth is there to be turned on.

Key Action
Up / Down, PageUp / PageDown Move through the results
Enter Go to the file, with the cursor on it
F3 / F4 View / edit the file without leaving the search
Tab Names everywhere, names in the current folder, or the text inside your files
Esc Close

Alt+letter is the other, smaller search: it jumps to the first name in the current panel starting with that letter. Keep typing to narrow it; Backspace takes a letter back, Esc ends it.

The desktop app lists the first 500 hits and counts the rest; type more to narrow them down.

Search inside your files

Press Tab twice in Find file and type words: Coxswain finds the files whose text has all of them, best match first, each with the passage that matched. The last word may be the start of one, so rocket bud finds "rocket budget".

Find file searching the text of files: seven hits for "engine", each with the passage that matched

What is read Your home folder: text, code, Markdown, logs, configuration and any other file that is plain text, and the documents below, up to 20 MB each
With programs you have installed tesseract: the words in screenshots, scans and pictures (camera photos are skipped); with pdftoppm too, scanned PDFs (up to 30 pages). LibreOffice: older Office files (.doc, .ppt), Publisher, Visio, WordPerfect, Pages and Keynote. They run at the lowest priority with a time limit; files they can read are read again once you install one. Settings lists which are there
What is left out Hidden folders, node_modules, target, build, dist, out, vendor, __pycache__ and the trash; folders you mark names only in Settings; any folder holding a file named .nosearch; pictures, video, archives and other files without text
When In the background, one file at a time and at half speed, by the helper, and not at all while a laptop runs on its battery (Index now in Settings reads anyway). It follows the file watcher, so a change shows up in searches within seconds
Also kept Every file's size and date, the total of each folder left out, so folder sizes are a sum; and the hash of files that share a size, for Duplicates
Where it is kept search.db in Coxswain's cache folder, readable by you alone. Nothing leaves your machine. Delete the file to start afresh
Switching it off Settings → Search inside files, or text = false under [search] in config.toml

Settings → Search inside files (coxswain-gui --settings=search) shows how many files can be searched, how many are still to be read and how much room the index takes. Index now reads the backlog at full speed; Delete the index empties it, and it fills again from the start. There you also pick the folders that are read (your home folder when none are set) and the folders kept to names only: found by name and counted in folder sizes, never read.

Settings, Search inside files: 31 files searchable, Index now and Delete the index, the folders read and the names-only folders

Start with my session (a checkbox there, or coxswain --index-service on) registers the helper with the system: a systemd user unit on Linux, a LaunchAgent on macOS, a Run entry on Windows. It then starts at login and stays, so the backlog is read before any window is opened, and it runs at low priority. Unticking it (--index-service off) removes the registration, and the helper goes back to starting with the first app and leaving ten minutes after the last.

Removable disks can be folders read too. Each is known by its disk (file system UUID, or the volume serial on Windows), not only by its path: while the disk is not plugged in its text stays in the index, out of search results, and Settings shows it as away; plugged in again, at the same place or another, it is searched again without being read afresh. Remove forgets it.

Other excludes and another size limit are text_exclude and text_max_size under [search]; the folders are text_roots and names_only.

Search by meaning

Words find the files that contain them. Search by meaning also finds the files that are about what you type, whatever words they use and in whichever language: "what the rocket's fuel costs" finds Brændstofbudget.docx. In Find file, Tab to the text of files; files found this way come after the ones with your words, each with the passage that was close, marked similar to.

It is off until you turn it on in Settings → Search by meaning (or coxswain --meaning on), which downloads a small language model once: multilingual-e5-small, 471 MB, from Hugging Face, at a pinned version and checked against its SHA-256. It runs on your machine's CPU (with candle, in pure Rust, in both apps), on two threads at the lowest priority and never on battery unless you press Index now; the first eight passages of each file with text get a vector, kept in search.db. Nothing you have leaves the machine. Turn off stops it; Delete the model (coxswain --meaning delete) removes the model as well.

On a GPU, with your own server. The built-in model needs nothing but is slow on a laptop's CPU. If you run Ollama or a server with the OpenAI API (Lemonade, LM Studio, llama.cpp, vLLM, LocalAI), it can make the vectors instead, on its GPU or NPU, with a bigger model:

Settings → Search by meaning → Vectors made by Terminal
Ollama on this machine Ollama; the model bge-m3 (multilingual, 1.2 GB) is suggested, and Pull fetches it coxswain --meaning ollama [model]
Ollama elsewhere Ollama, Server http://evo:11434 meaning_url in config.toml
Lemonade, LM Studio, … A server with the OpenAI API, Server http://localhost:8000/api/v1 (Lemonade's), then pick its embedding model coxswain --meaning server URL MODEL
Back to the built-in model Built-in model coxswain --meaning builtin
  • A server on another machine gets the text of your files; Settings says so, with its name. An API key, if the server wants one, is read from an environment variable you name (meaning_key_env), never written into config.toml.
  • Vectors of two models cannot be compared, so another model makes them all again, in the background; search by words goes on meanwhile.
  • A server that does not answer pauses search by meaning, and Settings says why; the files wait and are done once it answers.
  • To clean up: Turn off, or back to the built-in model. Coxswain installs nothing on a server; a model it pulled goes with ollama rm bge-m3.

Documents it reads

Kind Files
PDF .pdf; a very long manual is read for three seconds, which is most of it
Word and OpenDocument text .docx .docm .dotx .odt .ott, with headers, footers, footnotes and comments
Rich text .rtf
Spreadsheets .xlsx .xlsm .xlsb .xls .ods: every sheet, the values and not the formulas
Presentations .pptx .ppsx .potx .odp, with the speaker notes
Mail .eml and .mbox: subject, sender, receivers, the message and the names of its attachments
Books and web pages .epub .html .htm .xhtml
Notebooks and diagrams Jupyter .ipynb with what the cells printed; draw.io .drawio .dio, Mermaid .mmd and Mermaid blocks in Markdown, Graphviz .dot .gv, PlantUML .puml

A diagram is read as what it says, not only the words in its boxes: every arrow becomes a sentence, "Browser to Entra ID: authorize with PKCE", with the names the boxes show. So a search by meaning for "entra auth flow" finds the sequence diagram of your login, and a search by words for browser entra finds it too.

Coxswain reads these itself, starting no other program. Scanned pages and pictures have words only an OCR program can read: with tesseract installed they are read too (see the table above). A file locked with a password is not read.

The terminal app does the same, with the passage on a second line:

The terminal app searching the text of files

Query syntax

Names are searched with Everything's syntax:

Query Matches
foo bar names containing both
foo|bar either
!foo not foo
*.rs, a?c wildcards, whole name
ext:rs;toml by extension
file: / folder: only files / only folders
src/ lib a term with / matches the full path
case: case-sensitive
"a b" phrase with a space

Configuration

coxswain --config-path shows where the file lives (~/.config/coxswain/config.toml on Linux). coxswain --paths shows where everything is kept: the config, the state, the name index, the search store (search.db), the model for search by meaning, and the previews made by tools. Settings shows the search store's and the model's place in their sections. coxswain --dump-config prints every option with its default. Set only what you want to change:

language = "auto"           # or "en-GB", "da", "de", "es-AR", "he", ... (docs/languages.md)
theme = "nc"                # terminal app; or "cyber", "win95", ... or your own [themes.<name>]
glyphs = "nerd"             # or "ascii"
folder_sizes = true         # measure folders in the background; false to switch it off
editor = "hx"               # else $VISUAL / $EDITOR

[keys]
quit = ["F10", "Ctrl+Q"]    # listing an action replaces its default keys
search = ["Ctrl+P"]

[themes.mine.panel]         # unset slots fall back to the NC scheme
fg = "#e0e0e0"
bg = "#101820"

[[user_menu]]               # F2; %f file, %d dir, %s selection (shell-quoted)
key = "t"
label = "cargo test"
command = "cargo test"
wait = true

[search]
exclude = ["/proc", "/sys", "node_modules"]   # a path skips a tree; a bare name skips every such directory
watch = true

[preview]                   # previews made by tools: LaTeX, LibreOffice, PlantUML, ...
prefer = "container"        # use podman/docker even when a tool is installed ("auto", "local")
images.latex = "docker.io/texlive/texlive:latest-medium"   # see docs/previews.md

[gui]
font_size = 15

How search stays fast

The index (crates/coxswain-core/src/index.rs) keeps each name once in a \0-separated byte buffer, with a 12-byte node per entry (parent, offset, length, flags). A query runs a single SIMD memmem scan over that buffer, split across all cores. Full paths are built only for hits. The index is saved to the cache directory, so it loads in ~90 ms on the next start. It is then rebuilt in the background and kept current by file system events (inotify, FSEvents, ReadDirectoryChangesW).

One index for every window. The index lives in a helper process, which the first window or terminal app starts and the others find. Two windows and a terminal share one copy in memory and one scan of the disk, and a new window searches at once. The helper is the app itself, started with --index-helper; it leaves ten minutes after the last app has closed. Nothing is installed as a service. The apps talk to it over a local socket that only you can use, and if it cannot be reached, each app indexes by itself as before.

Run cargo run --release -p coxswain-core --example bench -- / to measure it on your machine.

Known limits and upgrade paths:

  • Linux: inotify needs one watch per directory. Past fs.inotify.max_user_watches, the hourly rebuild catches changes. fanotify would remove that limit, but it needs root.
  • Windows: the first index comes from a directory walk. Reading the MFT and USN journal directly, as Everything does, would make cold starts faster.

Layout

crates/coxswain-core   config, fs ops, git status, search index (shared)
crates/coxswain        terminal UI (package and binary: coxswain)
gui/                Svelte 5 frontend
gui/src-tauri       Tauri backend (binary: coxswain-gui)

License

MIT

Norton Commander is a trademark of Gen Digital Inc. Coxswain is an independent project, not affiliated with or endorsed by Gen Digital.