Skip to main content

carbon-report

Display CO2 emissions report for Claude Code sessions

Based on a skill by@raw-githubusercontent-com

Install this skill

or
79/100

Security score

The carbon-report skill was audited on Sep 16, 2026 and we found 21 security issues across 1 threat category. Review the findings below before installing.

Categories Tested

Security Issues

low line 23

Command substitution pattern

SourceSKILL.md
21 esac
22}
23CFG="$(ccp "${CLAUDE_CONFIG_DIR:-$HOME/.claude}")"
24REPO_DIR=""
25if command -v jq >/dev/null 2>&1 && [ -f "$CFG/settings.json" ]; then
low line 26

Command substitution pattern

SourceSKILL.md
24REPO_DIR=""
25if command -v jq >/dev/null 2>&1 && [ -f "$CFG/settings.json" ]; then
26 SL_CMD="$(jq -r '.statusLine.command // empty' "$CFG/settings.json" 2>/dev/null)"
27 # statusLine.command stores a shell-escaped path: expand ~ and unescape spaces
28 SL_CMD="${SL_CMD//\\ / }"; SL_CMD="${SL_CMD/#\~/$HOME}"; SL_CMD="$(ccp "$SL_CMD")"
low line 28

Command substitution pattern

SourceSKILL.md
26 SL_CMD="$(jq -r '.statusLine.command // empty' "$CFG/settings.json" 2>/dev/null)"
27 # statusLine.command stores a shell-escaped path: expand ~ and unescape spaces
28 SL_CMD="${SL_CMD//\\ / }"; SL_CMD="${SL_CMD/#\~/$HOME}"; SL_CMD="$(ccp "$SL_CMD")"
29 [ -n "$SL_CMD" ] && [ -f "$SL_CMD" ] && REPO_DIR="$(cd "$(dirname "$SL_CMD")/.." 2>/dev/null && pwd)"
30fi
low line 29

Command substitution pattern

SourceSKILL.md
27 # statusLine.command stores a shell-escaped path: expand ~ and unescape spaces
28 SL_CMD="${SL_CMD//\\ / }"; SL_CMD="${SL_CMD/#\~/$HOME}"; SL_CMD="$(ccp "$SL_CMD")"
29 [ -n "$SL_CMD" ] && [ -f "$SL_CMD" ] && REPO_DIR="$(cd "$(dirname "$SL_CMD")/.." 2>/dev/null && pwd)"
30fi
31[ -z "$REPO_DIR" ] && [ -n "${CLAUDE_PLUGIN_ROOT:-}" ] && REPO_DIR="$(ccp "$CLAUDE_PLUGIN_ROOT")"
low line 31

Command substitution pattern

SourceSKILL.md
29 [ -n "$SL_CMD" ] && [ -f "$SL_CMD" ] && REPO_DIR="$(cd "$(dirname "$SL_CMD")/.." 2>/dev/null && pwd)"
30fi
31[ -z "$REPO_DIR" ] && [ -n "${CLAUDE_PLUGIN_ROOT:-}" ] && REPO_DIR="$(ccp "$CLAUDE_PLUGIN_ROOT")"
32[ -z "$REPO_DIR" ] && [ -n "${CLAUDE_CARBON_DIR:-}" ] && REPO_DIR="$(ccp "$CLAUDE_CARBON_DIR")"
33if [ -z "$REPO_DIR" ]; then
low line 32

Command substitution pattern

SourceSKILL.md
30fi
31[ -z "$REPO_DIR" ] && [ -n "${CLAUDE_PLUGIN_ROOT:-}" ] && REPO_DIR="$(ccp "$CLAUDE_PLUGIN_ROOT")"
32[ -z "$REPO_DIR" ] && [ -n "${CLAUDE_CARBON_DIR:-}" ] && REPO_DIR="$(ccp "$CLAUDE_CARBON_DIR")"
33if [ -z "$REPO_DIR" ]; then
34 # Pure marketplace installs reach here: settings.json carries no statusLine.command
low line 41

Command substitution pattern

SourceSKILL.md
39 for D in "$CFG/plugins/cache"/*/claude-carbon/*/; do
40 [ -f "${D}scripts/equiv-lib.sh" ] || continue
41 if [ -z "$CACHE_LATEST" ] || [ "$(printf '%s\n%s\n' "$CACHE_LATEST" "$D" | sort -V | tail -1)" = "$D" ]; then
42 CACHE_LATEST="$D"
43 fi
low line 58

