Hermes Agent setup
Set up Hermes Agent notifications and phone approvals in one command. The Pushary plugin sends Hermes's dangerous-command approvals and questions to your phone.
Pushary sends Hermes Agent notifications and approvals to your phone. A Python plugin adds Pushary tools to Hermes, makes Pushary the transport for Hermes's dangerous-command approvals, and routes Hermes's questions to your phone. You get a push when a tool fails, and you can approve or deny a flagged command from your lock screen while Hermes runs.
Set it up
npx pushary@latest setupOn Windows PowerShell, run npx.cmd pushary@latest setup. The CLI needs Node.js 20.17+, 22.13+ or 23.5+.
Scan the QR code with your phone
Setup shows a QR code first. Scan it with your phone's camera or the Pushary app. Sign in or create an account, check that the code on your phone matches the one in your terminal, then tap Approve on Connect this computer? and allow notifications.
New accounts start a 3-day free trial, then pay $9.99 a month. A card is needed to start the trial. If this computer already has a Pushary key, setup reuses it and skips this step.
Pick Hermes
Setup asks Which agents do you use? with the agents it found already selected. Keep Hermes selected. To skip the question, run npx pushary@latest setup --agents hermes.
Setup finds the Python that Hermes runs in, installs the hermes-plugin-pushary package there with pip, and edits ~/.hermes/config.yaml. It never runs the hermes command itself.
Answer the test question
Setup sends a test push, then a test question. Answer it on your phone. The terminal says You're set once your answer arrives.
Start a new Hermes session
Hermes loads plugins when it starts.
On a Mac you can use Pushary Isle instead. Connecting your agents there installs the plugin into Hermes's own Python, selects Pushary as the approval transport, and saves your key in ~/.pushary/config.json, where the plugin reads it. It needs Hermes installed with its Python environment in place.
Install from the Hermes plugin catalog
Pushary is listed in the Hermes Agent plugin catalog, so Hermes can install it for you:
hermes plugins install pusharyThe catalog installs the release Nous reviewed, pinned to a commit. On Hermes v2026.9.11, run hermes update before installing: that release can read the catalog but lacks the redaction function the pinned plugin needs, so its approval cards would arrive without the command. Then set your API key in your shell profile and select Pushary as the approval transport, as shown in Set it up by hand:
export PUSHARY_API_KEY="pk_xxx.xxx"Do not run a second installer over the catalog copy.
What setup changes on your computer
| File | What changes |
|---|---|
| Hermes's Python environment | Installs hermes-plugin-pushary. Setup looks for the Python named in the hermes launcher, then in ~/.hermes/hermes-agent/venv. |
~/.hermes/config.yaml | Enables the plugin, selects Pushary as the approval transport with Hermes's own prompt as the fallback, and turns off Hermes's terminal clarify tool so questions go through pushary_ask. |
~/.pushary/setup/hermes-config.json | A record of what config.yaml had before, so npx pushary@latest clean can put it back. |
~/.pushary/config.json and your shell profile | Your API key. The plugin reads PUSHARY_API_KEY first, then ~/.pushary/config.json. |
The settings setup writes to ~/.hermes/config.yaml:
plugins:
enabled:
- pushary
security:
approval:
transport: pushary
transport_fallback: builtin
agent:
disabled_toolsets:
- clarifyCheck that it works
npx pushary@latest doctorDoctor checks your key and plan, that the plugin is installed and enabled, that approvals go through Pushary, and that questions go through Pushary. It sends a real test push. Add --roundtrip to send a test question too.
Then ask Hermes to do something its dangerous-command check flags, such as deleting a scratch folder. Your phone buzzes with Hermes's four choices.
Approve Hermes's dangerous commands from your phone
Hermes already detects dangerous commands and asks a person before it runs them. With security.approval.transport: pushary, that question goes to your phone instead of a terminal nobody is watching. You get the same four choices Hermes offers in the terminal:
| Choice | Effect |
|---|---|
| Allow once | Runs this command. |
| Allow for this session | Runs it, and stops asking for the rest of the session. |
| Always allow | Runs it, and writes a standing allow rule. |
| Deny | Blocks it. The agent is told you did not consent. |
How long your phone has depends on your approval mode. In Always, it is Hermes's own approvals.timeout (300 seconds by default). In When away, your phone has the push window, then Hermes's own prompt takes over.
transport_fallback: builtin makes the transport safe to leave on. If your key is missing, your mode is In agent, or no device can be reached, Pushary steps aside (withdrawing any question it already sent) and Hermes asks in its own prompt. If cancellation says stop, or Pushary cannot confirm the withdrawal, the command is denied. A network failure while Pushary waits never reopens approval silently. Remove the transport_fallback line and an unreachable Pushary becomes a denial instead.
Gate named tools with PUSHARY_GATE_TOOLS
To gate specific tools rather than Hermes's dangerous-command set, list them in PUSHARY_GATE_TOOLS. The check runs in the plugin's blocking pre_tool_call hook.
export PUSHARY_GATE_TOOLS="terminal,write_file"
export PUSHARY_GATE_TIMEOUT_MS=25000| Outcome | Result |
|---|---|
| You approve | The tool runs. |
| You deny | The tool is blocked, and the agent is told why. |
| No answer in the window | The tool is blocked. |
| Pushary unreachable, or no API key | The tool is blocked. |
| No phone, browser or Slack channel connected | The tool is blocked, with that as the reason. |
Hermes abandons any pre_tool_call callback that outlives plugins.hook_callback_timeout (30 seconds by default). The plugin keeps its wait inside that limit. PUSHARY_GATE_TIMEOUT_MS defaults to 55000 and is capped by it. Raise plugins.hook_callback_timeout to give your phone longer, up to the plugin's own limit of 55 seconds.
When Pushary is also the selected transport, the transport wins. The hook hands the call to Hermes's own approval gate, which gets the full 300-second window and the four choices. Always allow on such a call creates a standing rule for the whole tool name, including future calls with different arguments. Choose Allow once when you mean only the call on screen.
Hermes approvals off (dangerously skip permissions)
Hermes's approvals.mode: off turns off its native approval enforcement. Hermes then raises no dangerous-command approvals, so the Pushary transport has nothing to send. Plain MCP, the plugin's question tools and the skill only make questions cooperative: the agent decides whether to ask, so they are not an enforced gate. PUSHARY_GATE_TOOLS with no transport selected asks Pushary directly from the plugin's own hook. With the transport selected, it hands the call to Hermes's approval gate instead.
Hermes notifications and tools
The plugin registers 7 native Hermes tools:
| Tool | What it does |
|---|---|
pushary_notify | Send a push with optional rich context. |
pushary_ask | Ask a question: yes or no, multiple choice, or free text. |
pushary_wait | Poll once for the answer to a question created with wait=false. |
pushary_cancel | Cancel a pending question. |
pushary_propose_scope | Ask you to agree a file boundary or record a promise before a run. |
pushary_enroll | Connect one of your application's end users (Partner plan). |
pushary_ask_end_user | Ask an enrolled end user (Partner plan). |
Automatic notifications:
- Tool errors: a push when any tool returns an error, at most 3 per session.
- Session end: set
PUSHARY_AUTO_NOTIFY_SESSION_END=1to get a summary with tool and error counts when a session ends. Completed sessions use task-completion routing.
Hermes redacts gated argument summaries, targets and automatic error text before they are shortened or sent. If the host redactor is missing or fails, that detail is left out.
For questions, pushary_ask does its first wait and one server-directed poll per call; use pushary_wait with the same id while pending. Follow answered, status and handoffAction (or nextAction). Do not create a duplicate question or cancel a pending one because a poll ended. Cancel a live question before moving it to the current chat, stop if cancellation says stop, and if cancellation loses a race, poll once for one second and honor the winning answer. Silence is never approval.
Environment variables
| Variable | What it does |
|---|---|
PUSHARY_API_KEY | Your API key. Overrides the key in ~/.pushary/config.json. |
PUSHARY_CONFIG_FILE | Read the key from a different file than ~/.pushary/config.json. |
PUSHARY_AGENT_NAME | Label shown in notifications. Defaults to Hermes. Example: "Hermes - daily-briefing". |
PUSHARY_AUTO_NOTIFY_SESSION_END | Set to 1 to get notified when sessions end. |
PUSHARY_GATE_TOOLS | Comma-separated tool names to gate in pre_tool_call. |
PUSHARY_GATE_TIMEOUT_MS | How long the per-tool gate waits, in milliseconds. Defaults to 55000. |
When to use Pushary and when to use Hermes's chat platforms
Hermes can also talk to you through chat platforms such as Telegram, Discord and Slack. Use Pushary when you have no active chat open, when a quick decision should reach your lock screen, when a background task or cron job finishes, or when Hermes flags a dangerous command. Use the active chat platform when you are already in the conversation and the question is part of it.
Set it up by hand
Install the plugin into the Python that Hermes runs in, not your system Python:
~/.hermes/hermes-agent/venv/bin/python -m pip install hermes-plugin-pusharyAdd the settings from What setup changes on your computer to ~/.hermes/config.yaml. Current Hermes also accepts hermes plugins enable pushary for the first part.
Save your key in your shell profile:
export PUSHARY_API_KEY="pk_xxx.xxx"Start a new Hermes session, then run npx pushary@latest doctor.
Use MCP instead of the plugin
You can connect Hermes to the Pushary MCP server instead. Add this to ~/.hermes/config.yaml:
mcp_servers:
pushary:
url: https://pushary.com/api/mcp/mcp
headers:
Authorization: "Bearer ${PUSHARY_API_KEY}"Then install the Pushary skill, so Hermes knows when to notify you and how to choose between Pushary and the active chat platform:
hermes skills tap add Pushary/pushary-skill
hermes skills install pusharyThe MCP route gives Hermes the agent tools under their MCP names (send_notification, ask_user, wait_for_answer, cancel_question and propose_scope). It has none of the plugin's automatic notifications and no approval transport.
Turn it off
There is no pushary disconnect for Hermes. Edit ~/.hermes/config.yaml instead:
- To send approvals back to the terminal, remove
security.approval.transport. - To bring back terminal questions, remove
clarifyfromagent.disabled_toolsets.
npx pushary@latest clean removes Pushary from this computer, for every agent, and puts the Hermes settings back from its record. Add --dry-run to see what it would change first.
Troubleshooting
Setup says the Hermes CLI was not found
Setup looks for hermes on your PATH. Install Hermes, check that hermes runs in a new terminal, then run setup again.
Setup could not locate the Python that Hermes runs in
Install the plugin by hand with Hermes's own Python, as shown in Set it up by hand.
Setup installed the plugin but could not edit Hermes's config
Add the settings from What setup changes on your computer to ~/.hermes/config.yaml yourself.
Doctor says approvals stay in the terminal
security.approval.transport is not pushary in ~/.hermes/config.yaml. Run npx pushary@latest setup --agents hermes again, or set it by hand.
Next steps
Hermes notifications
What Hermes sends to your phone, and when.
Set your approval rules
Choose which actions run on their own and which wait for you.
Human in the loop
How questions, answers and timeouts work across agents.