Rohan Singh's Weblog

Writing about software, data science, and things I learn along the way.

Ghostty Terminal Setup on macOS

Ghostty is a fast, native terminal emulator built by Mitchell Hashimoto (of Terraform and Vagrant fame). It's GPU-accelerated, feels incredibly snappy, and comes with sensible defaults - but with the right config, it becomes something special.

Here's my complete setup. Copy these files and you'll have a beautiful, productive terminal in under 5 minutes.

qTtLjVV.md.png

What You'll Get

  • Catppuccin theme that auto-switches between light and dark mode with your system
  • JetBrains Mono Nerd Font (bundled with Ghostty — no extra install needed)
  • Semi-transparent window with background blur (the macOS frosted glass look)
  • Quake-style dropdown terminal via "Ctrl+`" — instant terminal from anywhere
  • Starship prompt — minimal, fast, and informative
  • Lazygit — a full git UI inside your terminal
  • Yazi — a blazing fast terminal file manager
  • Smart keybindings for tabs, splits, and font sizing

Step 1: Install Ghostty

Download from ghostty.org or build from source.

Ghostty ships with JetBrains Mono with Nerd Font Layer built in, so you don't need to install fonts separately.


Step 2: Ghostty Configuration

Open the Ghostty config with Cmd + , (This opens a plain text file - Ghostty is simple!)

Paste in the following:

# ============================================
# Ghostty Terminal Configuration
# ============================================
# Location: ~/Library/Application Support/com.mitchellh.ghostty/config
# Reload:   Cmd+Shift+,
# Docs:     ghostty +show-config --default --docs

# --- Typography ---
font-family = JetBrains Mono
font-size = 14
font-thicken = true
adjust-cell-height = 2

# --- Theme and Colors ---
# Automatic light/dark switching
theme = light:Atom One Light,dark:Catppuccin Mocha

# --- Window and Appearance ---
background-opacity = 0.9
background-blur-radius = 20
macos-titlebar-style = transparent
window-padding-x = 10
window-padding-y = 8
window-save-state = always
window-theme = auto

# --- Cursor ---
# No cursor-color set: Ghostty uses the theme's foreground color,
# which is dark in light mode and light in dark mode — always visible.
cursor-style = block
cursor-style-blink = false
# Makes the character under the cursor readable in both modes
cursor-text = cell-foreground

# --- Shell Integration ---
# Zsh shell integration overrides cursor-style with a blinking bar unless
# the cursor feature is explicitly disabled here.
shell-integration = zsh
shell-integration-features = no-cursor,sudo,title

# --- Mouse ---
mouse-hide-while-typing = true
copy-on-select = clipboard

# --- Quick Terminal (Quake-style dropdown) ---
quick-terminal-position = top
quick-terminal-screen = mouse
quick-terminal-autohide = true
quick-terminal-animation-duration = 0.15

# --- Security ---
clipboard-paste-protection = true
clipboard-paste-bracketed-safe = true

# --- Performance ---
scrollback-limit = 25000000

# --- Keybindings ---
# Tabs
keybind = cmd+t=new_tab
keybind = cmd+shift+left=previous_tab
keybind = cmd+shift+right=next_tab
keybind = cmd+w=close_surface

# Splits
keybind = cmd+d=new_split:right
keybind = cmd+shift+d=new_split:down
keybind = cmd+alt+left=goto_split:left
keybind = cmd+alt+right=goto_split:right
keybind = cmd+alt+up=goto_split:top
keybind = cmd+alt+down=goto_split:bottom
keybind = cmd+shift+e=equalize_splits
keybind = cmd+shift+f=toggle_split_zoom

# Font size
keybind = cmd+plus=increase_font_size:1
keybind = cmd+minus=decrease_font_size:1
keybind = cmd+zero=reset_font_size

# Config
keybind = cmd+shift+comma=reload_config

# Quick terminal global hotkey (Ctrl+`)
keybind = global:ctrl+grave_accent=toggle_quick_terminal

Why These Settings Matter

