Tide vs Starship: Choosing the Right Shell Prompt in 2026

Quick Reference:
# Install Starship (any shell)
curl -sS https://starship.rs/install.sh | sh
echo 'eval "$(starship init bash)"' >> ~/.bashrc
# Install Tide (Fish only)
fisher install IlanCosman/tide@v6
tide configure
Your shell prompt is something you see thousands of times a day. The right prompt surfaces useful context without slowing you down. Tide and Starship are two popular options, but they solve the problem differently.
Overview
Starship is a cross-shell prompt written in Rust. It works with Bash, Zsh, Fish, PowerShell, and more. Configuration is done through a single TOML file.
Tide is a prompt specifically built for Fish shell. It leverages Fish's async capabilities and integrates deeply with Fish's features.
Quick Comparison
| Feature | Starship | Tide |
|---|---|---|
| Shells supported | Bash, Zsh, Fish, PowerShell, Ion, Elvish, Tcsh, Nushell, Xonsh, Cmd | Fish only |
| Language | Rust | Fish script |
| Config format | TOML | Interactive wizard |
| Async prompt | Partial | Full |
| Git performance | Good | Excellent |
| Custom modules | Yes | Limited |
| Transient prompt | Yes | Yes |
| Right prompt | Yes | Yes |
Installation
Starship
Works on any shell:
# Install binary
curl -sS https://starship.rs/install.sh | sh
# Or via package manager
brew install starship # macOS
pacman -S starship # Arch
cargo install starship # Rust
# Add to shell config
# Bash
echo 'eval "$(starship init bash)"' >> ~/.bashrc
# Zsh
echo 'eval "$(starship init zsh)"' >> ~/.zshrc
# Fish
echo 'starship init fish | source' >> ~/.config/fish/config.fish
Tide
Fish shell only:
# Install Fisher (Fish plugin manager)
curl -sL https://raw.githubusercontent.com/jorgebucaran/fisher/main/functions/fisher.fish | source && fisher install jorgebucaran/fisher
# Install Tide
fisher install IlanCosman/tide@v6
# Run interactive configuration
tide configure
Tide's wizard walks you through style choices interactively.
Performance
This is where the differences matter most for heavy terminal users.
Benchmark: Simple Directory
~/projects/myapp (no git)
| Prompt | Render Time |
|---|---|
| Tide | 2-4ms |
| Starship | 5-10ms |
Benchmark: Large Git Repository
~/linux-kernel (git, 1M+ objects)
| Prompt | Render Time |
|---|---|
| Tide | 8-15ms |
| Starship | 50-200ms |
Tide's Fish-native async handling gives it a significant edge in git repositories. The prompt renders immediately and updates git status in the background.
Why Tide is Faster
- Native Fish async - Tide uses Fish's event system to update git status without blocking
- No subprocess spawning - Pure Fish functions avoid fork overhead
- Lazy evaluation - Only computes what's visible
Starship's Async Limitations
Starship supports async for git status, but it's not as seamless:
# starship.toml
[git_status]
disabled = false
# Still slower than Tide in large repos
Configuration
Starship Configuration
Starship uses a single ~/.config/starship.toml:
# Minimal config
format = "$directory$git_branch$git_status$character"
[directory]
truncation_length = 3
truncate_to_repo = true
[git_branch]
format = "[$branch]($style) "
style = "purple"
[git_status]
format = '([$all_status$ahead_behind]($style) )'
style = "red"
[character]
success_symbol = "[❯](green)"
error_symbol = "[❯](red)"
# Kubernetes context
[kubernetes]
disabled = false
format = '[$context(\($namespace\))]($style) '
# AWS profile
[aws]
format = '[$profile]($style) '
Starship has 100+ built-in modules for languages, tools, and cloud providers.
Tide Configuration
Tide uses an interactive wizard:
tide configure
The wizard asks about:
- Powerline style vs classic
- Icons (Nerd Font required)
- Transient prompt
- Two-line vs one-line
For manual tweaks, Tide uses Fish universal variables:
# Change git icon
set -U tide_git_icon ''
# Customize colors
set -U tide_git_color_branch green
# Add/remove items
set -U tide_left_prompt_items pwd git newline character
set -U tide_right_prompt_items status cmd_duration context
Feature Comparison
Git Integration
Both show branch, status, and ahead/behind counts.
Starship:
[git_status]
ahead = "⇡${count}"
behind = "⇣${count}"
diverged = "⇕⇡${ahead_count}⇣${behind_count}"
staged = "+${count}"
modified = "!${count}"
Tide:
# Shows automatically with icons
# Customizable via tide_git_* variables
set -U tide_git_icon
set -U tide_git_color_staged yellow
Tide's git status is faster but less configurable. Starship offers granular control over every indicator.
Cloud/Kubernetes Context
Starship has native modules:
[kubernetes]
disabled = false
format = '[$context/$namespace]($style) '
contexts = [
{ context_pattern = "prod-*", style = "red bold" }
]
[aws]
format = '[$profile]($style) '
[gcloud]
format = '[$project]($style) '
Tide requires custom functions:
# Add custom item
function _tide_item_k8s
set -l ctx (kubectl config current-context 2>/dev/null)
test -n "$ctx" && echo -n "⎈ $ctx"
end
set -U tide_right_prompt_items status cmd_duration k8s
Language Version Display
Starship auto-detects and shows versions:
~/myproject
❯ node v20.11.0 | python 3.11.7 | go 1.22
Configure in TOML:
[nodejs]
format = "[$symbol$version]($style) "
symbol = " "
[python]
format = '[${symbol}${pyenv_prefix}(${version})]($style) '
Tide doesn't include language detection by default. You'd need custom functions.
Transient Prompt
Both support collapsing old prompts to save space.
Starship:
# Enable in shell config
function set_win_title(){
echo -ne "\033]0; $(basename "$PWD") \007"
}
starship_precmd_user_func="set_win_title"
Tide:
# Enable during configuration or:
set -U tide_prompt_transient_enabled true
When to Choose Starship
Choose Starship if you:
- Use multiple shells (Bash on servers, Zsh locally, PowerShell on Windows)
- Want a single config file across machines
- Need extensive cloud/language modules
- Prefer TOML-based declarative config
- Don't mind slightly slower git status
Example use case: SRE who SSHs into various servers (Bash), uses Zsh locally, and occasionally touches Windows machines.
When to Choose Tide
Choose Tide if you:
- Use Fish shell exclusively
- Work in large git repositories frequently
- Want zero-config good defaults
- Prefer interactive configuration
- Value prompt speed over configurability
Example use case: Developer who uses Fish everywhere, works on monorepos, and wants the fastest possible prompt.
Hybrid Approach
Some users run Tide locally and Starship on servers:
# ~/.config/fish/config.fish
if set -q SSH_CONNECTION
starship init fish | source
else
# Tide loads automatically via Fisher
end
This gives you Tide's speed locally and Starship's consistency on remote machines.
Migration Tips
From Oh-My-Zsh/Powerlevel10k to Starship
# Backup old config
mv ~/.zshrc ~/.zshrc.bak
# Minimal .zshrc
autoload -Uz compinit && compinit
eval "$(starship init zsh)"
From Starship to Tide
# Remove Starship
rm ~/.config/starship.toml
# Remove from config.fish
# Install Tide
fisher install IlanCosman/tide@v6
tide configure
Performance Optimization
Starship
Disable unused modules:
[aws]
disabled = true
[gcloud]
disabled = true
[docker_context]
disabled = true
Use scan_timeout:
scan_timeout = 10 # ms
command_timeout = 500
Tide
Tide is already optimized, but you can:
# Remove unused items
set -U tide_right_prompt_items status cmd_duration
# Disable git in large repos
set -U tide_git_truncation_length 50
Conclusion
Starship is the Swiss Army knife - works everywhere, configures everything, good enough performance for most users.
Tide is the specialist - Fish-only, but exceptionally fast and polished for that environment.
For most SRE/DevOps workflows involving multiple shells and cloud contexts, Starship's flexibility wins. For Fish devotees who prioritize speed in large repositories, Tide is hard to beat.
Optimizing your terminal workflow? Akmatori AI agents integrate with your shell environment to surface incident context exactly when you need it.
