Skip to main content

Command Palette

Search for a command to run...

Building an AI Software Dev Team with OpenClaw

Updated
6 min read
Building an AI Software Dev Team with OpenClaw

How I set up 10 specialized AI agents as a full software development team — with Discord, Mission Control, and smart API routing. This is just general overview and plan idea. Source code and Prompts not included.


The Idea

I wanted a real AI dev team, not just a single chatbot. Something that mirrors how an actual small dev team works — a PM, an architect, frontend, backend, QA, DevOps, security, code reviewer, doc writer, and a scrum master. Each agent with its own role, personality, and tools.

The stack I landed on:

  • OpenClaw — always-on agent runtime (runs Claude Code under the hood)

  • Discord — the team's communication hub (dedicated server: Geek)

  • Mission Control — Kanban + token analytics dashboard

  • Agency-Swarm — Python orchestration for multi-agent pipelines

  • Promptfoo — QA evaluations and security red teaming

  • Impeccable — design language guidelines for frontend AI output


The Team — 10 Geek Agents

All agents share the geek- prefix. No human names — just clean role IDs.

Agent Role Model
geek-pm Product Manager MiniMax
geek-architect Tech Lead & Architect Claude
geek-frontend Frontend Developer MiniMax
geek-backend Backend Developer MiniMax
geek-qa QA Engineer Codex
geek-devops DevOps Engineer Codex
geek-reviewer Code Reviewer & Bug Fixer Claude
geek-docwriter Documentation Writer MiniMax
geek-security Security Auditor Claude
geek-scrum Scrum Master MiniMax

API Routing Logic

Three API keys, used strategically:

  • Claude → fixing issues, code reviews, security audits (high reasoning tasks)

  • Codex → test generation, DevOps scripts (code-execution tasks)

  • MiniMax → development, documentation, planning (high-volume tasks)


Workspace Structure

Each agent lives in its own workspace directory:

~/.openclaw/
├── workspace-geek-pm/
│   ├── AGENT_PROMPT.md      ← role instructions
│   ├── IDENTITY.md          ← name, emoji, vibe
│   ├── SOUL.md              ← personality
│   ├── TEAM_CONTEXT.md      ← injected by switch-team.sh
│   ├── MEMORY.md            ← persistent memory
│   └── memory_steps/        ← SOPs by task type
├── workspace-geek-architect/
│   └── ...
├── workspace-geekteam/      ← shared team workspace
│   ├── scripts/
│   │   ├── switch-team.sh   ← swap web ↔ mobile context
│   │   ├── api-router.sh    ← route task to right API
│   │   └── pipeline.sh      ← run full feature pipeline
│   ├── agency-swarm/        ← Python orchestration layer
│   ├── team-profiles/
│   │   ├── web.yaml         ← Next.js 15 + TS + Tailwind + PG
│   │   └── mobile.yaml      ← React Native + Expo + EAS
│   └── api-routing/
│       └── routing-rules.yaml

Multi-Team Support Without Duplicating Agents

One of the design goals: run a web team today, switch to mobile tomorrow — without creating 10 new agents.

The solution is TEAM_CONTEXT.md injection. One script rewrites the context file for all 10 agents at once:

./switch-team.sh web
# → writes web stack context to all 10 agents' TEAM_CONTEXT.md
# → no restart needed, agents pick it up on next message

./switch-team.sh mobile
# → same agents, now thinking React Native + Expo

Team profiles (web.yaml, mobile.yaml) define:

  • Tech stack

  • Per-agent context overrides

  • API routing preferences

  • OpenViking namespace for tiered context loading


Discord Setup — 3 Bots, 3 Servers

OpenClaw's multi-account Discord support lets each server have its own bot identity:

"discord": {
  "accounts": {
    "default": { "token": "...", ... },   // @KLinked — KLinked HQ
    "blog":    { "token": "...", ... },   // @Blogs   — Blog server
    "devteam": { "token": "...", ... }    // @Geek    — Geek server
  }
}

Bindings route each agent to the right channel:

{ "agentId": "geek-scrum",    "match": { "channel": "discord", "accountId": "devteam", "guildId": "..." } },
{ "agentId": "blog-research", "match": { "channel": "discord", "accountId": "blog", "peer": { "kind": "channel", "id": "..." } } }

The Geek server currently routes all messages to geek-scrum as the default handler in the #general channel. As more channels are added, each agent gets its own dedicated channel.


Mission Control Dashboard

builderz-labs/mission-control connects directly to the OpenClaw gateway:

Mission Control (localhost:3000)
    ↕ WebSocket
OpenClaw Gateway (localhost:18789)
    token: [gateway auth token]

What it gives the team:

  • Kanban board — track tasks across all 10 agents

  • Token analytics — monitor Claude / Codex / MiniMax usage per agent

  • Session viewer — see what each agent is working on

  • Natural language scheduler — queue tasks across agents

Setup was straightforward:

git clone https://github.com/builderz-labs/mission-control
cd mission-control
pnpm install
# configure .env with OPENCLAW_GATEWAY_* vars
pnpm build && pnpm start

Agency-Swarm Pipeline

For complex features, a Python orchestration layer chains agents together:

User request
    → geek-pm (requirements)
    → geek-architect (design)
    → geek-frontend + geek-backend (parallel build)
    → geek-qa (tests)
    → geek-reviewer (review)
    → geek-docwriter (docs)

Each agent in the pipeline uses LiteLLM for model routing, and delegates all file writes to Claude Code via claude --print:

# api routing via LiteLLM
AGENT_MODEL_MAP = {
    "geek-architect": "claude-sonnet-4-6",
    "geek-qa":        "openai/gpt-5.3-codex",
    "geek-pm":        "minimax/minimax-code-01",
    ...
}

QA & Security

geek-qa runs Promptfoo evaluations on every PR:

  • Component rendering tests

  • API response shape validation

  • Edge case coverage

geek-security runs OWASP Top 10 red team scenarios:

  • SQL injection probes

  • Auth bypass attempts

  • XSS payload testing

Both agents write results back to Mission Control via the /api/tokens endpoint.


What's Next

  • [ ] Add per-channel Discord routing as team grows (architecture, backend-work, qa-reports, etc.)

  • [ ] Wire Sprint board to Mission Control Kanban

  • [ ] Enable OpenViking L1/L2 context tiers as memory builds up

  • [ ] Set up Impeccable design language enforcement in geek-frontend's review loop

  • [ ] Mobile team profile live run with React Native project


Lessons Learned

OpenClaw binding schema is strict. Only channel, accountId, guildId, and peer are valid in match objects. Adding unknown fields (channelName, description) silently blocks all config reloads — check gateway.err.log first when things don't reload.

Multi-Discord via accounts, not channel plugins. Custom channel IDs like discord-blog don't work. The correct approach is discord.accounts.<name> with bindings using accountId.

TEAM_CONTEXT.md injection > agent duplication. 10 agents covering both web and mobile is always better than 20 agents with half sitting idle.

MiniMax for volume, Claude for quality, Codex for code execution. This split keeps costs manageable while routing the right reasoning power to the right tasks.

5 views