Stamp out a business-operations agent — a self-hosted Hermes gateway on Slack + Telegram, with an optional voice front-end (talk to it from any browser or phone), live tools (Gmail / Calendar / Notion / Linear via Composio), scheduled ops jobs (daily briefing, email triage, standup, reminders, weekly report), and git-backed Obsidian/Notion memory — all from one config file.
Built on the proven single-brain-template core (digest-pinned Hermes image + every hard-won upstream fix + a self-healing watchdog). The Operator layers three optional profiles on top; with none enabled you get a plain, reliable chat agent.
Slack / Telegram ─┐
voice (browser + phone) ───────┼──▶ Hermes gateway (Docker) ──▶ Fireworks (primary)
(ElevenLabs + relay) │ │ └▶ Together / OpenRouter (fallback)
│ ├─ Composio tools (Gmail/Calendar/Notion/Linear) [profile]
host cron ─ ops jobs ─────────▶┘ └─ sync daemon ─▶ vault (Obsidian) + Notion [profile]
| Profile | Turns on when you set | You get |
|---|---|---|
| base | FIREWORKS_API_KEY + a channel token |
Reliable Slack/Telegram agent, resilient LLM fallback, self-healing watchdog |
| composio | COMPOSIO_API_KEY + COMPOSIO_USER_ID + COMPOSIO_MCP_SERVER_ID |
Gmail / Calendar / Notion / Linear as chat tools |
| jobs | BRIEF_SLACK_CHANNEL (+ composio + an OpenRouter key) |
Cron ops: briefing 8am, triage 1pm, standup 9am, reminders 10am, weekly Fri 5pm, learning, credit-watch — all delivery-gated & retry-safe |
| voice | ELEVENLABS_API_KEY + VOICE_DOMAIN + RELAY_TOKEN |
Talk to it in any browser/phone at https://<VOICE_DOMAIN>/talk; fast direct-tool answers (~1-5s) + full-brain fallback |
| sync | NOTION_* (via --profile sync) |
Mirror sessions/kanban/memories/skills to Obsidian markdown + Notion |
# 1. Fresh Ubuntu 22.04+ VPS (installs Docker + clones this repo):
curl -fsSL https://raw.githubusercontent.com/jbellsolutions/operator-template/main/provision-vps.sh | bash
cd ~/operator-template
# 2. Configure (one file):
cp agent.example.env agent.env
nano agent.env # AGENT_NAME, BASE_DIR, FIREWORKS_API_KEY, a channel token,
# then fill any profiles you want (composio / jobs / voice)
# 3. Stamp it:
./new-agent.sh agent.env # prints which profiles it enabled
# 4. Launch the agent:
cd "$BASE_DIR"
docker compose up -d # core agent
docker compose --profile sync up -d # + Obsidian/Notion mirror (if NOTION_* set)
(crontab -l 2>/dev/null; echo "* * * * * $BASE_DIR/bin/watchdog.sh") | crontab -
# 5. Turn on the profiles you enabled:
$BASE_DIR/bin/setup-cron.sh # if jobs enabled
$BASE_DIR/bin/setup-voice.sh # if voice enabled (needs DNS A-record → this host first)Repeat step 2-5 with a different AGENT_NAME / BASE_DIR / HERMES_PORT to run more agents on the same box.
- Secrets: everything lives in
agent.env→ your gitignored.env. This repo ships zero secrets (seeSECURITY.md). The renderedhermes/data/config.yamlholds tool keys in cleartext (Hermes doesn't env-expand there) — it's per-agent state, gitignored, never commit it. - Voice speed: live-data questions ("unread email?", "my calendar?", "what's on my plate?") answer in ~1-5s via direct tools; memory/actions use the full brain (~15-20s) with a spoken "checking…" filler.
- Models: primary is config-driven (Fireworks DeepSeek-V4 by default; swap in
hermes/config.template.yaml). The voice brain path uses a fast non-reasoning model — seevoice/README-VOICE.md. - Docs:
docs/TROUBLESHOOTING.md(runtime symptom → fix),voice/README-VOICE.md(voice runbook: rotate token, change voice, add a real phone number). - Not affiliated with Anthropic or NousResearch. You supply your own accounts/keys.