Shell History Tools Compared: Atuin, fzf, McFly, hstr and Suvadu
Compare Atuin 18.23.0, fzf, McFly, hstr, and Suvadu 0.5.0 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), Atuin's release-tagged documentation and current docs, and the current fzf, McFly, and hstr READMEs linked below. I updated the Suvadu search and import claims on 21 September 2026 for Suvadu 0.4.2, and re-checked the Atuin claims on 26 September 2026 against the Atuin v18.23.0 release (published 22 September 2026) and its release-tagged documentation. On 26 September 2026 I also re-checked every Suvadu claim for Suvadu 0.5.0 against its release notes and README.
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.5.0 has no sync and no Fish or Windows support. It imports Zsh history, Bash history, an Atuin database, and its own JSONL. |
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. Works on macOS and Linux, Intel and ARM. Downloads a binary for your operating system and architecture, verifies its checksum, and installs to /usr/local/bin, using sudo only if that directory is not writable. End the command with bash -s -- --user instead to install into ~/.local/bin without 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
Homebrew and Cargo do not activate shell recording, and the install script adds the hook line only if you answer y when it offers. 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 or Bash history, an Atuin database (read-only), or a Suvadu JSONL export.
How the five tools differ
| Tool | Shells (documented) | Search and recall model | History and context | AI-agent support | Import and sync |
|---|---|---|---|---|---|
| Atuin 18.23.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.5.0 | Bash 4+, Zsh 5.1+ on macOS and Linux. | Four explicit Ctrl+R modes — terms (literal words, the default), literal, prefix, and fuzzy — ranked by match quality with directory and human-command boosts, plus all/directory/workspace/session scopes. 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, Bash history, an Atuin database, and Suvadu JSONL. 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 three read-only tools: history search (with scope, failed-only, and author filters), a command's captured output, and, new in 18.23.0, search across captured 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 and saved conversations it can resume. The 18.23.0 agent-hook docs do not describe capturing external agents' prompts or conversation transcripts; the AI session-capture interface listed in the generated 18.23.0 release notes was reverted before the release was tagged.
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.5.0 supports Bash and Zsh and stores structured command context locally. Search defaults to literal words — each typed word must appear as a substring — ranked prefix, contiguous, in-order, then any-order. Since 0.4.2 you can switch that default with --match or Ctrl+X, including a fuzzy mode with classic subsequence matching, and narrow with --scope. Up/Down recall is recency-first, using the current directory only as a tiebreaker.
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 ranking: since 0.4.2, typed
Ctrl+Rsearch matches and counts across the whole eligible history in SQL, so an older command is found. The newest 5,000 matches are the ones ranked by relevance; anything beyond them is paged newest-first. - Migration:
suv importaccepts Zsh history, Bash history, an Atuin database (--from atuin-db, read-only), and Suvadu JSONL. Bash history files carry no directory, exit code, or duration, and an untimestamped one carries no times either. - 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 you do not need sync, Fish, or Windows.
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. Works on macOS and Linux, Intel and ARM. Downloads a binary for your operating system and architecture, verifies its checksum, and installs to /usr/local/bin, using sudo only if that directory is not writable. End the command with bash -s -- --user instead to install into ~/.local/bin without 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
Homebrew and Cargo do not activate shell recording, and the install script adds the hook line only if you answer y when it offers. 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 or Bash history, an Atuin database (read-only), or a Suvadu JSONL export.
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