Ghostty + Starship for ADHD Devs: A Terminal That Fights Back Against Brain Fog

terminalconfigworkflowadhdghosttystarship

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

ToolPurpose
GhosttyTerminal emulator — fast, native, Liquid Glass ready
StarshipCross-shell prompt — configurable, Rust-fast
JetBrains Mono Nerd FontIcons in ls, glyphs everywhere
Catppuccin LatteSoft light theme, easy on eyes all day
ezaColorized ls with icons and git status
batSyntax-highlighted cat
zsh-syntax-highlightingLive command validation as you type
zsh-autosuggestionsGhost completions from history
fzfFuzzy history search (Ctrl+R)
lazygitTUI 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 integrationshell-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 Altmacos-option-as-alt = true makes Option+Arrow jump between words in zsh. Essential for editing long commands without retyping.

Split navigationcmd+[ 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 seedRANDOM=$(( $(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

DependencyPurposeInstall
GhosttyTerminal emulatorghostty.org
JetBrains Mono Nerd FontIcons + glyphsbrew install --cask font-jetbrains-mono-nerd-font
Catppuccin LatteLight themeBuilt into Ghostty 1.2.0+
StarshipPromptbrew install starship
ezaColorized lsbrew install eza
batSyntax catbrew install bat
zsh-syntax-highlightingLive command colorbrew install zsh-syntax-highlighting
zsh-autosuggestionsHistory ghostsbrew install zsh-autosuggestions
fzfFuzzy history searchbrew install fzf
lazygitTUI gitbrew install lazygit
Claude CodeAI agentnpm install -g @anthropic-ai/claude-code