My Terminal Setup: Ghostty + Zsh Configuration for a Modern Development Environment


Setting up a productive terminal environment is crucial for any developer. After experimenting with various terminal emulators and shell configurations, I've settled on a powerful combination: Ghostty terminal with a heavily customized Zsh setup. Here's a deep dive into my configuration that has significantly improved my daily workflow.
Why This Setup?
Before diving into the configuration details, let me explain why I chose this particular combination:
Ghostty: A fast, feature rich terminal emulator with excellent macOS integration
Zsh with Oh My Zsh: Powerful shell with extensive plugin ecosystem
Modern CLI tools: Enhanced versions of traditional Unix tools for better productivity
Ghostty Terminal Configuration
Ghostty is my terminal emulator of choice due to its performance and customization options. Here's my configuration breakdown:
Visual Aesthetics
theme = Brogrammer
font-size = 14
font-family = JetBrainsMonoNL Nerd Font Mono
background-opacity = 0.9
background-blur-radius = 20
macos-icon = xray
Key choices explained:
Brogrammer theme: A dark, high contrast theme that's easy on the eyes during long coding sessions
JetBrains Mono Nerd Font: Excellent for coding with ligatures and icon support
Semi-transparent background: Creates a modern, layered desktop experience while maintaining readability
macOS Integration
macos-titlebar-style = transparent
macos-option-as-alt = true
window-padding-balance = true
window-save-state = always
window-colorspace = "display-p3"
These settings ensure Ghostty feels native on macOS while providing enhanced functionality like proper Alt key behavior and state persistence.
User Experience Enhancements
mouse-hide-while-typing = true
cursor-style-blink = false
cursor-invert-fg-bg = true
desktop-notifications = true
Small details that make a big difference in daily usage the cursor stays visible but doesn't blink (less distracting), and the mouse automatically hides when typing.
Zsh Configuration Deep Dive
My Zsh setup is built around Oh My Zsh with carefully selected plugins and modern CLI tool integrations.
Core Framework Setup
export ZSH="$HOME/.oh-my-zsh"
ZSH_THEME="" # Using Starship instead
plugins=(git zsh-syntax-highlighting zsh-autosuggestions z fzf-tab)
Plugin breakdown:
git: Essential Git aliases and branch information
zsh-syntax-highlighting: Real time command syntax highlighting
zsh-autosuggestions: Fish like autosuggestions based on history
z: Smart directory jumping based on frequency
fzf-tab: Fuzzy finder integration for tab completion
Modern CLI Tools Integration
FZF (Fuzzy Finder)
source <(fzf --zsh)
export FZF_DEFAULT_OPTS="--height 40% --layout=reverse --border"
export FZF_CTRL_T_OPTS="
--walker-skip .git,node_modules,target
--preview 'bat -n --color=always {}'
--bind 'ctrl-/:change-preview-window(down|hidden|)'
"
FZF transforms how I navigate files and command history. The preview integration with bat
shows file contents instantly.
Enhanced Directory Listing with Eza
alias l="eza --icons"
alias ls="eza --icons"
alias ll="eza -lg --icons"
alias la="eza -lag --icons"
alias lt="eza -lTg --icons" # Tree view
Eza replaces ls
with a modern, colorful alternative that shows file icons and better formatting.
Starship Prompt
eval "$(starship init zsh)"
Starship provides a fast, customizable prompt that shows relevant context (Git status, Python virtual env, etc.) without being overwhelming.
Development Environment Setup
Programming Languages
export JAVA_HOME=$(/usr/libexec/java_home -v 21)
export PATH="$HOME/go/bin:$PATH"
export PNPM_HOME="/Users/sarth/Library/pnpm"
eval "$(rbenv init - zsh)"
Configured paths for Java 21, Go, Node.js (via pnpm), and Ruby (via rbenv).
Editor Integration
export EDITOR="nvim"
export VISUAL="nvim"
Neovim as the default editor for Git commits and other CLI operations.
Smart Git Workflows
I've created several FZF-integrated Git aliases that make version control much more interactive:
alias gafzf='git ls-files -m -o --exclude-standard | grep -v "__pycache__" | fzf -m --print0 | xargs -0 -o -t git add'
alias gbfzf='git branch | fzf | xargs git checkout'
alias grfzf='git diff --name-only | fzf -m --print0 | xargs -0 -o -t git restore'
These allow me to:
Select multiple files to stage using fuzzy search
Switch branches interactively
Restore files with visual selection
File Management Integration
Yazi File Manager
function y() {
local tmp="$(mktemp -t "yazi-cwd.XXXXXX")" cwd
yazi "$@" --cwd-file="$tmp"
IFS= read -r -d '' cwd < "$tmp"
[ -n "$cwd" ] && [ "$cwd" != "$PWD" ] && builtin cd -- "$cwd"
rm -f -- "$tmp"
}
This function integrates Yazi (a TUI file manager) so that when I exit, my shell's working directory updates to match where I navigated in Yazi.
Zoxide for Smart Navigation
eval "$(zoxide init --cmd cd zsh)"
Zoxide learns my directory usage patterns and lets me jump to frequently used directories with just a few characters.
The Result: A Cohesive Workflow
This configuration creates a terminal environment where:
Visual appeal meets functionality - The semi-transparent Ghostty window with blur effects looks modern while the Brogrammer theme ensures readability
Intelligent autocompletion - Between zsh-autosuggestions, fzf-tab, and various fuzzy finder integrations, I rarely type full commands or paths
Context-aware prompt - Starship shows exactly what I need to know about my current environment
Seamless Git integration - Interactive file selection and branch switching make version control effortless
Modern tool replacements - Enhanced versions of basic commands (ls → eza, cd → zoxide) that provide more information and better UX
Tips for Adopting This Setup
If you're interested in trying a similar configuration:
Start with the basics: Install Oh My Zsh and a few essential plugins first
Add tools gradually: Don't try to adopt every tool at once - add them one by one as you get comfortable
Customize to your needs: My aliases and functions reflect my workflow - adapt them to yours
Use Nerd Fonts: Essential for proper icon display in modern CLI tools
Experiment with themes: Both terminal and shell themes can significantly impact your daily experience
Performance Considerations
This setup is optimized for performance:
Starship is written in Rust and starts quickly
Lazy loading for some features to avoid startup delays
Efficient plugin selection to minimize shell startup time
The result is a terminal that starts fast but provides powerful functionality when needed.
Conclusion
A well configured terminal environment is an investment in your productivity. This setup has transformed how I interact with my development environment, making common tasks faster and more enjoyable. The combination of modern tools with thoughtful configuration creates a workspace that feels both powerful and pleasant to use.
Whether you adopt this exact configuration or use it as inspiration for your own setup, the key is finding tools that enhance rather than complicate your workflow. Happy coding!
What's your terminal setup like? I'd love to hear about your favorite tools and configurations in the comments below.
Subscribe to my newsletter
Read articles from Sarthak W directly inside your inbox. Subscribe to the newsletter, and don't miss out.
Written by
