Shell History Tools Compared: Atuin, fzf, McFly, hstr and Suvadu
Compare Atuin 18.22.0, fzf, McFly, hstr, and Suvadu 0.4.1 by search model, stored context, import, shell support, and AI-agent workflows, with reasons to choose each.
There is no universal best shell history tool. Atuin, fzf, McFly, hstr, and Suvadu solve overlapping but different problems. If you are comparing Atuin alternatives, start with the workflow you want to improve: recalling commands, migrating existing history, syncing machines, or reviewing what coding agents did.
Review note: I build Suvadu, so read this as a maker's comparison. I reviewed it on 19 September 2026 against Suvadu 0.4.1 (source and release notes), the Atuin v18.22.0 release (published 9 September 2026) with its release-tagged documentation and the current Atuin docs, and the current fzf, McFly, and hstr READMEs linked below.
Method: This is a documentation and source review, not a benchmark. I did not install the competing tools for this update or time any of them on the same hardware and history, so the article makes no speed ranking. Capabilities marked for another project are what its maintainers document; "not documented" means I did not find it in those pages, not proof that it cannot be done.
Choose by the job you need done
| Choose | When it fits best | Know before choosing |
|---|---|---|
| Atuin | You mainly want better shell history: fuzzy search with scopes, the widest shell and platform support here, importers for many shells, and optional encrypted sync. It also records AI-agent commands and has an MCP server. | Sync is optional; local history works without an account. Agent hooks record commands, not conversations. Output capture for agents needs its daemon and PTY proxy. |
| fzf | You want a flexible fuzzy finder that can search your existing shell history and many other lists. | fzf searches what your shell's history already holds; it is not a persistent history database, so it does not fix missing or lost history. |
| McFly | You want Ctrl+R results ranked from directory, command context, frequency, recency, selection, and prior exit status. | Its README lists Bash, Zsh, and PowerShell 7+ and says the project is seeking co-maintainers. |
| hstr | You use Bash or Zsh and want a focused browser for recent, matching, tagged, or favorite commands. | It works on your shell history rather than building a separate structured context store. |
| Suvadu | You use Bash or Zsh and coding agents such as Claude Code, Codex, or OpenCode, and want to review a whole agent session (prompts, responses, commands, tokens), save checkpoints another agent can read, and share skills across agents. | 0.4.1 has no sync, no Fish or Windows support, and imports only Zsh history and its own JSONL (no Bash or Atuin importer). Typed interactive search currently matches only the newest ~5,000 eligible entries. |
Next step: if your shortlist is Atuin and Suvadu, read the task-by-task Suvadu vs Atuin comparison. To try Suvadu now, use the install steps below or the installation guide.
Try Suvadu with your own history
For macOS or Linux with Zsh 5.1+ or Bash 4+. Install the CLI, enable your shell, then try Ctrl+R.
1. Install the CLI
With Homebrew:
brew tap AppachiTech/suvadu && brew install suvadu Other install methods
Install script. Linux only for now: the 0.4.1 script requests a macOS file that is not published, so on a Mac use Homebrew or Cargo. Downloads a binary for your architecture, verifies its checksum, and installs to /usr/local/bin using sudo.
curl -fsSL https://downloads.appachi.tech/suvadu/install.sh | bash Cargo. Requires a Rust toolchain. Compiles from source, which can take a few minutes. Make sure ~/.cargo/bin is on your PATH.
cargo install suvadu 2. Enable recording in your shell
The installer does not activate shell recording. Open the instructions for the shell you use. If another history tool owns Ctrl+R, disable its history binding before enabling Suvadu; keep your existing history data.
Zsh setup
Add this line once to ~/.zshrc. Keep the existing line if it is already present:
eval "$(suv init zsh)" Save the file, then activate it in your Zsh terminal:
source ~/.zshrc Bash setup
Add this line once to ~/.bashrc. Keep the existing line if it is already present:
eval "$(suv init bash)" Save the file, then activate it in your Bash terminal:
source ~/.bashrc Bash 4+ is required. For a login shell, make sure ~/.bash_profile sources ~/.bashrc, or use the startup file your shell reads. Shell setup details.
3. Check setup and try a search
suv doctor Run echo hello, press Ctrl + R, and search for hello. Select a result to put it in your prompt; press Enter to run it. Agent and MCP setup are optional.
Import existing Zsh history or a Suvadu JSONL export. Raw Bash history and Atuin databases are not supported import formats.
How the five tools differ
| Tool | Shells (documented) | Search and recall model | History and context | AI-agent support | Import and sync |
|---|---|---|---|---|---|
| Atuin 18.22.0 | Bash, Zsh, Fish (tier 1); Nushell, xonsh, PowerShell (community tier). Linux, macOS, Windows, WSL 2 binaries. | Fuzzy by default; prefix, full-text, and daemon-backed fuzzy modes. Global, host, directory, workspace, and session scopes. Ctrl+R and Up-arrow open search by default; either can be disabled. | SQLite history with directory, time, duration, exit code, host, session, and author. Optional captured command output. | Hooks for Claude Code, Codex, opencode, and pi record agent commands with an author label. Read-only MCP server for history and captured output. Optional built-in Atuin AI with its own skills. | atuin import auto plus importers for Bash, Zsh, zsh-histdb, Fish, Nushell, xonsh, PowerShell, and others. Optional end-to-end encrypted sync. |
| fzf | Bash, Zsh, Fish, Nushell integrations. | General-purpose fuzzy selection; shell integration binds Ctrl+R to history search. | Uses the history your shell already has. | None documented. | Not applicable; uses the shell's own history file. |
| McFly | Bash, Zsh, PowerShell 7+. | Neural-network ranking informed by directory and recent command context. | SQLite database with exit status, timestamp, and directory, while keeping the normal history file. | None documented. | No sync workflow documented. |
| hstr | Bash, Zsh. | Suggest box with keyword, exact, and regex matching; tags and favorites. | Searches and manages the shell's history. | None documented. | No sync workflow documented. |
| Suvadu 0.4.1 | Bash 4+, Zsh 5.1+ on macOS and Linux. | Literal word/substring search in Ctrl+R, ranked by match quality with directory and human-command boosts. Up/Down recall is recency-first with the current directory as a tiebreaker. | Local SQLite history with directory, exit code, duration, session, executor, tags, bookmarks, and notes. No command-output capture. | Command capture for several agents; native session capture (prompts, responses, models, reported tokens) for Claude Code, Codex, and OpenCode; unified suv sessions browser; read-only MCP server with opt-in summary writes; shared skills synced into agents' own files. | Imports Zsh history and Suvadu JSONL only. Manual JSON/JSONL/CSV export; no sync. |
Atuin: strongest when shell history itself is the priority
Atuin records substantially more context than a normal history file: directory, duration, exit code, host, and session. Its search UI can scope results to a machine, directory, Git workspace, or shell session, and its search configuration offers fuzzy, prefix, full-text, and daemon-backed modes. The key-binding docs show both Ctrl+R and Up-arrow opening search by default, with --disable-up-arrow and --disable-ctrl-r to opt out.
Getting started is also easier. Its import reference documents atuin import auto and importers for Bash, Zsh, zsh-histdb, Fish, Nushell, xonsh, PowerShell, and more, and its support matrix covers more shells and platforms, including Windows, than anything else in this group. The sync guide describes optional end-to-end encrypted history across machines, hosted or self-hosted; registration is a sync step, not a requirement for local storage and search.
Atuin's AI support is current and concrete. Its agent hooks (atuin hook install claude-code, codex, opencode, or pi) record the Bash-tool commands those agents run, with author, directory, timestamp, exit code, and duration, and hide them from interactive search by default. Its built-in MCP server has two read-only tools: history search (with scope, failed-only, and author filters) and captured command output. Output capture is off by default and needs the daemon and PTY proxy, but when enabled an agent can read the actual error text of a failed command. Atuin also offers an optional built-in assistant, Atuin AI, with project and global skills. The reviewed agent-hook docs do not describe capturing prompts or conversation transcripts.
fzf: strongest when you want a reusable fuzzy selector
fzf is broader than shell history. It reads candidates from standard input (or its file walker) and returns a selection, which makes it useful for files, Git branches, processes, and custom lists as well as commands. Its shell integration supports Bash, Zsh, Fish, and Nushell and binds Ctrl+R to history search (for Zsh, source <(fzf --zsh)).
Choose fzf when matching flexibility and composability matter more than capturing a new structured history record. Because it searches the shell's own history, its results are only as complete as that history; if commands are not being saved, fix your shell's history settings first.
McFly: strongest when contextual ranking is the goal
McFly's defining idea is ranking. Its maintainer documentation says results consider directory, preceding commands, frequency, recency, prior selection, and historical exit status. It augments the normal history file with a SQLite database containing exit status, timestamp, and directory, so you can stop using it without losing your shell history.
This makes McFly a focused option for people who mainly want Ctrl+R to guess the relevant command. The project lists Bash, Zsh, and PowerShell 7+, and its README asks for co-maintainers; check the repository if maintenance cadence affects your decision.
hstr: strongest for a focused Bash/Zsh history browser
hstr offers a terminal suggest box for Bash and Zsh history. Its official README documents navigation, keyword, exact, and regex search, removal of obsolete or sensitive entries, command tags, and curated favorites. That is a useful combination if you want to stay close to the shell's history model, and it is packaged for many Linux distributions, macOS, and FreeBSD.
It does not present itself as a structured command-observability database. If directory, duration, exit status, session, or executor fields are central to your workflow, compare the database-backed options instead of treating every Ctrl+R UI as equivalent.
Suvadu: shell history plus agent-session review
Suvadu 0.4.1 supports Bash and Zsh and stores structured command context locally. Search requires each typed word to appear as a literal substring; it then ranks prefix, contiguous, in-order, and any-order word matches. Up/Down recall is recency-first, using the current directory only as a tiebreaker. Those details matter if you expect classic fuzzy subsequence matching: Suvadu deliberately does something different.
Its distinct workflow is reviewing and continuing agent work across tools. For Claude Code, Codex, and OpenCode, Suvadu captures the native session (prompts, assistant responses, observed models, and provider-reported token counts) as well as the commands. suv sessions shows human terminal sessions and agent sessions in one timeline. Over its MCP server, which exposes 21 read-only tools by default, a connected agent can read a previous session and, only if you set allow_session_summaries = true under [mcp], save a summary checkpoint that another agent can pick up. The requesting agent writes that summary; Suvadu stores it. Shared skills keep one set of instructions and write them into Claude Code, Cursor, and Codex's own files with suv skills sync. Prompt Explorer and agent reports cover prompt-to-command review and risk summaries.
The current limits are real and worth knowing before you switch:
- Search completeness: in 0.4.1, typed
Ctrl+Rsearch only matches within the newest ~5,000 eligible entries, so an older command can be missing from results even though it is stored. Date or directory filters can bring it into range. A fix is planned but not yet released. - Migration:
suv importaccepts only Zsh history and Suvadu JSONL. There is no Bash-history or Atuin importer. - Command output: Suvadu records whether a command failed, not its stdout or stderr. Session capture excludes tool results.
- Coverage: no Fish, Nushell, PowerShell, or Windows support, and no sync. Capture depends on initialized shell hooks and on each agent integration; some agents do not supply a structured exit status.
A practical recommendation
- Pick Atuin if better shell history is the main goal: fuzzy scoped search, easy import from almost any shell, Fish or Windows support, encrypted sync, or agent access to captured command output.
- Pick fzf when you want one highly configurable fuzzy selector for history and many other command-line tasks.
- Pick McFly when contextual ranking is the main improvement you want from
Ctrl+R. - Pick hstr for a focused Bash/Zsh history browser with favorites and history management.
- Try Suvadu when you use Bash or Zsh with several coding agents and want to inspect whole agent sessions, hand checkpoints between agents, and keep shared skills in one place, and its current import and search limits are acceptable.
If your shortlist is Atuin and Suvadu, continue with the narrower Suvadu vs Atuin comparison. It walks through recovering a command, importing history, inspecting an agent session, and retrieving error output in each tool, and lists the migration limits in detail.
Try Suvadu with your own history
For macOS or Linux with Zsh 5.1+ or Bash 4+. Install the CLI, enable your shell, then try Ctrl+R.
1. Install the CLI
With Homebrew:
brew tap AppachiTech/suvadu && brew install suvadu Other install methods
Install script. Linux only for now: the 0.4.1 script requests a macOS file that is not published, so on a Mac use Homebrew or Cargo. Downloads a binary for your architecture, verifies its checksum, and installs to /usr/local/bin using sudo.
curl -fsSL https://downloads.appachi.tech/suvadu/install.sh | bash Cargo. Requires a Rust toolchain. Compiles from source, which can take a few minutes. Make sure ~/.cargo/bin is on your PATH.
cargo install suvadu 2. Enable recording in your shell
The installer does not activate shell recording. Open the instructions for the shell you use. If another history tool owns Ctrl+R, disable its history binding before enabling Suvadu; keep your existing history data.
Zsh setup
Add this line once to ~/.zshrc. Keep the existing line if it is already present:
eval "$(suv init zsh)" Save the file, then activate it in your Zsh terminal:
source ~/.zshrc Bash setup
Add this line once to ~/.bashrc. Keep the existing line if it is already present:
eval "$(suv init bash)" Save the file, then activate it in your Bash terminal:
source ~/.bashrc Bash 4+ is required. For a login shell, make sure ~/.bash_profile sources ~/.bashrc, or use the startup file your shell reads. Shell setup details.
3. Check setup and try a search
suv doctor Run echo hello, press Ctrl + R, and search for hello. Select a result to put it in your prompt; press Enter to run it. Agent and MCP setup are optional.
Import existing Zsh history or a Suvadu JSONL export. Raw Bash history and Atuin databases are not supported import formats.
Builder of Suvadu. Writes Rust, thinks about shell history more than most people, and believes developer tools should be local-first.
Related posts
Suvadu vs Atuin: Shell History and AI Agent Workflows
10 min read ComparisonSuvadu vs McFly: Shell History Features Compared (2026)
8 min read ComparisonSuvadu vs Hstr: A Modern Hstr Alternative for Shell History (2026)
8 min read ComparisonSuvadu vs fzf for Shell History: When Ctrl-R Isn't Enough (2026)
8 min read