User Guide · v1.0

Hook Dashboard

A unified interface for configuring, monitoring, and managing hooks across Git, webhooks, and Claude Code agentic workflows.

⚙️ Git Hooks 🔗 Webhooks 🤖 Claude Code Hooks

Overview

The Hook Dashboard gives you a single pane of glass to manage automation hooks across three paradigms: Git lifecycle hooks, webhook HTTP callbacks, and Claude Code agentic hooks. Whether you're enforcing commit standards, reacting to Stripe payments, or adding deterministic guardrails to an AI coding agent, all your hooks live here.

🔍

Inspect Any Hook

Click any hook in the list to open its full detail view — handler code, run metrics, tags, and architecture notes.

Real-Time Metrics

The stats bar tracks total hooks, active count, error state, and cumulative run counts across your entire fleet.

🔒

Deterministic Control

Hook execution is guaranteed. Unlike a system prompt instruction, a hook runs every time — no probability involved.

🏷️

Tagged & Searchable

Filter by category, status, or free-text search across hook names, events, and tags to find exactly what you need.

Core Concepts

Every hook in the dashboard — regardless of category — shares the same three-part structure:

Lifecycle Event

The trigger: pre-commit, payment.succeeded, PostToolUse

⚙️

Handler

The logic: a shell script, HTTP endpoint URL, or LLM prompt

Outcome Signal

The decision: exit code, HTTP response, or JSON — determines if execution continues

Understanding this three-part pattern makes any hook immediately legible, regardless of what system it lives in.

💡

Key insight: Hooks augment a host system without modifying it. A pre-commit hook doesn't touch Git internals. A webhook handler doesn't modify Stripe. A Claude Code hook doesn't alter the model. They intercept, they observe, and they decide.

Interface Layout

The dashboard is organized into four primary zones:

ZoneLocationPurpose
HeaderTop barApp identity and the + New Hook button
Stats BarBelow headerFour live metric cards: total, active, errors, total runs
Hook ListLeft columnFilters, search, scrollable list of hook cards, and reference panel
Detail PanelRight columnFull inspection of the selected hook — handler, metrics, tags

Stats Bar

The stats bar at the top of the workspace provides an at-a-glance health summary for your entire hook fleet. It updates immediately whenever you create, delete, activate, or deactivate a hook.

MetricWhat It Shows
⚓ Total HooksAll hooks registered in the dashboard, regardless of status
▶ ActiveHooks currently enabled and running
⚠ ErrorsHooks that have returned an error state — these need attention
⚡ Total RunsCumulative execution count across all hooks

Browsing Hooks

The hook list on the left shows a scrollable, filterable set of hook cards. Each card displays:

Click anywhere on the card body to open the full detail view in the right panel.

Filtering & Search

Three filter controls sit above the hook list and can be combined freely:

Search

The search box filters across hook name, event, and tags simultaneously. It updates the list as you type — no need to press Enter.

Category Filter

Segment the list by hook system:

All
Show every hook
Git
Git lifecycle hooks only
Webhooks
HTTP callbacks only
Claude
Claude Code hooks only

Status Filter

Filter by hook lifecycle state: All, Active, Inactive, or Error. Use the Error filter to quickly surface hooks that need attention.

Detail Panel

Selecting a hook opens its full profile in the right panel. This is where you inspect, manage, and understand any hook in depth.

Header Section

Shows the hook's name, status dot, and three primary badges: category, event, and handler type. The edit (✏️) and delete (🗑️) action buttons live here.

Metrics Row

Three inline metric cards display the hook's current status, total run count, and last run timestamp.

Handler Block

The handler's content is rendered in a syntax-styled code block. For command hooks this is a shell script. For prompt hooks it's the instruction sent to the model. For agent hooks it's the task description given to the spawned subagent.

Tags

Freeform labels for discovery and grouping. Click a tag in the detail panel to copy it for use in the search box.

Architecture Note

A context-aware explanation at the bottom of the panel describes how this specific hook type works under the hood — different for each category:

Activate / Deactivate Button

A context-aware button at the bottom of the detail view lets you toggle the hook's status. The label and color update based on current state.

Creating a New Hook

Click + New Hook in the top-right corner to open the creation modal.

Name your hook

Give it a clear, descriptive name. Example: "Block Dangerous Bash Commands". This is required — the form will not submit without it.

Select a category

Choose Git Hooks, Webhooks, or Claude Code Hooks. This choice determines which events are available in the next field.

Pick an event

For Git and Claude hooks, a dropdown populates with valid events for that category. For Webhooks, type the event name directly (e.g., payment.succeeded, order.created).

Choose a handler type

Select command, prompt, or agent. The handler textarea's placeholder updates to guide the appropriate format for each type.

Write the handler

For command hooks: a shell script. For prompt: an instruction to the model. For agent: a task description with success/failure criteria. Webhook handlers should be a valid HTTPS URL.

Add tags (optional)

Type a tag and press Enter or click +. Tags appear as removable pills. Click any tag pill to remove it. Tags make hooks discoverable via the search box.

Click "Create Hook"

The new hook is added to the list, selected automatically, and a confirmation toast appears. The hook starts in Active status.

⚠️

Webhook validation: Webhook handler fields must begin with http:// or https://. The form will surface a validation error if the URL format is invalid.

Editing & Deleting Hooks

Editing

Open any hook's detail view and click the ✏️ edit button in the top-right of the panel. The edit modal pre-populates all fields with the hook's current configuration. Make your changes and click Save Changes. The detail panel updates immediately.

Deleting

Click the 🗑️ delete button in the detail panel header. A browser confirmation dialog prevents accidental deletion. Confirming removes the hook from the list and clears the detail panel. This action cannot be undone.

