How to use zoxide
By Flavio Copes
Learn how to install and set up zoxide, then jump between frequently used directories with z, interactive selection, and frecency ranking.
zoxide is a smarter cd command.
It remembers the directories you use most often. You can then jump to one by typing a small part of its path.
Suppose I often work in this directory:
/Users/flavio/www/flaviocopes.com
With cd, I have to type the path or move through it one directory at a time.
With zoxide, I can type:
z flavio
zoxide finds the best match and takes me there.
Let’s set it up.
Install zoxide
On macOS, install zoxide with Homebrew:
brew install zoxide
On Linux and WSL, the project recommends its install script:
curl -sSfL https://raw.githubusercontent.com/ajeetdsouza/zoxide/main/install.sh | sh
On Windows, install it with winget:
winget install ajeetdsouza.zoxide
Installing the program is only the first step. You must also connect it to your shell.
Set up your shell
I use Zsh, which is the default shell on current macOS versions.
Add this line to the end of ~/.zshrc:
eval "$(zoxide init zsh)"
Then open a new terminal, or reload the file:
source ~/.zshrc
If you use Bash, add this to ~/.bashrc instead:
eval "$(zoxide init bash)"
Fish uses a different syntax in ~/.config/fish/config.fish:
zoxide init fish | source
For PowerShell, add this to your profile:
Invoke-Expression (& { (zoxide init powershell | Out-String) })
The initialization code creates the z and zi commands. It also teaches zoxide about the directories you visit.
Let zoxide learn your directories
Use the terminal normally after installing zoxide.
Move into your projects with cd as you already do:
cd ~/www/flaviocopes.com
cd ~/www/prototyped.dev
cd ~/www/thevalleyofcode.com
zoxide records those visits in its local database. Directories you use frequently get a higher rank.
You can also add a directory manually:
zoxide add ~/www/flaviocopes.com
You rarely need this. Visiting a directory is enough.
Jump with the z command
Once zoxide knows a directory, pass part of its name to z:
z flaviocopes
You do not need to start from the same parent directory. The match comes from zoxide’s database, not your current location.
You can pass multiple words when one is not enough:
z www myapp
Every term must appear in the path, in the same order. Matching is case-insensitive.
The last term normally matches the final directory name. For example, this can match ~/www/myapp:
z myapp
But it will not pick ~/www/myapp/archive because myapp is not the final directory in that path.
The z command also works like cd for normal paths:
z ..
z -
z ~/Downloads
z projects/
z .. moves to the parent directory. z - returns to the previous directory.
Choose a directory interactively with zi
Sometimes several directories match the same query.
Use zi to choose one interactively:
zi app
This opens an fzf list containing the matches. Start typing to filter it, move with the arrow keys, then press Enter.
Install fzf first if you do not already have it:
brew install fzf
On Linux, use your distribution’s package manager or follow the fzf installation instructions.
See what zoxide has learned
You can inspect the database with:
zoxide query --list --score
The output shows each directory and its current score.
To see only matches for a query, add a keyword:
zoxide query --list --score app
This is useful when z app goes somewhere you did not expect.
To remove a directory from the database, run:
zoxide remove ~/www/old-project
You can also open the interactive database editor:
zoxide edit
How zoxide decides where to go
zoxide uses frecency: a combination of frequency and recency.
Every directory starts with a score. Visiting it again increases that score. Recent visits count more than old ones when zoxide chooses between matches.
This makes the ranking adapt to your habits. A project you work on every day will beat an old directory with a similar name.
If zoxide picks the wrong directory, use more search terms or choose with zi. The ranking improves as you keep using it.
Replace cd with zoxide
zoxide can replace the cd command entirely.
For Zsh, initialize it like this:
eval "$(zoxide init zsh --cmd cd)"
Now cd gets zoxide’s matching behavior while still accepting regular paths.
I prefer keeping z and cd separate at first. The distinction is useful: cd means an exact path, while z means “find the directory I probably want.”
Once that feels natural, replacing cd is an option.
Exclude directories
You may have directories you never want zoxide to remember.
Set _ZO_EXCLUDE_DIRS before the zoxide init line in your shell configuration:
export _ZO_EXCLUDE_DIRS="$HOME/private/*:$HOME/tmp/*"
eval "$(zoxide init zsh)"
On macOS, Linux, and BSD, separate patterns with :. Windows uses ;.
This is useful for temporary build directories, mounted volumes, and folders whose names you do not want in the database.
Where zoxide fits
I would use zoxide for interactive terminal work, especially when moving between many projects every day.
I would not use it inside shell scripts. A script should use an explicit path because its behavior must not depend on one person’s directory history.
zoxide also needs a little time to learn. On a fresh installation, visit your main directories once or add them manually.
After that, z becomes one of those small commands that removes friction every time you open the terminal.
If you want to get more comfortable with paths, commands, and shell navigation first, start with my free Terminal Course.
Related posts about cli: