Wingman is a stateful, multi-agent runtime with a local CLI control plane and a gateway for routing, sessions, and collaboration. It is designed for more than coding: use it for research, operations, support, planning, and any workflow where agents, tools, and durable context matter.
- Gateway-first runtime: The gateway hosts agents, routing, and durable sessions by default.
- Local control plane: The CLI configures, invokes, and connects to the gateway, with an optional
--localexecution mode. - Multi-agent orchestration: A root agent can delegate to specialized subagents with clear roles.
- Protocol-first: The gateway streams raw agent events so any client (web, mobile, terminal) can render them.
- Tool-driven UI prompts (SGUI): tool calls can include UI render hints for Web UI components.
- Extensible: Custom agents, hooks, skills, and MCP tools let you tailor workflows to your team.
Wingman is an agent system, not a single “coding assistant.” Example use cases:
- Engineering: design reviews, refactors, dependency audits, multi-file changes, test automation
- Research: technology evaluations, competitive analysis, documentation synthesis
- Operations: scheduled routines, webhook-driven triage, incident summaries
- Support: channel routing, account-specific agents, structured responses
- Custom domains: finance, legal, data pipelines, or any workflow with tool integrations
- Wingman Gateway: stateful runtime for agents, routing, sessions, and channels
- Wingman CLI: local control plane for onboarding, config, and agent invocation
- Control UI: chat + streaming interface (served by the gateway)
- Wingman macOS App (planned): menu-bar companion that exposes macOS-only capabilities as a node
By default, the CLI connects to a local gateway. For isolated, local-only runs, use --local.
All product requirements live in docs/requirements/. These PRDs are the source of truth and act as a documentation gate:
- Any product or behavior change must update the relevant PRD(s).
- PRs are expected to keep requirements and implementation in sync.
- Legacy docs outside
docs/requirements/(including any historical docs-site content) should not be used for product decisions.
Key docs:
docs/requirements/000-architecture-overview.mddocs/requirements/001-multi-agent-architecture.mddocs/requirements/002-gateway-prd.mddocs/requirements/003-macos-app-prd.mddocs/requirements/004-node-protocol.mddocs/requirements/005-web-ui-sgui-prd.mddocs/custom-agents.md
apps/macos: macOS app (Xcode project)apps/wingman: Gateway + CLI + Control UI (Bun)apps/docs-website: documentation site (Rspress)apps/website: marketing site (Vite)docs/requirements: PRDs (source of truth)docs/dev-setup.md: local development guide
npm install -g @wingman-ai/gatewaywingman initwingman gateway startexport WINGMAN_GATEWAY_TOKEN=sk-...
wingman gateway start --auth- CLI:
wingman chat - Control UI:
http://localhost:18790(default) - VS Code: Install the Wingman extension (see project repo)
# Cloud providers
wingman provider login anthropic
wingman provider login openai
wingman provider login openrouter
wingman provider login xai
wingman provider login copilot
# Local providers (optional - work without auth)
wingman provider login lmstudio # Optional
wingman provider login ollama # Optionalwingman agent --local --agent <id> "prompt"Gateway behavior can be configured in three layers (higher priority wins): runtime flags, environment variables, and wingman.config.json. Use the config file for persistent defaults, then override per run when needed.
gateway.host/gateway.port- bind address + port. Use0.0.0.0for LAN access, or change the port to avoid conflicts.gateway.stateDir- where durable sessions and gateway state live. Point to fast local storage or a shared volume.gateway.fsRoots- allowlist for Control UI working folders and output paths. Keep this tight for safety.gateway.auth.mode/gateway.auth.token/gateway.auth.password- gateway auth strategy (token, password, or none) for remote access.gateway.auth.allowTailscale- trust Tailscale identity headers so Tailnet users can access without tokens.gateway.controlUi.enabled/gateway.controlUi.port- enable/disable Control UI and choose its port.gateway.controlUi.pairingRequired- require pairing for Control UI clients (recommended).gateway.controlUi.allowInsecureAuth- only for local dev when testing auth flows.gateway.adapters.discord.*- Discord output adapter:enabled,token,mentionOnly,allowBots,allowedGuilds,allowedChannelschannelSessionsto pin channels to a session (oragent:<id>:to force routing)sessionCommandfor ad-hoc session overridesresponseChunkSizeto fit Discord message limits- Optional
gatewayUrl,gatewayToken,gatewayPasswordto point the adapter at a remote gateway
--host,--port- override bind address + port for this run.--auth,--auth-mode,--token,--password- enable auth without editing config.--discovery mdns|tailscale,--name- advertise your gateway for LAN or Tailnet discovery.--max-nodes,--ping-interval,--ping-timeout- tune scale and heartbeat behavior.--log-level- dial verbosity for debugging or production.
WINGMAN_GATEWAY_TOKEN- supply a token at runtime so you don't store secrets in config.
agents.bindings- deterministic routing rules used by the gateway to select an agent per inbound channel/message.voice- gateway TTS defaults (provider + settings), with optional per-agent overrides for voice-enabled UIs.
{
"gateway": {
"host": "127.0.0.1",
"port": 18789,
"auth": { "mode": "none" },
"controlUi": { "enabled": true, "port": 18790 }
}
}{
"gateway": {
"host": "0.0.0.0",
"port": 18789,
"fsRoots": ["~/Projects", "~/.wingman/outputs"],
"auth": { "mode": "token" },
"controlUi": { "enabled": true, "port": 18790, "pairingRequired": true }
}
}Tip: set WINGMAN_GATEWAY_TOKEN at runtime so you do not store tokens in config.
{
"gateway": {
"host": "0.0.0.0",
"port": 18789,
"auth": { "mode": "token" },
"controlUi": { "enabled": false },
"adapters": {
"discord": {
"enabled": true,
"token": "DISCORD_BOT_TOKEN",
"mentionOnly": true,
"allowedGuilds": ["123456789012345678"],
"allowedChannels": ["987654321098765432"],
"channelSessions": {
"987654321098765432": "agent:support:discord:channel:987654321098765432"
}
}
}
}
}{
"gateway": {
"host": "0.0.0.0",
"port": 18789,
"auth": { "mode": "token", "allowTailscale": true },
"controlUi": { "enabled": true, "port": 18790, "pairingRequired": true }
},
"voice": {
"provider": "elevenlabs",
"defaultPolicy": "off",
"elevenlabs": {
"voiceId": "VOICE_ID",
"modelId": "eleven_multilingual_v2",
"stability": 0.4,
"similarityBoost": 0.7
}
}
}Start discovery at runtime:
wingman gateway start --discovery tailscale --name "Work Gateway"- Deterministic routing: bindings map inbound messages to a single agent by default.
- Durable sessions: sessions live in the gateway and persist across clients/devices.
- Agent isolation: each agent has its own workspace, config, and session store.
- Explicit broadcast: rooms enable parallel agent responses when requested.
- Channels + bindings for deterministic routing across accounts and peers.
- Routines for scheduled runs and repeatable workflows.
- Webhooks to trigger agents from external systems.
- Hooks for pre/post tool automation.
- Skills for reusable, domain-specific instruction sets.
- MCP tools to connect external systems and custom integrations.
- Bun (required for
bun:sqlitesupport) - Node.js (for tools outside Bun)
bun installcd apps/wingman
bun run buildcd apps/wingman
./bin/wingman gateway startcd apps/wingman
bun run devcd apps/wingman
bun run test- Config:
apps/wingman/.wingman/wingman.config.json - Logs:
~/.wingman/logs/wingman.log
- Keep
docs/requirements/current for any behavior changes. - Add tests for new functionality.
- Ensure all tests and builds pass before submitting.
See LICENSE.txt.
