Content
# Consistent AI Character Studio
A dashboard for producing images of the **same character** across many scenes, backed by
[WaveSpeed](https://wavespeed.ai) and [Higgsfield](https://higgsfield.ai), plus a shared
prompt MCP server so Claude Code can build the same prompts the dashboard does.
## Why this shape
Two character-consistency mechanisms exist, and they are not interchangeable:
- **WaveSpeed LoRA** — trained from a zip of 10–20 images via the WaveSpeed API. Fully
automatable, so the dashboard can create these end to end.
- **Higgsfield Soul ID** — trained on Higgsfield's platform from 20+ photos. Training is
**not** exposed on WaveSpeed's API, so the dashboard can only *register and use* a
`soul_id` you created on Higgsfield (or via their hosted MCP).
Prompt logic lives in `packages/prompt-kit` and is imported by **both** the web app and the
MCP server, so a prompt built in the browser is byte-identical to one Claude Code builds.
## Layout
```
apps/web/ Next.js dashboard (server-side WaveSpeed proxy)
packages/wavespeed/ typed REST client: submit · poll · train
packages/prompt-kit/ deterministic prompt composition (no LLM calls)
servers/prompt-mcp/ MCP server (stdio) wrapping prompt-kit
```
## MCP servers
| Server | Source | Purpose |
|---|---|---|
| `prompt-mcp` | this repo | build/validate character prompts |
| `wavespeed-mcp` | `pip install wavespeed-mcp` | ad-hoc generation from Claude Code |
| `higgsfield` | `https://mcp.higgsfield.ai/mcp` (OAuth) | Soul ID training |
See `.mcp.json`. The prompt MCP server calls **no** LLM — Claude Code is the LLM; the server
just supplies structured composition and model-specific syntax.
## Setup
```bash
pnpm install
cp .env.local.example apps/web/.env.local # fill in WaveSpeed + Supabase
pnpm test # unit tests
pnpm dev # dashboard on :3000
```