Plays a chime when a long task finishes

Four small mods for Claude Code. Install the ones you want.
| Mod | What it does |
|---|---|
codex | Claude can hand a task to Codex (OpenAI's gpt-6.1-sol), like a code review or a bug hunt. It runs in the background so the chat isn't blocked. |
imagegen | Claude can make and edit images through Codex, and shows the finished images right in the chat. |
devserver-limit | Stops Claude from starting a dev server when 2 are already running. Good for laptops with little memory. |
done-sound | Plays a chime when a task that took over a minute finishes. |
In a Claude Code terminal session, type one line per mod:
/plugin install codex --marketplace arjunkambj/claude-mods
/plugin install imagegen --marketplace arjunkambj/claude-mods
/plugin install devserver-limit --marketplace arjunkambj/claude-mods
/plugin install done-sound --marketplace arjunkambj/claude-mods
The first time, it asks to add the marketplace: press y. Then pick a scope (Enter picks "user", so it works in every project).
imagegen and done-sound use macOS tools and sounds.codex and imagegen: the Codex CLI installed and signed in (codex login). Images count against your Codex plan.hooks/register.ts 22 lines1import type { Register } from 'claude-code'
2
3// Only turns long enough that you may have looked away.
4const MIN_MS = 60_000
5// macOS's own Glass sound, read from the system so the mod ships no audio file.
6const SOUND = '/System/Library/Sounds/Glass.aiff'
7
8export const register: Register = on => {
9 on('turn.complete', async ($, e, next) => {
10 const result = await next(e)
11
12 if (!e.agentId && !e.isAborted && e.durationMs >= MIN_MS) {
13 void $.fs
14 .read(SOUND, { as: 'bytes' })
15 .then(({ base64 }) => $.audio.play({ base64, mime: 'audio/aiff' }))
16 .catch(() => undefined)
17 }
18
19 return result
20 })
21}
22