Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions website/docs/reference/cli-commands.md
Original file line number Diff line number Diff line change
Expand Up @@ -134,7 +134,7 @@ Examples:
```bash
hermes
hermes chat -q "Summarize the latest PRs"
hermes chat --provider openrouter --model anthropic/claude-sonnet-4.6
hermes chat --provider openrouter --model anthropic/claude-sonnet-5
hermes chat --toolsets web,terminal,skills
hermes chat --quiet -q "Return only JSON"
hermes chat --worktree -q "Review this repo and open a PR"
Expand Down Expand Up @@ -165,7 +165,7 @@ Per-run overrides (no mutation to `~/.hermes/config.yaml`):
```bash
hermes -z "…" --provider openrouter --model openai/gpt-5.5
# or:
HERMES_INFERENCE_MODEL=anthropic/claude-sonnet-4.6 hermes -z "…"
HERMES_INFERENCE_MODEL=anthropic/claude-sonnet-5 hermes -z "…"
```

Same agent, same tools, same skills — just strips every interactive / cosmetic layer. If you need tool output in the transcript too, use `hermes chat -q` instead; `-z` is explicitly for "I only want the final answer".
Expand Down
6 changes: 3 additions & 3 deletions website/docs/reference/faq.md
Original file line number Diff line number Diff line change
Expand Up @@ -109,7 +109,7 @@ Yes. Import the `AIAgent` class and use Hermes programmatically:
```python
from run_agent import AIAgent

agent = AIAgent(model="anthropic/claude-opus-4.7")
agent = AIAgent(model="anthropic/claude-opus-4.8")
response = agent.chat("Explain quantum computing briefly")
```

Expand Down Expand Up @@ -284,7 +284,7 @@ Make sure the key matches the provider. An OpenAI key won't work with OpenRouter
hermes model

# Set a valid model
hermes config set HERMES_MODEL anthropic/claude-opus-4.7
hermes config set HERMES_MODEL anthropic/claude-opus-4.8

# Or specify per-session
hermes chat --model openrouter/meta-llama/llama-3.1-70b-instruct
Expand Down Expand Up @@ -854,7 +854,7 @@ hermes config show | head -20
hermes model

# Or test with a known-good model
hermes chat -q "hello" --model anthropic/claude-opus-4.7
hermes chat -q "hello" --model anthropic/claude-opus-4.8
```

If using OpenRouter, make sure your API key has credits. A 400 from OpenRouter often means the model requires a paid plan or the model ID has a typo.
Expand Down
2 changes: 1 addition & 1 deletion website/docs/reference/model-catalog.md
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ Published on every merge to `main` via the existing `deploy-site.yml` GitHub Pag
"metadata": {},
"models": [
{"id": "z-ai/glm-5.2", "default": true},
{"id": "anthropic/claude-opus-4.7"},
{"id": "anthropic/claude-opus-4.8"},
{"id": "moonshotai/kimi-k3"}
]
}
Expand Down
2 changes: 1 addition & 1 deletion website/docs/reference/slash-commands.md
Original file line number Diff line number Diff line change
Expand Up @@ -182,7 +182,7 @@ Two config formats are supported:
```yaml
model_aliases:
fav:
model: claude-sonnet-4.6
model: claude-sonnet-5
provider: anthropic
grok:
model: grok-4
Expand Down
2 changes: 1 addition & 1 deletion website/docs/user-guide/configuration.md
Original file line number Diff line number Diff line change
Expand Up @@ -740,7 +740,7 @@ agent:
This applies **after** per-platform tool config (`platform_toolsets` written by
`hermes tools`), so a toolset listed here is always removed — even if a
platform's saved config still lists it. Use this when you want a single
switch for "turn X off everywhere" rather than editing 15+ platform rows in
switch for "turn X off everywhere" rather than editing per-platform rows in
the `hermes tools` UI.

Leaving the list empty, or omitting the key, is a no-op.
Expand Down
2 changes: 1 addition & 1 deletion website/docs/user-guide/features/kanban.md
Original file line number Diff line number Diff line change
Expand Up @@ -859,7 +859,7 @@ Gateway platforms have practical message-length caps. If `/kanban list`, `/kanba

### Autocomplete

In the interactive CLI, typing `/kanban ` and hitting Tab cycles through the built-in subcommand list (`list`, `ls`, `show`, `create`, `assign`, `link`, `unlink`, `claim`, `comment`, `complete`, `block`, `unblock`, `archive`, `tail`, `dispatch`, `context`, `init`, `gc`). The remaining verbs listed in the CLI reference above (`watch`, `stats`, `runs`, `log`, `assignees`, `heartbeat`, `notify-subscribe`, `notify-list`, `notify-unsubscribe`, `daemon`) also work — they're just not in the autocomplete hint list yet.
In the interactive CLI, typing `/kanban ` and hitting Tab cycles through the built-in subcommand list (`list`, `ls`, `show`, `create`, `assign`, `link`, `unlink`, `claim`, `comment`, `complete`, `block`, `unblock`, `archive`, `tail`, `dispatch`, `context`, `init`, `gc`). The remaining verbs listed in the CLI reference above (`watch`, `stats`, `runs`, `log`, `assignees`, `heartbeat`, `notify-subscribe`, `notify-list`, `notify-unsubscribe`, `daemon`) also work — they're just not in the autocomplete hint list.

