A body for Claude Code.
Hermes-Agent's product surface in ~10% the code.
Claude Soma (Greek soma, body) gives Claude Code a Telegram channel, voice in and out, a project orchestrator that spawns persistent, independent agent teams per workstream, social posting, and a showcase dashboard — all riding Claude Code's native rails.
One Oracle Cloud ARM free-tier VPS · authed entirely through Claude Max
Live from the running system
- 0
- Messages today
- 0
- Active project-leads
- 6
- Agent decisions today
- 0.8
- Uptime today (hrs)
Features
Everything the platform layer used to be — native instead
Channels, agent teams, scheduled routines, mobile push, MCP, hooks, plugins and auto-memory are native to Claude Code. Soma is the missing slice on top.
Telegram channel
DM the bot in text or voice; it replies in text or voice. The bot is an orchestrator — anything slow is dispatched to a background subagent and acked immediately, so chat never blocks.
Voice in / out
voice-stt (whisper.cpp) transcribes your voice memos; voice-tts (piper → opus) speaks the replies back as a voice note.
Project orchestration
Spin up a persistent project-lead per workstream. Each lead is an independent Claude Code session in its own working dir, with its own Remote Control URL, that can run its own agent team.
cgroup-isolated leads
Every lead runs in its own transient systemd unit and tmux server, so a channel restart can't take it down.
Social posting
Per-platform Playwright MCP servers post to X, LinkedIn, and Medium using a shared persistent browser-auth store — log in once via VNC, reused everywhere, refreshed weekly.
Scheduled routines
Server-hosted cron via Claude's cloud routines, plus systemd timers and crontab, all surfaced together.
Showcase dashboard
FastAPI + Next.js admin and showcase behind Caddy, gated by GitHub OAuth, reading live Claude state over a Unix-socket bridge.
Max OAuth only
Every Claude call draws on your Max plan. No Anthropic API key anywhere — ever.
How you use it
One Telegram thread, the whole system
You talk to one chat. Behind it, a skill fires, work fans out to isolated leads, and the result comes back.
You: “What am I working on?”voice
- What it does
- portfolio-status skill
- What you get
- Voice or text reply listing your repos and active project-leads
You: “Build a scraper for the F1 standings that tweets on change”
- What it does
- spawn-project → orchestrator spawns a cgroup-isolated lead running its own agent team
- What you get
- A persistent f1-scraper lead with its own cwd, team, and Remote Control URL
You: “Tell f1-scraper to use httpx”
- What it does
- message-project (tmux send-keys into the lead's pane)
- What you get
- The instruction lands in the lead; its reply is scraped back to you
You: “Post this to LinkedIn”
- What it does
- playwright-linkedin MCP session using the shared auth store
- What you get
- Posted — no per-task login
You: “Draw the system architecture”
- What it does
- codex-image-gen → Codex CLI (ChatGPT sub, not Max)
- What you get
- An image delivered as a Telegram photo
You: “Every weekday 8am IST, send me a brief”
- What it does
- schedule-routine
- What you get
- A cloud routine running on Anthropic infra
Architecture
The Telegram session is an orchestrator, not a team-lead
A request flows in on Telegram — text or voice. Fast work is answered inline; slow work is dispatched to a background subagent. The orchestrator spawns multiple independent project-leads, each in its own cgroup and each able to run its own agent team — sidestepping Claude Code's “one team per lead” constraint.
Telegram ──► claude --channels (OCI VPS, Max OAuth)
│
├── voice_stt MCP ──► whisper.cpp
├── voice_tts MCP ──► piper → opus
├── project_orchestrator MCP ──► spawns project-leads
└── hermes_api MCP ──► FastAPI ──► soma.mayankgupta.in
Each lead is spawned via 'sudo systemd-run' into its own transient
unit + dedicated tmux socket. It inherits every MCP server EXCEPT
Telegram, and is attachable from the Claude mobile app or
claude.ai/code via its Remote Control URL.- Isolated
- Each lead lives in its own transient systemd unit + tmux server. A channel restart can't take a lead down.
- Inherited
- Leads get every MCP server except Telegram, so they can use voice, social and image tools without owning the chat.
- Reachable
- Every lead exposes a Remote Control URL — attach from the Claude mobile app or claude.ai/code at any time.
See it run
A 60-second tour of what Claude Soma is — narrated by the project's own piper voice, animated with the hyperframes skill it ships with.
The thesis
What if your engine is Claude Code?
Hermes-Agent by Nous Research is a ~27,000-line platform for self-improving messaging agents — channels, cron, skills, memory curation, sandbox backends, and trajectory tooling. Studying it raises one question: what if your engine is Claude Code? How much do you actually need to build?
The answer is a few thousand lines. Channels (Telegram, Discord, custom), agent teams, server-hosted scheduled routines, Remote Control, mobile push, MCP, hooks, plugins and auto-memory are all native to Claude Code. The platform layer collapses.
Claude Soma is the missing slice — a voice pipeline, a project orchestrator, social posting, a dashboard, and curated workflows — riding Claude Code's native rails. Authed entirely through a Claude Max subscription, with no Anthropic API keys, running on a single Oracle Cloud Ubuntu ARM free-tier VPS.