Install command
Provided
SessionStart hook that prints a daily Claude Code retro at the top of every session — competency grade (0–100, A–F), 14-day efficiency sparklines, and a year-long contributions heatmap.
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
5 to clear
Platforms
1 listed
Difficulty
1/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.
Prerequisite readiness
5 prerequisites to line up before setup.
Safety & privacy surface
5 safety and 5 privacy notes across 4 risk areas. Review closely: credentials & tokens.
#!/bin/bash
# startup.sh — Single SessionStart hook that runs all startup scripts sequentially.
# Each step runs independently (one failure does not skip the rest). Per-step
# output + timing mirrored to a private ~/.claude/metrics/startup.log for
# debugging what Claude Code's hook pipeline actually receives.
# NOTE: no `set -e` — we want every step to execute even if an earlier one errors.
#
# ─── How SessionStart hook output reaches the user vs. the LLM ───────────────
#
# Per Claude Code's hook spec (https://code.claude.com/docs/en/hooks):
#
# SessionStart hook fires
# │
# ┌───────┴────────┐
# ▼ ▼
# Plain stdout JSON output
# │ │
# ▼ ┌───────┴───────┐
# Claude's ▼ ▼
# context systemMessage additionalContext
# ONLY (VISIBLE to (Claude's context
# (hidden user in only — invisible)
# from terminal)
# user)
#
# In Claude Code v2.1.x's full-screen TUI, plain stdout from a plugin's
# SessionStart hook is captured into the LLM's `additionalContext` and is NOT
# rendered visibly. To make the dashboard appear at the top of the user's
# session, we emit a JSON document with `systemMessage` set to the rendered
# output. Do NOT mirror helper output into `additionalContext`: the dashboard
# can contain local-history summaries and web/GitHub-derived scout findings,
# so it must remain display-only and not become model instructions/context.
source "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/_paths.sh"
DEBUG_LOG_DIR="${RETRO_DAILY_HOME:-$HOME/.claude/metrics}"
previous_umask=$(umask)
umask 077
mkdir -p "$DEBUG_LOG_DIR" 2>/dev/null || true
DEBUG_LOG="$DEBUG_LOG_DIR/startup.log"
touch "$DEBUG_LOG" 2>/dev/null || DEBUG_LOG="/dev/null"
umask "$previous_umask"
if [ "$DEBUG_LOG" != "/dev/null" ]; then
chmod 700 "$DEBUG_LOG_DIR" 2>/dev/null || true
chmod 600 "$DEBUG_LOG" 2>/dev/null || true
fi
{
echo "===== startup.sh invoked at $(date -u +%Y-%m-%dT%H:%M:%SZ) ====="
echo "TERM=$TERM PWD=$PWD USER=${USER:-?}"
echo "CLAUDE_CODE_SESSION=${CLAUDE_CODE_SESSION:-unset}"
echo "PATH=$PATH"
} >> "$DEBUG_LOG" 2>&1
# Accumulate every step's stdout into a single display buffer. At the end we
# emit the concatenated output only as systemMessage for user visibility. We
# intentionally keep raw helper output out of additionalContext because scout
# findings and local-history-derived summaries are untrusted.
ACCUMULATED=""
run_step() {
local name="$1"; shift
local t0=$(date +%s)
local out rc
out=$("$@" 2>&1); rc=$?
local t1=$(date +%s)
{
echo "[$name] exit=$rc bytes=${#out} seconds=$((t1-t0))"
echo "----- begin [$name] stdout -----"
printf '%s\n' "$out"
echo "----- end [$name] stdout -----"
} >> "$DEBUG_LOG"
# Append to the display-only buffer that will end up in systemMessage.
ACCUMULATED="${ACCUMULATED}${out}"$'\n'
}
# Order matters: dashboard first (scrolls to top of terminal), scout findings
# LAST so they stay visible near the prompt when the session opens. Earlier
# reverse order buried scout above the viewport.
run_step "daily-insights" bash "$RETRO_DAILY_HOME/daily-insights.sh" || true
run_step "scout" bash "$RETRO_DAILY_HOME/scout.sh" || true
run_step "tag-sessions" bash "$RETRO_DAILY_HOME/tag-sessions.sh" || true
run_step "scout-review" bash "$RETRO_DAILY_HOME/scout-review.sh" || true
# Emit the SessionStart hook JSON response. Reads ACCUMULATED from stdin so we
# don't have to worry about shell quoting of multi-line ANSI-colored content.
printf '%s' "$ACCUMULATED" | python3 -c '
import json, sys
content = sys.stdin.read().rstrip("\n")
# Keep helper output display-only. Do not pass local-history-derived summaries
# or web/GitHub-derived scout text into additionalContext, where it could be
# interpreted as model instructions in future sessions.
print(json.dumps({
"systemMessage": content,
"hookSpecificOutput": {
"hookEventName": "SessionStart",
"additionalContext": "Retro Daily rendered a display-only startup dashboard. Raw dashboard, scout, and session-history-derived text was intentionally not added to model context.",
},
}))
' 2>>"$DEBUG_LOG"
echo "===== startup.sh finished at $(date -u +%Y-%m-%dT%H:%M:%SZ) =====" >> "$DEBUG_LOG"{
"hooks": {
"SessionStart": [
{
"hooks": [
{
"type": "command",
"command": "~/.claude/metrics/startup.sh"
}
]
}
]
}
}claude -p background worker (the "scout") that researches your weakest metrics on docs.anthropic.com and GitHub between sessions.~/.claude/metrics/scout-archive/ and ships an interactive viewer for browsing historical findings.Install via the Claude Code plugin marketplace (recommended):
/plugin marketplace add gyanesh-m/retro-daily
/plugin install retro-daily@retro-daily
/reload-plugins
Or add the SessionStart hook manually to ~/.claude/settings.json using the configuration above, pointing at the startup.sh entry point you place in ~/.claude/metrics/.
~/.claude/settings.json.claude/settings.json.claude/settings.local.json/bin/bash works for the dashboard; the scout runner uses nohup so no setsid requirement).generate-metrics.py).claude session in your keychain so the background scout can call claude -p without prompting.Retro Daily reads local Claude Code session history from ~/.claude/projects/*.jsonl to compute metrics. It writes derived state, logs, scout results, and session tags under ~/.claude/metrics. The startup debug log is created at ~/.claude/metrics/startup.log with user-only file permissions when possible. Startup output is rendered as a display-only dashboard and raw dashboard, scout, and session-history-derived text is intentionally not mirrored into Claude Code additionalContext.
By default, scout.sh and tag-sessions.sh can start detached, sandboxed claude -p background workers. The scout worker uses WebSearch and Write to research weak metrics, writes temporary results to /tmp, validates JSON, then moves the results into ~/.claude/metrics. The session tagger builds a truncated digest from recent local session messages and asks claude -p to label those sessions; it denies network access and writes temporary results to /tmp before moving them into ~/.claude/metrics.
Set RETRO_DAILY_NO_BACKGROUND_WORKERS=1 to disable the background scout and session tagger while keeping the dashboard rendering.
{
"hooks": {
"SessionStart": [
{
"hooks": [
{
"type": "command",
"command": "~/.claude/metrics/startup.sh"
}
]
}
]
}
}
On every session start, three scripts run in sequence:
daily-insights.sh prints the editorial dashboard from the cached metrics-store.json. Regeneration (embedding classification) is gated by last-run-date.txt so it runs at most once per day.scout.sh spawns scout-runner.sh as a detached nohup background worker if the weak-metric set changed or the last scout is older than SCOUT_STALE_DAYS (default 7). A pgrep guard prevents double-spawn.scout-runner.sh invokes claude -p --allowedTools "WebSearch Write" with a research prompt over docs.anthropic.com, GitHub, and GitHub Trending, writing results to /tmp/ first and atomically mv-ing them into place. Previous results are archived.scout-review.sh renders a compact SCOUT FINDINGS block on the next session with one line per query.Confirm the SessionStart hook is registered in ~/.claude/settings.json and that ~/.claude/metrics/startup.sh is executable (chmod +x). Test manually: bash ~/.claude/metrics/startup.sh. Force a regenerate by removing the daily cache: rm ~/.claude/metrics/last-run-date.txt && python3 ~/.claude/metrics/generate-metrics.py.
macOS has no setsid, so nohup alone is not enough to survive the parent Claude Code session closing. The runner traps SIGHUP at the top (trap '' HUP) and scout.sh redirects stdin from /dev/null to keep the worker alive after the session exits.
claude -p --bare returns auth errors from the scout--bare disables OAuth and keychain auth. Drop --bare so the user's session auth applies. The runner uses --allowedTools "WebSearch Write" for the right scope.
~/.claude/The Claude Code sensitive-path guard blocks headless claude -p writes inside ~/.claude/ even with --allowedTools. The runner writes to /tmp/claude-scout-results-$$.json first, validates the JSON, then mvs it into place.
SessionStart hooks are exempt from the per-command autonomous-agent safety check, so the runner spawns fine from scout.sh. Re-running the runner manually from inside a session will be denied; test it via bash ~/.claude/metrics/scout-runner.sh from an external terminal.
Retro Daily - Hooks side by side with 3 alternatives on trust, install, platform support, and disclosed safety notes — all from reviewed registry metadata.
1 trust signal differ across this comparison (Submitter).
| Field | SessionStart hook that prints a daily Claude Code retro at the top of every session — competency grade (0–100, A–F), 14-day efficiency sparklines, and a year-long contributions heatmap. Open dossier | Collects and reports detailed metrics about the coding session when Claude stops. Open dossier | Generates a comprehensive report when Claude Code workflow stops, including files modified, tests run, and git status. Open dossier | Automated accessibility testing and compliance checking for web applications following WCAG 2.1 and WCAG 2.2 guidelines. This hook automatically runs accessibility scans on HTML files after they are written or edited, using axe-core for comprehensive WCAG compliance testing. 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 |
| SubmitterDiffers | gyanesh-m | — | — | — |
| 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 | gyanesh-m | JSONbored | JSONbored | JSONbored |
| Added | 2026-05-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 Claude Code SessionStart and can spawn detached background claude -p workers. Uses WebSearch and Write in the scout worker unless RETRO_DAILY_NO_BACKGROUND_WORKERS=1 is set. Writes temporary scout and tagger output to /tmp before moving validated results into ~/.claude/metrics. First full setup can install large Python model dependencies for local classification. Scout findings may include web- or GitHub-derived text and should be treated as untrusted informational context, not executable instructions. | ✓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 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 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. |
| Privacy notes | ✓Reads local Claude Code session history from ~/.claude/projects/*.jsonl to compute metrics. Writes derived metrics, logs, scout results, and session tags under ~/.claude/metrics. Session tagger builds a truncated digest from recent local session messages for claude -p labeling. Background scout may send weak-metric research queries to docs.anthropic.com and GitHub through WebSearch. The SessionStart hook may provide the rendered retro/scout dashboard to Claude Code as hookSpecificOutput.additionalContext, which is model-visible context in addition to the user-visible dashboard. | ✓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. | ✓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. | ✓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. |
| Prerequisites |
| — none listed | — none listed | — none listed |
| Install | | | | |
| Config | | | | |
| Citations | ||||
| Claim | Unclaimed | Unclaimed | Unclaimed | Unclaimed |
Loading live community signals…
A short, calm digest of reviewed Claude resources. Unsubscribe any time.