Install command
Provided
Sends development activity updates to Discord channel for team collaboration. This Notification hook automatically sends rich embed messages to Discord webhooks when Claude Code activities occur, providing real-time team visibility into development workflows.
Open the source and read safety notes before installing.
Source-backed facts for citing this resource, derived directly from the registry — also available as plain text for AI assistants.
Decision playbook
Signals are present but mixed. Use the checklist below to confirm the source and operational safety for your environment.
0
78
—
No baseline selected
No major trust-signal divergence detected in the current selection.
Confirm ownership and provenance before trusting install instructions.
Source link availableRequired
Open the canonical repository and verify ownership.
Source provenance statusRequired
Marked as source-backed.
Metadata reviewed
Registry metadata indicates a reviewed listing.
Validate risk disclosures before installation or API wiring.
Safety notes presentRequired
Review the listed safety guidance before running commands.
Privacy notes presentRequired
Review data handling notes before connecting accounts or secrets.
Trust level risk gateRequired
Trust level does not block evaluation.
Check package metadata and artifact integrity signals.
Install payload available
Install or copy payload is available for review.
Package verification flag
No package verification flag provided.
Checksum metadata
No checksum provided for downloaded artifact.
Use compare context to validate trade-offs before adoption.
Compare tray has multiple entries
Add at least one more entry to compare trust differences.
Baseline comparison available
No baseline peer selected yet.
Diverging trust signals identified
No major trust-signal divergence found.
Setup at a glance
Copy-ready — paste the snippet to get started.
Install command
Provided
Config snippet
Provided
Copy snippet
Provided
Prerequisites
None
Platforms
1 listed
Difficulty
0/100
Adoption plan
Current risk score 16/100. Use staged verification before broader rollout.
Validate source and review signals before any execution.
Confirm source provenanceRequired
Source URL/provenance metadata is present.
Confirm metadata review state
Listing has review metadata.
Verify install payload
Install/config payload exists and can be inspected.
Confirm safety, privacy, and package integrity signals.
Review safety notesRequired
Safety notes are present.
Review privacy notesRequired
Privacy notes are present.
Verify package integrity metadata
No package verification/checksum metadata.
Adopt in controlled steps based on the selected plan.
Run in isolated sandbox firstRequired
Use a constrained sandbox and observe behavior across multiple tasks.
Roll out graduallyRequired
Roll out to a small cohort before wider usage.
Set monitoring and fallback
Define rollback path and monitor errors after adoption.
Evidence readiness
Required evidence gates are covered (5/6 signals complete).
Source repository/provenance is listed.
Required in this preset
Review metadata is present.
Required in this preset
Safety notes are present.
Required in this preset
Privacy notes are present.
Optional in this preset
Package integrity metadata is missing.
Optional in this preset
Install payload is available.
Required in this preset
Required evidence gates are covered for this preset.
Decision timeline
5/6 steps complete with no blocking gaps for this preset.
triage
Source/provenance metadata is available.
triage
Review metadata is available.
verify
Safety notes are available.
verify
Privacy notes are available.
verify
Package integrity metadata is missing.
rollout
Install payload is available.
No required blockers for this timeline preset.
Safety & privacy surface
1 safety and 1 privacy notes across 2 risk areas. Review closely: credentials & tokens, permissions & scopes.
#!/usr/bin/env bash
# Read the tool input from stdin
INPUT=$(cat)
TOOL_NAME=$(echo "$INPUT" | jq -r '.tool_name')
FILE_PATH=$(echo "$INPUT" | jq -r '.tool_input.file_path // .tool_input.path // ""')
# Check if Discord webhook URL is configured
if [ -z "$DISCORD_WEBHOOK_URL" ]; then
echo "💡 Set DISCORD_WEBHOOK_URL environment variable to enable Discord notifications" >&2
exit 0
fi
echo "📤 Sending Discord notification for tool: $TOOL_NAME" >&2
# Determine color based on tool name or file type
COLOR="3447003" # Default blue
# Success indicators
if [[ "$TOOL_NAME" == *"Success"* ]] || [[ "$TOOL_NAME" == *"Complete"* ]]; then
COLOR="3066993" # Green
# Error indicators
elif [[ "$TOOL_NAME" == *"Error"* ]] || [[ "$TOOL_NAME" == *"Fail"* ]]; then
COLOR="15158332" # Red
# Warning indicators
elif [[ "$TOOL_NAME" == *"Warning"* ]] || [[ "$TOOL_NAME" == *"Alert"* ]]; then
COLOR="16776960" # Yellow
# Edit/Write operations
elif [[ "$TOOL_NAME" == "Edit" ]] || [[ "$TOOL_NAME" == "Write" ]] || [[ "$TOOL_NAME" == "MultiEdit" ]]; then
COLOR="5793266" # Purple
fi
# Get file information
if [ -n "$FILE_PATH" ]; then
FILENAME=$(basename "$FILE_PATH" 2>/dev/null || echo "Unknown file")
FILE_EXT="${FILENAME##*.}"
# Add file type icon based on extension
case "$FILE_EXT" in
js|jsx|ts|tsx) FILE_ICON="⚛️" ;;
py) FILE_ICON="🐍" ;;
rb) FILE_ICON="💎" ;;
go) FILE_ICON="🐹" ;;
rs) FILE_ICON="🦀" ;;
java) FILE_ICON="☕" ;;
cpp|c|cc) FILE_ICON="⚙️" ;;
html) FILE_ICON="🌐" ;;
css|scss) FILE_ICON="🎨" ;;
json) FILE_ICON="📋" ;;
md) FILE_ICON="📝" ;;
*) FILE_ICON="📄" ;;
esac
FILE_DISPLAY="$FILE_ICON $FILENAME"
else
FILE_DISPLAY="📂 General activity"
fi
# Get current timestamp
TIMESTAMP=$(date +"%H:%M:%S")
DATE_TIME=$(date +"%Y-%m-%d %H:%M:%S")
# Get Git information if available
GIT_BRANCH=""
GIT_COMMIT=""
if command -v git &> /dev/null && git rev-parse --git-dir > /dev/null 2>&1; then
GIT_BRANCH=$(git branch --show-current 2>/dev/null || echo "")
GIT_COMMIT=$(git rev-parse --short HEAD 2>/dev/null || echo "")
fi
# Build the Discord embed JSON
EMBED_DESCRIPTION="**Tool:** \`$TOOL_NAME\`"
if [ -n "$GIT_BRANCH" ]; then
EMBED_DESCRIPTION="$EMBED_DESCRIPTION\n**Branch:** \`$GIT_BRANCH\`"
fi
# Create fields array
FIELDS='['
FIELDS="$FIELDS{\"name\": \"File\", \"value\": \"$FILE_DISPLAY\", \"inline\": true}"
FIELDS="$FIELDS,{\"name\": \"Time\", \"value\": \"$TIMESTAMP\", \"inline\": true}"
if [ -n "$GIT_COMMIT" ]; then
FIELDS="$FIELDS,{\"name\": \"Commit\", \"value\": \"\`$GIT_COMMIT\`\", \"inline\": true}"
fi
FIELDS="$FIELDS]"
# Create the complete webhook payload
PAYLOAD=$(cat <<EOF
{
"embeds": [{
"title": "🤖 Claude Code Activity",
"description": "$EMBED_DESCRIPTION",
"color": $COLOR,
"fields": $FIELDS,
"footer": {
"text": "Claude Code • $DATE_TIME",
"icon_url": "https://claude.ai/favicon.ico"
},
"timestamp": "$(date -u +%Y-%m-%dT%H:%M:%S.000Z)"
}]
}
EOF
)
# Send the webhook
if command -v curl &> /dev/null; then
RESPONSE=$(curl -s -w "%{http_code}" -H "Content-Type: application/json" -X POST -d "$PAYLOAD" "$DISCORD_WEBHOOK_URL" 2>/dev/null)
HTTP_CODE="${RESPONSE: -3}"
if [ "$HTTP_CODE" = "204" ]; then
echo "✅ Discord notification sent successfully" >&2
else
echo "⚠️ Discord notification failed with HTTP code: $HTTP_CODE" >&2
fi
else
echo "⚠️ curl not available - cannot send Discord notification" >&2
fi
exit 0{
"hooks": {
"notification": {
"script": "./.claude/hooks/discord-activity-notifier.sh"
}
}
}.claude/settings.local.json~/.claude/settings.json.claude/settings.json{
"hooks": {
"notification": {
"script": "./.claude/hooks/discord-activity-notifier.sh"
}
}
}
#!/usr/bin/env bash
# Read the tool input from stdin
INPUT=$(cat)
TOOL_NAME=$(echo "$INPUT" | jq -r '.tool_name')
FILE_PATH=$(echo "$INPUT" | jq -r '.tool_input.file_path // .tool_input.path // ""')
# Check if Discord webhook URL is configured
if [ -z "$DISCORD_WEBHOOK_URL" ]; then
echo "💡 Set DISCORD_WEBHOOK_URL environment variable to enable Discord notifications" >&2
exit 0
fi
echo "📤 Sending Discord notification for tool: $TOOL_NAME" >&2
# Determine color based on tool name or file type
COLOR="3447003" # Default blue
# Success indicators
if [[ "$TOOL_NAME" == *"Success"* ]] || [[ "$TOOL_NAME" == *"Complete"* ]]; then
COLOR="3066993" # Green
# Error indicators
elif [[ "$TOOL_NAME" == *"Error"* ]] || [[ "$TOOL_NAME" == *"Fail"* ]]; then
COLOR="15158332" # Red
# Warning indicators
elif [[ "$TOOL_NAME" == *"Warning"* ]] || [[ "$TOOL_NAME" == *"Alert"* ]]; then
COLOR="16776960" # Yellow
# Edit/Write operations
elif [[ "$TOOL_NAME" == "Edit" ]] || [[ "$TOOL_NAME" == "Write" ]] || [[ "$TOOL_NAME" == "MultiEdit" ]]; then
COLOR="5793266" # Purple
fi
# Get file information
if [ -n "$FILE_PATH" ]; then
FILENAME=$(basename "$FILE_PATH" 2>/dev/null || echo "Unknown file")
FILE_EXT="${FILENAME##*.}"
# Add file type icon based on extension
case "$FILE_EXT" in
js|jsx|ts|tsx) FILE_ICON="⚛️" ;;
py) FILE_ICON="🐍" ;;
rb) FILE_ICON="💎" ;;
go) FILE_ICON="🐹" ;;
rs) FILE_ICON="🦀" ;;
java) FILE_ICON="☕" ;;
cpp|c|cc) FILE_ICON="⚙️" ;;
html) FILE_ICON="🌐" ;;
css|scss) FILE_ICON="🎨" ;;
json) FILE_ICON="📋" ;;
md) FILE_ICON="📝" ;;
*) FILE_ICON="📄" ;;
esac
FILE_DISPLAY="$FILE_ICON $FILENAME"
else
FILE_DISPLAY="📂 General activity"
fi
# Get current timestamp
TIMESTAMP=$(date +"%H:%M:%S")
DATE_TIME=$(date +"%Y-%m-%d %H:%M:%S")
# Get Git information if available
GIT_BRANCH=""
GIT_COMMIT=""
if command -v git &> /dev/null && git rev-parse --git-dir > /dev/null 2>&1; then
GIT_BRANCH=$(git branch --show-current 2>/dev/null || echo "")
GIT_COMMIT=$(git rev-parse --short HEAD 2>/dev/null || echo "")
fi
# Build the Discord embed JSON
EMBED_DESCRIPTION="**Tool:** \`$TOOL_NAME\`"
if [ -n "$GIT_BRANCH" ]; then
EMBED_DESCRIPTION="$EMBED_DESCRIPTION\n**Branch:** \`$GIT_BRANCH\`"
fi
# Create fields array
FIELDS='['
FIELDS="$FIELDS{\"name\": \"File\", \"value\": \"$FILE_DISPLAY\", \"inline\": true}"
FIELDS="$FIELDS,{\"name\": \"Time\", \"value\": \"$TIMESTAMP\", \"inline\": true}"
if [ -n "$GIT_COMMIT" ]; then
FIELDS="$FIELDS,{\"name\": \"Commit\", \"value\": \"\`$GIT_COMMIT\`\", \"inline\": true}"
fi
FIELDS="$FIELDS]"
# Create the complete webhook payload
PAYLOAD=$(cat <<EOF
{
"embeds": [{
"title": "🤖 Claude Code Activity",
"description": "$EMBED_DESCRIPTION",
"color": $COLOR,
"fields": $FIELDS,
"footer": {
"text": "Claude Code • $DATE_TIME",
"icon_url": "https://claude.ai/favicon.ico"
},
"timestamp": "$(date -u +%Y-%m-%dT%H:%M:%S.000Z)"
}]
}
EOF
)
# Send the webhook
if command -v curl &> /dev/null; then
RESPONSE=$(curl -s -w "%{http_code}" -H "Content-Type: application/json" -X POST -d "$PAYLOAD" "$DISCORD_WEBHOOK_URL" 2>/dev/null)
HTTP_CODE="${RESPONSE: -3}"
if [ "$HTTP_CODE" = "204" ]; then
echo "✅ Discord notification sent successfully" >&2
else
echo "⚠️ Discord notification failed with HTTP code: $HTTP_CODE" >&2
fi
else
echo "⚠️ curl not available - cannot send Discord notification" >&2
fi
exit 0
Complete hook script that sends Discord notifications for Claude Code activities
#!/usr/bin/env bash
INPUT=$(cat)
TOOL_NAME=$(echo "$INPUT" | jq -r '.tool_name')
FILE_PATH=$(echo "$INPUT" | jq -r '.tool_input.file_path // .tool_input.path // ""')
if [ -z "$DISCORD_WEBHOOK_URL" ]; then
echo "Set DISCORD_WEBHOOK_URL environment variable to enable Discord notifications" >&2
exit 0
fi
COLOR="3447003"
if [[ "$TOOL_NAME" == *"Success"* ]] || [[ "$TOOL_NAME" == *"Complete"* ]]; then
COLOR="3066993"
elif [[ "$TOOL_NAME" == *"Error"* ]] || [[ "$TOOL_NAME" == *"Fail"* ]]; then
COLOR="15158332"
fi
FILENAME=$(basename "$FILE_PATH" 2>/dev/null || echo "Unknown file")
TIMESTAMP=$(date +"%H:%M:%S")
DATE_TIME=$(date +"%Y-%m-%d %H:%M:%S")
PAYLOAD=$(cat <<EOF
{
"embeds": [{
"title": "Claude Code Activity",
"description": "**Tool:** \`$TOOL_NAME\`",
"color": $COLOR,
"fields": [
{"name": "File", "value": "$FILENAME", "inline": true},
{"name": "Time", "value": "$TIMESTAMP", "inline": true}
],
"footer": {
"text": "Claude Code • $DATE_TIME"
},
"timestamp": "$(date -u +%Y-%m-%dT%H:%M:%S.000Z)"
}]
}
EOF
)
if command -v curl &> /dev/null; then
RESPONSE=$(curl -s -w "%{http_code}" -H "Content-Type: application/json" -X POST -d "$PAYLOAD" "$DISCORD_WEBHOOK_URL" 2>/dev/null)
HTTP_CODE="${RESPONSE: -3}"
if [ "$HTTP_CODE" = "204" ]; then
echo "Discord notification sent successfully" >&2
fi
fi
exit 0
Enhanced hook script with rate limiting to prevent webhook spam (max 1 notification per minute)
#!/usr/bin/env bash
INPUT=$(cat)
TOOL_NAME=$(echo "$INPUT" | jq -r '.tool_name')
FILE_PATH=$(echo "$INPUT" | jq -r '.tool_input.file_path // .tool_input.path // ""')
if [ -z "$DISCORD_WEBHOOK_URL" ]; then
exit 0
fi
RATE_LIMIT_FILE=".claude/.discord-rate-limit"
CURRENT_TIME=$(date +%s)
LAST_NOTIFICATION=$(cat "$RATE_LIMIT_FILE" 2>/dev/null || echo "0")
TIME_DIFF=$((CURRENT_TIME - LAST_NOTIFICATION))
if [ "$TIME_DIFF" -lt 60 ]; then
exit 0
fi
echo "$CURRENT_TIME" > "$RATE_LIMIT_FILE"
COLOR="3447003"
if [[ "$TOOL_NAME" == *"Error"* ]]; then
COLOR="15158332"
fi
PAYLOAD=$(cat <<EOF
{
"embeds": [{
"title": "Claude Code Activity",
"description": "**Tool:** \`$TOOL_NAME\`",
"color": $COLOR,
"timestamp": "$(date -u +%Y-%m-%dT%H:%M:%S.000Z)"
}]
}
EOF
)
if command -v curl &> /dev/null; then
curl -s -H "Content-Type: application/json" -X POST -d "$PAYLOAD" "$DISCORD_WEBHOOK_URL" > /dev/null 2>&1
fi
exit 0
Enhanced hook script with improved Git branch/commit detection and jq-based JSON manipulation
#!/usr/bin/env bash
INPUT=$(cat)
TOOL_NAME=$(echo "$INPUT" | jq -r '.tool_name')
FILE_PATH=$(echo "$INPUT" | jq -r '.tool_input.file_path // .tool_input.path // ""')
if [ -z "$DISCORD_WEBHOOK_URL" ]; then
exit 0
fi
if command -v git &> /dev/null && git rev-parse --git-dir > /dev/null 2>&1; then
GIT_BRANCH=$(git branch --show-current 2>/dev/null || git describe --tags --always 2>/dev/null || echo "")
GIT_COMMIT=$(git rev-parse --short HEAD 2>/dev/null || echo "")
else
GIT_BRANCH=""
GIT_COMMIT=""
fi
COLOR="3447003"
FILENAME=$(basename "$FILE_PATH" 2>/dev/null || echo "Unknown file")
PAYLOAD=$(cat <<EOF
{
"embeds": [{
"title": "Claude Code Activity",
"description": "**Tool:** \`$TOOL_NAME\`",
"color": $COLOR,
"fields": [
{"name": "File", "value": "$FILENAME", "inline": true}
],
"timestamp": "$(date -u +%Y-%m-%dT%H:%M:%S.000Z)"
}]
}
EOF
)
if [ -n "$GIT_BRANCH" ]; then
PAYLOAD=$(echo "$PAYLOAD" | jq --arg branch "$GIT_BRANCH" '.embeds[0].fields += [{"name": "Branch", "value": $branch, "inline": true}]')
fi
if [ -n "$GIT_COMMIT" ]; then
PAYLOAD=$(echo "$PAYLOAD" | jq --arg commit "$GIT_COMMIT" '.embeds[0].fields += [{"name": "Commit", "value": $commit, "inline": true}]')
fi
if command -v curl &> /dev/null; then
curl -s -H "Content-Type: application/json" -X POST -d "$PAYLOAD" "$DISCORD_WEBHOOK_URL" > /dev/null 2>&1
fi
exit 0
Enhanced hook script with file type icon detection and display
#!/usr/bin/env bash
INPUT=$(cat)
TOOL_NAME=$(echo "$INPUT" | jq -r '.tool_name')
FILE_PATH=$(echo "$INPUT" | jq -r '.tool_input.file_path // .tool_input.path // ""')
if [ -z "$DISCORD_WEBHOOK_URL" ]; then
exit 0
fi
FILE_EXT="${FILE_PATH##*.}"
case "$FILE_EXT" in
js|jsx|ts|tsx) FILE_ICON="⚛️" ;;
py) FILE_ICON="🐍" ;;
rb) FILE_ICON="💎" ;;
go) FILE_ICON="🐹" ;;
rs) FILE_ICON="🦀" ;;
java) FILE_ICON="☕" ;;
cpp|c|cc) FILE_ICON="⚙️" ;;
html) FILE_ICON="🌐" ;;
css|scss) FILE_ICON="🎨" ;;
json) FILE_ICON="📋" ;;
md) FILE_ICON="📝" ;;
*) FILE_ICON="📄" ;;
esac
FILENAME=$(basename "$FILE_PATH" 2>/dev/null || echo "Unknown file")
FILE_DISPLAY="$FILE_ICON $FILENAME"
COLOR="3447003"
PAYLOAD=$(cat <<EOF
{
"embeds": [{
"title": "Claude Code Activity",
"description": "**Tool:** \`$TOOL_NAME\`",
"color": $COLOR,
"fields": [
{"name": "File", "value": "$FILE_DISPLAY", "inline": true}
],
"timestamp": "$(date -u +%Y-%m-%dT%H:%M:%S.000Z)"
}]
}
EOF
)
if command -v curl &> /dev/null; then
curl -s -H "Content-Type: application/json" -X POST -d "$PAYLOAD" "$DISCORD_WEBHOOK_URL" > /dev/null 2>&1
fi
exit 0
Export webhook URL in shell profile (.bashrc/.zshrc) or add to Claude Code config. Test with echo $DISCORD_WEBHOOK_URL in hook script to verify environment variable persists. Use .env file or Claude Code environment configuration for persistent webhook URL storage.
Validate PAYLOAD JSON structure before sending with echo $PAYLOAD | jq command. Ensure special characters in file names are properly escaped within JSON string values. Use jq for safe JSON construction instead of manual string concatenation. Verify JSON is valid: echo $PAYLOAD | jq .
Add rate limiting by checking notification count per minute using temporary file counter: .claude/.discord-rate-limit. Skip notification if threshold exceeded (max 1 per minute recommended), or batch multiple operations into single embed with field array. Use timestamp-based debouncing to prevent spam.
Add fallback to display commit SHA instead of branch name when git branch --show-current returns empty. Use git describe --tags --always for readable detached HEAD representation. Check git rev-parse --abbrev-ref HEAD for branch name with fallback to commit SHA.
Ensure date -u +%Y-%m-%dT%H:%M:%S.000Z command generates UTC ISO 8601 format. Use gdate on macOS if BSD date lacks proper UTC formatting support: brew install coreutils. Verify timestamp format: date -u +%Y-%m-%dT%H:%M:%S.000Z. Discord requires RFC3339 format with Z timezone.
Install curl using package manager: brew install curl on macOS, apt-get install curl on Ubuntu/Debian, yum install curl on RHEL/CentOS. Verify installation with curl --version. Check PATH includes curl binary location. Consider using wget as fallback if curl unavailable.
Implement rate limiting: max 30 requests per 60 seconds per webhook. Add delay between notifications using sleep command. Use rate limit file to track notification frequency. Batch multiple notifications into single embed with multiple fields. Respect Discord rate limit headers if returned.
Use jq for safe JSON construction: jq -n --arg tool "$TOOL_NAME" --arg file "$FILE_PATH" '{embeds: [{title: "Activity", description: "Tool: `" + $tool + "`", fields: [{name: "File", value: $file}]}]}'. Escape special characters properly. Avoid manual JSON string concatenation for complex data.
Show that Discord Activity Notifier - Hooks is listed on HeyClaude. Paste this Markdown into your README — it renders the badge and links back to this page.
[](https://heyclau.de/entry/hooks/discord-activity-notifier)Discord Activity Notifier - Hooks side by side with 3 alternatives on trust, install, platform support, and disclosed safety notes — all from reviewed registry metadata.
| Field | Sends development activity updates to Discord channel for team collaboration. This Notification hook automatically sends rich embed messages to Discord webhooks when Claude Code activities occur, providing real-time team visibility into development workflows. Open dossier | Sends progress updates to Slack channel for team visibility on Claude activities. Open dossier | Tracks all Claude Code activities in real-time and logs them for monitoring and debugging. Open dossier | A Claude Code hook that flags files exceeding complexity thresholds after you edit them — estimating cyclomatic complexity, line and function counts, and nesting depth (via ESLint's complexity rule and Radon). Open dossier |
|---|---|---|---|---|
| Next steps | ||||
| Trust | ||||
| Review status | ReviewedMaintainer reviewed | ReviewedMaintainer reviewed | ReviewedMaintainer reviewed | ReviewedMaintainer reviewed |
| Package trust | Package not verified | Package not verified | Package not verified | Package not verified |
| Source provenance | Source-backed | Source-backed | Source-backed | Source-backed |
| Submitter | — | — | — | — |
| Install risk | Review first | Review first | Review first | Review first |
| Notes | Safety ✓ Privacy ✓ | Safety ✓ Privacy ✓ | Safety ✓ Privacy ✓ | Safety ✓ Privacy ✓ |
| Brand | — | — | ||
| Category | hooks | hooks | hooks | hooks |
| Source | source-backed | source-backed | source-backed | source-backed |
| Author | JSONbored | JSONbored | JSONbored | JSONbored |
| Added | 2025-09-19 | 2025-09-19 | 2025-09-19 | 2025-09-19 |
| Platforms | Claude Code | Claude Code | Claude Code | Claude Code |
| Source repo | — | — | — | — |
| Safety notes | ✓Runs automatically on its configured Claude Code hook event and executes shell logic that can read, modify, or delete files in your project (and may run builds, installs, or network calls); review the script and scope it to expected paths before enabling. | ✓Runs on notification events and posts a formatted activity message to Slack when SLACK_WEBHOOK_URL is configured. Uses curl with a short timeout and retry, so failed network delivery may still delay hook completion briefly. High activity can create noisy Slack notifications unless users add their own filtering or rate limits. | ✓Runs on notification events and writes daily activity logs under .claude in the current project. Rotates logs to the last 100 entries and may archive older activity files under .claude/archive. Uses local file operations only but can add persistent project files if .claude is not ignored. | ✓Runs after edits to JS/TS/Python files and prints advisory warnings only; the line/function/brace counts are heuristics, not a substitute for ESLint or Radon run on the full project. |
| Privacy notes | ✓Receives Claude Code hook input (session metadata, file paths, and tool output) and reads local project files; review what the script logs or forwards to external services and keep credentials out of its output. | ✓Sends tool name, file basename, user name, git branch, project name, and timestamp to the configured Slack webhook. Uses the SLACK_WEBHOOK_URL environment variable and does not manage webhook rotation or channel permissions. Slack receives and retains the notification according to the workspace and webhook configuration. | ✓Records tool names, file paths, tool actions, timestamps, and generated session IDs. Stores human-readable and JSON activity logs under .claude. Prints recent activity summaries to local hook output. | ✓Reads the contents of files you edit to compute complexity locally; it prints warnings to hook output and does not transmit code, but those messages can reveal file structure. |
| Prerequisites | — none listed | — none listed | — none listed | — none listed |
| Install | | | | |
| Config | | | | |
| Citations | ||||
| Claim | Unclaimed | Unclaimed | Unclaimed | Unclaimed |
Source-backed guides for putting this to work.
Loading live community signals…
A short, calm digest of reviewed Claude resources. Unsubscribe any time.