Shell History Tools Compared: Atuin, fzf, McFly, hstr and Suvadu
Compare Atuin 18.24.0, fzf, McFly, hstr, and Suvadu 0.5.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), Atuin's release-tagged documentation and current docs, and the current fzf, McFly, and hstr READMEs linked below, and re-checked every Suvadu claim for 0.5.0 and 0.5.1 against their release notes and README. On 20 October 2026 I re-checked the Atuin claims against the Atuin v18.24.0 release (published 15 October 2026) and its release-tagged documentation; 18.24 added agent session capture, which changed Atuin's AI-agent rows. The fzf, McFly, and hstr details were last checked in September 2026.
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. Since 18.24 it can also capture agent sessions (Claude Code, Codex, opencode, pi) and resume them on another machine or in another agent; that and output capture need its daemon. |
| 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 with coding agents including Cursor or Antigravity, and want agent sessions without a background daemon (prompts, responses, commands, reported tokens, and git snapshots of what changed in the repository), risk rules for agent commands, and one set of skills written into each agent's own files. | 0.5.1 has no sync and no Fish, Nushell 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 Rust 1.95 or newer. Compiles from source, which can take a few minutes; cargo binstall suvadu installs the pre-built binaries instead. 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.24.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. Since 18.24, opt-in threads capture those agents' sessions (conversation, tool calls, edit diffs), synced and resumable. Read-only MCP server for history, captured output, and threads. 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.1 | Bash 4+, Zsh 5.1+ on macOS and Linux. | Four explicit Ctrl+R modes — terms (literal words, the default, retried with separators ignored when nothing matches), literal, prefix, and fuzzy — ranked by match quality, then a Smart rank weighing directory, frecency, failure rate and the previous command, plus all/directory/workspace/session scopes. Up/Down recall is recency-first with the current directory as a tiebreaker. | Local SQLite history with directory, git branch, exit code, duration, session, executor, tags, bookmarks, and notes. Opt-in end of a failed agent or suv wrap command's output; nothing from commands typed in a shell. | Command capture for several agents; session capture (prompts, responses, models, reported tokens) for Claude Code, Codex, and OpenCode, and Cursor without tokens; git snapshots of what each session changed; 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. Since 18.24, threads (atuin threads enable, which turns on the daemon) capture the sessions of those four agents: the conversation, each tool call's input and output, and the diffs of the agent's edits, with recognised secrets replaced. Threads sync like history, and atuin resume reopens one on another machine, forks it, or continues it in a different agent. Its built-in MCP server has six read-only tools: history search (with scope, failed-only, and author filters), a command's captured output, search across captured output, and search, list and read for threads. 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; it needs an Atuin Hub account or a self-hosted backend.
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.1 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; when nothing matches, it retries once ignoring separators, so hiveagent finds hive-agent. 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.
Since 0.5.1 Suvadu's ranking also moves toward McFly's signals: within a match tier, its Smart rank weighs frecency, scales down commands that usually fail, and boosts what you usually run after this shell's last command. Unlike McFly's network, these are fixed rules, written down in the search docs, and no boost can lift a command over a closer textual match.
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; since 0.5.1 Cursor conversations are sessions too, without token counts, and every session in a git repository records which files changed, which what_changed reports as observed. suv sessions shows human terminal sessions and agent sessions in one timeline. Over its MCP server, which exposes 22 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. Since 0.5.1 it can keep the last 4 KB of a failed command's output, opt-in, but only where an agent hook already carries it or under
suv wrap; it never captures output from commands typed in your shell, and 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, agent access to captured command output, or agent sessions you can resume on another machine or in another agent.
- 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 coding agents, including Cursor or Antigravity, and want sessions without a daemon, token counts, repository snapshots of what each session changed, risk rules and 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 Rust 1.95 or newer. Compiles from source, which can take a few minutes; cargo binstall suvadu installs the pre-built binaries instead. 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