Setup

My Fish Shell Config (2025 Update)

I still love Fish, but I've updated my setup quite a bit since my original post. The big changes? I switched to Ghostty as my terminal and I'm using Starship for my prompt now. Here's how it all works together.

Wolfgang Rittner

November 26, 2025 · 5 min read

Let's talk

The Stack

  • Fish - Still my shell of choice
  • Ghostty - Fast, native macOS terminal
  • Starship - Cross-shell prompt that looks beautiful

Ghostty

I recently switched to Ghostty, and honestly, it's been great. It's GPU-accelerated, feels native on macOS, and the configuration is dead simple. It feels more modern than Terminal.app that ships with macOS and it's straight-forward to set up properly.

Installation

bash
brew install ghostty

Configuration

My config lives at ~/.config/ghostty/config and looks like this:

bash
font-family = "SauceCodePro Nerd Font Mono"
font-size = 14
theme = "Monokai Pro Spectrum"
background-opacity = 0.95
background-blur = true
window-padding-x = 10,10
window-padding-y = 5,10

keybind = cmd+alt+right=next_tab
keybind = cmd+alt+left=previous_tab
keybind = shift+enter=text:\x1b\r
~/.config/ghostty/config

Nothing fancy - I'm using a Nerd Font (more on that in a bit), the Monokai Pro Spectrum theme, and some light transparency with blur. The keybindings let me navigate tabs with Cmd+Alt+Arrow and the shift+enter binding lets you insert a newline without executing the command - handy for writing multi-line commands.

Fish

Installation hasn't changed much from before:

bash
brew install fish
echo /opt/homebrew/bin/fish | sudo tee -a /etc/shells
chsh -s /opt/homebrew/bin/fish
Install fish, add it to the system's list of shells and set it as default shell.

My ~/.config/fish/config.fish is also pretty minimal these days:

fish
if status is-interactive
    # Commands to run in interactive sessions can go here

    # Getting rid of "last login" message and fish's greeting
    touch ~/.hushlogin
    set -U fish_greeting

    # activate https://starship.rs/
    starship init fish | source

    # add ./bin to path for bundler binstubs
    set -gx PATH ./bin $PATH
end

# Added by LM Studio CLI (lms)
set -gx PATH $PATH /Users/wr/.lmstudio/bin

# Added by OrbStack: command-line tools and integration
source ~/.orbstack/shell/init2.fish 2>/dev/null || :

mise activate fish | source
~/.config/fish/config.fish

The main additions here are Starship initialization and Mise integration. I'm using Mise for version management these days (Ruby, Node, etc.) but that's probably a separate blog post 😄.

Starship

This is the real game-changer. Starship is a cross-shell prompt written in Rust, and it's both fast and beautiful. I'm using the Gruvbox theme which matches perfectly with my terminal colors.

Installation

bash
brew install starship
mkdir -p ~/.config
starship preset gruvbox-rainbow -o ~/.config/starship.toml
Install starship and gruvbox theme

I started with the Gruvbox preset and tweaked it from there. Here's what my prompt shows:

  • OS icon (that little Apple logo)
  • Username
  • Current directory
  • Git branch and status
  • Programming language versions (Ruby, Node, Python, Go, Rust, etc.)
  • Docker context when relevant
  • Shell indicator (shows a 🐟 icon, or bash or zsh if I switch shells temporarily)

The cool part is that it automatically detects what's relevant. In a Ruby project? It shows the Ruby version. In a Node project? Node version appears. Simple.

The Config

My full ~/.config/starship.toml is quite long, but here are the highlights:

toml
palette = 'gruvbox_dark'

# ...

[os]
disabled = false
style = "bg:color_orange fg:color_fg0"

[os.symbols]
Macos = "󰀵"

[username]
show_always = true
style_user = "bg:color_orange fg:color_fg0"
format = '[ $user ]($style)'

[directory]
style = "fg:color_fg0 bg:color_yellow"
format = "[ $path ]($style)"
truncation_length = 3
truncation_symbol = "…/"

[git_branch]
symbol = ""
style = "bg:color_aqua"
format = '[[ $symbol $branch ](fg:color_fg0 bg:color_aqua)]($style)'

[shell]
disabled = false
fish_indicator = ''
bash_indicator = "bash"
zsh_indicator = "zsh"
style = "bg:color_bg1"
format = '[[ $indicator](fg:color_fg0 bg:color_bg1)]($style)'
~/.config/starship.toml

The whole config is modular - each segment (OS, directory, git, language, etc.) has its own styling and can be enabled/disabled independently.

Nerd Fonts

One thing you'll need: a Nerd Font. These are patched fonts that include all those fancy icons you see in modern terminal prompts. I'm using "SauceCodePro Nerd Font Mono" but there are tons of options.

You can install them via Homebrew:

bash
brew tap homebrew/cask-fonts
brew install font-sauce-code-pro-nerd-font
Install Nerd Font

The Result

The whole setup feels snappy and looks clean. Ghostty's GPU acceleration means everything is smooth, Starship gives me all the context I need at a glance, and Fish still does its magic with autocompletion and sensible defaults.

If you're curious about any of the config files, I can share them (maybe I should finally set up a dotfiles repo 🤔).

Still loving Fish after all these years. Are you using it too? Got any cool tips or configurations? Let me know!


FAQs

Q: Can I use Starship with Zsh or Bash instead of Fish?
A: Yep! That's one of Starship's best features - it works with any shell. The configuration is exactly the same, you just change the init command. The same starship.toml config should work across all shells. But you miss out on fish! 😞

Q: Does this setup work on Linux?
A: Absolutely! Fish, Starship, Ghostty, and Nerd Fonts all work great on Linux. Ghostty is even the new default terminal on Omarchy Linux - btw - and it already comes with Starship. The configs would be identical - same paths, same settings. The only difference would be how you install things (apt/dnf/pacman instead of Homebrew, depending on your distro).

Q: How do I customize my Starship prompt further?
A: The Starship documentation is excellent. Each module (directory, git, language versions, etc.) has tons of options. Want to change colors? Edit the palette. Waant to hide the username? Set [username].disabled = true. Best start with a preset like I did, then tweak from there - the config is really well structured.

Care about developer experience?
Let's chat.

Let's talk