Hermes — Reference
🜂 Hermes — Reference
Canonical detailed reference for the Hermes setup. Keep updated when the setup changes. Summary → Hermes — Overview.
High-level diagram: Hermes — Overview#Architecture Diagram (High-Level)
Architecture Diagram (Detailed)
graph TB
subgraph VPS["Oracle Cloud VPS (oraclevps) · ARM Ampere · Ubuntu · SSH only"]
direction TB
subgraph Platforms["User Platforms"]
WA["💬 WhatsApp
Bridge :3000 (Baileys)
self-chat"]
DC["🎮 Discord Bot
#general #alerts #status
#news #audit #session-logs
#briefings #seggy-said
#yasar-ahmad #trg-watch #health"]
EM["📧 Email
IMAP/SMTP Gmail
poll 15s"]
NT["🔔 ntfy
push alerts"]
end
subgraph Core["Hermes Gateway"]
GW["🜂 Gateway
hermes_cli.main gateway run
Agent core · Context compressor
Tool dispatch · Hooks"]
SDB["Session DB
SQLite state.db
FTS5 search"]
SK["Skills (60+)
15 categories
~/.hermes/skills/"]
GW --- SDB
GW --- SK
end
subgraph LLM["LLM Fallback Chain"]
direction LR
M1["glm-5.2
(primary)"]
M2["glm-5.1"]
M3["5-turbo"]
M4["4.7"]
M5["4.5-air"]
M6["Gemini
2.5-flash"]
M7["Cerebras
gpt-oss-120b"]
M8["Groq
llama-3.3-70b"]
M1 --> M2 --> M3 --> M4 --> M5 --> M6 --> M7 --> M8
end
subgraph Plugins["Plugins (6)"]
PA["hermes-audit
post_tool_call
→ #audit + log"]
PC["obsidian-capture
pre_gateway_dispatch
→ Inbox.md"]
PL["langfuse
pre/post_llm_call
→ traces"]
PS["security-guidance
various hooks"]
PD["disk-cleanup
temp hygiene"]
PT["web/tavily
search API"]
end
subgraph MCPS["MCP Servers (6)"]
GS["google_suite
GCal·Tasks·Contacts
Drive·Sheets·Slides·Gmail"]
CU["clickup
FastMCP
TEAM: 90181169347"]
CO["composio
Hosted MCP
1000+ SaaS"]
C7["context7
Live docs"]
LS["local_services
Weather·Prayer
News·Maps"]
DI["docintel
Doc extraction"]
end
subgraph MemLayer["Memory"]
MM["mem0 cloud
MEM0_API_KEY
either/or w/ Honcho"]
BI["MEMORY.md + USER.md
built-in · always active
5000/2500 chars"]
SDB2["Session DB
SQLite · FTS5"]
end
subgraph Voice["Voice Pipeline"]
STT["STT: Groq Whisper
→ Deepgram nova-2
→ Gemini
→ faster-whisper (CPU)"]
TTS["TTS: Gemini Kore
+ Edge · OpenAI · ElevenLabs"]
end
subgraph Cron["Scheduled Jobs"]
direction LR
subgraph SC["System Crontab (10)"]
MB["morning_brief.py
11AM PKT"]
PR["prayer_reminder.py
every minute"]
HW["hermes-watchdog.py
*/5 min"]
HC["health_check.py
*/10 min"]
NF["news_feed.py
9AM+9PM PKT"]
OG["obsidian-git-backup.sh
hourly"]
SL["session_logger.py
*/30 min"]
DN["daily_note + backup + prune"]
end
subgraph HC2["Hermes Cron (9)"]
TRG["TRG Watch
9AM+6PM"]
DJ["Dojo Self-Improve
6AM daily"]
SG["SeggySaid Monitor
6h"]
YA["Yasar Monitor
6h"]
DR["Dashboard Refresh
hourly"]
FW["Fallback Watchdog
10m"]
DU["Uptime Monitor
5m"]
JID["JID Patch
6h"]
end
end
subgraph Output["Outputs & Storage"]
VAULT["📚 Obsidian Vault
~/obsidian-vault/
6 folders · wikilinks"]
SYNC["Syncthing :8384
→ Samsung A55 (QUIC)"]
GIT["Git → GitHub
hourly commit"]
VW["Vault Watcher
polls 30s → wrangler"]
CF["🌐 Cloudflare Pages
omair.pages.dev
Dashboard · Books · Transcripts"]
DASH["Dashboard :9119
systemd · localhost"]
end
subgraph MonLayer["Monitoring & Observability"]
WDG["hermes-watchdog
13 probes · */5min
state-change alerts"]
LFE["Langfuse
LLM tracing · costs · latency"]
AUD["hermes-audit
every tool call
→ #audit + audit.log"]
FBW["Fallback Watchdog
model degradation
→ WhatsApp"]
SLO["Session Logger
DB → Obsidian + Discord"]
HCI["healthchecks.io
dead-man's-switch
5min period, 15min grace"]
end
end
subgraph Ext["External Services (Internet)"]
ZAI["z.ai API
glm-5.2 + fallbacks"]
GAP["Google APIs
OAuth (gauth.py)"]
CUP["ClickUp API
Composio Cloud"]
GRO["Groq Whisper API"]
DEEP["Deepgram nova-2"]
GTTS["Gemini TTS API"]
LFC["Langfuse Cloud
cloud.langfuse.com"]
MEMC["mem0 Cloud"]
end
%% Platform → Gateway
WA & DC & EM ==> GW
GW -.->|responses| WA & DC & EM
%% Gateway ↔ LLM
GW <==>|prompt/completion| M1
M1 & M6 & M7 & M8 -->|HTTPS| ZAI
M6 & M8 --> GRO
M6 --> GTTS
%% Gateway → MCP
GW ==>|tool calls| GS & CU & CO & C7 & LS & DI
GS -->|OAuth| GAP
CU -->|API| CUP
CO -->|hosted| CUP
%% Gateway → Memory
GW <==>|recall/store| MM & BI & SDB2
MM -->|HTTPS| MEMC
%% Plugins → Gateway (hooks)
PA & PC & PL & PS & PD & PT -.->|hooks| GW
%% Voice
GW <==>|audio in/out| STT & TTS
STT --> GRO & DEEP
TTS --> GTTS
%% Cron → Gateway + Outputs
MB & PR & HW & HC & NF -->|deliver| GW
SL -->|logs| VAULT
OG -->|commit| GIT
TRG & DJ & SG & YA -->|trigger| GW
DR -->|deploy| CF
%% Monitoring
HW -->|alerts| NT & DC
FBW -->|alert| WA
PL -.->|traces| LFE
LFE -->|HTTPS| LFC
HW -->|ping| HCI
SL -->|embeds| DC
%% Outputs
GW -->|deploy| CF
VAULT --- SYNC & GIT
VAULT --> VW
VW -->|redeploy| CF
GW --> DASH
%% Styling
classDef user fill:#083344,stroke:#22d3ee,color:#fff
classDef core fill:#064e3b,stroke:#34d399,color:#fff
classDef mcp fill:#4c1d95,stroke:#a78bfa,color:#fff
classDef sched fill:#78350f,stroke:#fbbf24,color:#fff
classDef plg fill:#881336,stroke:#fb7185,color:#fff
classDef ext fill:#1e293b,stroke:#94a3b8,color:#fff
classDef out fill:#083344,stroke:#22d3ee,color:#fff
classDef mon fill:#881336,stroke:#fb7185,color:#fff
classDef voice fill:#431407,stroke:#fb923c,color:#fff
class WA,DC,EM,NT user
class GW,SDB,SK,M1,M2,M3,M4,M5,M6,M7,M8 core
class GS,CU,CO,C7,LS,DI,MM,BI,SDB2 mcp
class MB,PR,HW,HC,NF,OG,SL,DN,TRG,DJ,SG,YA,DR,FW,DU,JID sched
class PA,PC,PL,PS,PD,PT plg
class STT,TTS voice
class VAULT,SYNC,GIT,VW,CF,DASH out
class WDG,LFE,AUD,FBW,SLO,HCI mon
class ZAI,GAP,CUP,GRO,DEEP,GTTS,LFC,MEMC ext
1. Host & access
oraclevps(193.123.86.131, Oracle ARM/Ampere, Ubuntu).ssh oraclevps(userubuntu).- Everything under
~/.hermes/. Framework source:~/.hermes/hermes-agent/. - Externally only SSH(22) is reachable (host iptables default-accept except 3389 DROP; OCI security list blocks the rest).
2. Core services (systemd)
| Service | What | Port |
|---|---|---|
hermes-gateway.service |
Agent + messaging gateway (hermes_cli.main gateway run) |
— |
| WhatsApp bridge (child) | scripts/whatsapp-bridge/bridge.js (Baileys, self-chat) |
127.0.0.1:3000 |
hermes-dashboard.service |
Localhost web dashboard | 127.0.0.1:9119 |
syncthing.service |
Obsidian vault sync | 8384 GUI / 22000 sync |
vault-watcher.service |
Obsidian web viewer auto-rebuild (polls 30s) | — |
hermes-groq-warp.service |
Groq WARP reverse-proxy (redundancy; see §4) | 127.0.0.1:8788 |
warp-svc.service |
Cloudflare WARP client (socks5 egress for Groq + YouTube) | 127.0.0.1:40000 |
Restart gateway: sudo systemctl restart hermes-gateway.service (also cycles the bridge; ~5–10s). |
3. LLM (brain) — all healthy
- Primary: glm-5.2, provider
custom,https://api.z.ai/api/coding/paas/v4(Z_API_KEY). - Fallback chain: glm-5.1 → glm-5-turbo → glm-4.7 → glm-4.5-air (z.ai) → gemini-2.5-flash → cerebras gpt-oss-120b → groq llama-3.3-70b-versatile.
- z.ai siblings sit on top because they tolerate GLM's
reasoning_contentfield that Cerebras/Groq reject (HTTP 400). - All 8 endpoints verified green (2026-06-25). Groq now reachable both directly and via WARP proxy (ASN ban appears lifted). Cerebras key renewed. Gemini responsive (no current quota issues).
4. Voice
- STT (in):
stt.provider: groq— working off-CPU. Groq Whisper-turbo via WARP proxy (or direct). Voice-note capture order: Groq Whisper-turbo → Deepgram nova-2 → Gemini → local faster-whisper (keyless last-resort + creator-video transcriber). Deepgram + Groq both verified 200. - TTS (out):
tts.provider: gemini(gemini-3.1-flash-tts-preview, voice Kore). Replies sent as native WhatsApp voice bubbles via bridge/send-media(auto ogg/opus). Also configured:edge(AriaNeural),openai(gpt-4o-mini-tts, alloy),elevenlabs(multilingual_v2). - Groq WARP history: Groq formerly returned Cloudflare error 1010 (Oracle ASN banned). Fixed by routing through WARP socks5 proxy (
warp-svc, 127.0.0.1:40000) viahermes-groq-warp.service→~/.hermes/hermes-groq-warp-proxy.py(listens :8788). Configgroq.base_url+.env GROQ_BASE_URL→http://127.0.0.1:8788/openai/v1. As of 2026-06-25, Groq is also reachable directly (200) — WARP proxy kept as redundancy.
5. Messaging
- WhatsApp (primary): self-chat via
bridge.js(:3000). Media →~/.hermes/audio_cache. Send programmatically:POST http://localhost:3000/send {"chatId","message"}. - Discord: bot with Manage Channels. Per-aspect routing: #general (chat), #briefings (morning brief), #alerts (watchdog fail), #status (watchdog recover + health_check), #news (news_feed 9am/9pm PKT), #audit (every tool call via hermes-audit plugin), #session-logs (session summaries via session_logger), #seggy-said / #yasar-ahmad (creator_notify), #trg-watch, #health.
- Email: IMAP/SMTP via gateway adapter (Gmail).
- ntfy: alert channel (watchdog, independent of WhatsApp).
- Config templates exist for Telegram, Slack, Matrix, Mattermost — not connected.
6. Memory
memory.provider: mem0(MEM0_API_KEY), enabled + user_profile, ~5000/2500 char budgets, pluginhermes-agent/plugins/memory/mem0/. Manage:hermes_cli.main memory .... External provider is either/or (cannot stack Honcho + mem0). Built-in MEMORY.md / USER.md always run alongside.
7. Scheduled jobs (system crontab, UTC)
| Schedule | Script | Purpose |
|---|---|---|
0 6 * * * (11 PKT) |
morning_brief.py | Brief → WhatsApp+email+Discord |
* * * * * |
prayer_reminder.py | 15-min-before prayer alerts (WhatsApp) |
*/10 * * * * |
health_check.py | Host health → Discord #status |
*/5 * * * * |
hermes-watchdog.py | 13-probe service/LLM check → ntfy+Discord |
0 0 * * * (5 PKT) |
obsidian_daily_note.py | Daily/YYYY-MM-DD.md from brief data |
17 * * * * |
obsidian-git-backup.sh | Hourly vault commit + GitHub push |
0 3 * * * |
audio_cache prune | Remove cached audio >7 days |
0 4,16 * * * |
news_feed.py | Tech+AI news → Discord #news (deduped) |
0 3 * * 0 |
hermes-backup.sh | Weekly Hermes backup |
*/30 * * * * |
session_logger.py | Session logs → Obsidian Session-Logs/ |
8. Hermes cron jobs
| Job ID | Name | Schedule | Purpose |
|---|---|---|---|
| 8554a8c0e4c5 | TRG Watch (Regular) | 0 4,13 * * * (9AM+6PM PKT) |
TRG stock monitoring → WhatsApp + Discord #trg-watch |
| d9da6c6bed36 | TRG Watch (Jul 1 Escalation) | 0 13-18 1 7 * (hourly Jul 1, 6-11PM PKT) |
Hourly TRG monitoring on Jul 1 |
| 394bbd064009 | Dojo Overnight Improvement | 0 1 * * * (6AM PKT) |
Self-improvement cycle (see §14) |
| 37b381342401 | SeggySaid Video Monitor | every 360m | New video detection → download→transcribe→essay→deploy |
| 398317ec3712 | Yasar Ahmad Video Monitor | every 360m | Same pipeline for Yasar Ahmad |
| 72fd25777c45 | Dashboard Refresh | every 60m | Hash-skip rebuild → omair.pages.dev |
| 0fc364c13b32 | Fallback Alert Watchdog | every 10m | Alerts when model falls back from primary |
| 417cb060bb10 | Dashboard Uptime Monitor | every 5m | Checks omair.pages.dev is reachable |
| 6c7ff9549a87 | WhatsApp ensureJid Patch | every 360m | Ensures JID registration stays patched |
| — | Sehri/Iftari/Wake-up (Muharram) | one-shots | Time-sensitive reminders (deliver: local) |
9. MCP servers (config mcp_servers)
| Server | Type | Purpose |
|---|---|---|
| context7 | npm package | Live documentation lookup for libraries/APIs |
| google_suite | custom (google_suite.sh) |
Unified GSuite: Calendar, Tasks, Contacts, Drive, Sheets, Slides, Gmail |
| local_services | custom (local_services.sh) |
Weather (OpenWeatherMap), Prayer times, News, Maps (OSM) |
| docintel | custom (gdocintel.sh) |
Document intelligence (Google Docs extraction/analysis) |
| clickup | custom (clickup.sh) |
ClickUp tasks (FastMCP, CLICKUP_API_KEY, TEAM_ID=90181169347) |
| composio | hosted URL | 1,000+ SaaS app integrations via OAuth (x-api-key auth) |
| Plus built-in: Tavily search, web fetch/extract, browser automation. |
10. Custom in-house adapters (~/.hermes/custom-mcp/, venv .venv)
In-house Python over Google's official APIs: google_calendar.py, google_contacts.py, google_drive.py, google_sheets.py, google_slides.py, google_tasks.py, google_suite.py (unified), weather.py, prayer.py, news.py, maps.py, docintel.py, clickup.py, local_services.py, gauth.py (shared OAuth). Each has a matching .sh launcher wrapper (e.g. gcal.sh, gweather.sh, gnews.sh, gcontacts.sh, gsheets.sh, gtasks.sh, gslides.sh, gprayer.sh, gdrive.sh, gmaps.sh). Also: morning_brief.py, prayer_reminder.py, health_check.py, news_feed.py, obsidian_daily_note.py. Secrets in ~/.hermes/.env.
11. Custom scripts (~/.hermes/scripts/)
| Script | Purpose |
|---|---|
seggy_monitor.py |
Seggy Said video detection + pipeline trigger |
yas_ahmed_monitor.py |
Yasar Ahmad video detection + pipeline trigger |
yas_ahmed_batch_tt.py / yas_ahmed_batch_yt.py / yas_ahmed_summarize.py |
Bulk processing (TikTok, YouTube, LLM essays) |
generate_obsidian.py |
Generate vault chapters from master.json book data |
creator_notify.py |
Post-deploy Discord notifications (#seggy-said / #yasar-ahmad) |
refresh_dashboard.py |
Hash-skip dashboard rebuild → Cloudflare Pages |
dashboard_monitor.py |
Uptime probe for omair.pages.dev |
fallback-watchdog.py |
Model fallback detection → WhatsApp alert |
ensure-jid-watchdog.py |
WhatsApp JID registration patch monitor |
ensure-reasoning-strip-patch.py |
GLM reasoning_content strip patch for agent runtime |
prayer-reminder.sh |
Prayer reminder wrapper |
session_logger.py |
Session DB → Obsidian Session-Logs/ entries |
reference_auditor.py |
Audits Reference doc against live system state |
12. Plugins & hooks
| Plugin | Hook | What it does |
|---|---|---|
| hermes-audit | post_tool_call |
Every tool call → Discord #audit + ~/.hermes/logs/audit.log |
| obsidian-capture | pre_gateway_dispatch |
note:/todo:/idea: text or voice → Obsidian Inbox.md (STT: Groq→Deepgram→Gemini). Short-circuits agent |
| disk-cleanup | — | Safely clears temp files generated during sessions |
| observability/langfuse | various | Full LLM call tracing → Langfuse cloud (traces, tool calls, costs, latency) |
| security-guidance | various | Security best-practice enforcement and threat-model awareness |
| web/tavily | — | Web search via Tavily API |
- Hook types available: pre_tool_call, post_tool_call, transform_terminal_output, transform_tool_result, transform_llm_output, pre_llm_call, post_llm_call, pre_api_request, post_api_request, api_request_error, on_session_start/end/finalize/reset, subagent_start/stop, pre_gateway_dispatch, pre_approval_request, post_approval_response. |
||
- Gateway hooks dir: ~/.hermes/hooks/ (currently empty — all hook logic lives in plugins). |
12. Langfuse observability
- Cloud-hosted at
cloud.langfuse.com(keys:LANGFUSE_PUBLIC_KEY,LANGFUSE_SECRET_KEY,LANGFUSE_BASE_URL). - Traces every LLM call: input/output tokens, reasoning tokens, latency, tool invocations, model used, cost per call, cache hit/miss.
- Enabled via
plugins.enabled: ["observability/langfuse"]. No separate systemd service — hooks into the agent runtime. - Dashboard:
https://cloud.langfuse.com→ project traces.
13. Hermes Dojo (self-improvement)
- Skill:
~/.hermes/skills/hermes-dojo/with scripts inscripts/and data indata/. - Cron job 394bbd064009 runs at 6AM PKT daily. Two-phase cycle:
1. Analyze —
monitor.pyscans session history, identifies top 3 weaknesses and skill gaps. 2. Fix — patches top weak skill viaskill_manage(action="patch"), or creates a new skill if a capability was requested 3+ times. - Output saved to
~/.hermes/cron/output/394bbd064009/. Delivers to WhatsApp (skips with[SILENT]if nothing to report).
14. Fallback Alert Watchdog
- Cron job
0fc364c13b32(every 10min, no-agent script:scripts/fallback-watchdog.py). - Monitors whether the primary model (glm-5.2) is active or if the system has fallen back to a cheaper model.
- Alerts to WhatsApp when fallback occurs — so Omair knows quality may be degraded.
15. Content pipeline (creator books)
scripts/seggy_monitor.py/yas_ahmed_monitor.py: follow Seggy Said & Yasar Ahmad (YT/TikTok/FB) → yt-dlp download → faster-whisper transcribe → LLM essays →scripts/{seggy,yas_ahmed}-data/master.json(essay= markdown).build_html()→deploy_to_cf_pages→~/hermes-portal/<book>/index.html+ Cloudflare Pages (omair.pages.dev). Thengenerate_obsidian.py --book <book>→ vault chapters.- Batch scripts:
yas_ahmed_batch_tt.py,yas_ahmed_batch_yt.py,yas_ahmed_summarize.pyfor bulk processing. - Post-deploy:
creator_notify.py→ Discord #seggy-said / #yasar-ahmad.
16. Portal / dashboard (~/hermes-portal/, :9119)
dashboard.html (generate_dashboard.py), library/, seggy-book, yas-book, transcripts, generate_vault_viewer.py → omair.pages.dev/vault. Shared nav via shared_nav.py. Reach via ssh -L 9119 oraclevps.
17. Obsidian / Sync / Backup stack
- Syncthing ↔ phone "Omair Samsung A55" (direct QUIC); GUI 127.0.0.1:8384 (user omair).
- Git time-machine: vault git repo;
~/.local/bin/obsidian-git-backup.shhourly → private GitHubomair-obsidian-vault..stignoreexcludes.git+.obsidian/workspace*. - Books:
~/.hermes/scripts/generate_obsidian.py→Books/<Author> — AI/(Contents chip-list + chapters + Reading Dashboard). - WhatsApp capture: plugin
~/.hermes/plugins/obsidian-capture/(pre_gateway_dispatch) →~/obsidian-vault/Inbox.md(textnote:/todo:/idea:/inbox:/capture:/jot:or 📝; voice → transcribe → inbox). - Daily notes:
obsidian_daily_note.py(cron 5AM PKT) auto-generatesDaily/YYYY-MM-DD.mdfrom morning brief data. - Session logs:
session_logger.py(cron */30min) reads session DB →Session-Logs/entries with stats, tools, key exchanges, vault links. Also posts compact embed to Discord #session-logs (source-colored). - Dojo logs:
~/obsidian-vault/Dojo/— one file per day (YYYY-MM-DD.md) with findings table, actions taken, skills modified, top performers. Index atDojo/README.md. Cron writes log during overnight run + posts full report to Discord #dojo + sends brief WhatsApp summary. - Web viewer:
vault.omair.pages.dev—generate_vault_viewer.pybuilds static HTML,vault_watcher.servicepolls every 30s and redeploys via wrangler on change. Strips Dataview/Meta Bind/raw code blocks.
18. Skills library (~/.hermes/skills/)
~60 skills across 15 categories: - apple: Apple ecosystem integration - autonomous-ai-agents: claude-code, codex, custom-mcp-servers, hermes-agent, hermes-model-config, hermes-operations-dashboard, opencode - creative: architecture-diagram, ascii-art, ascii-video, baoyu-infographic, claude-design, comfyui, design-md, excalidraw, humanizer, manim-video, p5js, popular-web-designs, pretext, songwriting-and-ai-music, touchdesigner-mcp - data-science: jupyter-live-kernel - devops: cloudflare-pages-deploy, deployment, kanban-orchestrator, kanban-worker, systemd-ops - dogfood: exploratory QA of web apps - email: himalaya (IMAP/SMTP from terminal) - github: codebase-inspection, github-auth, github-code-review, github-issues, github-pr-workflow, github-repo-management - hermes-dojo: continuous self-improvement (see §13) - media: gif-search, omair-transcription-treatment, songsee, video-transcription, youtube-content - mlops: huggingface-hub, evaluation (lm-eval-harness, weights-and-biases), inference (llama-cpp, vllm), models (audiocraft, segment-anything) - note-taking: obsidian - productivity: airtable, google-calendar, google-docs-formatting, google-drive, hermes-cron-jobs, maps, market-data, memory-management, notion, ocr-and-documents, powerpoint, teams-meeting-pipeline, whatsapp-messaging - research: arxiv, blogwatcher, llm-wiki, polymarket, web-retrieval - smart-home: openhue (Philips Hue) - social-media: xurl (X/Twitter) - software-development: database-operations, git-operations, hermes-agent-skill-authoring, node-inspect-debugger, plan, python-debugpy, requesting-code-review, security-hardening, spike, systematic-debugging, test-driven-development - yuanbao: Yuanbao (元宝) Chinese platform groups
19. Keys (~/.hermes/.env)
| Key | Status | Used for |
|---|---|---|
Z_API_KEY |
✅ alive | Primary LLM (z.ai glm-5.2) |
GEMINI_API_KEY |
✅ alive | Fallback LLM + TTS |
CEREBRAS_API_KEY |
✅ alive | Fallback LLM (renewed) |
GROQ_API_KEY |
✅ alive | STT + fallback LLM |
DEEPGRAM_API_KEY |
✅ alive | Voice-note STT (capture chain) |
OPENAI_API_KEY |
⚠️ intentional | Actually the z.ai key (auxiliary client → z.ai). Not a real OpenAI key. |
TAVILY_API_KEY |
✅ alive | Web search |
CLICKUP_API_KEY |
✅ alive | ClickUp tasks MCP |
CLICKUP_TEAM_ID |
✅ set | 90181169347 (IBEX Workspace) |
DISCORD_BOT_TOKEN |
✅ alive | Discord bot |
CLOUDFLARE_API_TOKEN |
✅ alive | Pages deploys, DNS |
LANGFUSE_SECRET_KEY / PUBLIC_KEY / BASE_URL |
✅ alive | Observability tracing (cloud.langfuse.com) |
MEM0_API_KEY |
✅ alive | External memory provider |
COMPOSIO_API_KEY |
✅ alive | SaaS integrations MCP |
NTFY_TOPIC |
✅ alive | Watchdog push alerts |
HEALTHCHECKS_URL |
✅ set | Dead-man's-switch (5min period, 15min grace) |
STT_GROQ_MODEL |
✅ set | whisper-large-v3-turbo |
Platform config vars (not secrets — operational config):
| Key | Purpose |
|---|---|
| WHATSAPP_ENABLED / WHATSAPP_MODE / WHATSAPP_HOME_CHANNEL / WHATSAPP_HOME_CHANNEL_THREAD_ID / WHATSAPP_ALLOWED_USERS | WhatsApp bridge config |
| DISCORD_HOME_CHANNEL / DISCORD_HOME_CHANNEL_THREAD_ID / DISCORD_ALLOWED_USERS / DISCORD_ALLOW_ALL_USERS | Discord bot config |
| DISCORD_*_CHANNEL (ALERT, STATUS, AUDIT, NEWS, BRIEF, HEALTH, SEGGY, YAS) | Discord channel routing IDs |
| EMAIL_ADDRESS / EMAIL_PASSWORD / EMAIL_IMAP_HOST / EMAIL_IMAP_PORT / EMAIL_SMTP_HOST / EMAIL_SMTP_PORT / EMAIL_POLL_INTERVAL / EMAIL_HOME_ADDRESS / EMAIL_ALLOWED_USERS | Gmail IMAP/SMTP config |
| OBSIDIAN_VAULT_PATH | ~/obsidian-vault |
| AGENT_BROWSER_EXECUTABLE_PATH | Browser binary for automation |
| BROWSER_* (SESSION_TIMEOUT, INACTIVITY_TIMEOUT) / BROWSERBASE_* (PROXIES, ADVANCED_STEALTH) | Browser automation tuning |
| TERMINAL_TIMEOUT / TERMINAL_LIFETIME_SECONDS / TERMINAL_MODAL_IMAGE | Terminal tool limits |
| *_DEBUG (WEB, VISION, MOA, IMAGE) | Debug flags for tool subsystems |
20. Known issues / watch-list
- None critical. All LLM endpoints green, all STT providers green, zero failed systemd units (2026-06-25).
- WARP proxy (
hermes-groq-warp.service) kept as redundancy — Groq now works directly too. OPENAI_API_KEYis intentionally the z.ai key, not a bug.- Watch for: Gemini quota limits (intermittent 429s under heavy use), GLM-5.2 reasoning_content token overhead (max_tokens ≥ 8000 for essay-length output).
21. Monitoring & alerting stack
| Layer | What | Where |
|---|---|---|
hermes-watchdog.py (crontab */5) |
Dependency probes: 5 systemd services, WA bridge, 3 LLM APIs, healthchecks.io dead-man switch | ntfy + Discord #alerts/#status |
health_check.py (Hermes cron 10m) |
Host health: systemd services, WA bridge, Discord API, z.ai brain, disk, memory, load, CPU. 4h heartbeat embeds. | Discord #status + email + WhatsApp (PROBLEM only, not recovery) |
fallback-watchdog.py (Hermes cron 10m) |
Model fallback detection (non-GLM fallbacks only) | Discord #alerts |
dashboard_monitor.py (Hermes cron 5m) |
Uptime check for omair.pages.dev (TTFB + HTTP code) | local log only |
ensure-jid-watchdog.py (Hermes cron 6h) |
WhatsApp JID registration patch | local |
hermes-audit plugin (real-time) |
Every tool call audit trail | Discord #audit + log file |
| healthchecks.io | Dead-man's-switch (if watchdog stops) | healthchecks.io ping |
22. Content routing policy (three-pillar model)
WhatsApp = Personal & Time-Sensitive (~10 msgs/day max) - Morning Brief (full), Prayer Reminders, TRG Watch (1-line summary), Seggy/Yasar (1-line summary), Dojo summary, custom reminders, health PROBLEM alerts
Discord = Archive & Detail (all 12 channels) - #briefings: Morning Brief full copy - #trg-watch: TRG Watch full analysis - #seggy-said / #yasar-ahmad: Creator content full report - #alerts: Fallback alerts + watchdog failures - #status: Health heartbeats + recoveries - #news: News feed - #audit: Real-time tool call log - #session-logs: Session summaries - #dojo: Dojo self-improvement reports - #general: Interactive chat (future)
Obsidian Vault = Knowledge & History - Session-Logs/: Full session transcripts - Dojo/: Daily improvement logs - Daily/: Daily notes - Hermes/: System documentation - Inbox.md: Quick capture via obsidian-capture plugin
23. Reading library
Books/<Author> — AI/<Category>/chapters: cleaned titles, 2-pass dedup, Released/Platform chips, Prev/Next nav, ▶ source link, per-chapter Meta Bind status toggle.📖 Reading Dashboard= static shelf (renders everywhere) + Dataview progress (Obsidian only).- Web viewer strips
```dataview, Meta Bind , and hidden dirs (.stversions/.obsidian). - Obsidian plugins required: Dataview + Meta Bind (installed).