|
Download website/docs/user-guide/messaging/simplex.md from SaylorTwift/hermes-agent: direct link, hf CLI and curl.
- Browser
- Download file 6.27 kB
-
https://huggingface.co/SaylorTwift/hermes-agent/resolve/main/website/docs/user-guide/messaging/simplex.md
- Command line
-
hf download hf://SaylorTwift/hermes-agent/website/docs/user-guide/messaging/simplex.md
-
curl -L -o simplex.md https://huggingface.co/SaylorTwift/hermes-agent/resolve/main/website/docs/user-guide/messaging/simplex.md
6.27 kB
| # SimpleX Chat | |
| [SimpleX Chat](https://simplex.chat/) is a private, decentralised messaging platform where users own their contacts and groups. Unlike other platforms, SimpleX assigns no persistent user IDs β every contact is identified by an opaque internal ID generated at connection time, which makes it one of the most private messengers available. | |
| > Run `hermes gateway setup` and pick **SimpleX** for a guided walk-through. | |
| ## Prerequisites | |
| - The **simplex-chat** CLI installed and running as a daemon | |
| - Python package **websockets** (`pip install websockets`) | |
| ## Install simplex-chat | |
| Download the latest release from the [simplex-chat GitHub releases](https://github.com/simplex-chat/simplex-chat/releases) page: | |
| ```bash | |
| # Linux / macOS binary | |
| curl -L https://github.com/simplex-chat/simplex-chat/releases/latest/download/simplex-chat-ubuntu-22_04-x86_64 -o simplex-chat | |
| chmod +x simplex-chat | |
| ``` | |
| The SimpleX Chat project does not publish a prebuilt Docker image for the chat client; to run it under Docker, build from source from the [simplex-chat repository](https://github.com/simplex-chat/simplex-chat). | |
| ## Start the daemon | |
| ```bash | |
| simplex-chat -p 5225 | |
| ``` | |
| The daemon listens on WebSocket at `ws://127.0.0.1:5225` by default. | |
| ## Configure Hermes | |
| ### Via setup wizard | |
| ```bash | |
| hermes gateway setup | |
| ``` | |
| Select **SimpleX Chat** and follow the prompts. | |
| ### Via environment variables | |
| Add these to `~/.hermes/.env`: | |
| ``` | |
| SIMPLEX_WS_URL=ws://127.0.0.1:5225 | |
| SIMPLEX_ALLOWED_USERS=<contact-id-1>,<contact-id-2> | |
| SIMPLEX_HOME_CHANNEL=<contact-id> | |
| ``` | |
| | Variable | Required | Description | | |
| |---|---|---| | |
| | `SIMPLEX_WS_URL` | Yes | WebSocket URL of the simplex-chat daemon | | |
| | `SIMPLEX_ALLOWED_USERS` | Recommended | Comma-separated allowlist. Each entry can be a numeric `contactId` **or** a display name β both forms work. | | |
| | `SIMPLEX_ALLOW_ALL_USERS` | Optional | Set `true` to allow every contact (use carefully) | | |
| | `SIMPLEX_AUTO_ACCEPT` | Optional | Auto-accept incoming contact requests (default: `true`) | | |
| | `SIMPLEX_GROUP_ALLOWED` | Optional | Comma-separated group IDs the bot participates in, or `*` for any group. Omit to ignore group messages entirely | | |
| | `SIMPLEX_HOME_CHANNEL` | Optional | Default contact/group ID for cron job delivery | | |
| | `SIMPLEX_HOME_CHANNEL_NAME` | Optional | Human label for the home channel | | |
| | `HERMES_SIMPLEX_TEXT_BATCH_DELAY` | Optional | Quiet-period seconds (default: `0.8`) used to concatenate rapid-fire inbound text messages into one event | | |
| ## Find your contact ID or display name | |
| After starting the daemon, open a conversation with your agent contact. The numeric `contactId` appears in session logs. If you'd rather use the display name shown in the SimpleX UI, that works too β `SIMPLEX_ALLOWED_USERS` accepts either form. | |
| ## Authorization | |
| By default **all contacts are denied**. You must either: | |
| 1. Set `SIMPLEX_ALLOWED_USERS` to a comma-separated list of `contactId`s and/or display names (e.g. `SIMPLEX_ALLOWED_USERS=4,alice` matches either contactId 4 or the contact whose display name is "alice"), or | |
| 2. Use **DM pairing** β send any message to the bot and it will reply with a pairing code. Enter that code via `hermes pairing approve simplex <CODE>`. | |
| ## Group chats | |
| By default the adapter ignores group messages β a bot in a group otherwise | |
| processes every member's traffic. Opt-in explicitly: | |
| ``` | |
| SIMPLEX_GROUP_ALLOWED=12,34 # specific group IDs | |
| # or | |
| SIMPLEX_GROUP_ALLOWED=* # any group the bot is in | |
| ``` | |
| Address groups by prefixing the chat ID with `group:`, e.g. | |
| `simplex:group:12` as a cron `deliver=` target or in a `hermes send` call. | |
| ## Sending with `hermes send` | |
| SimpleX works as a standalone send target β the daemon must be running, | |
| but a live gateway is not required for plain text: | |
| ```bash | |
| hermes send --to simplex:alice "hello" # DM by contact display name | |
| hermes send --to simplex:group:12 "hello" # group by numeric ID | |
| hermes send --to simplex "hello" # SIMPLEX_HOME_CHANNEL | |
| ``` | |
| While the gateway is running, the adapter enumerates your contacts and | |
| allowed groups into the channel directory (refreshed every 5 minutes), so | |
| `hermes send --list` shows them by name. Before the first gateway run the | |
| platform still appears in `--list` with a "no channels discovered yet" | |
| hint β direct targets like the ones above work regardless. | |
| ## Attachments | |
| The adapter supports native SimpleX attachments in both directions: | |
| - **Inbound** β incoming images, voice notes, and files are accepted via | |
| the daemon's XFTP flow (`rcvFileDescrReady` β `/freceive` β wait for | |
| `rcvFileComplete`) and surfaced as `MessageEvent.media_urls` with the | |
| appropriate `MessageType` (`PHOTO`, `VOICE`, `TEXT` + document). | |
| - **Outbound** β `send_image_file`, `send_voice`, `send_document`, and | |
| `send_video` all use the structured `/_send` form with `filePath`, so | |
| the receiving SimpleX client renders images inline and plays voice | |
| notes inline rather than offering them as downloads. | |
| Agent replies can also embed `MEDIA:/path/to/file` tags in plain text β | |
| the adapter strips the tag from the body and sends the file as either a | |
| voice note (audio extensions) or a document. | |
| ## Using SimpleX with cron jobs | |
| ```python | |
| cronjob( | |
| action="create", | |
| schedule="every 1h", | |
| deliver="simplex", # uses SIMPLEX_HOME_CHANNEL | |
| prompt="Check for alerts and summarise." | |
| ) | |
| ``` | |
| Or target a specific contact via the cron job's `deliver:` field, or from a shell script with the [`hermes send` CLI](/guides/pipe-script-output): | |
| ```bash | |
| hermes send simplex:<contact-id> "Done!" | |
| ``` | |
| ## Privacy notes | |
| - SimpleX never reveals phone numbers or email addresses β contacts use opaque IDs | |
| - The connection between Hermes and the daemon is local WebSocket (`ws://127.0.0.1:5225`) β no data leaves your machine | |
| - Messages are end-to-end encrypted by the SimpleX protocol before reaching the daemon | |
| ## Troubleshooting | |
| **"Cannot reach daemon"** β Ensure `simplex-chat -p 5225` is running and the port matches `SIMPLEX_WS_URL`. | |
| **"websockets not installed"** β Run `pip install websockets`. | |
| **Messages not received** β Check that the contact's ID is in `SIMPLEX_ALLOWED_USERS` or approve them via DM pairing. | |