Ghostty + Starship for ADHD Devs: A Terminal That Fights Back Against Brain Fog
Last updated: 2026-03-08
Why Your Terminal Should Be Weird
Most terminal setups are optimized for looking professional in screenshots. Mine is optimized for a brain that needs novelty, immediate visual feedback, and a small burst of delight every time it opens a new shell.
I have ADHD. I run 2–4 Claude Code agents in parallel across git worktrees. I spend most of my day in the terminal, and I barely type commands myself anymore — mostly I just cd somewhere and type claude. So the terminal needs to be pleasant to look at, not functional in the traditional sense.
This is what I built.
The ADHD Terminal Design Principles
Before the config dump, here’s the underlying logic:
1. Color is information, not decoration.
ADHD brains struggle when text blurs together. Every visual distinction — red for errors, green for valid commands, cyan for directories, purple for git branches — reduces the cognitive load of scanning output. zsh-syntax-highlighting turns your commands red before you hit enter if they don’t exist. That’s a 0ms feedback loop.
2. Novelty keeps you engaged. A static prompt is invisible after day two. A random kaomoji on every enter key press means your brain registers the prompt instead of tuning it out. This is not a joke. Surprise = dopamine = noticing where you are.
3. Time externalization. ADHD brains are notoriously bad at tracking elapsed time. Millisecond timestamps on every prompt line turn time into a visible, external artifact. You didn’t feel 45 minutes pass — but the timestamps say you’ve been in this directory since 17:23. That’s useful.
4. Reduce friction to zero.
One alias. One command. No flags to remember. claude launches Claude Code in full-permissions mode. ls shows icons and colors. cat shows syntax-highlighted output. Every tool should do the smart thing automatically.
Stack
| Tool | Purpose |
|---|---|
| Ghostty | Terminal emulator — fast, native, Liquid Glass ready |
| Starship | Cross-shell prompt — configurable, Rust-fast |
| JetBrains Mono Nerd Font | Icons in ls, glyphs everywhere |
| Catppuccin Latte | Soft light theme, easy on eyes all day |
| eza | Colorized ls with icons and git status |
| bat | Syntax-highlighted cat |
| zsh-syntax-highlighting | Live command validation as you type |
| zsh-autosuggestions | Ghost completions from history |
| fzf | Fuzzy history search (Ctrl+R) |
| lazygit | TUI git — visual, no flags to remember |
Install everything:
brew install starship bat eza zsh-syntax-highlighting zsh-autosuggestions fzf lazygit
brew install --cask font-jetbrains-mono-nerd-font ghostty
Ghostty Config
Config location: ~/Library/Application Support/com.mitchellh.ghostty/config
# Weixiang's Ghostty — light, airy, and ready to build
# ─── Theme ───
theme = Catppuccin Latte
background-opacity = 0.92
# ─── Font ───
font-family = JetBrainsMono Nerd Font
font-size = 14
font-thicken = true
# ─── Window ───
window-padding-x = 16
window-padding-y = 12
window-height = 45
window-width = 160
window-title-font-family = JetBrainsMono Nerd Font
macos-titlebar-style = tabs
window-decoration = true
confirm-close-surface = false
macos-option-as-alt = true
# ─── Cursor ───
cursor-style = bar
cursor-style-blink = true
# ─── Shell ───
shell-integration = zsh
shell-integration-features = cursor,sudo,title
# ─── Splits & Tabs — for the multi-agent swarm life ───
keybind = cmd+shift+n=new_window
keybind = cmd+left_bracket=goto_split:previous
keybind = cmd+right_bracket=goto_split:next
Design decisions
Light mode (Catppuccin Latte) — Soft pastel light theme. The 92% opacity gives subtle translucency without being distracting. Note: as of Ghostty 1.2.0 the theme name is Catppuccin Latte (title case, space) not catppuccin-latte.
Big default window (45 rows × 160 cols) — Sized for immediately splitting into 2–3 panes. A typical multi-agent session:
┌──────────────────────────────┬──────────────────────────────┐
│ Claude Agent 1 │ Claude Agent 2 │
│ ~/Local_Dev/projects/ │ ~/Local_Dev/projects/ │
│ voxlight/ │ bythewei/ │
│ (TTS engine work) │ (whiteboard feature) │
├──────────────────────────────┼──────────────────────────────┤
│ Claude Agent 3 │ Shell │
│ ~/Local_Dev/projects/ │ (git, builds, testing) │
│ voxlight-mac/ │ │
└──────────────────────────────┴──────────────────────────────┘
Title integration — shell-integration-features = cursor,sudo,title makes each tab/split show its working directory in the title bar. Critical when you have 4 Claude Code sessions open and need to know which worktree is which at a glance.
Option as Alt — macos-option-as-alt = true makes Option+Arrow jump between words in zsh. Essential for editing long commands without retyping.
Split navigation — cmd+[ and cmd+] to hop between splits. No thinking required when bouncing between agents.
Starship Config
Config location: ~/.config/starship.toml
format = """
$env_var$time$directory$git_branch$git_status
╰─ """
[env_var.STARSHIP_KAOMOJI]
format = "[$env_value](bold magenta) "
variable = "STARSHIP_KAOMOJI"
[time]
disabled = false
format = "[$time](bold yellow) "
time_format = "%H:%M:%S%.3f"
[directory]
style = "bold cyan"
truncation_length = 3
[git_branch]
format = "[ $branch](bold purple) "
[git_status]
format = '([\[$all_status$ahead_behind\]](bold yellow) )'
ahead = "⬆"
behind = "⬇"
modified = "~"
untracked = "?"
staged = ""
deleted = ""
[character]
success_symbol = "[╰─](bold green)"
error_symbol = "[╰─](bold red)"
Each prompt line shows: random kaomoji · millisecond timestamp · current directory · git branch + status.
.zshrc
# ─── PATH ───
export PATH="/opt/homebrew/opt/postgresql@15/bin:$PATH"
export PATH="$HOME/.npm-global/bin:$PATH"
export PATH="$HOME/.claude:$PATH"
export PATH="$HOME/.local/bin:$PATH"
export PATH="$HOME/.antigravity/antigravity/bin:$PATH"
export PATH="$HOME/.maestro/bin:$PATH"
# ─── ENV ───
export CLAUDE_PERMISSION_MODE=permissionless
export OLLAMA_HOST=0.0.0.0:11434
# ─── Integrations ───
test -e "${HOME}/.iterm2_shell_integration.zsh" && source "${HOME}/.iterm2_shell_integration.zsh"
# ─── Aliases ───
alias claude="claude --dangerously-skip-permissions"
alias ls="eza --icons --color=always"
alias ll="eza --icons --color=always -la"
alias cat="bat"
# ─── Kaomoji prompt ───
function _random_kaomoji() {
local kaomojis=(
'(ノ◕ヮ◕)ノ*:・゚' '(`∀´)' '( •_•)>⌐■-■'
'(゚Д゚)' '(*´∀`*)' '( ´ ▽ ` )'
'(╯°□°)╯' 'ヽ(・∀・)ノ' '(´• ω •`)'
'( ˘ω˘ )' '(; ̄Д ̄)' '(ง •_•)ง'
'(*´▽`*)' 'ヾ(^∇^)' '(◕‿◕)'
'(^▽^)' '。◕‿◕。' '(っ˘ω˘ς)'
'\(٥⁀▽⁀)/' '(ノ´ヮ`)ノ*:・゚' 'ヽ(´▽`)/'
'(。‿。)' '( ・ω・)ノ' '(´,,•ω•,,`)'
'\(^o^)/' '(。◕‿◕。)' 'ヽ(°〇°)ノ'
'(◠‿◠)' '(⌒▽⌒)' '( ˶ˆ꒳ˆ˵ )'
'(ノ°▽°)ノ' 'o(≧▽≦)o' '(*^▽^*)'
'٩(◕‿◕。)۶' '(´∀`)' 'ヾ(*´∀`*)ノ'
'(ΦωΦ)' '(=^・ω・^=)' '( ´ω` )'
'ฅ(^・ω・^ฅ)' '(*´꒳`*)' '( •̀ω•́ )'
'(*・ω・)ノ' '(゚∀゚)' 'ヽ(;▽;)ノ'
'(´;ω;`)' '(;ω;)' '(T_T)'
'ヽ(゚▽゚)ノ' '(ω)' '( ͡° ͜ʖ ͡°)'
'(¬‿¬)' '(ಠ_ಠ)' 'ψ(`∇´)ψ'
'(╯°□°)╯︵ ┻━┻' '¯\_(ツ)_/¯' 'ᕕ( ᐛ )ᕗ'
'(⌐■_■)' 'ʕ•ᴥ•ʔ' '(=^▽^=)'
'(◍•ᴗ•◍)' '(๑ᴖ◡ᴖ๑)' '(҂◡_◡)'
)
echo "${kaomojis[$(( RANDOM % ${#kaomojis[@]} + 1 ))]}"
}
function starship_precmd_user_func() {
RANDOM=$(( $(date +%N) % 32768 ))
export STARSHIP_KAOMOJI=$(_random_kaomoji)
}
precmd_functions+=(starship_precmd_user_func)
# ─── Plugins ───
source $(brew --prefix)/share/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh
source $(brew --prefix)/share/zsh-autosuggestions/zsh-autosuggestions.zsh
# ─── fzf ───
eval "$(fzf --zsh)"
# ─── Starship ───
eval "$(starship init zsh)"
Key tricks
Nanosecond random seed — RANDOM=$(( $(date +%N) % 32768 )) reseeds zsh’s $RANDOM with nanoseconds on every prompt. Without this, $RANDOM cycles predictably and you get stuck on the same kaomoji for minutes.
precmd_functions — Starship exposes this hook so you can run arbitrary zsh before every prompt render. The kaomoji gets set as an env var (STARSHIP_KAOMOJI) which Starship then reads from $env_var.
Workflow
Open Ghostty
└─ cmd+d → split vertically
└─ cmd+shift+d → split horizontally
└─ cd ~/Local_Dev/projects/<project>
└─ claude → Claude Code, full permissions, no flags
└─ cmd+[ / cmd+] → hop between agent panes
└─ cmd+shift+n → new window for separate project
Every pane title shows its working directory. Every prompt shows a random kaomoji and millisecond timestamp. Commands turn green when valid, red when not. Git branch and status appear automatically when inside a repo.
The terminal is no longer a blank anxiety box. It is a small chaotic friend. (ノ◕ヮ◕)ノ*:・゚
Dependencies
| Dependency | Purpose | Install |
|---|---|---|
| Ghostty | Terminal emulator | ghostty.org |
| JetBrains Mono Nerd Font | Icons + glyphs | brew install --cask font-jetbrains-mono-nerd-font |
| Catppuccin Latte | Light theme | Built into Ghostty 1.2.0+ |
| Starship | Prompt | brew install starship |
| eza | Colorized ls | brew install eza |
| bat | Syntax cat | brew install bat |
| zsh-syntax-highlighting | Live command color | brew install zsh-syntax-highlighting |
| zsh-autosuggestions | History ghosts | brew install zsh-autosuggestions |
| fzf | Fuzzy history search | brew install fzf |
| lazygit | TUI git | brew install lazygit |
| Claude Code | AI agent | npm install -g @anthropic-ai/claude-code |