Hermes Audit — 2026-06-25
🔍 Hermes Complete System Audit — 2026-06-25
Full inventory of everything installed, configured, and working. Cross-analysis of three information channels: WhatsApp, Discord, Obsidian Vault. Recommendations for optimal content routing.
Part 1: System Inventory
1.1 Core Services (5 systemd units — all active ✅)
| Service | Purpose | Status |
|---|---|---|
| hermes-gateway | Main agent runtime (WhatsApp/Discord/Email/ntfy) | ✅ running |
| hermes-dashboard | Dashboard uptime/ping monitor | ✅ running |
| hermes-groq-warp | Groq API reverse proxy via WARP (bypasses ASN 1010 ban) | ✅ running |
| syncthing | P2P file sync (Obsidian vault → mobile/desktop) | ✅ running |
| vault-watcher | Auto-rebuilds vault web viewer on file change (30s poll) | ✅ running |
1.2 Hermes Agent
| Component | Value |
|---|---|
| Version | v0.16.0 (2026.6.5) — up to date |
| Python | 3.11.15 |
| OpenAI SDK | 2.24.0 |
| Project dir | ~/.hermes/hermes-agent/ |
| Config | ~/.hermes/config.yaml |
| Memory | ~/.hermes/memories/MEMORY.md (5,567 bytes) + USER.md (2,520 bytes) |
| State DB | ~/.hermes/state.db (sessions, messages) |
1.3 LLM Configuration
| Setting | Value |
|---|---|
| Primary model | glm-5.2 via custom provider (z.ai) |
| Context length | 1,000,000 tokens |
| Fallback chain | glm-5.1 → 5-turbo → 4.7 → 4.5-air → Gemini → Cerebras → Groq |
| Provider: groq | Local WARP proxy at localhost:8788 |
| Voice/STT | Groq Whisper (via WARP) |
| Voice/TTS | Gemini (default — may fail WhatsApp voice delivery) |
1.4 Plugins (6 enabled)
| Plugin | Status | Issue |
|---|---|---|
| hermes-audit | ✅ files exist | #audit channel is EMPTY — plugin may not be posting |
| obsidian-capture | ✅ files exist | Inbox.md doesn't exist yet (will be created on first use) |
| disk-cleanup | ⚠️ enabled in config | No files found — built-in plugin or misconfigured |
| observability/langfuse | ⚠️ enabled in config | No files found — empty plugin dir |
| security-guidance | ⚠️ enabled in config | No files found — built-in or misconfigured |
| web/tavily | ⚠️ enabled in config | No files found — built-in or misconfigured |
1.5 MCP Servers (6 configured)
| Server | Transport | Purpose |
|---|---|---|
| clickup | Shell wrapper (.sh → .py) | ClickUp tasks via REST API |
| composio | Remote HTTPS | Multi-app OAuth integrations |
| context7 | CLI binary | Library docs context |
| docintel | Shell wrapper | Google Doc intelligence |
| google_suite | Shell wrapper (.sh → Python) | Calendar, Contacts, Drive, Sheets, Slides, Tasks |
| local_services | Shell wrapper | System info queries |
1.6 Skills Library (84 skills, 15 categories)
| Category | Count | Highlights |
|---|---|---|
| creative | 15 | architecture-diagram, excalidraw, comfyui, p5js |
| productivity | 13 | google-calendar, notion, airtable, obsidian |
| software-development | 12 | api-integration, test-driven-dev, systematic-debugging |
| mlops | 7 | llama-cpp, vllm, huggingface, weights-and-biases |
| autonomous-ai-agents | 7 | claude-code, codex, opencode, custom-mcp-servers |
| research | 6 | arxiv, blogwatcher, llm-wiki, web-retrieval |
| github | 6 | code-review, PR workflow, issues, repo management |
| devops | 5 | cloudflare-pages-deploy, deployment, systemd-ops |
| media | 5 | gif-search, youtube-content, video-transcription |
| data-science | 1 | jupyter-live-kernel |
| dogfood | 1 | hermes-dojo |
| 1 | himalaya | |
| hermes-dojo | 1 | continuous self-improvement |
| note-taking | 1 | obsidian |
| smart-home | 1 | openhue |
| social-media | 1 | xurl |
| yuanbao | 1 | yuanbao |
1.7 Custom Scripts (15 in ~/.hermes/scripts/)
creator_notify.py, dashboard_monitor.py, ensure-jid-watchdog.py, ensure-reasoning-strip-patch.py, fallback-watchdog.py, generate_obsidian.py, prayer-reminder.sh, reference_auditor.py, refresh_dashboard.py, seggy_monitor.py, session_logger.py, yas_ahmed_batch_tt.py, yas_ahmed_batch_yt.py, yas_ahmed_monitor.py, yas_ahmed_summarize.py
1.8 Custom MCP Scripts (37 in ~/.hermes/custom-mcp/)
Core services: morning_brief.py, health_check.py, news_feed.py, obsidian_daily_note.py, prayer_reminder.py, prayer.py, weather.py, maps.py, news.py, docintel.py, local_services.py, clickup.py
Google Suite: google_calendar.py, google_contacts.py, google_drive.py, google_sheets.py, google_slides.py, google_suite.py, google_tasks.py + .sh wrappers for each
1.9 Environment Variables (51 keys)
All API keys, channel IDs, and service configs stored in ~/.hermes/.env. Discord channel IDs verified — all 9 target channels return HTTP 200.
1.10 External Services
| Service | Used For |
|---|---|
| z.ai API | Primary LLM (glm-5.2) |
| Groq Cloud | Fallback LLM + STT (via WARP proxy) |
| Google Cloud (APIs) | Calendar, Contacts, Drive, Sheets, Slides, Tasks, Maps |
| ClickUp | Task management (IBEX workspace) |
| Composio | Multi-app OAuth bridge |
| Cloudflare Pages | Dashboard + Vault web viewer + book sites |
| Discord Bot | 11 channels in server |
| WhatsApp (Baileys bridge) | Primary messaging (:3000) |
| IMAP/SMTP (Gmail) | Email adapter |
| ntfy.sh | Push notifications |
| healthchecks.io | Uptime heartbeat |
| Syncthing (relay) | P2P vault sync to mobile |
Part 2: Channel Analysis — Current State
2.1 WhatsApp
Role: Primary interactive channel. Direct 1:1 with Omair.
Currently receives:
| Source | Frequency | Type | Should it be here? |
|---|---|---|---|
| Morning Brief | Daily 11AM | Weather, calendar, prayer, news, inbox | ✅ Yes — personal daily start |
| Prayer Reminders | 15 min before | Salah notification | ✅ Yes — time-sensitive, personal |
| TRG Watch | 9AM + 6PM | SDNY court dockets | ✅ Yes — active intel, needs attention |
| Fallback Alert | On event | Model fallback notice | ⚠️ Maybe — operational detail |
| SeggySaid alerts | On new video | Transcription + summary | ⚠️ Maybe — content notification |
| Yasar Ahmad alerts | On new video | Transcription + summary | ⚠️ Maybe — content notification |
| Dojo Summary | Daily 6AM | Brief self-improvement summary | ✅ Yes — daily digest |
| Time-based reminders | One-shot | Custom reminders | ✅ Yes — personal |
Volume: ~15-25 messages/day. Some noise from fallback alerts and content monitors.
2.2 Discord (11 channels)
| Channel | ID | Purpose | Status | Issues |
|---|---|---|---|---|
| #general | ...391 | Home/chat | ❌ UNDERUSED | Only gateway shutdown notices. No real conversations. |
| #status | ...510 | Health checks | ✅ WORKING | Embeds every 10min. Good. |
| #alerts | ...608 | Failures/warnings | ✅ WORKING | Watchdog posts on break/recover. |
| #briefings | ...612 | Morning brief copy | ⚠️ ROUTER ONLY | Has 1 msg ("your brief will land here") — briefs not actually posting. |
| #trg-watch | ...204 | TRG reports | ❌ STALE | Last msg Jun 14. May be broken. |
| #seggy-said | ...882 | Seggy content | ❌ LOW | 1 message despite monitor running. |
| #yasar-ahmad | ...112 | Yasar content | ❌ EMPTY | 0 messages despite monitor running. |
| #news | ...814 | News feed | ⚠️ LIGHT | 1 embed. Working but sparse. |
| #audit | ...208 | Tool call audit | ❌ EMPTY | Plugin enabled but zero posts. |
| #session-logs | ...368 | Session summaries | ✅ NEW | 1 embed, just set up. |
| #dojo | ...784 | Dojo reports | ✅ NEW | Created today, first post tomorrow. |
Verdict: 3 channels working (#status, #alerts, #dojo), 2 new and untested (#session-logs, #dojo), 6 channels broken or empty.
2.3 Obsidian Vault (765 notes)
| Folder | Count | Status | Issues |
|---|---|---|---|
| Books/ | 723 | ✅ WORKING | 95% of vault content. Ebook essays. |
| Session-Logs/ | 25 | ✅ WORKING | Good coverage Jun 11-24. |
| Daily/ | 2 | ✅ WORKING | Jun 24-25. Just started. |
| Dojo/ | 2 | ✅ NEW | Backfilled + README. |
| Projects/ | 5 | ⚠️ LIGHT | Static docs, no tracking. |
| Hermes/ | 2 | ✅ CORE | Reference + Overview. |
| System/ | 3 | ⚠️ LIGHT | Hermes Infra + Vault docs. |
| Resources/ | 1 | ❌ VERY LIGHT | Only Naveen. |
| Templates/ | 1 | ⚠️ LIGHT | Daily Note template. |
| (root) | 1 | ✅ | README.md |
Web viewer: vault.omair.pages.dev — auto-rebuilds via vault-watcher. Mermaid support added.
Syncthing: Active, sharing vault folder to Omair Samsung A55. 2 devices connected (but API not reachable without auth setup).
Verdict: Session logs and daily notes are solid. Everything else is sparse. Inbox.md is missing (obsidian-capture plugin needs it).
Part 3: Issues Found
3.1 Critical (will cause failures)
| # | Issue | Impact | Fix |
|---|---|---|---|
| C1 | Langfuse plugin enabled but has zero files | Error on load or silent noop | Either install Langfuse plugin files or remove from enabled list |
| C2 | disk-cleanup, security-guidance, web/tavily enabled but no files | Same — may cause startup warnings | Same — install or remove |
| C3 | #briefings not receiving morning briefs | Briefing script has Discord code but may not be called | Check morning_brief.py flow — it has send_discord() but may not be invoked in default mode |
| C4 | #trg-watch stale since Jun 14 | TRG Watch may be posting to WA only, Discord code broken | Check TRG skill's Discord posting logic |
| C5 | #seggy-said and #yasar-ahmad nearly empty | Monitors may not be posting to Discord | Check seggy_monitor.py and yas_ahmed_monitor.py Discord routing |
| C6 | #audit completely empty | Audit plugin may be failing silently | Debug hermes-audit plugin — check if it has channel posting code |
3.2 Warnings (working but suboptimal)
| # | Issue | Impact | Fix |
|---|---|---|---|
| W1 | #general is wasted | Gateway shutdown noise in a channel that could be the main chat hub | Consider making it the default interactive channel (require_mention already set) |
| W2 | Fallback alert sends to WA but not #alerts | Operational alerts fragmented across channels | Add Discord #alerts posting to fallback-watchdog.py |
| W3 | SeggySaid + Yasar go to BOTH WhatsApp AND Discord | Duplication — user reads the same alert twice | Choose primary channel: Discord for content, WhatsApp for summary only |
| W4 | TRG Watch goes to BOTH WhatsApp AND Discord | Same duplication | Same as above |
| W5 | Health check runs from crontab (every 10min) + dashboard_monitor from Hermes cron (every 5min) | Overlapping health checks | Consolidate to one |
| W6 | hermes-watchdog.py (crontab) + fallback-watchdog.py (Hermes cron) | Partially overlapping alert systems | Merge or clarify boundaries |
| W7 | Syncthing API key not set | Can't monitor sync status programmatically | Set API key in config.xml |
| W8 | Voice TTS default is Gemini → may fail WhatsApp voice | User gets no voice response | Switch default TTS to edge/openai |
| W9 | Memory files at ~/.hermes/memories/ (not standard profile path) | Works but non-standard | Leave as-is (functional) |
| W10 | 9 one-shot cron jobs (Muharram, Amazon) that will pile up | Cluttered cron list after completion | They should auto-clean after firing |
3.3 Improvements (nice to have)
| # | Opportunity | Benefit |
|---|---|---|
| I1 | Move content monitors (Seggy, Yasar) to Discord-only, send WA summary | Less WhatsApp noise |
| I2 | Move TRG Watch to Discord-only, WA summary only | Less WhatsApp noise |
| I3 | Create Resources/Contacts/ folder with all family/friends | Obsidian becomes useful contact reference |
| I4 | Add system health daily summary to vault | Historical uptime tracking |
| I5 | Add backup verification log to vault | Know if backups are actually succeeding |
| I6 | Consolidate watchdog systems into one coherent stack | Less complexity, clearer responsibilities |
| I7 | Repurpose #general as interactive chat channel | Discord becomes usable for Hermes interaction |
| I8 | Create #reminders channel for time-based one-shots | Keeps them out of WA clutter |
Part 4: Recommended Content Routing
The Three-Pillar Model
WhatsApp = Personal & Time-Sensitive - Things Omair needs to act on NOW - Brief, actionable, no fluff - Maximum 10 messages/day
Discord = Archive & Detail - Everything that's useful to reference later - Full reports, logs, content, monitoring data - Searchable, organized by topic - The "second brain" for Hermes output
Obsidian = Knowledge & History - Long-lived reference material - Session logs, daily notes, system docs - Cross-linked knowledge graph - Human-readable, browsable, syncable
Proposed Routing Matrix
| Source | Discord | Obsidian | Notes | |
|---|---|---|---|---|
| Morning Brief | ✅ Full (personal) | #briefings | Daily/ | Keep WA copy — it's the daily start |
| Prayer Reminders | ✅ Yes | ❌ | ❌ | Time-sensitive, personal only |
| TRG Watch | 📋 Summary only | #trg-watch (full) | ❌ | Move full report to Discord, 1-line to WA |
| SeggySaid | 📋 Summary only | #seggy-said (full) | Books/ (via pipeline) | WA gets "1 new from Seggy Said — link" |
| Yasar Ahmad | 📋 Summary only | #yasar-ahmad (full) | Books/ (via pipeline) | Same pattern |
| Fallback Alert | ❌ Move to Discord | #alerts | ❌ | Operational detail, not personal |
| Health Failures | ❌ Move to Discord | #alerts | ❌ | Operational detail |
| Dojo Report | ✅ Summary (daily) | #dojo (full) | Dojo/ | Keep WA summary — quick glance |
| Session Logs | ❌ | #session-logs | Session-Logs/ | Already correct |
| News Feed | ❌ | #news | ❌ | Reference material, not action |
| Audit Trail | ❌ | #audit | ❌ | Debug/archive only |
| Watchdog | ❌ | #alerts + #status | ❌ | Operational only |
| Obsidian Capture | ❌ (creates vault entry) | ❌ | Inbox/ | Plugin creates vault entry |
| Reminders | ✅ Yes | #reminders (new?) | ❌ | Keep WA — time-sensitive |
| Daily Notes | ❌ | ❌ | Daily/ | Already correct |
Expected WhatsApp Volume After Changes
Before: ~15-25 messages/day After: ~8-12 messages/day - Morning Brief: 1 - Prayer Reminders: 5 - TRG Watch summary: 2 (1-line each) - Seggy/Yasar summaries: ~2 (1-line each) - Dojo summary: 1 - Custom reminders: 1-3
Part 5: Priority Actions
Do First (fix broken things)
- Fix empty Discord channels — debug why #briefings, #seggy-said, #yasar-ahmad aren't receiving posts despite env vars being correct
- Fix #audit — debug hermes-audit plugin or remove if broken
- Clean up ghost plugins — remove langfuse, disk-cleanup, security-guidance, web/tavily from enabled list if they have no files (or install them)
- Create Inbox.md — create empty file so obsidian-capture doesn't fail on first use
Do Second (routing optimization)
- Move fallback alerts to Discord #alerts — remove WA delivery from fallback-watchdog.py
- Move Seggy/Yasar/TRG to Discord-primary — WA gets 1-line summary, Discord gets full report
- Consolidate watchdog systems — merge hermes-watchdog + fallback-watchdog + health_check into one coherent stack
Do Third (enrich vault)
- Create Resources/Contacts/ — move family, contacts info there
- Add daily system health to vault — auto-generated uptime/backup summary
- Repurpose #general — make it the default Discord chat channel for Hermes
Audit conducted: 2026-06-25 01:30 PKT Hermes Agent v0.16.0 | System uptime: stable