Troubleshooting

Start with:

claudio status

That shows the config file in use, whether audio is enabled (MUTED when it is not), the effective volume, active soundpack, log level, which backend auto resolved to and whether it is available, the log file path, tracking, and Claudio version. It includes CLAUDIO_* environment overrides.

claudio: command not found

Check where Go installed the binary:

go env GOPATH
go env GOBIN

Add the relevant bin directory to PATH, usually:

export PATH="$PATH:$(go env GOPATH)/bin"

If GOBIN is set, add that directory instead.

Then verify:

claudio --version

Hooks Installed But No Sound

Check the audio backend line in claudio status. available means the backend is compiled in, or for system_command that a player is on PATH. It does not open the audio device, so it does not prove you will hear anything. If the backend is unavailable, an enabled hook prints the error and exits nonzero instead of starting its background worker, so the agent’s hook output shows the reason. Muted hooks stay quiet either way.

On Linux, check that a PulseAudio-compatible server is reachable (set PULSE_SERVER when needed), or that the ALSA runtime library libasound.so.2 is installed. See Installation.

If the output device stops taking audio without reporting an error (a suspended PulseAudio sink, a disconnected Bluetooth or USB output), Claudio abandons the sound about two seconds after it should have finished, and gives up opening the device after five seconds. The log file records Oto playback stalled. Reconnect or wake the device; the next hook opens it fresh.

A config from an older release that sets audio_backend to malgo loads as oto and logs a warning. Change it to oto or auto to silence the warning.

Check that Claudio is not muted:

claudio status
claudio unmute
claudio volume 0.5

Check environment overrides:

env | grep CLAUDIO

CLAUDIO_ENABLED=false or CLAUDIO_VOLUME=0 can override the config file. An invalid CLAUDIO_AUDIO_BACKEND value is ignored with only a warning in the log file, so check its spelling against auto, oto, and system_command.

Run a manual payload:

echo '{"session_id":"debug","cwd":".","hook_event_name":"PostToolUse","tool_name":"Bash","tool_response":{"stdout":"ok","stderr":"","interrupted":false}}' | claudio

If that works, the issue is likely hook registration or agent trust. If it does not, inspect the debug log and the audio backend.

If you moved or replaced the claudio binary after installing hooks, the hooks still point at the old path. Run claudio install again with the new binary.

No Supported Agents Detected

claudio install uses --agent auto by default. It installs hooks only for agents Claudio can detect.

Check expected settings paths:

ls -la ~/.claude/settings.json
ls -la ~/.codex/hooks.json
ls -la ~/.gemini/settings.json
ls -la ~/.qwen/settings.json
ls -la ~/.copilot/settings.json

CLAUDE_CONFIG_DIR, CODEX_HOME, and COPILOT_HOME move these files when set. Detection also succeeds when the agent’s command is on PATH.

Run the target agent once if its settings directory does not exist yet, or install explicitly:

claudio install --agent claude --scope global
claudio install --agent codex --scope global
claudio install --agent gemini --scope global
claudio install --agent qwen --scope global
claudio install --agent copilot --scope global

Codex Hooks Do Nothing

After installing Codex hooks:

claudio install --agent codex --scope global

Run /hooks in Codex and trust the Claudio hook. Codex will not run an untrusted hook.

Dry-run the target path:

claudio install --agent codex --scope global --dry-run

For project hooks, make sure you installed from the project root:

claudio install --agent codex --scope project --dry-run

Claude Code Hooks Do Nothing

If you use CLAUDE_CONFIG_DIR, make sure it has the same value when you run claudio install as when you run Claude Code. Claudio writes to $CLAUDE_CONFIG_DIR/settings.json when it is set and ~/.claude/settings.json when it is not.

Inspect the target settings file:

claudio install --agent claude --scope global --dry-run
claudio install --agent claude --scope global --print

For project hooks, run from the repository root:

claudio install --agent claude --scope project --dry-run

Reinstalling is idempotent for Claudio hooks:

claudio install --agent claude --scope global

Gemini Hooks Do Nothing

Inspect the target settings file:

claudio install --agent gemini --scope global --dry-run
claudio install --agent gemini --scope global --print

