跳到主要内容

signal-notify

❖ Communityv1.0.0★ 0

Signal texts when a Hermes turn pauses, fails or is interrupted, and when Hermes waits on a clarify question, approval or sudo prompt. Sends through the user's own signal-cli HTTP daemon (the same SIGNAL_* settings as the core Signal gateway); skips Signal-origin, cron and subagent turns, and dedupes identical texts within 60s. Outbound-only, no input channel.

Open in Hermes Desktop
hermes plugins install signal-notify

What it adds

Hooks 3

post_llm_callon_session_endon_human_input_request

Environment variables it needs 3

SIGNAL_HTTP_URLSIGNAL_ACCOUNTSIGNAL_HOME_CHANNEL

README

From the reviewed commit 16bff1f ↗; it updates when the author re-pins.

signal-notify for Hermes Agent

CI OpenSSF Scorecard License: MIT Hermes

Get a Signal text when your Hermes Agent needs you. Hermes texts you when:

Event Text
A turn finishes and Hermes is waiting for your next message ⏸ Hermes paused [tui …a1b2c3d4] plus the start of its reply
A turn fails or ends without finishing (an error, the iteration limit) ❌ Hermes errored [...] plus the exit reason
A turn is interrupted ⏹ Hermes stopped [...] plus the reason
Hermes asks a clarify question, needs an approval, or needs a sudo password ❓ Hermes is asking [...] plus the question

Leave a long agent run going, walk away, and your phone tells you when it stops or has a question.

Requirements

  • Hermes Agent 0.21.5 or newer.
  • A running signal-cli daemon with its HTTP endpoint on (signal-cli daemon --http), registered to a number Hermes sends from. If you already use Hermes' Signal gateway, you have this.
  • These variables in ~/.hermes/.env, which Hermes' Signal gateway also uses:
    • SIGNAL_HTTP_URL, for example http://127.0.0.1:8080. Use a loopback, private network (such as Tailscale) or HTTPS address: text travels to signal-cli as plain HTTP otherwise.
    • SIGNAL_ACCOUNT, the number signal-cli is registered to
    • SIGNAL_HOME_CHANNEL, the number to text. The recipient setting overrides it.

Quick start

hermes plugins install https://github.com/dbrosnan/hermes-signal-notify
hermes plugins enable signal-notify

Once the plugin is listed in the Hermes catalog, hermes plugins install signal-notify installs the reviewed, pinned release instead.

To check it works, ask Hermes anything and let the turn finish. A ⏸ Hermes paused text should arrive within a few seconds.

A running gateway picks up the hooks when the plugin is enabled. CLI and TUI sessions pick them up the next time they start.

Settings

Set these in the Desktop app under Settings → Plugins → signal-notify, or under plugins.entries.signal-notify.settings in config.yaml:

Setting Default Meaning
recipient "" Number or UUID to text. Empty uses SIGNAL_HOME_CHANNEL.
notify_on [paused, failed, interrupted, question] Which events send a text.
skip_platforms [signal, cron, subagent] Turns from these platforms never text. Signal chats already show the reply, cron jobs have their own delivery, and subagent turns would be noise.
reply_chars 300 Characters of the reply or prompt to include. 0 sends no conversation text, only the event and session.

Identical texts within 60 seconds are sent once, so a burst of the same prompt does not flood your phone.

What it sends and where (disclosure)

  • Network: each event makes one HTTP POST to the signal-cli endpoint in SIGNAL_HTTP_URL, in plain HTTP unless that URL is https://. signal-cli then sends an end-to-end encrypted Signal message to the recipient. Nothing goes to any other service.
  • Conversation text, on by default: up to reply_chars (300) characters of the final reply, the clarify question, or the approval or sudo command. Hermes redacts secrets from question and command text before the hook sees it. Reply text is not redacted, so anything the agent wrote in the first 300 characters of its reply reaches your phone. Set reply_chars: 0 to send no conversation text.
  • Never sent: sudo passwords and your answers to questions. Hermes does not give either to hooks.
  • Credentials: reads SIGNAL_HTTP_URL, SIGNAL_ACCOUNT and SIGNAL_HOME_CHANNEL through Hermes' secret_scope. It stores nothing and never reads .env itself.
  • Memory: keeps a preview of at most 64 recent replies, each clipped to reply_chars.
  • Background work: each send runs on a short-lived daemon thread with a 20 second timeout, so a slow or offline signal-cli never blocks Hermes. Failures are logged and dropped.
  • No shell commands, no files written, no telemetry, no self-updates.

The install security scan flags sudo_usage as a caution. That comes from the label for Hermes' sudo prompt. The plugin never runs sudo.

How it works

Three public Hermes hooks, with no core patching:

  • post_llm_call keeps the latest reply for each session so the pause text can quote it.
  • on_session_end fires when every turn finishes and decides whether the turn paused, failed or was interrupted.
  • on_human_input_request fires right before Hermes blocks on a clarify, approval or sudo prompt.

Troubleshooting

Symptom Check
No texts at all hermes plugins list shows signal-notify enabled. ~/.hermes/logs/agent.log has signal-notify lines.
Log says SIGNAL_HTTP_URL, SIGNAL_ACCOUNT or recipient missing Set the variables in ~/.hermes/.env and restart the session or gateway.
Log says send failed signal-cli isn't reachable: curl -X POST $SIGNAL_HTTP_URL/api/v1/rpc -H 'content-type: application/json' -d '{"jsonrpc":"2.0","method":"version","id":1}'
Log says signal-cli error: ... Unregistered user The recipient isn't a Signal user, or the number is missing the + country code.
Texts from the CLI but not the TUI, or the other way round Each process loads plugins when it starts. Restart the one that's missing texts.
Two texts per event An old copy of the plugin is still loaded. Restart the gateway with hermes gateway restart.
Too many texts Remove events from notify_on, or add platforms to skip_platforms.

FAQ

Can I reply to Hermes from the text? Not through this plugin, which only sends. Hermes' own Signal gateway handles two-way chat, and its turns are skipped here so you don't get each reply twice.

Does it work with Telegram, Slack or email? No, it's Signal only. For Telegram, see telegram-notify.

Does it slow Hermes down? No. Each send runs on its own thread with a 20 second timeout, and the agent never waits for it.

Contributing

Bug reports, ideas and pull requests are welcome. Start with CONTRIBUTING.md, and see SECURITY.md for private vulnerability reports. Everyone taking part follows the Code of Conduct. Releases are described in docs/RELEASING.md, and changes are listed in CHANGELOG.md.

uvx --with pytest-cov pytest --cov=. tests
uvx ruff check . && uvx ruff format --check .
hermes plugins validate .

License

MIT

Disclosure

← Back to the catalog · catalog built Oct 29, 2026