Most AI dev tools give you one helper. Usta gives you a team — a PM agent plans the work, specialists run in parallel, and they hand off through a shared event bus.
Real projects aren't built by one person. So why is every AI dev tool a single assistant?
Point Usta at any codebase and the PM scans the stack. Or describe what you want to build in one sentence and the PM picks the stack itself.
API keys live in Keychain. Nothing on disk.


The PM agent reads your project, decides which specialists it needs, and writes each role's brief on the fly. A landing page might get a frontend + designer + animator. A trading backend might get an API engineer + DBA + security + QA.
The team is shaped to fit the project. Not a fixed menu.
Each role gets its own real terminal — Claude Code, Gemini, or local Ollama. They coordinate through a shared event bus: frontend ships a component → QA wakes up → tests pass → done. If tests fail, the right role gets reopened automatically.
A bottleneck detector always tells you which role to unblock next.

Every piece exists because solo Claude-pair-programming hit a wall there.
SwiftTerm, real terminal, persistent scrollback — survives daemon restarts.
SQLite-backed pub/sub. Fuzzy topic match. Auto inter-agent reactions.
Type a feature. PM picks which roles act, assigns scoped tasks, only those wake up.
Daemon detects when a role finishes and publishes its announced events.
Global "Next Action" bar always tells you which role is blocking the team.
Anthropic · Gemini · Ollama, per-role. Run local. Or hybrid. Your call.
Stdio MCP — drive Usta's bus from any MCP-compatible client.
API keys never touch disk. macOS Keychain only.
Caveman · memory · mattpocock · custom — per role, click to invoke.
Roles aren't a fixed menu — PM picks them per workspace. Common ones it tends to draft:
Let the team handle it. You ship the feature.