Atuin fzf
Built for Shell history, and nothing else Fuzzy finding anything. History is one of many uses
History storage SQLite database, no size limit, imports your existing history Reads your shell's plain-text history file, with its truncation and dedup limits
Context recorded Exit code, directory, duration, hostname, session, and time Only what the shell keeps: the command, maybe a timestamp
Sync across machines Optional; end-to-end encrypted, hosted or self-hosted None
Backup History survives reinstalls and lost laptops None; history -c clears it permanently
Filter modes Global, host, session, directory, and workspace. Cycle with ctrl-r One flat list per machine
Fuzzy matching Fuzzy, prefix, and full-text search modes Yes, it's fzf's core feature
Files, processes, git… No, history only Yes, pipe anything into it
Stats & insights atuin stats shows your most-used commands and more None
Open source MIT licensed, written in Rust MIT licensed, written in Go
The difference

A database beats a text file

fzf searches whatever your shell wrote to its history file. Atuin records commands in its own database, along with the directory, exit code, and a few other things, so you can query your history properly instead of grepping a text file.

  • 01

    Search by what happened

    Atuin stores the exit code, directory, duration, and hostname of every command. Filter for commands that succeeded, or search only the history of the project you're in.

  • 02

    History that follows you

    Sync is end-to-end encrypted and works with the hosted server or your own. Set up a new machine, log in, and your history is already there.

  • 03

    Nothing falls off the end

    There's no HISTSIZE limit and no truncation, and a shell crash doesn't lose history. Search is indexed, so it stays fast as the database grows.

ctrl-r with fzf ~/.zsh_history
> deploy   7/1432   just deploy staging > kubectl rollout status deploy/api
ctrl-r with Atuin synced · encrypted · 78,594 cmds
<tab> edit · <enter> run · exit 0 · ~/src/api 45s  1h ago  laptop  just deploy staging > 12s  now    ci-box  kubectl rollout status deploy/api [ DIRECTORY ] deploy

Prefer your own infra? The sync server is open source — self-host it.

Better together

You don't have to choose

Atuin binds ctrl-r, plus the up arrow if you want it. Everything else stays with fzf: ctrl-t for files, alt-c for directories, **<tab> completion, and whatever scripts are built around it. Running both is a common setup.

Getting started

Try it in two minutes

Install, run setup, then import your existing history. The whole thing takes about two minutes.

  1. 01 Install Atuin
    $curl --proto '=https' --tlsv1.2 -LsSf https://setup.atuin.sh | sh
  2. 02 Run setup
    $atuin setup
  3. 03 Import your history
    $atuin import auto

Want more detail? Read the docs.

FAQ

Frequently asked questions

Can I use Atuin and fzf together?

Yes, this is a common setup. Atuin takes ctrl-r for history search and fzf keeps everything else: files, directories, completion, pipelines. They don't conflict.

Does Atuin do fuzzy search like fzf?

Yes. Fuzzy is the default search mode, so the muscle memory you built with fzf carries over. There are also prefix and full-text modes when you want something stricter.

What happens to my existing shell history?

Run atuin import auto and Atuin reads your existing bash, zsh, or fish history into its database. New commands get recorded with full context from then on.

Do I have to sync my history?

No, sync is optional. Atuin works offline as a purely local history database. If you turn sync on, history is encrypted on your machine before upload, and the server can be self-hosted.

Is Atuin as fast as fzf?

Yes. Search hits an indexed SQLite database and stays instant even with years of history in it. Atuin is written in Rust.

Will Atuin break my existing shell setup?

No. It binds ctrl-r and, optionally, the up arrow; both are configurable. The rest of your bash, zsh, or fish config is left alone.