## Collaboration patterns

Expand Down
4 changes: 2 additions & 2 deletions website/docs/user-guide/messaging/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -323,8 +323,8 @@ Details:
# Restrict to specific users (recommended):
TELEGRAM_ALLOWED_USERS=123456789,987654321
DISCORD_ALLOWED_USERS=123456789012345678
SIGNAL_ALLOWED_USERS=+155****4567,+155****6543
SMS_ALLOWED_USERS=+155****4567,+155****6543
SIGNAL_ALLOWED_USERS=+15550123456,+15550987654
SMS_ALLOWED_USERS=+15550123456,+15550987654
EMAIL_ALLOWED_USERS=trusted@example.com,colleague@work.com
MATTERMOST_ALLOWED_USERS=3uo8dkh1p7g1mfk49ear5fzs5c
MATRIX_ALLOWED_USERS=@alice:matrix.org
Expand Down
2 changes: 1 addition & 1 deletion website/docs/user-guide/messaging/signal.md
Original file line number Diff line number Diff line change
Expand Up @@ -194,7 +194,7 @@ You can still see tool activity in the CLI, and final Signal replies can include
### Phone Number Redaction

All phone numbers are automatically redacted in logs:
- `+15551234567` → `+155****4567`
- `+15551234567` → `+15550123456`
- This applies to both Hermes gateway logs and the global redaction system

### Note to Self (Single-Number Setup)
Expand Down
2 changes: 1 addition & 1 deletion website/docs/user-guide/messaging/sms.md
Original file line number Diff line number Diff line change
Expand Up @@ -108,7 +108,7 @@ hermes gateway
You should see:

```
[sms] Twilio webhook server listening on 127.0.0.1:8080, from: +1555***4567
[sms] Twilio webhook server listening on 127.0.0.1:8080, from: +15550123456
```

If you see `Refusing to start: SMS_WEBHOOK_URL is required`, set `SMS_WEBHOOK_URL` to the public URL configured in your Twilio Console (see Step 3).
Expand Down
4 changes: 4 additions & 0 deletions website/docs/user-guide/security.md
Original file line number Diff line number Diff line change
Expand Up @@ -722,6 +722,10 @@ Blocked files show a warning:
9. **Monitor logs** — check `~/.hermes/logs/` for unauthorized access attempts
10. **Keep updated** — run `hermes update` regularly for security patches

:::tip Egress credential-injection proxy
For Docker backends, the [egress proxy](/user-guide/egress/iron-proxy) keeps your real API keys out of the sandbox entirely: the container only sees opaque proxy tokens that resolve against a local TLS-intercepting daemon on the host. Setup is `hermes egress setup && hermes egress start`. **Note:** currently wired for the Docker backend only — Modal, SSH, Daytona, and Singularity are not supported yet.
:::

### Securing API Keys

```bash
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -315,7 +315,7 @@ Use this when:
Generate or host audio separately, then:

```bash
python3 "$SCRIPT" twilio-call "+155****0000" --audio-url "https://example.com/briefing.mp3"
python3 "$SCRIPT" twilio-call "+15550120000" --audio-url "https://example.com/briefing.mp3"
```

Recommended Hermes TTS -> Twilio Play workflow:
Expand Down
2 changes: 1 addition & 1 deletion website/docs/user-guide/windows-native.md
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,7 @@ Everything except the dashboard's embedded terminal pane runs natively on Window
|---|---|---|
| CLI (`hermes chat`, `hermes setup`, `hermes gateway`, …) | ✓ | ✓ |
| Interactive TUI (`hermes --tui`) | ✓ | ✓ |
| Messaging gateway (Telegram, Discord, Slack, WhatsApp, 15+ platforms) | ✓ | ✓ |
| Messaging gateway (Telegram, Discord, Slack, WhatsApp, 30+ platforms) | ✓ | ✓ |
| Cron scheduler | ✓ | ✓ |
| Browser tool (Chromium via Node) | ✓ | ✓ |
| MCP servers (stdio and HTTP) | ✓ | ✓ |
Expand Down
40 changes: 40 additions & 0 deletions website/scripts/fix-masked-phones.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
#!/usr/bin/env python3
"""Replace masked example phone numbers with valid fictional E.164 numbers.

+155****4567 -> +15550123456 (555-01xx is the FCC-reserved fictional range)
+155****6543 -> +15550987654
+155****3456 -> +15550123456
+155****2222 -> +15550122222
+155****0000 -> +15550120000
+1555***4567 -> +15550123456
"""
import re
from pathlib import Path

ROOT = Path(__file__).resolve().parent.parent / "docs"

MASKED = {
"+155****4567": "+15550123456",
"+155****6543": "+15550987654",
"+155****3456": "+15550123456",
"+155****2222": "+15550122222",
"+155****0000": "+15550120000",
"+1555***4567": "+15550123456",
}

pat = re.compile("|".join(re.escape(k) for k in MASKED))

changed = []
for p in sorted(ROOT.rglob("*.md")):
try:
t = p.read_text(encoding="utf-8")
except Exception:
continue
new = pat.sub(lambda m: MASKED[m.group(0)], t)
if new != t:
p.write_text(new, encoding="utf-8")
changed.append(str(p.relative_to(ROOT)))

print(f"Fixed {len(changed)} files")
for c in changed:
print(" ", c)