Command substitution pattern

SourceSKILL.md
56# the factors are country-specific (a French car and a US car differ by ~1.7x).
57. "$REPO_DIR/scripts/equiv-lib.sh"
58EQUIV_SET="$(detect_equiv_set)"
59
60# Force C locale: comma-decimal locales (de_DE, fr_FR) make awk mis-parse
low line 64

Command substitution pattern

SourceSKILL.md
62export LC_ALL=C
63
64DB_PATH="$(ccp "${CLAUDE_CARBON_DB:-${CLAUDE_CONFIG_DIR:-$HOME/.claude}/claude-carbon/carbon.db}")"
65
66if [ ! -f "$DB_PATH" ]; then
low line 73

Command substitution pattern

SourceSKILL.md
71
72CURRENT_YEAR="$(date +%Y)"
73TODAY="$(date +%Y-%m-%d)"
74
75# Ensure the excluded column exists on pre-existing DBs (idempotent).
low line 81

Command substitution pattern

SourceSKILL.md
79
80# --- Aggregates ---
81TODAY_CO2="$(sqlite3 "$DB_PATH" "SELECT COALESCE(SUM(co2_grams), 0) FROM sessions WHERE ${NOT_EXCLUDED} AND started_at LIKE '${TODAY}%';" | awk '{printf "%.1f", $1}')"
82TODAY_SESSIONS="$(sqlite3 "$DB_PATH" "SELECT COUNT(*) FROM sessions WHERE ${NOT_EXCLUDED} AND started_at LIKE '${TODAY}%';")"
83
low line 82

Command substitution pattern

SourceSKILL.md
80# --- Aggregates ---
81TODAY_CO2="$(sqlite3 "$DB_PATH" "SELECT COALESCE(SUM(co2_grams), 0) FROM sessions WHERE ${NOT_EXCLUDED} AND started_at LIKE '${TODAY}%';" | awk '{printf "%.1f", $1}')"
82TODAY_SESSIONS="$(sqlite3 "$DB_PATH" "SELECT COUNT(*) FROM sessions WHERE ${NOT_EXCLUDED} AND started_at LIKE '${TODAY}%';")"
83
84YEAR_CO2="$(sqlite3 "$DB_PATH" "SELECT COALESCE(SUM(co2_grams), 0) FROM sessions WHERE ${NOT_EXCLUDED} AND started_at LIKE '${CURRENT_YEAR}%';" | awk '{printf "%.1f", $1}')"
low line 84

Command substitution pattern

SourceSKILL.md
82TODAY_SESSIONS="$(sqlite3 "$DB_PATH" "SELECT COUNT(*) FROM sessions WHERE ${NOT_EXCLUDED} AND started_at LIKE '${TODAY}%';")"
83
84YEAR_CO2="$(sqlite3 "$DB_PATH" "SELECT COALESCE(SUM(co2_grams), 0) FROM sessions WHERE ${NOT_EXCLUDED} AND started_at LIKE '${CURRENT_YEAR}%';" | awk '{printf "%.1f", $1}')"
85YEAR_SESSIONS="$(sqlite3 "$DB_PATH" "SELECT COUNT(*) FROM sessions WHERE ${NOT_EXCLUDED} AND started_at LIKE '${CURRENT_YEAR}%';")"
86
low line 85

Command substitution pattern

SourceSKILL.md
83
84YEAR_CO2="$(sqlite3 "$DB_PATH" "SELECT COALESCE(SUM(co2_grams), 0) FROM sessions WHERE ${NOT_EXCLUDED} AND started_at LIKE '${CURRENT_YEAR}%';" | awk '{printf "%.1f", $1}')"
85YEAR_SESSIONS="$(sqlite3 "$DB_PATH" "SELECT COUNT(*) FROM sessions WHERE ${NOT_EXCLUDED} AND started_at LIKE '${CURRENT_YEAR}%';")"
86
87ALL_CO2="$(sqlite3 "$DB_PATH" "SELECT COALESCE(SUM(co2_grams), 0) FROM sessions WHERE ${NOT_EXCLUDED};" | awk '{printf "%.1f", $1}')"
low line 87