Setting What It Does
font-thicken = true Makes the font slightly bolder — easier on the eyes on Retina displays
adjust-cell-height = 2 Adds a bit of line spacing so code doesn't feel cramped
background-opacity = 0.9 Slight transparency lets your wallpaper peek through
background-blur-radius = 20 Frosted glass effect behind the transparent window
macos-titlebar-style = transparent Removes the default macOS title bar for a clean, minimal look
copy-on-select = clipboard Select text and it's automatically copied — no Cmd+C needed
quick-terminal-animation-duration = 0.15 Snappy dropdown animation (150ms)
clipboard-paste-protection = true Warns you before pasting potentially dangerous commands
scrollback-limit = 25000000 25MB of scrollback — you'll never lose output

Step 3: Starship Prompt

Starship is a cross-shell prompt that's fast (written in Rust) and highly customizable.

brew install starship

Create ~/.config/starship.toml:

| Add symbols as per your liking or remove symbols

command_timeout = 1000
right_format = "$aws"

[vagrant]
format = 'via [⍱ $version](bold white) '

[terraform]
format = 'via [$symbol$version $workspace]($style) '

[docker_context]
symbol = " "
format = 'via [$symbol $context](blue bold)'

[git_branch]
symbol = " "

[git_commit]
tag_symbol = '  '

[nodejs]
symbol = " "

This gives you: - Git branch shown with a branch icon - Node.js version when in a JS project - Docker context when active - Terraform workspace when in a TF project - AWS profile on the right side of the prompt


Step 4: Lazygit — A Full Git UI in Your Terminal

Lazygit gives you an interactive git interface without leaving the terminal. Stage files, write commits, manage branches, resolve merge conflicts, cherry-pick, rebase - all with keyboard shortcuts.

brew install lazygit

Run lazygit inside any git repo. You get visual staging, interactive rebase, merge conflict resolution, branch management, and a commit graph — all without memorizing git flags.

Key Action
Space Stage/unstage file
c Commit
p Push
P Pull
b Branch menu
] / [ Switch panels
Enter View file diff / expand
? Show all keybindings

Lazygit works beautifully inside a Ghostty split — press Cmd+D to split right, run lazygit in one pane, and keep your editor in the other.


Step 5: Yazi — A Fast Terminal File Manager

Yazi is a terminal file manager written in Rust. It's async, supports image previews natively in Ghostty, and uses vim-style keybindings. Think of it as a modern replacement for ls and cd — browse directories, preview files, and open them without leaving the terminal.

brew install yazi

Run yazi in any directory to start browsing.


Step 6: Shell Configuration

Add this to your ~/.zshrc:

# Starship prompt
eval "$(starship init zsh)"

# Zsh autosuggestions (fish-like suggestions as you type)
source $HOME/.zsh/zsh-autosuggestions/zsh-autosuggestions.zsh

Install zsh-autosuggestions:

git clone https://github.com/zsh-users/zsh-autosuggestions ~/.zsh/zsh-autosuggestions

Step 7: Keybinding Cheat Sheet

Ghostty

Shortcut Action
Cmd + , Open config file
Cmd + Shift + , Reload config
Ctrl + `` Toggle quick terminal (global — works from any app)
Cmd + T New tab
Cmd + W Close tab/split
Cmd + Shift + Left/Right Switch between tabs
Cmd + D Split right
Cmd + Shift + D Split down
Cmd + Alt + Arrow Keys Navigate between splits
Cmd + Shift + E Equalize split sizes
Cmd + Shift + F Zoom/unzoom current split
Cmd + Plus/Minus Increase/decrease font size
Cmd + 0 Reset font size

Quick Start (TL;DR)

# 1. Install everything
brew install starship lazygit yazi
git clone https://github.com/zsh-users/zsh-autosuggestions ~/.zsh/zsh-autosuggestions

# 2. Download Ghostty from https://ghostty.org

# 3. Open Ghostty, press Cmd+, to open config, paste the config from this post

# 4. Copy the Starship config to ~/.config/starship.toml

# 5. Add the shell config to ~/.zshrc

# 6. Press Cmd+Shift+, to reload — done!

The Workflow

Here's how all of this comes together in practice:

  1. Ctrl + `` — Summon the dropdown terminal from anywhere on your Mac
  2. yazi — Browse to your project directory
  3. Cmd + D — Split the terminal, run your editor on one side
  4. lazygit — Open lazygit in the other split to manage your git workflow
  5. Cmd + Shift + E — Equalize your splits when they get uneven

Everything runs natively, everything is fast, and everything looks great.

No Electron. No bloat. Just a terminal that gets out of your way.

qTtLwiB.md.png

Cheers

RS

← Back to writing