The project's README from github.com/mikeparcewski/wicked-studio. As one markdown file: README.md.
The cockpit for AI coding agents you can actually trust. wicked-studio is a browser UI for running coding-agent CLIs (Claude Code, Codex, Antigravity, and more) as governed workers: you give an intent, the agents do the work behind verification gates, and you approve the decisions that matter — with the evidence behind every "done" one click away.
It's the human surface of the wicked platform. The agents run headless in the background; studio is where you point them at your repos, watch them work in real time, unblock them when they need a human, and see what actually happened.
Coding agents are fast but unsupervised — they assert "done," grade their own work, and bury the reasoning in a scrollback you'll never read. wicked-studio flips that:
Studio ships inside wicked-crew — one command gives you the API, the engine, and this UI on a single port:
npx wicked-crew serve
# then open the URL it prints (default http://127.0.0.1:7701)
That's the whole install for most people — no separate studio setup. Prefer a guided setup, or want the rest of the wicked family too? Use the installer:
npx wicked-installer
It installs and wires wicked-crew (which serves this UI) alongside the other wicked-* tools, across whichever coding-agent CLIs you already use.
Studio rides along with crew, so you update it by updating crew:
npm i -g wicked-crew@latest # or: npx wicked-installer (updates the whole family)
Each wicked-crew release bundles the matching studio build, so a fresh crew is a fresh UI. To see what changed, check the releases.
npx wicked-crew serve
— you only need this floor if you point a standalone studio at your own daemon)Studio is a Vite/React SPA and a pure HTTP/WS client of the wicked-crew daemon — it talks only to
crew's published /api/v1 REST surface and /ws event stream, and imports zero crew source.
The one thing the two share is the wire-contract package
wicked-crew-api-types.
┌─────────────────┐ HTTP /api/v1 + WS /ws ┌────────────────────┐
│ wicked-studio │ ───────────────────────────▶ │ wicked-crew daemon │
│ (React SPA) │ ◀─────────────────────────── │ API · engine · │
│ │ contract: wicked-crew-api-types │ gates · evidence │
└─────────────────┘ └────────────────────┘
npx wicked-crew serve # a control plane on :7701 for the SPA to talk to
npm install
npm run dev # vite on http://127.0.0.1:4200, pointed at :7701
npm test (vitest + testing-library), npm run typecheck, npm run lint, npm run build
(tsc + vite → dist/). CI runs all four on ubuntu / macos / windows for every PR.
You can build studio and host it yourself, pointed at any reachable daemon:
VITE_API_HOST=127.0.0.1:7701 npm run build
npx serve dist # any static server with SPA fallback works
The SPA finds its daemon two ways: bundled/same-origin (production) calls back to
window.location.origin, so --port / CREW_PORT just work with no host baked in; standalone
uses VITE_API_HOST (host:port, no scheme) fixed at build time. The daemon's loopback CORS admits
any localhost / 127.0.0.1 origin, so a standalone studio drives a local daemon out of the box.
e2e/studio_standalone_test.py is the scripted proof of this mode.
The npm package publishes dist/ only. wicked-crew declares wicked-studio as a devDependency and
its build:with-studio step copies node_modules/wicked-studio/dist into the daemon's serving
tree, so npx wicked-crew serve is same-origin UI + API on one port (with a headless fallback when
the dist is absent). A studio release therefore also bumps crew's devDep pin.
The repo also carries a data-testid selector contract (testid-inventory.json, regenerated with
npm run manifest:testids and drift-checked in CI) that the test generators build against — see
CLAUDE.md for the full contributor doctrine.
npm install && npm run dev — SPA on :4200, daemon on :7701.npm test && npm run typecheck && npm run lint before committing.Keep the wire-contract boundary intact: all crew interaction goes through /api/v1 and /ws, never
a crew-source import — if a type is missing, it lands in wicked-crew-api-types first.
Studio was extracted from the wicked-crew monorepo (packages/studio) as its own product,
preserving the full in-monorepo history via git subtree split. An earlier, pre-consolidation
incarnation is archived read-only at
wicked-studio-archived.
MIT