How we built Hermes: from Slack experiment to brand assistant
Hermes started as a Slack experiment. Six weeks later it became the brand-aware assistant we use daily. Here's the architecture, the prompts, and the mistakes worth learning from.
Six weeks. That’s how long it took Hermes to go from a single n8n webhook node to the thing I now ping a dozen times a day for research, drafting, and quick ops. This is a write-up of how it got there - the architecture I landed on, the prompt choices that mattered, and the two mistakes I’d undo if I were starting over.
The starting brief
I wanted one thing: an assistant that already knew our brand before I typed a word. Not a fresh ChatGPT tab every time. Not a half-trained custom GPT that forgot context the moment the conversation ended. A real assistant - aware of who we write for, what we sound like, what tools we run.
Three rules going in:
- It lives wherever I message it. No new UI.
- It uses our actual stack - n8n, Claude, Notion - not yet another isolated SaaS.
- The brand context is editable by me, in a file, not buried in a vendor’s settings.
The architecture
The setup ended up simpler than I expected. One container, one orchestration layer, one model, one shared memory file.
You message Hermes (any channel)
▼
n8n webhook
▼
Claude (system: SOUL.md + tool list)
▼
tool call? ── yes ──▶ anysite / notion / web fetch
│ │
▼ ▼
no result back to Claude
│ │
└──────────┬───────────────────┘
▼
reply to you
The brand context lives in a single file - SOUL.md - mounted into the container. Want to update Hermes’s tone? Edit the file. Want it to know about a new product? Add a line. No retraining, no fine-tuning, no migration.
The prompt choice that mattered
The temptation with brand-aware assistants is to stuff the system prompt with rules: “always do X”, “never say Y”, “format like Z”. I tried that. Hermes became stiff, formal, and overrode its own judgment to follow rules I’d forgotten I’d written.
The version that works is shorter and more honest about who we are:
Hermes speaks as TheGrowthLabs - direct, no buzzwords, action-first. Confident without being aggressive. When asked something you don’t know, say so. When asked to draft, match the voice of the existing examples - don’t reinvent it.
That’s most of it. Six lines do more than sixty.
What I’d cut
If you’re starting your own brand assistant, here’s where I overengineered:
- Tool list with 14 entries. I added every MCP I had. Half were never used. The model spent tokens reading the list. Now it has 4.
- Multi-step “thinking” wrappers. Layered chain-of-thought scaffolding. Claude already reasons fine. The wrappers made replies slower and more verbose.
- A custom logging schema. n8n already logs every execution. The “structured event” layer I built duplicated that and was never queried.
The mistakes
Two specifically worth flagging.
First: I let it run with my personal credentials. Anysite key, Notion API token, the lot - all under my name. That worked until I needed to share access with someone and realised every Hermes call would still look like me. New deploy: dedicated service identity. Small thing, mattered later.
Second: I didn’t version the SOUL file. I edited it live, in production, more than once. When the assistant started behaving slightly off three weeks in, I had no idea what I’d changed. SOUL.md now lives in a git repo with proper commits. Boring fix, took an hour, would save me a day if it happened again.
Current state
Hermes ships about 30 messages a day on average - some research, some drafting, some “what’s the current state of X” lookups. It’s available on Slack and a couple of channels I’m testing.
Build cost: maybe 40 hours of my time spread across the six weeks. Running cost: Claude tokens, plus the VPS it shares with our other infra. Less than a Slack seat.
Not a replacement for thinking. A replacement for tab-switching.
If you want this kind of assistant inside your team’s workflow, talk to us. The build is most of the work; the SOUL file is most of the value.