Skip to content

SymbolStar/echo-cue

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

1 Commit
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

echo-cue 🔔

A short Web-Audio "ding-dong" when OpenClaw Control UI finishes a reply. Locally nicknamed echo.

ClawHub

A zero-build local patch for the OpenClaw Control UI (webchat) that plays a short two-tone chime (A5 → E5, ~900ms) when an assistant reply finishes streaming.

Think of it as the missing "reply ready" sound for OpenClaw's web UI — especially useful when you keep the Control UI in a background tab while you work elsewhere.

This is a stop-gap mirror of upstream PR openclaw/openclaw#73894 (issue #69186) which implements the same feature but has not been merged yet. echo-cue works today and gracefully steps aside the moment upstream ships.

Install

Via ClawHub (recommended)

clawhub install echo-cue
bash $(clawhub list --json | jq -r '.[]|select(.slug=="echo-cue").path')/apply.sh

Manual

git clone https://github.com/SymbolStar/echo-cue.git
cd echo-cue
bash apply.sh

Then refresh your Control UI browser tab. Click or press a key once on the page to unlock the AudioContext (browser policy — happens automatically the first time you send a message).

Verify

DevTools console:

window.__milly_cue_v1__   // → true

Toggle (per browser, no UI)

// Disable entirely
localStorage.setItem('milly.completionCue', 'off')

// Re-enable
localStorage.removeItem('milly.completionCue')

// Limit ringing to hidden / unfocused tabs only (default in 0.2.0+: rings always)
localStorage.setItem('milly.completionCue.onlyHidden', 'on')

// Restore default (always rings)
localStorage.removeItem('milly.completionCue.onlyHidden')

Uninstall

bash remove.sh

Restores the original bundle and index.html from the .milly.bak files.

After openclaw update

The update overwrites dist/control-ui/..., dropping the patch. Re-run:

bash apply.sh

apply.sh is idempotent and upstream-aware:

  • Already patched → skip
  • Upstream responseCompletionSound shipped → skip + advise uninstall

How it works

  • Detects every OpenClaw install on the box (Homebrew, nvm, OPENCLAW_HOME)
  • Backs up the current Control UI bundle (index-*.js → .milly.bak)
  • Appends a small IIFE that:
    • Watches the chat container with a MutationObserver
    • Listens for added .chat-group.assistant nodes
    • Skips NO_REPLY / empty silent completions
    • Plays a Web Audio two-tone chime (A5 → E5)
    • 4-second hard rate-limit + content-fingerprint dedup → no double-rings
  • Renames the bundle to index-*.milly-NNN.js and updates index.html so a plain Cmd+R refresh actually picks up the patch (Vite's hashed bundles ship with Cache-Control: immutable, otherwise hard-refresh would still hit cache)

Known limits

  • Anchor: .chat-group.assistant DOM class. If OpenClaw renames it the patch silently does nothing (fail-quiet — no breakage).
  • AudioContext requires one user gesture per page load (browser policy).
  • Webchat only. TUI / iOS / macOS / Android clients are not covered (they have their own native notification stacks).
  • Single audible cue per assistant turn regardless of message length.

File layout

File Purpose
SKILL.md ClawHub skill manifest (frontmatter name + description)
apply.sh Detect every OpenClaw install, idempotent inject IIFE, backup, cache-bust
remove.sh Restore from .milly.bak files
inject/completion-cue.iife.js The patch payload
tests/manual.md 7-step verify checklist

Related

License

MIT — see LICENSE.

About

Local Web-Audio chime for OpenClaw Control UI when an assistant reply finishes streaming. Stop-gap for openclaw/openclaw#73894 / #69186. Published on ClawHub as echo-cue.

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors