Session-End Summary Log

Pairs with the SessionStart context log to bracket every session with a start and end entry in the same register — the two together let a reviewer reconstruct exactly which sessions ran, for how long, and why each one ended, without needing the raw transcript file to still exist.

Audit & Compliance Logging Event: SessionEnd Claude Code Open source · Free

1. Save this as the hook script

#!/usr/bin/env python3
"""SessionEnd hook — writes a closing entry to the audit log."""
import json, sys, datetime
from pathlib import Path

data = json.load(sys.stdin)
log_path = Path(data.get("cwd", ".")) / ".claude" / "audit.log"
log_path.parent.mkdir(parents=True, exist_ok=True)

entry = {
    "ts": datetime.datetime.utcnow().isoformat() + "Z",
    "event": "session_end",
    "session_id": data.get("session_id"),
    "reason": data.get("reason"),
}

with open(log_path, "a") as f:
    f.write(json.dumps(entry) + "\n")

sys.exit(0)

Save to a path inside your project, e.g. .claude/hooks/session-end-summary-log.sh, then chmod +x it.

2. Wire it into .claude/settings.json

{
  "hooks": {
    "SessionEnd": [
      {
        "hooks": [
          {"type": "command", "command": "python3 .claude/hooks/session-end-summary-log.py"}
        ]
      }
    ]
  }
}

Before you use this

A hook runs with your local shell's permissions — review the script above before adding it, the same way you'd review any script you didn't write yourself. See our guide on hook security risks for the specific CVEs this category of feature has already produced.

Related hooks

← All hooks
FEEDBACK