Hermes Architecture Reference

George Kuruvilla · 4 profiles · 16 cron jobs · Hybrid Ollama + Codex · Updated 2026-07-06

System topology

HERMES MULTI-GATEWAY ARCHITECTURE George default · CoS 10 cron · Telegram jess 4 cron · deals · news jackie 2 cron · Codex · Slack+TG amit counseling RAG Ollama 30B Qdrant RAG Firecrawl SearXNG Codex GPT-5.5 gws · Google Granola MCP Telegram Slack

Profile registry

CLIhermes (default profile)
HERMES_HOME~/.hermes
Workspace/Users/gkuruvilla/chief-of-staff
PurposeStrategy, ops cadence, calendar/email triage, 1:1 prep, travel, talent, faith
Context filessoul.md, AGENTS.md, USER.md, MEMORY.md
RAG collectionjess_knowledge (shared with Jess)
Cron jobs10
CLIjess
HERMES_HOME~/.hermes/profiles/jess
Workspace.../chief-of-staff/jess
PurposeCompetitive research, LinkedIn/blog drafts, deal hunter, breaking news
Scriptsdeals_run.py, news_run.py (no_agent cron)
Engines~/.hermes/mcp-servers/deals.py, news.py
RAGjess_knowledge (44 chunks)
Cron jobs4
CLIjackie
Workspace.../chief-of-staff/jackie
PurposePersonal financial advisor — net worth, 529, retirement, holdings (non-fiduciary)
Modelgpt-5.5 via openai-codex (main + auxiliary + cron, pinned)
DeliverySlack C0BF91FFM1P + Telegram 5946547528
RAGjackie_knowledge
Cron jobs2 — daily portfolio (7 AM) + weekday news scan (9–4 CT every 2h)
CLIamit
Workspace.../chief-of-staff/amit
PurposeCollege & pre-med counselor for Gabriella (Gaby), Class of 2029, Benet Academy
TargetsUChicago, Northwestern, Notre Dame, UIUC · top-25 · merit scholarships
RAGamit_knowledge (20 chunks)
CronNone yet

Integrations matrix

CapabilityTooldefaultjessjackieamitRule
Calendargws calendaryesyesyesyesNever Granola for schedule
Gmailgws gmailyesyesyesyesNever himalaya
Drive/Docs/Sheetsgwsyesyesyesyes
Meeting notesGranola MCPyesyesyesyesPast meetings only
Web researchFirecrawl + webyesyesyesyesCite URLs
Semantic memoryQdrant RAGjess_knjess_knjackie_knamit_knSeparate collections
Deal alertsdeals.pynoyesnono[SILENT] default
News alertsnews.pynoyesnonoDedup + recency
TelegramBot tokenholdslocklockvariesOne holder per token
SlackApp tokenholdslockholdslockOne holder per token

Model stack (hybrid)

ProfilePrimary LLMUse case
default (CoS)qwen3-coder:30b · OllamaVolume cron — plans, triage, 1:1 prep
jessqwen3-coder:30b · OllamaResearch digest, drafts, no_agent deal/news scripts
jackiegpt-5.5 · openai-codexFinance quality — holdings analysis, citations, cron pinned
amitqwen3-coder:30b · OllamaCollege counseling on demand
Embeddingsnomic-embed-text · OllamaLocal RAG without external API
Vector DBQdrantlocalhost:6333
Web scrapeFirecrawl + SearXNGlocalhost:3002 / :8080

Scheduled tasks (16 total)

Chief of Staff — default (10)

Schedule (CT)JobIntegrations
6:00 AM dailyDaily Action Plan (w1)gws calendar, gmail, Granola, MEMORY
6:00 AM dailyBirthday alertsDocument cache
6:30 AM dailyMorning devotional (fa1)Web
7:00 AM daily1:1 agenda builder (p2)gws calendar, Granola
8:00 AM dailyPersonal Gmail triage (f4)gws gmail
4:00 PM FriSustainable schedule audit (h3)gws calendar
6:00 PM SunUT Austin AI PG bodyguard (k2)gws calendar
8:00 PM SunTri-zone travel brief (t1)gws calendar
9:00 AM SatPersonal research compounding (k3)Web, knowledge-log
8:00 AM 1st/monthTalent watchlist (p1)Granola, MEMORY

Jess (4)

