Skip to main content

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

中文文档 / Chinese README


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:

  1. copies done.mp3 / blocked.mp3 into <herdr config dir>/sounds/<pack>/
  2. writes the pack into [ui.sound] in your config.toml
  3. runs herdr server reload-config so 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)

Source distribution for herdr-sound 1.0.0
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)

Table of built distributions (wheels) for herdr-sound 1.0.0
File Interpreter ABI Platform Actions
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.

Release history Release notifications | RSS feed

This release

1.0.0 This release

2 release files No provenance

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page