# Status Line Customization > **Status**: ✅ Configured > **Date**: 2025-10-17 ## Overview The status line displays real-time information at the bottom of your Claude Code terminal. It's configured to show: - 📁 Current directory (last 2 path segments) - 🌿 Git branch (if in a git repository) - ● Uncommitted changes indicator - 🕐 Current time ## Current Configuration **Location**: `.claude/statusline.sh` **Format**: `📁 project/subdir 🌿 main ● | 🕐 14:30` ### What's Displayed | Element | Description | Example | |---------|-------------|---------| | 📁 Directory | Last 2 path segments | `Claude Code Setup/subdir` | | 🌿 Branch | Current git branch | `main` | | ● Changes | Uncommitted changes indicator | Shows when dirty | | 🕐 Time | Current time (HH:MM) | `14:30` | ## Customization Options ### Adding More Information Edit [`.claude/statusline.sh`](.claude/statusline.sh) to add: #### 1. **Token Count / Context Usage** ```bash # This requires Claude Code to expose this info # Currently not available in status line script ``` #### 2. **Model Name** ```bash # Get from environment if set MODEL="${CLAUDE_MODEL:-sonnet}" echo "... | 🤖 $MODEL | ..." ``` #### 3. **Project Name** ```bash # From package.json or project config PROJECT=$(cat package.json 2>/dev/null | grep '"name"' | head -1 | cut -d'"' -f4) if [ -n "$PROJECT" ]; then echo "📦 $PROJECT | ..." fi ``` #### 4. **Git Commit Count** ```bash COMMIT_COUNT=$(git rev-list --count HEAD 2>/dev/null) if [ -n "$COMMIT_COUNT" ]; then echo "... | 📝 $COMMIT_COUNT commits | ..." fi ``` #### 5. **Pending Changes Count** ```bash CHANGED_FILES=$(git diff --name-only 2>/dev/null | wc -l) if [ "$CHANGED_FILES" -gt 0 ]; then echo "... | ✏️ $CHANGED_FILES files | ..." fi ``` #### 6. **Last Commit Time** ```bash LAST_COMMIT=$(git log -1 --format="%ar" 2>/dev/null) if [ -n "$LAST_COMMIT" ]; then echo "... | ⏰ $LAST_COMMIT | ..." fi ``` ### Color and Styling The status line supports ANSI escape codes: ```bash # Colors RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' # No Color # Example: Color git branch based on state if [ -z "$(git status --porcelain 2>/dev/null)" ]; then # Clean echo "🌿 ${GREEN}$GIT_BRANCH${NC}" else # Dirty echo "🌿 ${RED}$GIT_BRANCH${NC} ●" fi ``` ### Layout Options #### Left-Heavy Layout ```bash # More info on left, minimal on right echo "📁 $DIR 🌿 $BRANCH ● ✏️ $CHANGED_FILES | $TIME" ``` #### Center Information ```bash # Balance information echo "$DIR | 🌿 $BRANCH $STATUS | 🕐 $TIME" ``` #### Minimal Layout ```bash # Just essentials echo "$DIR | $BRANCH" ``` ### Dynamic Padding Adjust spacing based on terminal width: ```bash # Get terminal width TERM_WIDTH=$(tput cols) # Calculate available space # Adjust content based on width if [ "$TERM_WIDTH" -lt 80 ]; then # Narrow terminal - minimal info echo "$DIR | $TIME" else # Wide terminal - full info echo "📁 $DIR 🌿 $BRANCH ● ✏️ $CHANGED 📝 $COMMITS | 🕐 $TIME" fi ``` ## Example Configurations ### Configuration 1: Developer Focus ```bash #!/usr/bin/env bash BRANCH=$(git branch 2>/dev/null | grep '^\*' | sed 's/^\* //') CHANGED=$(git diff --name-only 2>/dev/null | wc -l) STAGED=$(git diff --cached --name-only 2>/dev/null | wc -l) echo "🌿 $BRANCH | ✏️ $CHANGED modified | ✅ $STAGED staged" ``` ### Configuration 2: Project Overview ```bash #!/usr/bin/env bash PROJECT=$(basename $(pwd)) BRANCH=$(git branch 2>/dev/null | grep '^\*' | sed 's/^\* //') COMMITS=$(git rev-list --count HEAD 2>/dev/null) echo "📦 $PROJECT | 🌿 $BRANCH | 📝 $COMMITS commits" ``` ### Configuration 3: Time Tracking ```bash #!/usr/bin/env bash SESSION_START=${SESSION_START:-$(date +%s)} CURRENT=$(date +%s) DURATION=$((CURRENT - SESSION_START)) MINUTES=$((DURATION / 60)) echo "⏱️ Session: ${MINUTES}m | 🕐 $(date +%H:%M)" ``` ### Configuration 4: Full Featured ```bash #!/usr/bin/env bash # Directory DIR=$(pwd | awk -F/ '{print $(NF-1)"/"$NF}') # Git info BRANCH=$(git branch 2>/dev/null | grep '^\*' | sed 's/^\* //') if [ -n "$BRANCH" ]; then AHEAD=$(git rev-list @{u}..HEAD 2>/dev/null | wc -l) BEHIND=$(git rev-list HEAD..@{u} 2>/dev/null | wc -l) GIT_INFO="🌿 $BRANCH" if [ "$AHEAD" -gt 0 ]; then GIT_INFO="$GIT_INFO ↑$AHEAD" fi if [ "$BEHIND" -gt 0 ]; then GIT_INFO="$GIT_INFO ↓$BEHIND" fi if [ -n "$(git status --porcelain 2>/dev/null)" ]; then GIT_INFO="$GIT_INFO ●" fi else GIT_INFO="" fi # Time TIME="🕐 $(date +%H:%M:%S)" # Output echo "📁 $DIR | $GIT_INFO | $TIME" ``` ## Troubleshooting ### Status Line Not Showing 1. Check script is executable: `chmod +x .claude/statusline.sh` 2. Verify settings.json syntax is correct 3. Test script manually: `bash .claude/statusline.sh` 4. Check Claude Code logs: `.claude/logs/` ### Slow Performance If status line updates feel slow: ```bash # Cache expensive operations # Example: Cache git status for 5 seconds CACHE_FILE="/tmp/claude_statusline_cache" CACHE_AGE=5 if [ -f "$CACHE_FILE" ] && [ $(($(date +%s) - $(stat -c %Y "$CACHE_FILE"))) -lt $CACHE_AGE ]; then cat "$CACHE_FILE" else # Generate status line OUTPUT="📁 $(pwd) | ..." echo "$OUTPUT" | tee "$CACHE_FILE" fi ``` ### Script Errors Enable debugging: ```bash #!/usr/bin/env bash set -x # Print commands as they execute # Your status line code ``` View errors in Claude Code logs or run manually: ```bash bash .claude/statusline.sh 2>&1 ``` ## Best Practices ### Performance - Keep scripts fast (< 100ms execution time) - Cache expensive operations - Avoid network calls - Use built-in commands over external tools ### Information Density - Don't overcrowd the status line - Prioritize most useful information - Consider terminal width - Use abbreviations for long text ### Visual Design - Use emoji icons sparingly - Consider colorblind users (don't rely only on color) - Test in different terminal emulators - Ensure readability in light and dark themes ### Maintainability - Comment complex logic - Use functions for reusability - Test edge cases (no git repo, etc.) - Document custom icons/abbreviations ## Advanced: Conditional Status Lines Show different info based on context: ```bash #!/usr/bin/env bash # Detect context if [ -f "package.json" ]; then # Node.js project PKG_NAME=$(cat package.json | grep '"name"' | head -1 | cut -d'"' -f4) PKG_VERSION=$(cat package.json | grep '"version"' | head -1 | cut -d'"' -f4) echo "📦 $PKG_NAME v$PKG_VERSION | 🌿 $(git branch 2>/dev/null | grep '^\*' | sed 's/^\* //')" elif [ -f "Cargo.toml" ]; then # Rust project PKG_NAME=$(grep '^name' Cargo.toml | head -1 | cut -d'"' -f2) echo "🦀 $PKG_NAME | 🌿 $(git branch 2>/dev/null | grep '^\*' | sed 's/^\* //')" elif [ -f "requirements.txt" ] || [ -f "pyproject.toml" ]; then # Python project echo "🐍 Python | 🌿 $(git branch 2>/dev/null | grep '^\*' | sed 's/^\* //')" else # Generic echo "📁 $(basename $(pwd)) | 🌿 $(git branch 2>/dev/null | grep '^\*' | sed 's/^\* //')" fi ``` ## Disabling Status Line Temporarily disable: ```bash # In current session /settings statusLine.type none ``` Permanently disable: ```json // Remove or comment out in .claude/settings.json // "statusLine": { ... } ``` ## Related Features - **Hooks**: Run commands on events - **Output Styles**: Change Claude's response format - **Behaviors**: Modify Claude's behavior patterns ## Resources - [Official Status Line Docs](https://docs.claude.com/en/docs/claude-code/status-line-configuration) - [ANSI Color Codes](https://en.wikipedia.org/wiki/ANSI_escape_code) - [Bash Scripting Guide](https://www.gnu.org/software/bash/manual/) --- **Configuration Version**: 1.0.0 **Last Updated**: 2025-10-17 **Maintainer**: [Your Name]