ScheduleJobType
5:00 AM dailyDaily research digestLLM agent → deliver all
7:30 AM dailyDaily post draftsLLM agent → deliver all
0 */3 * * *Deal hunterno_agent → deals_run.py → deals.py
0 * * * *Company news watchno_agent → news_run.py → news.py

Jackie (2)

Schedule (CT)JobModel / delivery
7:00 AM dailyDaily portfolio & investment reportgpt-5.5 Codex → Slack + Telegram
9, 11, 1, 3 PM weekdaysHoldings news alert scangpt-5.5 Codex → Slack + Telegram · [SILENT] default

Deterministic alert pipelines (Jess)

Deal hunter

watchlist.json Slickdeals Firecrawl observations.json deals.py Alert| [SILENT]

Policy: 20% off list · target/alert_below · new-low · 12h cooldown · 22 watchlist items

News watch

watchlist.json Google News RSS Domain filter observations.json news.py Alert once| [SILENT]

RAG knowledge base

CollectionProfile(s)ChunksContents
jess_knowledgedefault, jess44Research logs, competitive intel, George voice corpus
jackie_knowledgejackie12Financial snapshots, planning context
amit_knowledgeamit20Counseling roadmap, school strategy, AGENTS

Decision: CoS shares jess_knowledge so morning briefs can recall research without duplicate ingestion.

Architecture decision records

ADR-1: Multi-profile over monolith
Decision: Four isolated profiles.
Why: Context bleed between work, finance, family.
Trade-off: Slack/Telegram token contention across gateways.
ADR-2: gws canonical for Google
Decision: gws only; Granola for past notes only.
Why: Mixed sources produced wrong calendar answers.
Enforced in: Every AGENTS.md hard rules block.
ADR-3: Deterministic alert engines
Decision: deals.py + news.py with [SILENT] contract.
Why: LLM hallucinated prices and re-sent duplicate news.
Pattern: no_agent cron → Python script → engine → stdout drives delivery.
ADR-4: SOUL + AGENTS separation
Decision: Persona in SOUL.md; playbook in AGENTS.md.
Why: Clone profiles (Jackie, Amit) without mixing voice and tool routing.
ADR-5: Local-first stack
Decision: Ollama + Qdrant + Firecrawl on Mac; Jackie on Codex GPT-5.5.
Why: Privacy and $0 marginal cost for 14 local cron jobs; finance quality needs cloud.
Trade-off: Host must stay on; Jackie depends on Codex OAuth.
ADR-7: Jackie on Codex GPT-5.5
Decision: Pin gpt-5.5 / openai-codex on Jackie profile and both cron jobs.
Why: Holdings analysis needs citation discipline local 30B can't match.
Pattern: model + provider fields in cron jobs.json; OAuth via ChatGPT Codex.
ADR-8: Dual delivery (Slack + Telegram)
Decision: Jackie cron deliver array: slack:C0BF91FFM1P + telegram:5946547528.
Why: Portfolio report delivered to Slack but wasn't seen; redundancy reduces miss rate.
Pattern: Hermes multi-deliver JSON array on cron jobs.
ADR-6: Research compounding
Decision: knowledge_search before sweeps; ingest.py on logs nightly.
Why: Stop re-researching the same Wrike/competitor news weekly.

Directory map

~/.hermes/ # default (Chief of Staff) ├── config.yaml, cron/jobs.json # 10 CoS jobs ├── google_token.json # Shared OAuth ├── mcp-servers/ │ ├── deals.py, news.py # Deterministic engines │ ├── rag_server.py, ingest.py └── profiles/ ├── jess/ # Research + alerts │ ├── scripts/deals_run.py, news_run.py │ └── cron/jobs.json # 4 jobs ├── jackie/ # Finance └── amit/ # College counselor /Users/gkuruvilla/chief-of-staff/ # CoS workspace ├── soul.md, AGENTS.md, USER.md, MEMORY.md ├── jess/deals/, jess/news/ # Watchlists + state ├── jackie/ └── amit/planning/

Gateway & messaging

ProfileGatewayLaunchAgent
defaultRunningai.hermes.gateway.plist
jessRunningai.hermes.gateway-jess.plist
jackieRunningai.hermes.gateway-jackie.plist
amitRunningai.hermes.gateway-amit.plist

Mitigation for token locks: dedicated Slack/Telegram bots per profile, CLI chat (jess chat), or gateway.multiplex_profiles on default.