Command substitution pattern

SourceSKILL.md
85YEAR_SESSIONS="$(sqlite3 "$DB_PATH" "SELECT COUNT(*) FROM sessions WHERE ${NOT_EXCLUDED} AND started_at LIKE '${CURRENT_YEAR}%';")"
86
87ALL_CO2="$(sqlite3 "$DB_PATH" "SELECT COALESCE(SUM(co2_grams), 0) FROM sessions WHERE ${NOT_EXCLUDED};" | awk '{printf "%.1f", $1}')"
88ALL_SESSIONS="$(sqlite3 "$DB_PATH" "SELECT COUNT(*) FROM sessions WHERE ${NOT_EXCLUDED};")"
89ALL_COST="$(sqlite3 "$DB_PATH" "SELECT COALESCE(SUM(cost_usd), 0) FROM sessions WHERE ${NOT_EXCLUDED};" | awk '{printf "%.2f", $1}')"
low line 88

Command substitution pattern

SourceSKILL.md
86
87ALL_CO2="$(sqlite3 "$DB_PATH" "SELECT COALESCE(SUM(co2_grams), 0) FROM sessions WHERE ${NOT_EXCLUDED};" | awk '{printf "%.1f", $1}')"
88ALL_SESSIONS="$(sqlite3 "$DB_PATH" "SELECT COUNT(*) FROM sessions WHERE ${NOT_EXCLUDED};")"
89ALL_COST="$(sqlite3 "$DB_PATH" "SELECT COALESCE(SUM(cost_usd), 0) FROM sessions WHERE ${NOT_EXCLUDED};" | awk '{printf "%.2f", $1}')"
90
low line 89

Command substitution pattern

SourceSKILL.md
87ALL_CO2="$(sqlite3 "$DB_PATH" "SELECT COALESCE(SUM(co2_grams), 0) FROM sessions WHERE ${NOT_EXCLUDED};" | awk '{printf "%.1f", $1}')"
88ALL_SESSIONS="$(sqlite3 "$DB_PATH" "SELECT COUNT(*) FROM sessions WHERE ${NOT_EXCLUDED};")"
89ALL_COST="$(sqlite3 "$DB_PATH" "SELECT COALESCE(SUM(cost_usd), 0) FROM sessions WHERE ${NOT_EXCLUDED};" | awk '{printf "%.2f", $1}')"
90
91# --- Equivalences (all-time total) ---
low line 97

Command substitution pattern

SourceSKILL.md
95# the world average: a car, a kWh and a kilo of beef each differ by 2x+ between
96# countries, so a single set would be wrong for most readers.
97EQUIV_ROWS="$(jq -r --arg set "$EQUIV_SET" \
98 '.equivalences[$set][] | "\(.divisor)|\(.decimals)|\(.label)|\(.source)"' "$FACTORS_FILE" \
99 | while IFS='|' read -r divisor decimals label source; do
low line 100

Command substitution pattern

SourceSKILL.md
98 '.equivalences[$set][] | "\(.divisor)|\(.decimals)|\(.label)|\(.source)"' "$FACTORS_FILE" \
99 | while IFS='|' read -r divisor decimals label source; do
100 count="$(echo "$ALL_CO2" | awk -v d="$divisor" -v p="$decimals" '{ fmt = "%." p "f"; printf fmt, $1 / d }')"
101 printf '%s|%s|%s\n' "$count" "$label" "$source"
102 done)"
low line 110

Command substitution pattern

SourceSKILL.md
108
109# --- Top 5 sessions by CO2 ---
110TOP5="$(sqlite3 -separator '|' "$DB_PATH" \
111 "SELECT DATE(started_at), project, ROUND(co2_grams, 2), model, ROUND(cost_usd, 4)
112 FROM sessions
low line 118

Command substitution pattern

SourceSKILL.md
116
117# --- By project ---
118BY_PROJECT="$(sqlite3 -separator '|' "$DB_PATH" \
119 "SELECT project, ROUND(SUM(co2_grams), 2), COUNT(*), ROUND(SUM(cost_usd), 4)
120 FROM sessions
Scanned on Sep 16, 2026
View Security Dashboard
Installation guide →
GitHub Stars 194
Rate this skill
Categoryother
UpdatedSeptember 27, 2026
gwittebolle/claude-carbon