v0.1.0 — first public release

Your AI engineering
team. Not an assistant.

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.

The problem

One helper isn't a team.

Real projects aren't built by one person. So why is every AI dev tool a single assistant?

Everyone else

  • One model. One context. One chat.
  • You stay the project manager forever.
  • Tool calls a function — never wakes up a colleague.
  • "Frontend" and "Backend" share a brain.
  • You're the bus. You're the dispatcher. You burn out.

Usta

  • A PM agent reads your project & picks specialists.
  • Each role runs in its own terminal, with its own brief.
  • They publish events. Other roles wake up. You watch.
  • Bottleneck detector points at the role to unblock.
  • You ship the feature. The team ships the diff.
How it works

From idea to running team in three steps.

Step 1

Open a folder. Or describe an idea.

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.

Welcome
PM proposal — ShopHub team with stack and roles
Step 2

PM designs the team.

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.

Step 3

Specialists work. You watch.

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.

Workspace
Features

Built like real engineering.

Every piece exists because solo Claude-pair-programming hit a wall there.

Real PTYs per role

SwiftTerm, real terminal, persistent scrollback — survives daemon restarts.

🔀

Shared event bus

SQLite-backed pub/sub. Fuzzy topic match. Auto inter-agent reactions.

🧠

PM auto-orchestration

Type a feature. PM picks which roles act, assigns scoped tasks, only those wake up.

👁

Idle watcher

Daemon detects when a role finishes and publishes its announced events.

🚧

Bottleneck detector

Global "Next Action" bar always tells you which role is blocking the team.

🔌

Pluggable LLMs

Anthropic · Gemini · Ollama, per-role. Run local. Or hybrid. Your call.

🛠

MCP server included

Stdio MCP — drive Usta's bus from any MCP-compatible client.

🔐

Keychain keys

API keys never touch disk. macOS Keychain only.

🎯

Skills system

Caveman · memory · mattpocock · custom — per role, click to invoke.

The team is dynamic

Whatever the project asks for.

Roles aren't a fixed menu — PM picks them per workspace. Common ones it tends to draft:

🎨Frontend ⚙️Backend 🎭UI/UX Animation 🧪QA 🚀DevOps 🗄️DBA 🔒Security 📚Docs 📱Mobile 📊Data 🔬Research … and anything else
Stack

Native. Local-first. Open.

App
SwiftUI · Swift 6
Daemon
Rust · tokio
Transport
gRPC · UDS
Storage
SQLite
Terminal
SwiftTerm PTY
LLM
Anthropic · Gemini · Ollama
Bridge
MCP stdio
License
MIT
# 1. Download DMG → drag Usta.app to Applications # 2. Remove the macOS Gatekeeper warning: $ xattr -dr com.apple.quarantine /Applications/Usta.app # 3. Launch: $ open /Applications/Usta.app

Stop being
the project manager.

Let the team handle it. You ship the feature.