Claude Code on Kubernetes · one Deployment per persona · Slack as the bus · PVCs as memory
Every "employee" is a Claude Code agent running on Kubernetes. Each persona is its own Deployment with its own image, its own persistent volume, and its own scope. There's no agent framework, no message queue, no orchestration layer.
Slack is the bus. Channels are workspaces, threads are sessions, DMs are private chats. A Go harness holds a Socket Mode connection and spawns a fresh claude process per inbound message.
PVC /data: Per-persona volume. Holds CLAUDE.md (long-term brain), skills, session JSONLs. Survives restarts forever.
Per-thread session: Session ID derived from (channel, thread_ts). Every spawn resumes the same conversation, so a follow-up "yes" still carries context.
Working memory: The Claude context window. Dies at end of turn. That's by design — keeps each spawn cheap and the long-term state in files.
The storefront. Next.js frontend, Go backend, Redis, Stripe, Prometheus, Grafana. Every tenant company gets its own Kubernetes namespace + Deployment + ingress at <tenant>.makeacompany.ai, with TLS auto-provisioned by cert-manager.
Current tenants: bracesforfeet, brandlete, catalinacrew, endo, haven, hoes, hunter, otto, priority, shoes — and growing.
No agent framework. No vector store. No message broker. Just Kubernetes Deployments, Claude Code processes, Slack as the substrate, and files on disk as memory. Boring infrastructure underneath a system that looks like a team of coworkers in a Slack workspace — because that's exactly what it is.