For project hooks, run from the repository root:

claudio install --agent gemini --scope project --dry-run

Reinstalling is idempotent for Claudio hooks:

claudio install --agent gemini --scope global

Qwen Code Hooks Do Nothing

Inspect the target settings file:

claudio install --agent qwen --scope global --dry-run
claudio install --agent qwen --scope global --print

For project hooks, run from the repository root:

claudio install --agent qwen --scope project --dry-run

Reinstalling is idempotent for Claudio hooks:

claudio install --agent qwen --scope global

GitHub Copilot CLI Hooks Do Nothing

Inspect the target settings file:

claudio install --agent copilot --scope global --dry-run
claudio install --agent copilot --scope global --print

Project scope writes ./.github/copilot/settings.local.json, or an existing ./.github/copilot/settings.json. Run it from the repository root:

claudio install --agent copilot --scope project --dry-run

Wrong Sound Plays

Use tracking first:

claudio analyze usage --show-chains --show-summary
claudio analyze missing --preset all-time --limit 50

If a specific sound is missing, add that key to your soundpack. For example, when git commit falls back to success/git-success.wav, add:

success/git-commit-success.wav

Validate after changes:

claudio soundpack validate ./my-pack

Custom Soundpack Not Found

List discovered soundpacks:

claudio soundpack list

If your pack is not listed, install it:

claudio soundpack install ./my-pack --default

or use a JSON path directly in config:

{
  "default_soundpack": "my-pack",
  "soundpack_paths": ["/absolute/path/to/my-pack.json"]
}

Directory packs in the standard data location must live under:

<XDG_DATA_HOME>/claudio/soundpacks/<name>/

JSON Soundpack Fails Validation

Run:

claudio soundpack validate ./my-pack.json

Common causes:

Empty mappings are allowed. Broken references fail validation.

Directory Soundpack Fails Validation

Run:

claudio soundpack validate ./my-pack

Check:

Missing keys only lower the coverage numbers. Adding default.wav at the pack root is still a good idea, since it is the last step of every fallback chain.

Audio Backend Errors

Show the configured backend:

claudio status

Try the system-command backend:

echo '{"session_id":"debug","cwd":".","hook_event_name":"Stop"}' | CLAUDIO_AUDIO_BACKEND=system_command claudio

system_command runs the first player it finds on PATH, in this order: paplay, ffplay, aplay, afplay. afplay ships with macOS; on Linux install pulseaudio-utils (paplay) or FFmpeg (ffplay). On Windows only ffplay applies. aplay plays WAV only and ignores the volume setting.

If the agent runs on a remote machine over SSH, that box usually has no audio device at all. Forward a PulseAudio socket instead; see Remote Audio Over SSH.

Debug Logs

Enable debug file logging:

export CLAUDIO_LOG_LEVEL=debug

The level applies to the log file only. Claudio writes nothing below ERROR to stderr, so read the file. claudio status prints its exact path. Defaults:

Platform Log file
Linux, WSL $XDG_CACHE_HOME/claudio/logs/claudio.log, normally under ~/.cache
macOS ~/Library/Caches/claudio/logs/claudio.log
Windows %LOCALAPPDATA%\cache\claudio\logs\claudio.log

Setting XDG_CACHE_HOME overrides the default on every platform.

If you do not want a log file for a one-off run:

CLAUDIO_FILE_LOGGING=false claudio status

Tracking Has No Data

Check status:

claudio status

If tracking is disabled, enable it:

export CLAUDIO_SOUND_TRACKING=true

or in config:

{
  "sound_tracking": {
    "enabled": true
  }
}

Then use Claudio normally and rerun:

claudio analyze usage
claudio analyze missing

Remove Claudio

Remove hooks:

claudio uninstall --agent all --scope global

To remove one agent, pass --agent claude, codex, gemini, qwen, or copilot. Repeat with --scope project in each repository where you installed project hooks.

Remove optional command artifacts:

claudio uninstall-commands --agent claude
claudio uninstall-commands --agent codex
claudio uninstall-commands --agent antigravity

Report An Issue

Include:

See Also