There’s a natural back-and-forth as you work with Claude Code—where most of your turns are probably important directions!

Yet you might also find yourself giving Claude the same reminders—varying flavors of:

  • “Please make sure you followed <some specific guidelines>”,
  • “Please <compile the code and check for errors>”, or
  • “Please commit your changes”

Especially as the conversation goes on, Claude might finish its turn without the “final checks” you desire—and you might not catch on until later. (Or maybe you’ll simply tire of issuing reminders).

Is there an easy way to pass along a pre-written reminder–checklist for Claude to evaluate before handing back control to you?

There is!

Enter…

The Stop Hook

A stop hook is triggered when Claude “stops”—that is, when Claude finishes its output and hands control back to you.

A stop hook evaluates a shell script [runs a small program] and then either:

  1. Hands control back to you or
  2. Returns control to Claude

Can you see the possibilities?

Maybe you’d like Claude Code to play Turbo’s Eurobeat Summer of ’99 Remix to alert you that Claude has finished its task.

Maybe you’d like to trigger another program to immediately preview Claude’s changes.

Or maybe you’d like to return control to Claude—plus a short reminder–checklist to review before handing back control to you again.

Let’s cover that last one…

The first two tasks are left as an exercise for the reader.

The astute reader might recognize the possibilities for placing Claude in an infinite loop—using stop hooks and refusing to take back control—with all the possibilities and dangers that entails.

Providing Claude Code With A Short Reminder–Checklist

Champing at the bit? Sold on the solution?

Hand these markdown instructions to your Claude and ask for help installing a similar hook in your project. Or get a copy of my hook directly.

Either way, check with your Claude for more details about installing the hook in your project’s .claude/hooks/ folder and making the file executable. Make sure to adapt the specific text to your use case.

Here’s a brief walkthrough of my specific stop hook implementation:

When Claude finishes its response (stops):

  • Check if Claude is in plan mode—if so, return control to the user, per usual.
  • Check if Claude already received this reminder and responded—if so, return control to the user, per usual. Otherwise:
  • Send Claude a reminder with the checklist—and return control to Claude.

Makes sense, right?

If you are running multiple Claudes in the same directory [folder] at the same time and they both trigger this stop hook simultaneously, some might not see the checklist and others might see the checklist more than once, because we are using the same flag file. Please ask your Claude to fix this for you if necessary.

Customization

You’ll want to ask Claude to adapt the hook for your specific project and workflow.

For instance, I use git for version control [tracking changes]—so I ask Claude to commit [“save”] its recent changes—and the script can remind Claude which files changed, if any, along with the static [unchanging] reminder text.

Perhaps you’d like Claude to make a note of its changes this session for your later review? Or remember to queue up tasks for other instances and yourself? Or end each exchange with a haiku? All possible!

Things to think about:

Do you have commands you want to run? Maybe making backup copies or saving a short summary of Claude’s changes? You could even trigger the stop hook during certain conditions but not others—“Remind Claude to tell me to go to sleep if the local time is after midnight!”.

Ask Claude how to implement those functions in your stop hook!

Thanks for reading.

(Do you have feedback or recommendations? Have I made a mistake? Please let me know. I’d also like to hear if you were confused along the way—but please also check with your Claudes for faster feedback first. Good luck out there!)

Technical Specifics

I am including the steps for installing the hook and its complete text for reference.

Nonetheless, I recommend downloading the instructions for Claude and handing them over to Claude directly to receive a version customized for your project.

The Script

Save this as .claude/hooks/reminder-hook.sh in your project:

#!/bin/bash
cd "$CLAUDE_PROJECT_DIR" || exit 0

# Read hook input from stdin
input=$(cat)

# Skip checklist in plan mode (planning, not executing)
permission_mode=$(echo "$input" | jq -r '.permission_mode // "default"')
if [ "$permission_mode" = "plan" ]; then
    exit 0  # exit 0 = pass through, return control to user
fi

# Project-specific flag prevents interference between parallel sessions
FLAG_FILE="/tmp/claude-stop-hook-$(echo "$CLAUDE_PROJECT_DIR" | md5 -q 2>/dev/null || echo "$CLAUDE_PROJECT_DIR" | md5sum | cut -c1-8)"
FLAG_MAX_AGE=30  # minutes

# Two-phase logic: block first time, pass second time
if [ -f "$FLAG_FILE" ]; then
    # Flag exists — check if it's fresh (< 30 min old)
    if [ -z "$(find "$FLAG_FILE" -mmin +$FLAG_MAX_AGE 2>/dev/null)" ]; then
        # Fresh flag: Claude already saw the checklist, let them through
        rm -f "$FLAG_FILE"
        exit 0
    fi
    # Stale flag: session was abandoned, show checklist again
    rm -f "$FLAG_FILE"
fi

touch "$FLAG_FILE"

{
echo ""
echo "── Automated Reminder ──────────────────────────────────────"

# Show uncommitted changes compactly
changes=$(git status --porcelain 2>/dev/null)
if [ -n "$changes" ]; then
    files=$(echo "$changes" | awk '{print $2}' | tr '\n' ' ')
    count=$(echo "$changes" | wc -l | tr -d ' ')
    if [ "$count" -gt 3 ]; then
        short=$(echo "$changes" | head -2 | awk '{print $2}' | tr '\n' ' ')
        echo "Uncommitted: ${short}(+$((count-2)) more)"
    else
        echo "Uncommitted: $files"
    fi
    echo ""
fi

echo "Before finishing, did you:"
echo "  □ build/test   (if you made code changes)"
echo "  □ commit       (your changes, not pre-existing uncommitted files)"
echo "  □ plan mode    (task complete? enter plan mode for next steps)"
echo ""
echo "Feel free to suggest next steps, but please await direction before starting new work."
echo "All set? Finish your response — this clears on your next turn. Thank you!"
echo "────────────────────────────────────────────────────────────"
} >&2

exit 2  # exit 2 = block, show message, return control to Claude

Make it executable:

chmod +x .claude/hooks/reminder-hook.sh

Hook Configuration

Create or update .claude/settings.json in your project:

{
  "hooks": {
    "Stop": [
      {
        "hooks": [
          {
            "type": "command",
            "command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/reminder-hook.sh"
          }
        ]
      }
    ]
  }
}

And that’s it! The next time Claude wraps up and hands back control in your project—outside of plan mode—you’ll both see the checklist and Claude will have a chance to follow the instructions.