Features
- Official Catppuccin Mocha color palette with 26 eye-candy colors
- Powerline-style separators for seamless segment transitions
- Modular segments: model, directory, Git branch, token count
- Pastel aesthetics optimized for long coding sessions
- Git integration with branch display
- Nerd Font icons for visual clarity
- Conditional rendering (Git segment only in repositories)
- 256-color terminal support for accurate palette reproduction
Use Cases
- Developers already using Catppuccin theme in editor/terminal
- Users preferring soothing pastel aesthetics over harsh neon
- Teams standardizing on Catppuccin design system
- Visual continuity across Neovim, tmux, and Claude Code
- Reducing eye strain during extended AI-assisted coding sessions
- Accessibility-friendly color schemes for low-light environments
Requirements
- Claude Code CLI installed and configured
- Bash shell available (bash 4.0+ recommended for string manipulation)
- jq command-line JSON processor (jq 1.6+ recommended for safe extraction with // defaults)
- Terminal with 256-color mode support (required for accurate Catppuccin Mocha palette reproduction)
- Nerd Font installed and configured (required for Powerline separator glyphs: U+E0B0-U+E0B3)
- Git command-line tool (optional, for Git branch segment display)
Configuration
{
"statusLine": {
"type": "command",
"command": "$CLAUDE_PROJECT_DIR/.claude/statuslines/catppuccin-mocha-theme.sh",
"refreshInterval": 500
}
}
Examples
Enhanced Catppuccin Mocha with Cost Display
Extended version with cost information and additional segments
#!/usr/bin/env bash
# Enhanced Catppuccin Mocha Theme with Cost Display
input=$(cat)
model=$(echo "$input" | jq -r '.model.id // .model.display_name // "unknown"')
dir=$(echo "$input" | jq -r '.workspace.current_dir // "~"' | sed "s|$HOME|~|")
tokens=$(echo "$input" | jq -r '.session.totalTokens // 0')
cost=$(echo "$input" | jq -r '.cost.total_cost_usd // 0')
git_branch=$(git rev-parse --abbrev-ref HEAD 2>/dev/null || echo "")
# Catppuccin Mocha colors
BASE="\033[48;5;235m"
TEXT="\033[38;5;205m"
LAVENDER="\033[48;5;183m"
BLUE="\033[48;5;117m"
TEAL="\033[48;5;152m"
PEACH="\033[48;5;216m"
GREEN="\033[48;5;151m"
LAVENDER_FG="\033[38;5;183m"
BLUE_FG="\033[38;5;117m"
TEAL_FG="\033[38;5;152m"
PEACH_FG="\033[38;5;216m"
GREEN_FG="\033[38;5;151m"
RESET="\033[0m"
SEP="\ue0b0"
statusline=""
# Model segment
statusline+="${LAVENDER}${RESET}${TEXT} ${model} ${RESET}"
statusline+="${LAVENDER_FG}${SEP}${RESET}"
# Directory segment
statusline+=" ${BLUE}${RESET}${TEXT} ${dir} ${RESET}"
statusline+="${BLUE_FG}${SEP}${RESET}"
# Git branch segment
if [ -n "$git_branch" ]; then
statusline+=" ${TEAL}${RESET}${TEXT} ${git_branch} ${RESET}"
statusline+="${TEAL_FG}${SEP}${RESET}"
fi
# Token count segment
statusline+=" ${PEACH}${RESET}${TEXT} ${tokens} ${RESET}"
statusline+="${PEACH_FG}${SEP}${RESET}"
# Cost segment (Green)
if (( $(echo "$cost > 0" | bc -l 2>/dev/null || echo "0") )); then
statusline+=" ${GREEN}${RESET}${TEXT} $${cost} ${RESET}"
statusline+="${GREEN_FG}${SEP}${RESET}"
fi
echo -e "$statusline"
Catppuccin Mocha with Custom Segment Order
Configurable segment order via environment variables
#!/usr/bin/env bash
# Catppuccin Mocha Theme with Custom Segment Order
SEGMENT_ORDER=${CATPPUCCIN_SEGMENT_ORDER:-"model,dir,git,tokens"}
input=$(cat)
model=$(echo "$input" | jq -r '.model.id // .model.display_name // "unknown"')
dir=$(echo "$input" | jq -r '.workspace.current_dir // "~"' | sed "s|$HOME|~|")
tokens=$(echo "$input" | jq -r '.session.totalTokens // 0')
git_branch=$(git rev-parse --abbrev-ref HEAD 2>/dev/null || echo "")
# Catppuccin Mocha colors
TEXT="\033[38;5;205m"
LAVENDER="\033[48;5;183m"
BLUE="\033[48;5;117m"
TEAL="\033[48;5;152m"
PEACH="\033[48;5;216m"
LAVENDER_FG="\033[38;5;183m"
BLUE_FG="\033[38;5;117m"
TEAL_FG="\033[38;5;152m"
PEACH_FG="\033[38;5;216m"
RESET="\033[0m"
SEP="\ue0b0"
statusline=""
# Parse segment order and build statusline
IFS=',' read -ra SEGMENTS <<< "$SEGMENT_ORDER"
for segment in "${SEGMENTS[@]}"; do
case "$segment" in
model)
statusline+="${LAVENDER}${RESET}${TEXT} ${model} ${RESET}"
statusline+="${LAVENDER_FG}${SEP}${RESET}"
;;
dir)
statusline+=" ${BLUE}${RESET}${TEXT} ${dir} ${RESET}"
statusline+="${BLUE_FG}${SEP}${RESET}"
;;
git)
if [ -n "$git_branch" ]; then
statusline+=" ${TEAL}${RESET}${TEXT} ${git_branch} ${RESET}"
statusline+="${TEAL_FG}${SEP}${RESET}"
fi
;;
tokens)
statusline+=" ${PEACH}${RESET}${TEXT} ${tokens} ${RESET}"
statusline+="${PEACH_FG}${SEP}${RESET}"
;;
esac
done
echo -e "$statusline"
Catppuccin Mocha Theme Installation Example
Complete setup script with Nerd Font verification
#!/bin/bash
# Installation script for Catppuccin Mocha Theme
mkdir -p .claude/statuslines
# Check for Nerd Font (Powerline separators require Nerd Font)
echo "Checking for Nerd Font support..."
if echo -e "\ue0b0" | grep -q "\ue0b0"; then
echo "Nerd Font detected"
else
echo "Warning: Nerd Font may not be installed. Powerline separators may not display correctly."
echo "Install from: https://www.nerdfonts.com/"
echo "Recommended: JetBrains Mono Nerd Font, FiraCode Nerd Font"
fi
# Check terminal color support
echo "Checking terminal color support..."
if tput colors | grep -qE '^(256|[0-9]{3,})$'; then
echo "256-color mode supported"
else
echo "Warning: Terminal may not support 256 colors. Colors may appear incorrect."
fi
cat > .claude/statuslines/catppuccin-mocha-theme.sh << 'SCRIPT_EOF'
#!/usr/bin/env bash
# Paste the full statusline script from the primary example above before running this installer.
SCRIPT_EOF
chmod +x .claude/statuslines/catppuccin-mocha-theme.sh
# Add to settings.json
if [ ! -f .claude/settings.json ]; then
echo '{"statusLine":{"type":"command","command":"$CLAUDE_PROJECT_DIR/.claude/statuslines/catppuccin-mocha-theme.sh","refreshInterval":500}}' > .claude/settings.json
else
jq '.statusLine = {"type":"command","command":"$CLAUDE_PROJECT_DIR/.claude/statuslines/catppuccin-mocha-theme.sh","refreshInterval":500}' .claude/settings.json > .claude/settings.json.tmp
mv .claude/settings.json.tmp .claude/settings.json
fi
echo "Catppuccin Mocha Theme installed successfully!"
echo "Note: For best results, use a terminal with 256-color support and Nerd Font."
Troubleshooting
Colors look washed out or incorrect compared to official palette
Verify terminal supports 256 colors with 'tput colors' (should return 256). Enable true color if available: export COLORTERM=truecolor. Check terminal theme doesn't override ANSI colors. Verify color codes match Catppuccin Mocha palette: LAVENDER=183, BLUE=117, TEAL=152, PEACH=216. Test colors: echo -e '\033[48;5;183m LAVENDER \033[0m'.
Nerd Font icons showing as boxes or missing glyphs
Install Catppuccin-compatible Nerd Font from nerdfonts.com. Recommended: JetBrains Mono Nerd Font, FiraCode Nerd Font. Configure terminal to use installed font in preferences. Verify font includes Powerline glyphs (U+E0B0-U+E0B3). Test separator: echo -e '\ue0b0' (should show Powerline separator, not box).
Git branch not displaying even when in repository
Check Git installed: git --version. Verify you're in Git repo: git status. Ensure script has permission to execute git commands. Test manually: git rev-parse --abbrev-ref HEAD. Check error handling: git_branch=$(git rev-parse --abbrev-ref HEAD 2>/dev/null || echo ""). Verify Git command output is not empty.
Powerline separators misaligned or overlapping text
Verify Nerd Font properly installed with Powerline glyphs (U+E0B0-U+E0B3). Test separator: echo -e '\ue0b0'. Disable font ligatures if enabled. Increase terminal line spacing if needed. Check terminal font rendering settings. Verify separator character encoding: SEP="\ue0b0" (Unicode escape).
Statusline disappears or flickers on refresh
Increase refreshInterval to 1000ms in configuration: {"refreshInterval": 1000}. Check script permissions: chmod +x statusline.sh. Verify jq installed: jq --version. Test script manually with sample JSON input. Check for syntax errors: bash -n catppuccin-mocha-theme.sh.
Model or directory showing as 'unknown' or empty
Verify JSON structure: echo '$input' | jq '.model, .workspace'. Check field names: model.id, model.display_name, workspace.current_dir, workspace.project_dir. Test extraction: echo '$input' | jq -r '.model.id // .model.display_name // "unknown"'. Verify Claude Code is passing correct JSON structure.
Token count always showing 0
Check token field exists: echo '$input' | jq '.session.totalTokens, .cost.total_tokens'. Verify field name matches: session.totalTokens or cost.total_tokens. Test extraction: echo '$input' | jq -r '.session.totalTokens // .cost.total_tokens // 0'. Check Claude Code version supports token tracking.
Statusline output showing raw ANSI codes instead of colors
Verify echo -e flag is used for escape sequence interpretation. Check terminal supports ANSI colors: echo -e '\033[38;5;183mLAVENDER\033[0m'. Some terminals require explicit color support enabled. Check TERM environment variable: echo $TERM (should include 'xterm' or '256color'). Verify terminal emulator settings for color support.