| Crates.io | fsel |
| lib.rs | fsel |
| version | 2.5.0-seedclay |
| created_at | 2025-10-09 15:32:35.303474+00 |
| updated_at | 2026-01-07 03:49:31.588683+00 |
| description | Fast TUI app launcher and fuzzy finder for GNU/Linux and *BSD |
| homepage | https://github.com/Mjoyufull/fsel |
| repository | https://github.com/Mjoyufull/fsel |
| max_upload_size | |
| id | 1875788 |
| size | 620,004 |
More Info: Detailed Usage Guide
Build Requirements:
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | shrustc --version (should show stable, not nightly)rustup default stableRuntime Requirements:
Optional:
cclip - for clipboard history modechafa - for image previews in cclip modeGet up and running in 30 seconds:
# Install with Nix (recommended)
nix run github:Mjoyufull/fsel
# Or the Aur
$ yay -S fsel-git
# or
$ paru -S fsel-git
# Or build from source
git clone https://github.com/Mjoyufull/fsel && cd fsel
cargo build --release
sudo cp target/release/fsel /usr/local/bin/
# Launch it
fsel
# Use as dmenu replacement
echo -e "Option 1\nOption 2\nOption 3" | fsel --dmenu
# Browse clipboard history (requires cclip)
fsel --cclip
That's it. Type to search, arrow keys to navigate, Enter to launch.
Build and run with Nix flakes:
$ nix run github:Mjoyufull/fsel
Add to your profile:
$ nix profile add github:Mjoyufull/fsel
Add to your flake.nix inputs:
{
inputs.fsel.url = "github:Mjoyufull/fsel";
# ... rest of your flake
}
$ cargo install fsel@2.5.0-seedclay
$ cargo install fsel@2.5.0-seedclay --force
$ cargo search fsel # See available versions
$ cargo install fsel@<version>
$ yay -S fsel-git
# or
$ paru -S fsel-git
$ git clone https://aur.archlinux.org/fsel-git.git
$ cd fsel-git
$ makepkg -si
$ git clone https://github.com/Mjoyufull/fsel && cd fsel
$ cargo build --release
target/release/fsel to somewhere in your $PATH$ ./create_dmenu_symlink.sh
Or manually: ln -s $(which fsel) ~/.local/bin/dmenu--uwsm flag)--systemd-run flag (usually pre-installed)--cclip mode)Run fsel from a terminal to open the interactive TUI launcher.
OnlyShowIn/NotShowIn fields$PATHKeyboard:
↑/↓ or Ctrl-P/Ctrl-N to navigate up/down←/→ to jump to top/bottom of listEnter or Ctrl-Y to launch selected applicationCtrl-Space to pin/favorite selected app (pinned apps appear first)Esc or Ctrl-Q to exitBackspace to remove characters from searchMouse:
Launch applications directly from the command line without opening the TUI:
# Launch Firefox directly
fsel -p firefox
# Launch first match for "terminal"
fsel -p terminal
# Works with partial names
fsel -p fire # Finds Firefox
# Combine with launch options
fsel --uwsm -p discord
fsel --systemd-run -vv -p code
Open the TUI with a pre-filled search string. Works with app launcher, dmenu, and cclip modes:
# Open TUI with "firefox" already searched
fsel -ss firefox
# Multi-word search terms work
fsel -ss web browser
# Combine with other options (must be last)
fsel --uwsm -vv -r -ss text editor
# Works with dmenu mode
echo -e "option1\noption2\noption3" | fsel --dmenu -ss opt
# Works with cclip mode
fsel --cclip -ss image
Fsel includes a full dmenu replacement mode that reads from stdin and outputs selections to stdout:
# Basic dmenu replacement
echo -e "Option 1\nOption 2\nOption 3" | fsel --dmenu
# Display only specific columns (like cut)
ps aux | fsel --dmenu --with-nth 2,11 # Show only PID and command
# Use custom delimiter
echo "foo:bar:baz" | fsel --dmenu --delimiter ":"
# Pipe from any command
ls -la | fsel --dmenu
find . -name "*.rs" | fsel --dmenu
git log --oneline | fsel --dmenu
Column Operations:
--with-nth - Display specific columns--accept-nth - Output specific columns--match-nth - Match against specific columns--delimiter - Custom column separatorInput/Output:
--password - Mask input for passwords--index - Output index instead of text--dmenu0 - Null-separated input--only-match - Force selection from listSelection:
--select - Pre-select by string--select-index - Pre-select by index--auto-select - Auto-select single matchModes:
--prompt-only - Text input without list--match-mode=exact - Exact matching onlydmenu)Browse and select from your clipboard history with image previews:
# Browse clipboard history with cclip integration
fsel --cclip
# Filter by tag
fsel --cclip --tag prompt
# List all tags
fsel --cclip --tag list
# List items with specific tag (verbose shows details)
fsel --cclip --tag list prompt -vv
# Clear tag metadata from fsel database
fsel --cclip --tag clear
# Show tag color names in display
fsel --cclip --cclip-show-tag-color-names
Dmenu mode:
# Simple selection
echo -e "Edit\nView\nDelete" | fsel --dmenu
# Password input
echo -e "pass1\npass2" | fsel --dmenu --password
# Process killer
ps aux | fsel --dmenu --with-nth 2,11 --accept-nth 2 | xargs kill
# Git branch switcher
git branch | fsel --dmenu --select main | xargs git checkout
# Drop-in dmenu replacement
ln -s $(which fsel) ~/.local/bin/dmenu
Scripting:
# SSH picker
grep "^Host " ~/.ssh/config | fsel --dmenu --with-nth 2 | xargs ssh
# File opener
find . -type f | fsel --dmenu | xargs xdg-open
# Window switcher (Sway)
swaymsg -t get_tree | jq -r '..|select(.name)|.name' | fsel --dmenu
See USAGE.md for more examples and advanced usage.
Usage:
fsel [OPTIONS]
├─ Core Modes
│ ├─ -p, --program <NAME> Launch program directly (bypass TUI)
│ ├─ --cclip Clipboard history mode
│ └─ --dmenu Dmenu-compatible mode
│
├─ Control Flags
│ ├─ -r, --replace Replace running fsel/cclip instance
│ ├─ -d, --detach Detach launched applications (GUI-safe)
│ ├─ -v, --verbose Increase verbosity (repeatable)
│ ├─ --systemd-run Launch via systemd-run --user --scope
│ ├─ --uwsm Launch via uwsm app
│ ├─ --no-exec Print selection to stdout instead of launching
│ └─ -ss <SEARCH> Pre-fill TUI search (must be last option)
│
├─ Quick Extras
│ ├─ --clear-history Clear launch history
│ ├─ --clear-cache Clear app cache
│ ├─ --refresh-cache Rescan desktop entries
│ ├─ --filter-desktop[=no] Respect OnlyShowIn/NotShowIn (default: yes)
│ ├─ --hide-before-typing Hide list until first character typed
│ ├─ --list-executables-in-path Include executables from $PATH
│ ├─ --match-mode <MODE> fuzzy | exact (default: fuzzy)
│ ├─ --prefix-depth <N> Character depth for prefix matching priority (default: 3)
│ └─ -T, --test Enable debug/test mode with detailed logging
│
├─ Dmenu Mode Options
│ ├─ --dmenu0 Like --dmenu but null-separated input
│ ├─ --password[=CHAR] Password mode (mask input)
│ ├─ --index Output index instead of text
│ ├─ --with-nth <COLS> Display only specific columns (e.g. 1,3)
│ ├─ --accept-nth <COLS> Output only specified columns
│ ├─ --match-nth <COLS> Match only specified columns
│ ├─ --delimiter <CHAR> Column delimiter (default: space)
│ ├─ --only-match Disallow custom input
│ ├─ --exit-if-empty Exit if stdin is empty
│ ├─ --select <STRING> Preselect matching entry
│ ├─ --select-index <N> Preselect entry by index
│ ├─ --auto-select Auto-select when one match remains
│ └─ --prompt-only Input-only mode (no list)
│
├─ Clipboard Mode Options
│ ├─ --cclip Clipboard history viewer with previews
│ ├─ --tag <NAME> Filter clipboard items by tag
│ ├─ --tag list List all tags
│ ├─ --tag list <NAME> List items with specific tag
│ ├─ --tag clear Clear tag metadata from fsel database
│ ├─ --tag wipe Wipe ALL tags from cclip entries (cclip 3.2+)
│ └─ --cclip-show-tag-color-names Show tag color names in display
│
└─ General
├─ -h Show short help
├─ -H, --help Show detailed help
├─ -T, --test Enable debug/test mode (logs to ~/.config/fsel/logs/)
└─ -V, --version Show version info
$SWAYSOCK is set. Uses swaymsg exec to launch applications in the current workspace (requires Sway)--systemd-run launches applications in isolated systemd user scopes (requires systemd)--uwsm launches applications through the Universal Wayland Session Manager (requires uwsm to be installed)-v: Show application execution details-vv: Show application paths and additional metadata-vvv: Show debug information including usage statisticsUse -T or --test to enable detailed debug logging:
# Enable debug mode
fsel -T
# Debug logs are written to ~/.config/fsel/logs/
# Filename format: fsel-debug-YYYYMMDD-HHMMSS-pidXXXXX.log
Debug mode logs:
Useful for debugging search ranking, understanding why apps appear in a certain order, or analyzing performance.
Config file: ~/.config/fsel/config.toml
# Colors
highlight_color = "LightBlue"
cursor = "█"
# App launcher
terminal_launcher = "alacritty -e"
[app_launcher]
filter_desktop = true # Filter apps by desktop environment
list_executables_in_path = false # Show CLI tools from $PATH
hide_before_typing = false # Hide list until you start typing
match_mode = "fuzzy" # "fuzzy" or "exact"
confirm_first_launch = false # Confirm before launching new apps with -p
prefix_depth = 3 # Character depth for prefix matching priority
# Pin/favorite settings
pin_color = "rgb(255,165,0)" # Color for pin icon (orange)
pin_icon = "📌" # Icon for pinned apps
# UI customization
rounded_borders = true
main_border_color = "White"
apps_border_color = "White"
input_border_color = "White"
# Layout (percentages)
title_panel_height_percent = 30 # Top panel height (10-70%)
input_panel_height = 3 # Input panel height in lines
title_panel_position = "top" # "top", "middle", or "bottom"
# Dmenu mode
[dmenu]
password_character = "*"
exit_if_empty = false
# Clipboard mode
[cclip]
image_preview = true
hide_inline_image_message = false
# Custom keybinds (optional)
[keybinds]
up = ["up", { key = "k", modifiers = "ctrl" }]
down = ["down", { key = "j", modifiers = "ctrl" }]
select = ["enter"]
exit = ["esc", { key = "q", modifiers = "ctrl" }]
pin = [{ key = "space", modifiers = "ctrl" }]
See config.toml and keybinds.toml for all options with detailed comments.
Sway/i3:
# ~/.config/sway/config
set $menu alacritty --title launcher -e fsel
bindsym $mod+d exec $menu
for_window [title="^launcher$"] floating enable, resize set width 500 height 430, border none
# Clipboard history
bindsym $mod+v exec 'alacritty --title clipboard -e fsel --cclip'
Hyprland:
# ~/.config/hypr/hyprland.conf
bind = $mod, D, exec, alacritty --title launcher -e fsel
windowrule = float, ^(launcher)$
windowrule = size 500 430, ^(launcher)$
dwm/bspwm/any WM:
# Use dmenu mode
bindsym $mod+d exec "fsel --dmenu | xargs swaymsg exec --"
Contributions are welcome! Whether you're reporting bugs, suggesting features, or submitting code, we appreciate your help making fsel better.
cargo fmt and cargo clippy before submittingcargo test and cargo build --release passSee CONTRIBUTING.md for detailed guidelines on:
All contributors are valued and appreciated. Your name will be added to the contributors list, and significant contributions will be highlighted in release notes.
Thank you for helping improve fsel!
fsel is a unified TUI workflow tool built for terminal-centric setups. It combines app launching, dmenu functionality, and clipboard history into one scriptable interface with consistent keybinds and theming.
This means:
Apps not showing up?
$XDG_DATA_DIRS includes /usr/share/applications--filter-desktop=no to disable desktop filtering-vvv for debug infoMouse not working?
disable_mouse = false in configImages not showing in cclip mode?
chafa for image renderingimage_preview = true in configFuzzy matching too loose?
--match-mode=exact for stricter matchingmatch_mode = "exact" in configTerminal apps not launching?
terminal_launcher in configterminal_launcher = "kitty -e"Fork of gyr by Namkhai B.
BSD 2-Clause (c) 2020-2022 Namkhai B., Mjoyufull