I use Claude Code daily as a Software Engineer at Citrix, and two small frictions kept showing up in long agentic sessions:
- I was reading every diff and tool-call output just to know if the agent was stuck, even though 90% of it was routine.
- On long sessions, the original goal I gave the agent would quietly drift as the conversation went on.
Claude Code plugins can hook into lifecycle events (Stop, Notification, UserPromptSubmit, etc.) with a single command, so I built one plugin for each problem.
earshot — narrates instead of reading
earshot hooks Stop and Notification. Instead of reading the agent's full response, it narrates a short spoken summary — and by default says nothing at all unless the agent is asking a question, blocked, or failed.
That "silent by default" behavior wasn't my first instinct — it came from reading two peer-reviewed studies on blind and low-vision developers using AI coding tools. Both found the core problem was auditory overload, not silence. Developers already running a screen reader don't want a second voice narrating the same text.
waypoint — a goal that doesn't get lost
waypoint hooks UserPromptSubmit. You set a goal once:
/goal-set Fix the login bug on the checkout page
From then on, every prompt you send silently carries a one-line reminder of that goal as injected context — until you clear it with /goal-done. No manual re-explaining 40 messages into a session that's drifted.
$ /goal-status
Active goal (set 2h 15m ago): Fix the login bug on the checkout page
What I'd tell someone building their first plugin
- Hooks are just a CLI you already know how to write. Read stdin, maybe write JSON to stdout, exit 0. No SDK, no framework — I used zero npm dependencies for both (pure Node fs/os/path).
- Silence is a feature. For anything that fires on every prompt or every response, decide explicitly when it says nothing — a hook that's chatty by default gets disabled fast.
-
State lives in
~/.claude/<plugin>/, plain JSON, no database needed for something this small. - Test the hook path directly by piping sample JSON into it via stdin before you ever load the plugin — it's the fastest feedback loop.
Both plugins are MIT-licensed and install in one command:
/plugin marketplace add absep98/earshot
/plugin marketplace add absep98/waypoint
Repos: github.com/absep98/earshot · github.com/absep98/waypoint
Happy to answer questions about the hook lifecycle or plugin structure in the comments.
Top comments (0)