🚨

Deletion is permanent. There is no undo or recycle bin. Deactivate a hook instead of deleting it if you may need it again.

Toggling Hook Status

You can toggle a hook's active/inactive state in two places:

Status changes are reflected immediately in the stats bar and the hook's card. Note that toggling from error to active is also supported — useful when you've resolved the underlying issue and want to re-enable the hook.


Git Hooks

Git hooks are executable scripts that fire automatically when lifecycle events occur in a repository. They transform version control from a passive record-keeping tool into an active quality enforcement system.

Client-Side vs. Server-Side

TypeWhere It RunsCan Be Bypassed?Primary Use
Client-sideDeveloper's machineYes, by the developerLinting, test execution, commit formatting
Server-sideRemote repository serverNoGovernance, CI/CD triggers, security audits

Example: pre-commit Linter

#!/bin/sh
npm run lint
if [ $? -ne 0 ]; then
  echo "Linter failed. Aborting commit."
  exit 1
fi
ℹ️

Exit code 0 allows the commit to proceed. Any non-zero exit code aborts the commit. The error message is shown to the developer in their terminal.

Git Hook Event Reference

EventTrigger PointCommon Use
pre-commitBefore commit is createdLinting, unit tests
prepare-commit-msgBefore editor opensInject JIRA IDs, templates
commit-msgBefore commit is finalizedMessage format validation
post-commitAfter commit is createdLocal notifications, logging
pre-pushBefore git push runsFinal integration tests
pre-receiveOn server during pushReject non-compliant commits
post-receiveOn server after pushTrigger CI/CD, deployments

Webhooks

Webhooks are user-defined HTTP callbacks triggered by events in a source system and delivered as HTTP POST requests to a destination URL — typically carrying a JSON payload.

Polling vs. Webhooks

API PollingWebhooks
Communication modelClient asks "did anything happen?"Server answers proactively when it does
EfficiencyLow — most requests return nothingHigh — one request per real event
LatencyDepends on poll intervalNear real-time
Server loadHighLow

The Two-Phase Processing Pattern

The most critical implementation detail for webhooks is response timing. If your handler performs slow work synchronously, the provider may time out and retry — creating duplicate events.

1️⃣

Phase 1 (Synchronous)

Receive, validate signature, queue payload, return 200 OK immediately

2️⃣

Phase 2 (Async)

Background worker processes the queue at its own pace, no time pressure

⚠️

Always respond within the provider timeout. Stripe's timeout is 30 seconds. GitHub's is 10 seconds. Exceeding these without returning 200 triggers automatic retries and may result in your endpoint being flagged or blacklisted.

Claude Code Hooks

Claude Code hooks are the frontier of this dashboard. They attach to specific points in an AI agent's operational lifecycle, providing deterministic control over agent behavior.

💡

The core distinction: A system prompt instruction is probabilistic — the model usually follows it. A hook is a guarantee — it runs every time, regardless of what the model decides.

Claude Code Event Reference

EventTrigger PointTypical Use
SessionStartNew session beginsInject Git branch, env vars, recent commits
UserPromptSubmitBefore Claude processes promptSafety validation, request enrichment
PreToolUseBefore a tool executesBlock rm -rf, intercept dangerous patterns
PostToolUseAfter a tool call succeedsRun Prettier, Black, or other formatters
NotificationWhen Claude needs attentionDesktop notifications, Slack alerts
StopResponse is completeSecondary verification, quality checks
PreCompactBefore context compactionPersist conversation summary

Handler Types

Every hook uses one of three handler types. The type determines how the hook's logic executes and what it can do.

command

Shell Command

Executes a shell script or binary. Fastest and most deterministic. Exit code 0 = pass, exit code 2 = block (stderr feeds back to Claude as an error message).

Best for: Formatters, linters, pattern matching, anything with clear binary logic.

prompt

LLM Prompt

Sends a single-turn instruction to a Claude model. Returns a structured JSON allow/deny decision with an explanation.

Best for: Judgment calls that need reasoning — "does this edit violate our security policy?"

agent

Subagent

Spawns a complete Claude subagent with access to tools (file reading, grep, glob). Enables sophisticated verification logic that operates on the full codebase.

Example: "For every new function added, verify a corresponding unit test exists in /tests. Report missing tests as blocking errors." This is not a style check — this is an AI verifying another AI's work.

ℹ️

Choose the simplest handler type that can accomplish the task. Command hooks are faster and cheaper than prompt hooks, which are faster and cheaper than agent hooks. Reserve agent hooks for tasks that genuinely require tool access and multi-step reasoning.

Architecture Reference

The Three Invariants

Regardless of category, a hook's behavior is fully determined by three things:

ElementGit ExampleWebhook ExampleClaude Example
Lifecycle Eventpre-commitpayment.succeededPostToolUse
HandlerShell scriptHTTPS endpointShell / Prompt / Agent
Outcome SignalExit codeHTTP 200 / 4xxExit code / JSON decision

Exit Code Semantics (Command Hooks)

Exit CodeMeaningWhat Happens
0SuccessExecution continues normally
1General errorExecution aborted, error shown
2Blocking errorStderr output fed back to Claude as context for reconsideration

The Augmentation Principle

Hooks augment without modifying their host system. A pre-commit hook doesn't touch Git internals. A PostToolUse formatter hook doesn't modify the Claude model. A webhook handler doesn't touch Stripe's API. This is why hooks are the essential building block of modular, composable software — they insert behavior without coupling to implementation.

Reference Panel (In-App)

The dashboard includes a built-in reference panel at the bottom of the left column. It has three tabs: