{"slug": "integrating-the-pebble-index-01-with-my-hermes-agent", "title": "Integrating the Pebble Index 01 with my Hermes Agent", "summary": "A developer integrated the Pebble Index 01 voice ring with the Hermes Agent framework by using webhooks instead of MCP servers, because Hermes' MCP server is stdio-only and cannot create new conversations. The setup uses a Cloudflare Tunnel to expose a proxy script on a Mac mini, which forwards transcriptions to Hermes for full agent processing and delivers responses to Telegram.", "body_md": "I recently got the [Pebble Index 01](https://repebble.com/index). It’s a slim aluminum ring with a single button and a mic, no screen, and no notifications. You press and hold, speak, it transcribes what you said, and sends it to the Pebble app for processing.\n\nI’ve hooked it up using the app to Apple Reminders (todos including time triggers, and shopping lists), Apple Calendar (to add entries), and Obsidian (speak note content, it lands in my vault). It works and is low-friction. The number of times I’ve forgotten something in seconds because I didn’t have my phone on me is now zero.\n\nBut sometimes a thought is too complex for a pre-built action. Sometimes it needs actual reasoning, or tool access, or the ability to dig into something I’ve built, a script, an API, a research thread. For those moments I run [Hermes Agent](https://hermes-agent.nousresearch.com/), an open-source autonomous agent framework on my Mac mini. It has access to my tools, my memory, my skills. It can read my knowledge base, write code, send context-aware messages, and more.\n\nAnd when I’m out and about, sometimes I have a clarifying thought on how to move something forward. So the natural question: why not have the ring talk to Hermes using the secondary gesture of a double click and hold?\n\n## [Hermes’ MCP server, and why it doesn’t work](#hermes-mcp-server-and-why-it-doesnt-work)\n\nHermes can expose an MCP server, with messaging tools like `conversations_list`, `messages_send` and `events_poll`. On paper that sounds like the right interface, with Pebble supports MCP servers in its cloud agent, and the idea of connecting the two felt obvious.\n\nIt doesn’t work for two reasons:\n\n**Hermes MCP is stdio-only.** Pebble needs an HTTP or SSE endpoint. Bridging stdio to HTTP adds latency and complexity I don’t want for something that should feel instant.\n\n**The available tools don’t create new conversations.** The MCP server lets you read and write messages on *existing* platform connections. It doesn’t start a new Hermes thread with full agent access.\n\nSo I went a different direction. Webhooks instead of MCP.\n\n## [The architecture](#the-architecture)\n\nThe ring sends a voice note. The Pebble app transcribes it locally and POSTs it to my tunnel URL. A proxy script on my Mac receives the multipart POST, extracts the transcription, signs an HMAC, and forwards JSON to Hermes. Hermes runs the full agent with all its tools and delivers the response to a Telegram forum topic. I reply in that topic. The conversation continues.\n\nSimple, low latency, full agent access. Here’s how I set it up\n\n## [Setting it up](#setting-it-up)\n\n### [Cloudflare Tunnel](#cloudflare-tunnel)\n\nMy Mac mini runs at home and is exposed via a [Tailnet](https://tailscale.com/docs/concepts/tailnet) to my other personal devices. The ring’s app can’t reach it directly.\n\nEnter [Cloudflare Tunnel](https://developers.cloudflare.com/cloudflare-one/connections/connect-apps/). It’s a lightweight daemon that creates an outbound WebSocket connection to Cloudflare’s edge. No port forwarding, no exposed services, no firewall holes. Cloudflare handles the HTTPS termination, the routing, and the certificate management.\n\nCreate a config file at `~/.cloudflared/pebble-index.yaml`:\n\nBut there’s a gotcha I hit: Cloudflare Tunnel’s ingress rules need explicit hostname matching for domain-based routing. The bare `service:` directive won’t route to your backend when you’re using a custom domain. I had to use:\n\nAnd I needed to write that to `~/.cloudflared/config.yaml`, not the named config file. Cloudflared reads `config.yaml` for ingress rules, not the tunnel-specific YAML. That one confused me for a while.\n\nDNS route:\n\nThat CNAME record creates `https://your-custom.domain.com`, which now routes to my proxy on port 8788. DNS propagation takes 1-3 minutes.\n\n## [Converting and forwarding the payload to Hermes](#converting-and-forwarding-the-payload-to-hermes)\n\nPebble sends webhooks as `multipart/form-data`, a format designed for file uploads rather than API payloads. The fields are:\n\n- `transcription` — the transcribed text\n- `audio` — the raw M4A audio file (optional)\n- `recordedAt` — Unix timestamp in milliseconds\n- `client` — always “ring”\n\nHermes expects JSON. The proxy bridges the gap.\n\nThe proxy reads the HMAC secret from the config file or an environment variable, starts listening on port 8788, and when it receives a multipart POST it extracts the transcription, signs the payload, and forwards JSON to Hermes. No dependencies, pure stdlib.\n\n## [The Hermes route](#the-hermes-route)\n\nHermes webhooks work by defining routes in `config.yaml`. Each route matches an incoming POST, runs the agent, and delivers the response.\n\nA few notes on the configuration:\n\n- `prompt` uses dot-notation to access the JSON payload.`{transcription}` pulls the`transcription` field from the incoming JSON.\n- `deliver: telegram` sends the response to Telegram.\n- `deliver_extra` with`chat_id` and`message_thread_id` routes to a specific forum topic in the group I use to interact with my agents. Replace both values with your own.\n- `secret` is an HMAC key for request authentication.\n\nYou might wonder why I didn’t use `hermes webhook subscribe pebble-input --deliver telegram`, the CLI way to create a webhook subscription. The CLI has a routing bug: `--deliver telegram` on a webhook subscription sends the agent’s response back to the caller, not to the target Telegram chat. Routes defined directly in `config.yaml` don’t have this problem.\n\n## [Pebble app configuration](#pebble-app-configuration)\n\nIn the Pebble app:\n\n1. Go to **Index** →**Settings**\n2. Set **Double-click & hold** to “Webhook only”\n3. Set the **Webhook URL** to`https://your-custom.domain.com` (your domain, no path appended)\n4. Set **What to send** to “Transcription”\n\nDouble press the ring button, hold, speak. Within 3-5 seconds your thought arrives in Telegram’s Index 01 forum topic. Hermes runs the agent with full tool access and responds. You reply in the same topic to continue the conversation.\n\n## [The auto-start services](#the-auto-start-services)\n\nBoth the proxy and the tunnel run as macOS launchd services. They survive reboots automatically.\n\n**Proxy plist:** `~/Library/LaunchAgents/com.pebble.proxy.plist`\n\n**Tunnel wrapper:** `~/.hermes/scripts/pebble-tunnel-start.sh`\n\n**Tunnel plist:** `~/Library/LaunchAgents/com.pebble.tunnel.plist`\n\nLoad them:\n\nBoth will start automatically on boot. The proxy catches Pebble webhooks, routes them to Hermes, and the agent runs with full access to everything: browsing, code execution, file manipulation, calendar, reminders, API calls.\n\n## [Why tihs matters](#why-tihs-matters)\n\nThe Pebble ring captures thoughts with almost zero friction. Simple thoughts route to Apple Reminders for tracking, medium ones to Obsidian for reference, and complex thoughts to Hermes where they actually get processed.\n\nThoughts like “research the best way to batch-process the PDFs in my Google Drive” or “write a script to monitor my Apify accounts sending” need more than a todo item. They need reasoning and tool access, and that’s what closing the loop to Hermes gives you.\n\nBy connecting the ring to Hermes, I’ve closed the loop. Simple thoughts go to Apple Reminders. Medium thoughts go to Obsidian. Complex thoughts go to Hermes. The ring stays the input method, the processing is context-aware.\n\nThe pipeline is:", "url": "https://wpnews.pro/news/integrating-the-pebble-index-01-with-my-hermes-agent", "canonical_source": "https://lws.io/blog/integrating-pebble-index-01-with-hermes-agent/", "published_at": "2026-09-08 00:00:00+00:00", "updated_at": "2026-09-08 08:01:24.948130+00:00", "lang": "en", "topics": ["ai-agents", "ai-tools", "developer-tools"], "entities": ["Pebble Index 01", "Hermes Agent", "Nous Research", "Cloudflare Tunnel", "Mac mini", "Telegram", "Apple Reminders", "Obsidian"], "alternates": {"html": "https://wpnews.pro/news/integrating-the-pebble-index-01-with-my-hermes-agent", "markdown": "https://wpnews.pro/news/integrating-the-pebble-index-01-with-my-hermes-agent.md", "text": "https://wpnews.pro/news/integrating-the-pebble-index-01-with-my-hermes-agent.txt", "jsonld": "https://wpnews.pro/news/integrating-the-pebble-index-01-with-my-hermes-agent.jsonld"}}