{"slug": "show-hn-beckon-distinct-sounds-for-what-your-ai-coding-agent-needs", "title": "Show HN: Beckon, distinct sounds for what your AI coding agent needs", "summary": "Beckon, a new open-source tool by developer Isa1asN, assigns distinct sounds to an AI coding agent's lifecycle events so developers can know whether to look, unblock, wait, or read an error without watching the terminal. The tool, which requires Claude Code, binds to agent hooks and plays different tones for finished turns, blocked decisions, failures, and rate-limiting, with configurable packs and per-project sound variations. It is available via cargo install and on GitHub, with Linux fully verified and macOS/Windows builds tested in CI but audio unverified.", "body_md": "Distinct sounds for your AI coding agent, so you don't have to watch the terminal.\n\nbeckon binds to your agent's lifecycle hooks and plays a different sound depending on what it needs:\n\n| Sound | Meaning | What to do |\n|---|---|---|\n| rising chime | finished its turn | go look |\n| insistent sting | blocked on your decision | go unblock it |\n| falling tone | it failed | go read the error |\n| slow pulse | rate-limited or throttled | wait |\n\nA single undifferentiated ding tells you something happened. It doesn't tell you whether to get up.\n\n```\ncargo install beckon-cli   # the binary is called `beckon`\nbeckon init                # binds the hooks — shows a diff and asks first\nbeckon test                # hear the active pack\n```\n\nOr from source: `git clone https://github.com/Isa1asN/beckon && cd beckon && cargo install --path .`\n\n`init`\n\nprints the exact change it will make to `~/.claude/settings.json`\n\n, copies\nthe file to `settings.json.beckon-backup-<timestamp>`\n\nbeside itself, and only\nthen writes. `beckon uninstall`\n\nremoves beckon's entries and leaves everything\nelse alone.\n\nIt refuses to touch a settings file it cannot round-trip: invalid JSON, invalid\nUTF-8, a non-object root, or an unfamiliar `hooks`\n\nshape. A file it does accept\nis re-serialised, so non-canonical formatting (CRLF, tabs, duplicate keys) is\nnormalised. Content is preserved; the backup keeps the original bytes.\n\n| Builds | Test suite | Audio verified | |\n|---|---|---|---|\n| Linux x86-64 | yes | yes | yes |\n| macOS | yes | in CI | no |\n| Windows | yes | in CI | no |\n\nCI runs the full suite on all three. CI runners have no sound device, so playback there goes through the null backend — the macOS and Windows audio paths compile and are exercised structurally, but nobody has heard them. Reports welcome.\n\nAlso built without the `embedded-audio`\n\nfeature, which is the shape a fully\nstatic musl binary takes: no cpal, no libasound, falling back to a system\nplayer.\n\nRequires Claude Code. Other agents are planned; the adapter seam exists and is\ndocumented in [docs/DESIGN.md](/Isa1asN/beckon/blob/main/docs/DESIGN.md).\n\n```\nbeckon test                     # play every sound in the active pack\nbeckon packs                    # list packs\nbeckon use cipher               # switch pack\nbeckon mute 30m                 # quiet for a while (45s, 2h, …); unmute ends it\nbeckon doctor                   # why is it quiet? every reason, listed\nbeckon config set volume 0.4\nbeckon uninstall\n```\n\nBy default beckon:\n\n- says nothing when a turn finished in under 30 seconds — you were still watching\n- always plays a blocking alert, however fast it arrived, because a permission prompt stalls progress\n- doesn't repeat the same sound for the same session within 1.5 seconds\n- stays quiet for a tool failure, since a failing test is normal work\n(\n`beckon config set events.tool-failed true`\n\nto change that) - ignores a tool you interrupted yourself\n- caps concurrent sounds at 8\n\nIf it's quiet and you didn't ask it to be, `beckon doctor`\n\nsays why.\n\nEach project gets a stable transposition from a consonant scale, so\n`api-server`\n\nand `worktree-auth`\n\nsound different with the same pack, and two\nsounding together harmonise rather than clash. Nothing to configure; disable\nwith `beckon config set identity.per_project false`\n\n.\n\nRate limiting is scoped per session and per state. A machine-wide throttle would let one agent's completion chime swallow another's permission alert.\n\nThree ship inside the binary, all original, all CC0:\n\n**aurora**— calm starship computer. Soft triangle arpeggios, long reverb.** cipher**— stealth-game alert. Short, dry, cuts through.** unit-7**— deadpan lab robot. Mechanical FM bleeps, no reverb.\n\nA pack is a TOML file, not a folder of audio. Sounds are synth recipes — oscillators, envelopes, filters — about a kilobyte of text:\n\n```\n[sounds.done]\ntype = \"synth\"\nreverb = { room = 0.55, mix = 0.34 }\n\n[[sounds.done.layer]]\nwave = \"triangle\"\nnotes = [\"C5\", \"E5\", \"G5\"]\nstep_ms = 92\nfilter = { kind = \"lowpass\", cutoff_hz = 3200 }\n```\n\nSo a pack is provably original, weighs nothing, and can be reviewed as a diff. Auditing a folder of binary blobs for licence provenance is what makes shared sound libraries impractical.\n\nTo write one, drop a `pack.toml`\n\nin `~/.local/share/beckon/packs/<id>/`\n\n. It\nshadows a built-in of the same name, so you can fork `aurora`\n\nand keep the name.\n`beckon test <id>`\n\nto hear it.\n\nYou don't need to author a pack to use your own audio:\n\n```\nbeckon config set sounds.needs-you ~/sounds/alert.wav\n```\n\nAnything you don't override falls through to the active pack, at every step of\nthe fallback chain — replace `failed`\n\nand `rate-limited`\n\nfollows it. wav, ogg,\nflac and mp3 are supported. The path is checked when you set it, so a typo fails\nimmediately rather than becoming silence you notice days later.\n\nOr write the table directly:\n\n```\n# ~/.config/beckon/config.toml\n[sounds]\nneeds-you = \"~/sounds/alert.wav\"\ndone      = \"~/sounds/ding.wav\"\n```\n\n`[sounds]`\n\nis honoured only in your own config, never in a project's\n`.beckon.toml`\n\n. A repository you clone can change *when* beckon makes a noise;\nit cannot name files on your machine and have them opened by a media decoder.\n\nSample files are bounded: regular files only, 10 MiB and 30 seconds maximum, and a pack's samples must resolve inside the pack after symlinks are followed.\n\n- No daemon. Nothing runs between hooks. Your agent invokes beckon, it decides in ~5ms, hands playback to a detached child, and exits.\n- No network at hook time.\n- No telemetry.\n- Packs are data, never executed.\n- Exits 0 unconditionally — bad config, no audio device, corrupt input, panic.\nbeckon binds hooks that block the agent on a non-zero exit, so this is\nverified against the release binary, where\n`panic = \"abort\"`\n\nputs it beyond the reach of`cargo test`\n\n.\n\n- Publish to crates.io\n- Hear it on macOS and Windows (CI builds and tests there already)\n-\n`beckon install github:user/repo`\n\n— packs from git - A browsable community pack index\n- SSH: escape sequences so a remote agent alerts your local terminal\n- Adapters for Codex, Cursor, Gemini\n- npm and Homebrew distribution\n\n```\ngit clone https://github.com/Isa1asN/beckon && cd beckon\n./scripts/install-hooks.sh   # pre-commit: fmt + clippy\n./check.sh --release         # everything CI enforces\n```\n\n`main`\n\nrequires a pull request and **signed commits**. If you don't already\nsign, GitHub will reject the push without much explanation:\n\n```\ngit config --global gpg.format ssh\ngit config --global user.signingkey ~/.ssh/id_ed25519.pub\ngit config --global commit.gpgsign true\n```\n\nThen add the same key to GitHub under Settings → SSH and GPG keys with key type\n**Signing Key** — an authentication key does not count, and that catches most\npeople out.\n\nCI runs fmt, clippy with `-D warnings`\n\n, the suite on Linux/macOS/Windows, a\nbuild with no audio backend, an MSRV check, the release-binary safety script,\nand crates.io packaging. `./check.sh --release`\n\ncovers everything except the\nother two platforms.\n\nNew sound packs are welcome — a pack is a TOML file, so a pull request adding\none is reviewable as a diff. Design notes: [docs/DESIGN.md](/Isa1asN/beckon/blob/main/docs/DESIGN.md).\n\nCode is MIT OR Apache-2.0. The built-in packs are CC0-1.0.", "url": "https://wpnews.pro/news/show-hn-beckon-distinct-sounds-for-what-your-ai-coding-agent-needs", "canonical_source": "https://github.com/Isa1asN/beckon", "published_at": "2026-08-28 07:12:17+00:00", "updated_at": "2026-08-28 07:18:29.720330+00:00", "lang": "en", "topics": ["developer-tools", "ai-agents", "ai-tools"], "entities": ["Beckon", "Isa1asN", "Claude Code", "GitHub"], "alternates": {"html": "https://wpnews.pro/news/show-hn-beckon-distinct-sounds-for-what-your-ai-coding-agent-needs", "markdown": "https://wpnews.pro/news/show-hn-beckon-distinct-sounds-for-what-your-ai-coding-agent-needs.md", "text": "https://wpnews.pro/news/show-hn-beckon-distinct-sounds-for-what-your-ai-coding-agent-needs.txt", "jsonld": "https://wpnews.pro/news/show-hn-beckon-distinct-sounds-for-what-your-ai-coding-agent-needs.jsonld"}}