Skip to content

Custom Paths

ccusage supports flexible path configuration to handle various Claude Code installation scenarios and custom data locations.

Overview

By default, ccusage automatically detects Claude Code data in standard locations. However, you can customize these paths for:

  • Multiple Claude installations - Different versions or profiles
  • Custom data locations - Non-standard installation directories
  • Shared environments - Team or organization setups
  • Backup/archive analysis - Analyzing historical data from different locations

CLAUDE_CONFIG_DIR Environment Variable

The primary method for specifying custom paths is the CLAUDE_CONFIG_DIR environment variable.

Single Custom Path

Specify one custom directory:

bash
# Set environment variable
export CLAUDE_CONFIG_DIR="/path/to/your/claude/data"

# Use with any command
ccusage daily
ccusage monthly --breakdown
ccusage blocks --live

Example scenarios:

bash
# Custom installation location
export CLAUDE_CONFIG_DIR="/opt/claude-code/.claude"

# User-specific directory
export CLAUDE_CONFIG_DIR="/home/username/Documents/claude-data"

# Network drive
export CLAUDE_CONFIG_DIR="/mnt/shared/claude-usage"

Multiple Custom Paths

Specify multiple directories separated by commas:

bash
# Multiple installations
export CLAUDE_CONFIG_DIR="/path/to/claude1,/path/to/claude2"

# Current and archived data
export CLAUDE_CONFIG_DIR="~/.claude,/backup/claude-archive"

# Team member data aggregation
export CLAUDE_CONFIG_DIR="/team/alice/.claude,/team/bob/.claude,/team/charlie/.claude"

When multiple paths are specified:

  • Data aggregation - Usage from all paths is automatically combined
  • Automatic filtering - Invalid or empty directories are silently skipped
  • Consistent reporting - All reports show unified data across paths

Default Path Detection

Standard Locations

When CLAUDE_CONFIG_DIR is not set, ccusage searches these locations automatically:

  1. ~/.config/claude/projects/ - New default (Claude Code v1.0.30+)
  2. ~/.claude/projects/ - Legacy location (pre-v1.0.30)

Version Compatibility

Breaking Change

Claude Code v1.0.30 moved data from ~/.claude to ~/.config/claude without documentation. ccusage handles both locations automatically for seamless compatibility.

Migration Scenarios

Scenario 1: Fresh Installation

bash
# Claude Code v1.0.30+ - uses new location
ls ~/.config/claude/projects/

# ccusage automatically finds data
ccusage daily

Scenario 2: Upgraded Installation

bash
# Old data still exists
ls ~/.claude/projects/

# New data in new location
ls ~/.config/claude/projects/

# ccusage combines both automatically
ccusage daily  # Shows data from both locations

Scenario 3: Manual Migration

bash
# If you moved data manually
export CLAUDE_CONFIG_DIR="/custom/location/claude"
ccusage daily

Path Structure Requirements

Expected Directory Structure

ccusage expects this directory structure:

claude-data-directory/
├── projects/
│   ├── project-1/
│   │   ├── session-1/
│   │   │   ├── file1.jsonl
│   │   │   └── file2.jsonl
│   │   └── session-2/
│   │       └── file3.jsonl
│   └── project-2/
│       └── session-3/
│           └── file4.jsonl

Validation

ccusage validates paths by checking:

  • Directory exists and is readable
  • Contains projects/ subdirectory
  • Has JSONL files in the expected structure

Invalid paths are automatically skipped with debug information available.

Common Use Cases

Multiple Claude Profiles

If you use multiple Claude profiles or installations:

bash
# Work profile
export CLAUDE_CONFIG_DIR="/Users/username/.config/claude-work"

# Personal profile
export CLAUDE_CONFIG_DIR="/Users/username/.config/claude-personal"

# Combined analysis
export CLAUDE_CONFIG_DIR="/Users/username/.config/claude-work,/Users/username/.config/claude-personal"

Team Environments

For team usage analysis:

bash
# Individual analysis
export CLAUDE_CONFIG_DIR="/shared/claude-data/$USER"
ccusage daily

# Team aggregate
export CLAUDE_CONFIG_DIR="/shared/claude-data/alice,/shared/claude-data/bob"
ccusage monthly --breakdown

Development vs Production

Separate environments:

bash
# Development environment
export CLAUDE_CONFIG_DIR="/dev/claude-data"
ccusage daily --since 20250101

# Production environment
export CLAUDE_CONFIG_DIR="/prod/claude-data"
ccusage daily --since 20250101

Historical Analysis

Analyzing archived or backup data:

bash
# Current month
export CLAUDE_CONFIG_DIR="~/.config/claude"
ccusage monthly

# Compare with previous month backup
export CLAUDE_CONFIG_DIR="/backup/claude-2024-12"
ccusage monthly --since 20241201 --until 20241231

# Combined analysis
export CLAUDE_CONFIG_DIR="~/.config/claude,/backup/claude-2024-12"
ccusage monthly --since 20241201

