skim-rs/skim
71.7
Strong · 29 September 2026
22.1k
lines of production code
Rust
primary language
2
measurements over time
What this system is
Skim is a high-performance fuzzy finder and interactive selection tool for command-line environments, serving as a modern replacement for fzf. It provides a modular matching engine with multiple algorithms, including Arinae, Clangd, and Fzy, to handle complex text filtering and ranking. The system features a rich terminal user interface with support for image previews, ANSI colors, and integration with terminal multiplexers like tmux and Zellij. Additionally, it offers a programmable Rust library for embedding fuzzy search capabilities into other applications.
How it got here
2016–2017 — Rebranding to Skim and shell integration
6 changes.
The project was rebranded from fzf-rs to Skim, establishing comprehensive documentation, developer tooling, and reproducible build configurations. This period focused on integrating Skim as the default fuzzy finder, adding shell completions and keybindings, and introducing robust unit tests for core parsing and ranking logic.
2018–2026 — modular engine and TUI rewrite
17 changes.
The project underwent a significant architectural overhaul, introducing a modular matching engine with multiple new algorithms (Arinae, Clangd, Frizbee) and a complete rewrite of the TUI to an event-driven, action-based system. This period also established robust infrastructure, including cross-platform test harnesses, fuzzing targets, and pre-commit linting, while adding user-facing features like remote IPC, popup support, and Windows installation.
Features
Add shell integration scripts and completions for skim
The shell directory now includes the official key bindings and completion scripts for bash, zsh, fish, and nushell. These files provide tab-completion for skim's command-line options and interactive key bindings (such as Ctrl+T for file selection and Ctrl+R for history search) that integrate the \sk\ command into your shell environment.
shell · high confidence
Added fuzzing targets for core parsers and matchers
The project now includes \cargo-fuzz\ targets in the \fuzz/\ directory to automatically test the stability of hand-written parsers and matching algorithms against adversarial input. These new fuzzers exercise the ANSI stripping logic, \--nth\/\--with-nth\ field extraction, fuzzy matching algorithms (Skim, Fzy, Clangd), the full query-to-match pipeline, and the \--bind\ keymap parser. This addition helps prevent panics and index-out-of-bounds errors in these critical, untrusted-input-facing components.
fuzz · high confidence
Introduce Arinae fuzzy matching algorithm
Added the Arinae fuzzy matcher, a new algorithm based on Smith-Waterman local alignment with affine gap penalties and context-sensitive bonuses. This implementation introduces features such as typo tolerance, smart case detection, and specific scoring bonuses for word separators (like \/\ and \\_\) and camelCase transitions. It also includes optimized prefiltering and banding strategies to improve performance on large datasets.
_src/fuzzy\matcher/arinae · high confidence
New fuzzy matching algorithms: Clangd, Frizbee, and Fzy
Users can now choose from three additional fuzzy matching algorithms alongside the existing Skim matcher. The new Clangd matcher replicates the algorithm used by the clangd language server, while the Fzy matcher implements the fzy scoring algorithm with support for typo tolerance. The Frizbee matcher integrates the library used by blink.cmp, featuring thread-local caching for performance and configurable typo tolerance. All new matchers support case-insensitive, case-sensitive, and smart-case matching strategies.
_src/fuzzy\matcher · high confidence
New library usage examples for the Skim Rust crate
The examples directory now includes a comprehensive set of demonstrations for using the Skim library programmatically. These new examples cover basic item selection, configuring options via SkimOptionsBuilder, and handling ANSI-colored output. They also illustrate advanced integration patterns, including running Skim within an async Tokio runtime, implementing custom item types and selectors, binding custom keybindings with synchronous and asynchronous callbacks, and managing fine-grained lifecycle control over the event loop. Additional examples demonstrate specific features such as image previews, fuzzy matching algorithms, custom command collectors, and downcasting selected items.
examples · high confidence
Support for tmux and Zellij popups
Skim can now run inside a floating popup window within tmux or Zellij terminal multiplexers. This adds a new \src/popup\ module that detects the active multiplexer, creates a temporary FIFO for stdin piping, and launches a nested skim instance with configurable positioning (center, top, bottom, left, right) and sizing (percentages or fixed cells). The popup respects the global border style settings and allows environment variables to be passed through to the child process.
src/popup · high confidence
Windows installer support added
Users on Windows can now install the application via a native MSI installer generated by WiX. The installer places the executable in the Program Files directory and includes an optional feature to add the installation path to the system PATH environment variable for easy command-line access.
wix · high confidence
Behavioural changes
Enforce strict linting and formatting in pre-commit hook
A new pre-commit hook has been added to the repository to automatically enforce code quality standards before changes are committed. The hook runs \cargo fmt\ to check formatting and executes \cargo clippy\ with strict warning-as-error settings across multiple feature configurations (default, no-defaults, cli, image, listen, and frizbee). This ensures that all contributions adhere to the project's style guide and pass static analysis checks regardless of which optional features are enabled.
.githooks · high confidence
Introduce Skim (sk) as the new default fuzzy finder
The plugin now uses Skim (sk) instead of fzf for fuzzy file finding and selection. This change updates the default search command to prioritize \fd\, followed by \git ls-tree\, \rg\, \ag\, and \find\, and includes Windows-specific shell escaping and command wrapping to ensure compatibility. Users will experience potentially faster file listing and selection, with the plugin automatically detecting the \sk\ executable or falling back to the system \sk\ command.
plugin · high confidence
New \`sk\` binary entry point with clap-based options and remote support
The \src/bin/main.rs\ file introduces the primary entry point for the \sk\ command-line tool, replacing the previous implementation with a structure built on \clap\ for argument parsing. This change enables several user-facing capabilities: shell completion generation (supporting nushell), man page generation, and a new \--remote\ flag that allows the binary to connect to and send actions to a running \--listen\ instance via local sockets. The entry point also handles logging initialization via \env\_logger\, manages popup window execution on Unix systems, and orchestrates the core fuzzy-finding loop through \sk\_main\, including history management and output formatting.
src/bin · high confidence
New helper module for item processing, reading, and selection
The \src/helper\ module has been introduced to centralize core item handling logic. It adds \DefaultSkimItem\ to manage text, ANSI code stripping, field transformations, and the new \--hide-nth\ option (hiding fields from display while keeping them searchable). \SkimItemReader\ handles input parsing, supporting ANSI colors, null-terminated lines (\--read0\), custom delimiters, and the new \--disable-pattern\ option to mark matching items as unselectable. A new \DefaultSkimSelector\ enables pre-selection of items via the first N items, preset strings, or regex patterns.
src/helper · high confidence
New modular matching engine architecture with AND/OR combinators and normalization
The matching engine in src/engine has been restructured into a modular system with distinct components for different matching strategies. The new architecture introduces AND and OR combinator engines (src/engine/andor.rs) that allow combining multiple matchers, with AND merging matched ranges and summing scores while OR selects the best matching sub-engine. A new NormalizedEngine (src/engine/normalized.rs) enables accent-insensitive matching by normalizing text before comparison. The engine factory system (src/engine/factory.rs) now supports creating exact, fuzzy, regex, and split-match engines through a unified interface. The split-match engine (src/engine/split.rs) allows matching against different parts of items separated by delimiters. These changes provide a more flexible and composable matching system while maintaining backward compatibility with existing query syntax.
src/engine · high confidence
Redesigned TUI with event-driven architecture and granular action bindings
The TUI layer has been rewritten to use an event-driven architecture, introducing a central \App\ struct that manages state and a new \Action\ system for handling user input. This change adds granular, bindable actions (such as \set-query\, \set-cmd\, \bind\, and \unbind\) that allow users to customize keybindings and dynamically change the interactive command. The new architecture also supports custom action callbacks (both synchronous and asynchronous) for library users, improves input handling with proper byte-length cursor movement, and introduces a more robust layout system that correctly handles multiline headers and dynamic resizing.
src/tui · high confidence
sk-tmux script deprecated in favor of sk --tmux
The sk-tmux helper script now emits a deprecation warning and directs users to use the native \sk --tmux\ flag instead. While the script remains available for backward compatibility, it is scheduled for removal in a future release.
bin · high confidence
Test coverage
Added test infrastructure configuration for nextest, Valgrind, and ThreadSanitizer; Expanded test coverage for ANSI, bindings, and matching behavior; New benchmark suite for matcher performance and CLI ingestion; New cross-platform test harnesses for unit and end-to-end testing; New field extraction, keybinding, and ranking tests; Snapshot tests for ANSI, bindings, and hide-nth features.
Dependencies
Initial dependency lockfiles and manifest configuration
The project now includes Cargo.lock files for the main workspace and the fuzzing sub-crate, alongside the Cargo.toml manifests. This establishes the pinned dependency graph for the 'skim' fuzzy finder (version 5.7.2), ensuring reproducible builds by locking versions for key libraries such as ratatui (0.30.0), clap (4.6.1), and frizbee (0.13.0).
(dependencies) · high confidence
Housekeeping
Project rebrand to Skim with comprehensive documentation and developer tooling; Updated man pages for sk and sk-tmux.
Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.
How this codebase got here
Score
- CAI 72 → 72 (+0.2)
- Rubric changed (rubric-2026.09.9 → rubric-2026.09.18) — scores are not directly comparable.
Lenses
- Code Health 79 → 79 (+0.0)
- Architecture 100 → 90 (-10.4)
- Maturity 68 → 67 (-0.2)
- Readiness 81 → 70 (-11.0)
- Security 66 → 76 (+9.8)
- Performance 94 (new)
Resolved (8)
- Hotspot: src/fuzzy_matcher/fzy.rs (src/fuzzy_matcher/fzy.rs)
- Hotspot: src/fuzzy_matcher/skim.rs (src/fuzzy_matcher/skim.rs)
- Hotspot: src/helper/item.rs (src/helper/item.rs)
- Hotspot: src/manpage.rs (src/manpage.rs)
- Hotspot: src/popup/mod.rs (src/popup/mod.rs)
- Hotspot: src/theme.rs (src/theme.rs)
- Hotspot: src/util.rs (src/util.rs)
- Off-boarding risk: anonymized user #1
New (84)
- Ambiguous boolean flags with similar prefixes. no_clear, no_clear_start, and no_clear_if_empty suggest related but distinct behaviors regarding clearing the screen/output, which can be confusing to users trying to understand the exact scope of each flag.
- Documentation: no project overview (README.md)
- Flaky test: skim::ansi.test_ansi_flag_enabled
- Flaky test: skim::ansi.test_ansi_hide_nth
- Flaky test: skim::ansi.test_ansi_matching_on_stripped_text
- Flaky test: skim::binds.bind_act_prefix
- Flaky test: skim::binds.bind_append_and_select
- Flaky test: skim::binds.bind_set_header_change
- Flaky test: skim::case.case_ignore_different
- Flaky test: skim::case.case_ignore_lower
- Flaky test: skim::case.case_ignore_no_match
- Flaky test: skim::case.case_non_ascii
- Flaky test: skim::case.case_respect_exact
- Flaky test: skim::defaults.vanilla
- Flaky test: skim::highlighting.highlight_split_match
- Flaky test: skim::keys.keys_bspace
- Flaky test: skim::keys.keys_btab
- Flaky test: skim::keys.keys_ctrl_k
- Flaky test: skim::keys.keys_ctrl_w
- Flaky test: skim::multiline.multiline_custom_sep_colon
- …and 64 more
Changes since last survey
- 5 commits — 3 feature/other, 2 fixes
By area
- (root) — 2 commits
- src/fuzzy_matcher — 1 commit
- src/lib.rs — 1 commit
- src/skim.rs — 1 commit
Notable commits
- fix: fix(lib): make run_items close the channel before starting the TUI
- fix: fix: smart case detection treated special chars as uppercase (#1180)
- change: docs: fix some typos (#1177)
- change: release: v5.7.1 (#1178)
- change: release: v5.7.2 (#1182)
Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.
Survey your own repository
skim-rs/skim was measured the same way every project in this corpus was: the same rubric, at a pinned commit, with the result published in full. Point a surveyor at a repository you know and see whether you agree with it.
About this page
- The score is its most recent published measurement, taken on 29 September 2026 at a pinned commit. It is not a live figure and does not change until the project is measured again.
- Measured at commit 5ad4e355c20fc63045d859a4fac8fbcf3bd444c6 — the exact code this score is about.
- Scored under rubric-2026.09.18 — the same rubric and the same method as every other entry in this index.
- Measured by watchdog.canine.dev using codehealth-analyzer preprod-c4983f2d4e5c.