A terminal-style 10-page web dashboard for your Hermes agent. Chat, manage agents, run cron jobs, and monitor system health — all inside Telegram.
A React SPA dashboard with streaming chat, agent spawning, cron management, session browsing, and more — all from Telegram.
Real-time SSE streaming with file attachments, typing indicator, haptic feedback, and abort-on-cancel.
Spawn independent Hermes instances in tmux. Monitor output, send messages, kill agents — all from your phone.
View, create, pause, and trigger scheduled jobs with inline editing and delete confirmation.
Status, Sessions, Analytics, Logs, Cron, Skills, Config, Keys — plus Chat and Agents tabs.
HMAC-SHA256 + Ed25519 validation of Telegram initData. Bearer token fallback for browser testing.
Responsive bottom nav, horizontal pill selectors, overflow-safe cards. Built for phone screens.
Clone the repo, run deploy, set up the tunnel. That's it.
You need Hermes v0.9.0 or later.
pip install hermes-agent
Open @BotFather, send /newbot, pick a name and username. Save the bot token — it looks like 123456789:ABCdefGHIjklMNOpqrsTUVwxyz.
Open @userinfobot, send /start. It replies with your numeric ID. This is a number like 9876543210 — not your username.
Clone the repo and run the deploy script.
git clone https://github.com/clawvader-tech/hermes-telegram-miniapp.git cd hermes-telegram-miniapp ./deploy.sh --install-hook
Add these to ~/.hermes/.env:
TELEGRAM_BOT_TOKEN=your_b...here TELEGRAM_OWNER_ID=your_numeric_user_id API_SERVER_KEY=$(python3 -c "import secrets; print(secrets.token_urlsafe(32))")
The dashboard runs on port 9119. Telegram needs HTTPS to reach it.
# Quick test (URL changes on restart): cloudflared tunnel --url http://localhost:9119 # Production (stable URL): cloudflared tunnel create hermes cloudflared tunnel route dns hermes dashboard.yourdomain.com cloudflared tunnel run hermes
Use the Bot API to set the menu button:
curl -s "https://api.telegram.org/bot${TOKEN}/setChatMenuButton" \
-H "Content-Type: application/json" \
-d '{"chat_id": YOUR_ID, "menu_button": {"type": "web_app", "text": "Dashboard", "web_app": {"url": "https://your-domain/"}}}'
Dual HMAC-SHA256 + Ed25519 signature validation — Telegram's official methods. No bot token exposed to the client.
initData payload.
initData to your server via the X-Telegram-Init-Data header on every API request.
TELEGRAM_OWNER_ID. Only you can access the API.
The mini app talks to the Hermes dashboard API on port 9119.
| Endpoint | Auth | Purpose |
|---|---|---|
GET /api/status | None | Version, gateway state, active sessions |
GET /api/system-health | None | System health (CPU, memory, uptime) |
POST /v1/chat/completions | Yes | Streaming chat (SSE) |
GET /api/agents | None | List spawned agents |
POST /api/agents | Yes | Spawn agent in tmux |
GET /api/cron/jobs | None | List cron jobs |
POST /api/cron/jobs | Yes | Create cron job |
initData validation is failing. Check:
TELEGRAM_BOT_TOKEN set? It's needed to extract the bot ID for validation.curl https://api.telegram.org/bot<TOKEN>/getMeTELEGRAM_OWNER_ID your numeric ID? Not your username.The cron tab uses Bearer token fallback. Check that API_SERVER_KEY is set in your environment and matches what the mini app has stored. Try clearing the mini app's storage: Telegram → tap and hold the mini app → Clear storage.
initData freshness is checked with a 5-minute window. If the app stays open, close and reopen it to get fresh data from Telegram.
Free cloudflared tunnel --url tunnels get random URLs each restart. Set up a named tunnel with your own domain for stability.
cryptography packageEd25519 validation requires the cryptography Python package. Install it with:
pip install cryptography
hermes_cli/web_dist/
Found a bug? Have an idea? PRs are welcome on GitHub.