herdr-sound
Give your Herdr agents a game-style notification sound.
herdr-sound is a tiny CLI that switches Herdr's native notification sounds
between chiptune "packs" — one sound when an agent finishes, another when it
needs you. No plugin, no background process: it just copies the audio files next
to your Herdr config and points [ui.sound] at them.
$ hsp use zelda
done -> ~/.config/herdr/sounds/zelda/done.mp3
blocked -> ~/.config/herdr/sounds/zelda/blocked.mp3
已切换音色包:zelda
config: ~/.config/herdr/config.toml
Packs
| Pack | Vibe | done | blocked |
|---|---|---|---|
mario |
bright two-note jump / classic falling three-note | 0.39s | 0.67s |
zelda |
five-note rising arpeggio ("secret found") / descending resolve | 0.68s | 0.93s |
sonic |
fast high double-tap / descending sting with retrigger | 0.44s | 0.82s |
tetris |
quick rising sweep / five-note minor descent | 0.39s | 0.84s |
pacman |
rapid alternating "waka" / eleven-note chromatic slide | 0.34s | 0.86s |
ff |
fanfare arpeggio with a held top note / slow low descent | 0.78s | 0.90s |
Run herdr-sound list to see them with exact durations.
All audio is original. Every pack is synthesized from square waves by
src/herdr_sound_plugin/gen.py— the notes and rhythm are original compositions in a genre style. No samples from any game are included, so the whole package is safe to redistribute.
Install
Requires Python 3.10+ and Herdr 0.9.3+.
# recommended: isolated install with uv
uv tool install herdr-sound
# or plain pip
pip install herdr-sound
Until the package is on PyPI, install straight from this repo:
uv tool install --from git+https://github.com/ezstack-dev/herdr-sound-plugin herdr-sound
# or, from a local clone
uv tool install .
Both herdr-sound and the short alias hsp are installed.
Usage
hsp list # list packs, * marks the active one
hsp use mario # switch to a pack
hsp status # what is active right now, and where
hsp doctor # health check: binary, config, sound files
hsp restore # back to Herdr defaults (disable sound, remove copies)
hsp use <pack> does three things:
- copies
done.mp3/blocked.mp3into<herdr config dir>/sounds/<pack>/ - writes the pack into
[ui.sound]in yourconfig.toml - runs
herdr server reload-configso it takes effect without a restart
It edits your config in place and preserves comments and formatting, but backing it up first is still a good habit.
Which key does what
| Herdr config key | When it fires | Pack file |
|---|---|---|
ui.sound.done_path |
an agent finished its turn | done.mp3 |
ui.sound.request_path |
an agent needs attention | blocked.mp3 |
Custom config location
herdr-sound finds your config the same way Herdr does:
$HERDR_CONFIG_PATH → $XDG_CONFIG_HOME/herdr/config.toml →
~/.config/herdr/config.toml. Set HERDR_CONFIG_PATH to operate on a
different one:
HERDR_CONFIG_PATH=/tmp/test/config.toml hsp use pacman
Things worth knowing
Sounds play in the Herdr client, not the server. Herdr resolves
[ui.sound] and plays the audio in the attached client process. If you run
Herdr headlessly or only attach through a bridge, the config is still correct —
you just won't hear anything until a real client is attached. hsp doctor tells
you the config is valid either way.
There is no "failed" sound. Herdr's agent states are
idle / working / blocked / done / unknown — there is no failed. A crashed or
errored agent usually still ends as done, so it gets the finish sound. The
blocked slot means "needs attention", which is the closest thing Herdr offers
and is what we map the "something's wrong" sound onto.
restore only removes what it installed. Files under sounds/<pack>/ for
known packs are deleted; anything else you put in the sounds directory is left
alone.
Development
task check # tests + sound-sync check + wheel packaging check
task sounds # regenerate all mp3s from the note tables in packs.py
task list # print packs and durations
Layout:
src/herdr_sound_plugin/
cli.py typer app (list / use / status / doctor / restore / version)
config.py locate + read + edit herdr's config.toml (tomlkit, keeps comments)
install.py copy sounds, compute [ui.sound] paths, uninstall
herdr.py thin wrapper: find the herdr binary, reload-config
packs.py the note tables — one "score" per pack and purpose
synth.py square-wave synthesis -> mp3
gen.py writes packs.py scores out to sounds/<pack>/<kind>.mp3
sounds/ 12 committed mp3s, shipped inside the wheel
packages/legacy-herdr-plugin/ ⚠️ dead code from the old plugin approach
packages/legacy-herdr-plugin/ is archived, not used, and excluded from test
collection. See its README if you want the post-mortem.
License
Apache-2.0. See LICENSE.
Metadata
Release files for herdr-sound 1.0.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| herdr_sound-1.0.0.tar.gz | 146.2 kB | Without provenance | Details for herdr_sound-1.0.0.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| herdr_sound-1.0.0-py3-none-any.whl | Python 3 | none | any | Details for herdr_sound-1.0.0-py3-none-any.whl |
Total release size: 298.6 kB
Release files / herdr_sound-1.0.0.tar.gz
| Download URL | herdr_sound-1.0.0.tar.gz |
|---|---|
| Size | 146.2 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
deced9f49c5c2bbb5182b8ab538de15596eb3df59e329b559bb26d8d24886645
|
|
BLAKE2b-256 checksum How to use checksums |
7fc084ac17b7660b3b5e9b640a0a0c936a22a4ac05ad4d3c802fc5b094dd3cef
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.12.22 {"installer":{"name":"uv","version":"0.12.22","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|
Release files / herdr_sound-1.0.0-py3-none-any.whl
| Download URL | herdr_sound-1.0.0-py3-none-any.whl |
|---|---|
| Size | 152.4 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
a57a9453c3ab0164c6af9a08b2c2312cdf0fe60442762168ed03251e55698b14
|
|
BLAKE2b-256 checksum How to use checksums |
9105c4932c2a3f117beadc5470f41b6061b2a18904296a904da0a04a0bd37161
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.12.22 {"installer":{"name":"uv","version":"0.12.22","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|
Security for herdr-sound 1.0.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.