Shell Integration

Setting Persistent Environment Variables

Bash/Zsh

Add to ~/.bashrc, ~/.zshrc, or ~/.profile:

bash
# Default Claude data directory
export CLAUDE_CONFIG_DIR="$HOME/.config/claude"

# Or multiple directories
export CLAUDE_CONFIG_DIR="$HOME/.config/claude,$HOME/.claude"

Fish Shell

Add to ~/.config/fish/config.fish:

fish
# Default Claude data directory
set -gx CLAUDE_CONFIG_DIR "$HOME/.config/claude"

# Or multiple directories
set -gx CLAUDE_CONFIG_DIR "$HOME/.config/claude,$HOME/.claude"

Temporary Path Override

For one-time analysis without changing environment:

bash
# Temporary override for single command
CLAUDE_CONFIG_DIR="/tmp/claude-backup" ccusage daily

# Multiple commands with temporary override
(
  export CLAUDE_CONFIG_DIR="/archive/claude-2024"
  ccusage daily --json > 2024-report.json
  ccusage monthly --breakdown > 2024-monthly.txt
)

Aliases and Functions

Create convenient aliases:

bash
# ~/.bashrc or ~/.zshrc
alias ccu-work="CLAUDE_CONFIG_DIR='/work/claude' ccusage"
alias ccu-personal="CLAUDE_CONFIG_DIR='/personal/claude' ccusage"
alias ccu-archive="CLAUDE_CONFIG_DIR='/archive/claude' ccusage"

# Usage
ccu-work daily
ccu-personal monthly --breakdown
ccu-archive session --since 20240101

Or use functions for more complex setups:

bash
# Function to analyze specific time periods
ccu-period() {
  local period=$1
  local path="/archive/claude-$period"

  if [[ -d "$path" ]]; then
    CLAUDE_CONFIG_DIR="$path" ccusage daily --since "${period}01" --until "${period}31"
  else
    echo "Archive not found: $path"
  fi
}

# Usage
ccu-period 202412  # December 2024
ccu-period 202501  # January 2025

MCP Integration with Custom Paths

When using ccusage as an MCP server with custom paths:

Claude Desktop Configuration

json
{
	"mcpServers": {
		"ccusage": {
			"command": "ccusage",
			"args": ["mcp"],
			"env": {
				"CLAUDE_CONFIG_DIR": "/path/to/your/claude/data"
			}
		},
		"ccusage-archive": {
			"command": "ccusage",
			"args": ["mcp"],
			"env": {
				"CLAUDE_CONFIG_DIR": "/archive/claude-2024,/archive/claude-2025"
			}
		}
	}
}

This allows you to have multiple MCP servers analyzing different data sets.

Troubleshooting Custom Paths

Path Validation

Check if your custom path is valid:

bash
# Test path manually
ls -la "$CLAUDE_CONFIG_DIR/projects/"

# Run with debug output
ccusage daily --debug

Common Issues

Path Not Found

bash
# Error: Directory doesn't exist
export CLAUDE_CONFIG_DIR="/nonexistent/path"
ccusage daily
# Result: No data found

# Solution: Verify path exists
ls -la /nonexistent/path

Permission Issues

bash
# Error: Permission denied
export CLAUDE_CONFIG_DIR="/root/.claude"
ccusage daily  # May fail if no read permission

# Solution: Check permissions
ls -la /root/.claude

Multiple Paths Syntax

bash
# Wrong: Using semicolon or space
export CLAUDE_CONFIG_DIR="/path1;/path2"  # ❌
export CLAUDE_CONFIG_DIR="/path1 /path2"  # ❌

# Correct: Using comma
export CLAUDE_CONFIG_DIR="/path1,/path2"  # ✅

Data Structure Issues

bash
# Wrong structure
/custom/claude/
├── file1.jsonl  # ❌ Files in wrong location
└── data/
    └── file2.jsonl

# Correct structure
/custom/claude/
└── projects/
    └── project1/
        └── session1/
            └── file1.jsonl

Debug Mode

Use debug mode to troubleshoot path issues:

bash
ccusage daily --debug

# Shows:
# - Which paths are being searched
# - Which paths are valid/invalid
# - How many files are found in each path
# - Any permission or structure issues

Performance Considerations

Large Data Sets

When using multiple paths with large data sets:

bash
# Filter by date to improve performance
ccusage daily --since 20250101 --until 20250131

# Use JSON output for programmatic processing
ccusage daily --json | jq '.[] | select(.totalCost > 10)'

Network Paths

For network-mounted directories:

bash
# Ensure network path is mounted
mount | grep claude-data

# Consider local caching for frequently accessed data
rsync -av /network/claude-data/ /local/cache/claude-data/
export CLAUDE_CONFIG_DIR="/local/cache/claude-data"

Next Steps

After setting up custom paths:

Released under the MIT License.