mesh-avatar-studio
Turn one illustration into an animated 2D mesh avatar with a coding agent and a local editor
翻译准备中
Laconova Labs — 本地优先的 AI 工具,运行在您自己的硬件上,轻量且私密。Phoenix:创作者的本地 AI 控制室,免费且开源。
AI 翻译
Laconova Labs — local-first AI tools that run on your own hardware, lean and private. Phoenix: a creative's control room for local AI, free and open source.
设计JavaScript · HTMLGitHub @laconova在线运营者未确认
试用过了吗? 点一下就好,无需登录。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证A creative's control room for local AI — a free, open-source harness that drives your local generation toolchain (images, 3D, voice, Blender) from one browser workbench.
翻译准备中
取自仓库 README
正在加载完整 README。 以下为已保存的摘录。
A creative's control room for local AI. Phoenix is a free, open‑source harness that brings the messy toolchain of local AI generation — concept images, 3D meshes, voice & sound, image editing, a Blender bridge — into one browser workbench and drives the tools for you. Describe what you want in plain language; Phoenix runs the pipeline and hands you an asset to finish in Blender. It all runs on your own GPU — the flagship pipeline (prompt → reference image → 3D mesh → Blender) is the fastest way to see it work.查看完整 README ↗A creative's control room for local AI. Phoenix is a free, open‑source harness that brings the messy toolchain of local AI generation — concept images, 3D meshes, voice & sound, image editing, a Blender bridge — into one browser workbench and drives the tools for you. Describe what you want in plain language; Phoenix runs the pipeline and hands you an asset to finish in Blender. It all runs on your own GPU — the flagship pipeline (prompt → reference image → 3D mesh → Blender) is the fastest way to see it work.
Built by Laconova. Phoenix is the first public release built on Laconova's in-house agent harness — the same foundation behind the developer tooling we're building next.
Status: alpha. Early and evolving — expect rough edges. Issues and feedback welcome.
Phoenix is a lightweight Node.js orchestrator (zero npm dependencies — just the Node standard library) that drives a local ComfyUI over HTTP. A chat assistant runs the pipeline stage by stage:
Each stage has an optional gate (pause for your approval). The generation engine is field‑aware and workflow‑agnostic: every workflow is described by a small node‑map, so Phoenix can drive any ComfyUI graph — and you can add your own (see below).
you ──chat──▶ Phoenix (Node, :7777) ──HTTP──▶ ComfyUI (:8188)
│ │
prompt · image · mesh · import models / workflows
└────────▶ staging library ──▶ Blender
claude, sign in with your Anthropic account), the Codex CLI (ChatGPT plan), a local model server (LM Studio / llama.cpp), or an API key — pick it in Settings ▸ General ▸ Seats.python on your PATH (Unreal bridge — see Connect Unreal); a CrispASR speech server plus .gguf voice packs (Voice / SFX tabs — this is what powers the integrated default engine); an ffmpeg binary for voice/SFX effects (auto‑detected from imageio‑ffmpeg if present, otherwise set voice.ffmpeg). Chatterbox (in the picker) runs on this PC through Phoenix's own voice dispatcher — switch it on in Settings → Voice; it needs an NVIDIA GPU, Python 3.12 and about 9 GB of disk. CosyVoice stays blocked in this release.git clone https://github.com/laconova/phoenix.git
cd phoenix
# start ComfyUI separately, then:
node server.js
Open http://127.0.0.1:7777.
On first run Phoenix creates phoenix-config.json from the example automatically — no manual copy
needed. To customize endpoints/models, edit that file, or pre-create it yourself:
copy phoenix-config.example.json phoenix-config.json (Windows) /
cp phoenix-config.example.json phoenix-config.json (macOS/Linux).
On first run, Phoenix seeds its registry with seven built‑in ("Verified") ComfyUI workflows — Flux Klein, Z-Image Turbo and SD 1.5 (image), Trellis2‑GGUF (mesh), Qwen Image Edit and SAM3 Isolate (i2i / edit), and Local · LTX-2 i2v (video) — plus three Voice engines in the library's Voice section (CrispASR, the integrated default, alongside Chatterbox and CosyVoice). The Workflows tab shows a live dependency badge per workflow so you can see what actually runs on your machine. The Image and Mesh tabs each have a workflow picker; workflows that aren't installed yet are acquired from Library → Workflows.
The final pipeline stage imports your prop into Blender. Phoenix talks to Blender through a small file‑based IPC addon — no sockets, no ports, no firewall setup (it works the same on Windows and Linux).
One‑time install (4 clicks):
blender-addon/phoenix_blender_ipc.py from this repo.With Blender open and the addon enabled, the import stage drops generated props straight into your scene. The Troubleshooter's Blender check probes the bridge and flips to ✓ once it's connected. (The onboarding wizard's Blender pill reports something different — whether the optional apps.blender executable path in your config exists.)
Optional: set apps.blender in phoenix-config.json to your Blender executable so Phoenix can launch it for you. Requires Blender 3.0+ (tested on 5.1).
(Optional — for the 1.7.0 Unreal bridge.) Phoenix can drive an already‑running Unreal Engine editor: place brushes and spawn saved characters into the open level, pull assets back into Blender, and screenshot the viewport so the assistant can check its own work. Phoenix never launches Unreal — you keep the editor open and it connects over Unreal's Python remote execution.
One‑time setup, in Unreal:
python on your PATH. The bridge shells out to a short Python helper that speaks Unreal's remote‑execution protocol — any Python 3 works. On Windows, make sure it is a real Python and not the Microsoft‑Store python app‑execution stub, which exits instantly. If python isn't on PATH, point Phoenix at one with apps.python in the config.With the editor open and a project loaded, the Unreal actions light up (a red/absent indicator means one of the three above is missing — the bridge's error message names which). Tested on UE 5.8. Optional: set apps.unrealEngine to your install folder (e.g. C:\Program Files\Epic Games\UE_5.8); left empty, Phoenix uses the newest UE_* it finds.
Phoenix also runs as an MCP server, so an external coding agent can generate props, import them and check the result with Phoenix's render vision — the agent is the brain, Phoenix is the tool. Add it once (replace <abs> with your Phoenix folder; Settings ▸ Connections shows the exact lines):
claude mcp add --scope user phoenix -- node "<abs>/phoenix-mcp.js"
codex mcp add phoenix -- node "<abs>/phoenix-mcp.js"
Cursor — .cursor/mcp.json:
{"mcpServers":{"phoenix":{"command":"node","args":["<abs>/phoenix-mcp.js"]}}}
Phoenix must be running (start it with server.bat on Windows, or node server.js). Every MCP call shows up live in the Phoenix chat window, marked with 🔌.
What an agent can do. Almost every Phoenix tool is available (the exceptions are listed at the end of this paragraph), in groups: generate (generate_prop, generate_image, image_to_3d) · scene (import_asset, use_brush, apply_material, inspect_render — Phoenix renders the scene and a vision model judges it) · humans & animation (make_human, place_human, animate_human, sequence_animations, hy_motion text→motion, save_animation, list_animations) · custom rigs (list_custom_rigs, assign_skeleton, spawn_rig, animate_clip, sequence_clips, prepare_mesh, bind_mesh, save_clip, save_mesh) · characters (list_characters, save_character, spawn_character) · library (list_assets, list_brushes, list_materials, read_palette, save_as_brush, brush_preview, rename_asset, rename_brush) · Unreal (brush_to_unreal, unreal_to_blender, unreal_to_brush, character_to_unreal, inspect_unreal — needs a running Unreal Editor with the Phoenix bridge) · control (read_state, job_status, stop). Tools that change your open Blender scene take a checkpoint first (on/off in the ⚙ panel, limits in Settings ▸ General), and one heavy job runs at a time. Three things are off until you tick them in Settings ▸ Connections: blender_run (arbitrary Python in your Blender scene), unreal_run (arbitrary Python in Unreal) and the deletes delete_asset / delete_brush / delete_material (permanent — a checkpoint cannot bring a deleted file back). brush_to_unreal / character_to_unreal re-import into the same /Game path and replace those Unreal assets (they can be regenerated from Phoenix). The Edit tab's stays UI-only. Voice/TTS, sound effects, the workflow downloader, reference-image generation () and Make video () are not available over MCP yet.
Long generations: generate_prop / generate_image take several minutes. Claude Code: set the MCP_TOOL_TIMEOUT environment variable (milliseconds). Codex: add [mcp_servers.phoenix] with tool_timeout_sec = 3600 to ~/.codex/config.toml. If a client times out anyway, Phoenix keeps working — check with job_status / list_assets.
video.backend picks the backend (auto prefers local).The Human tab builds parametric people directly in your open Blender scene through MPFB2 (MakeHuman's engine, installed in your Blender): body and face sliders, skin, hair, clothes, and a preview before anything enters the scene. Switch the rig to Mixamo and the figure is animation‑ready.
See human-tab-guide.md for the walkthrough, including the setup MPFB2 needs.
Describe a movement in plain English and get an animation clip back, retargeted onto any Mixamo‑rigged character in your scene. It runs on HY‑Motion (Tencent Hunyuan Motion) in ComfyUI. Two things it needs, both easy to get wrong:
A ComfyUI with the HY nodes. hyMotion.api must point at a ComfyUI that has ComfyUI-HY-Motion1 in custom_nodes and the weights under models/HY-Motion/. That can be the same ComfyUI you use for images and meshes — what matters is that the nodes are installed there, not which port it runs on. Point it at another machine (http://gpu-box.local:8188) if generation runs on a separate GPU box. node preflight.js reports whether the endpoint is up and whether the HY nodes are actually there.
A T‑pose template. HY‑Motion retargets against a character FBX that must be in the Mixamo rest pose (T‑pose). Feed it an A‑pose rig and generation still "succeeds" — it just returns a hunched figure with the forearms bent in front of the body, which is the single most confusing failure in this feature. Create the template once with scripts/hy-motion/make_tpose_char.py:
blender --background --python scripts/hy-motion/make_tpose_char.py -- <char.fbx> <char_tpose.fbx>
then put the result in that ComfyUI's input/3d/ and set hyMotion.template to its path. Preflight cannot verify this one for you: ComfyUI's file listing only reports top‑level files, so a template inside input/3d/ is invisible to it — if your figures come out hunched, this is why.
A brush is a reusable asset saved from your Blender scene — one .blend library file that places back whole, however many meshes it contains. Two ways to tell Phoenix what goes in:
Phoenix reports how many meshes went into the brush — if that's not what you expected, adjust the selection/collection and save again. Place it later with "use the campfire brush".
The Edit · i2i sub‑tab (inside the Image window) is a branch between the image and the mesh: take a generated or loaded reference and either change how it looks or cut a part out, then send the result to Trellis or refine it further. Two engines, picked from a dropdown:
sam3.pt.Each edit is a new tile — the reference is never overwritten. A tile can become the new reference (Refine) or go straight to → 3D.
Both engines are heavy and share your GPU, so Phoenix runs one heavy job at a time. If Qwen‑Image‑Edit and Trellis live in separate ComfyUI instances (they often need incompatible CUDA/Python), set the optional endpoints.comfyui_bild to the second one; otherwise everything runs on your single endpoints.comfyui.
Workflows tab → + Add workflow → pick the stage (image / mesh / i2i / video) → upload a ComfyUI workflow exported as "Save (API Format)" → Analyze with Phoenix. Phoenix proposes the node‑map (which node receives the prompt, seed, steps, output, …) and the required custom nodes / models from the graph. Review the dropdowns, give it a name, and save. Only positive + output (image) / image + output (mesh) / input_image + output (i2i) are required; anything you don't map keeps the workflow's own built‑in value.
scripts/ holds a few standalone helpers that are not (yet) wired into the UI. Run them yourself
when you need them:
leaf_scatter.py — the trick that makes generated trees hold up. An image‑to‑3D mesher spends
its whole polygon budget on the whole tree, so each "leaf" ends up a facet half a metre across.
Instead: mesh a single leaf, decimate it, and instance it thousands of times over the canopy
with Geometry Nodes — leaf size becomes a dial rather than something baked into the mesh. Includes
an instance guard that computes the exact instance count first and refuses to run over budget,
because the alternative is Blender dying of OOM. Run it inside Blender (the docstring at the top of
the file is the walkthrough). This is the workflow the roadmap folds into Phoenix proper.contact_sheet.py — build a contact sheet from a batch of generated images.check-refs.js — release gate: node scripts/check-refs.js verifies that every file the code
reaches for actually exists in the tree. Useful before packaging, useless afterwards.check-scaffold-parity.js — release gate: node scripts/check-scaffold-parity.js answers one
question — is the brush runtime a fresh install gets the same one this machine runs? There are two
copies of it: brushes/phoenix_brushes.py (gitignored user data) and the template inside
brush-scaffold.js. A fix to the live file does not reach the template on its own, and once that
drifted the fresh-install copy silently shipped bugs that had already been fixed. Exits 1 on drift
and prints the differing lines. Run it where the brush system is actually used — on a tree
without brushes/ it has nothing to compare and says so.check-voice-release.js — release gate, run by check-refs.js: refuses a tree that contains a reference
recording (ref-*.wav and friends, any .wav under sounds/refs/ or voice-engines/). Your own private strings
(voice file stem, machine paths) go in PHOENIX_RELEASE_FORBIDDEN="a,b" at release time — never into the code.hy-motion/ — helpers for text→motion, including make_tpose_char.py (see above).One more lives in the repo root: node scene-sync.js polls your open Blender scene and keeps the
assistant's picture of it current, so it can answer "what is in the scene" without asking Blender each
time. It is a separate, optional process — the server does not start it — and it is tuned by the
sceneSync block in the config. Without it the assistant still works; its scene view is just only as
fresh as the last import or explicit refresh.
Phoenix creates phoenix-config.json from phoenix-config.example.json on first run (or copy it yourself — copy on Windows, cp on macOS/Linux). Key fields:
seats — which model each role uses (orchestrator, metaprompter, troubleshooter, vision, and utility — the category provider, the small model that picks a category for a prop). Each seat has a provider: claude-cli (your Claude Code login, the default), codex-cli (your ChatGPT plan through the Codex CLI — an empty model means Codex's own default), or openai-compat with an endpoint name from endpoints (local = a local server such as LM Studio / llama.cpp, no key; a cloud entry names an apiKeyRef — keys live in .secrets/, never in this file). A seat without provider still works: a model named claude* uses the CLI, anything else the local server. Easiest is Settings ▸ General ▸ Seats, which also runs the tool / vision tests. The orchestrator's chat history is sized in tokens to the seat's context (read from a local server, 200k for the CLI seats, or set seats.orchestrator.contextTokens), and a small meter under the chat input shows how full the request is.endpoints — ComfyUI + local‑model URLs. comfyui runs your image, mesh and i2i/edit
workflows; optional comfyui_bild is a second ComfyUI instance for i2i workflows tagged
instance:'bild' — only needed if you run Qwen‑Image‑Edit and Trellis in separate environments
(see Edit an image (i2i)). Leave it out and everything runs on the one comfyui.hyMotion — text→motion: api (a ComfyUI with the HY‑Motion nodes installed — the same one as
endpoints.comfyui is fine) and template (the T‑pose FBX it retargets against). See Text → motion above.voice — the Voice/SFX tabs: api (a CrispASR speech server — local or on your GPU box, e.g.
http://gpu-box.local:8090; leave empty to hide the functions) and ffmpeg (path to an ffmpeg binary
for the effects; leave empty to auto‑detect the one bundled with imageio‑ffmpeg). The picker's
non‑default engine Chatterbox needs a dispatcher: normally just switch on Settings → Voice → Run
voice engines on this PC (writes voice.dispatcher: { "local": true, "port": 8091 } and
for you, plus — default on — and ).
can stay empty for Chatterbox. Your own voice, your characters: only clone a voice you own or have consent for.Runtime/user files (phoenix-config.json, workflows.json, palette.json, output/, …) are git‑ignored — Phoenix recreates them on first run.
MIT © 2026 Laconova
i2i_editgenerate_from_refsmake_videoworkflow-params.json; values that 1.9 kept in palette.json are migrated on first start./speak never silently falls back to an unavailable engine — it tells you what's missing instead.utility in the config) picks its own provider: the Claude CLI, the Codex CLI (ChatGPT plan), a local OpenAI‑compatible server (LM Studio / llama.cpp) or an API key. A model that is going to drive tools must pass a tool test first (a local orchestrator also a short competence benchmark); a non‑Claude vision seat must pass a vision test (it has to read a colour card next to the render) before it can be saved. Pick them in Settings ▸ General ▸ Seats.voiceInstall.voicevoice.watermarkvoice.consentAckvoice.apicomfyInstall / voiceInstall — optional; what the Workflow Library's ⬇ Acquire button
needs to fetch a workflow's missing models / custom nodes (or a voice engine) for you. One key per
instance → { root, via }: root is the ComfyUI checkout (models land in root/models, custom nodes
in root/custom_nodes) or the voice/bench root; via is "local" (default — install onto this
machine) or "supervisor" (install on another host over endpoints.rigSsh). Image and mesh workflows
(no explicit instance) resolve under the trellis key, so a single‑machine user sets
comfyInstall.trellis = { "root": "<your ComfyUI folder>", "via": "local" }; i2i workflows tagged
instance:'bild' use comfyInstall.bild; the one voice endpoint uses voiceInstall.voice. Left out
(or a workflow's instance absent), Acquire shows "manual" and you place the files yourself — never a
silent install to some default location. Note: on Windows (via:"local") the Chatterbox Acquire runs
without a shell (it needs Python 3.12, builds the venv and installs CUDA torch); engines with git + requirements
steps (CosyVoice class) still need a Linux/macOS target, and cancelling a voice acquire on a Windows host
may not stop the in‑flight step (Windows has no process‑group kill). ComfyUI Acquire is portable either way.feedback.endpointUrl — optional. Set it to a URL that accepts a JSON POST and the in‑app
Feedback form's Send feedback posts there; leave it empty and Send by email opens your mail
program with a draft instead.feedback.mailTo — the address that mail draft goes to (default [email protected]).gates — which stages pause for approval (prompt / image / mesh), plus gates.vision
(off / focused / full) — after a scene‑changing action Phoenix renders the viewport and has a
model look at it, instead of reporting "fixed ✓" from text alone. focused is the default and
covers the animation/mesh/brush tools; full adds asset placement and blender_run. The seat that
does the looking is seats.vision.gates.mode — the default run mode, ask or auto (the toggle above the chat input picks per message). Tool steps per turn: orchestrator.maxToolCalls (Ask, default 3) and orchestrator.maxToolCallsAuto (Auto, default 8).checkpoints — { enabled, keep, maxGB }: save a scene copy before scene‑changing steps (default on), how many to keep (1–100, default 10) and the disk budget in GB (default 2).mcp — allowBlenderRun, allowUnrealRun, allowDelete: the three MCP tools that are off until you enable them (Settings ▸ Connections).remesh — { enabled, provider: "meshy", topology, targetPolycount, maxUploadMB }: the optional paid Meshy remesh (off by default; the key is stored in .secrets/). topology / targetPolycount are the defaults the Library's Remesh dialog opens with.apps — local paths: blender (the Blender executable), comfyOutput (the folder Phoenix
reads ComfyUI's generated files from; leave empty to use the default ~/Documents/ComfyUI/output),
unrealEngine (your UE install folder — optional, Phoenix otherwise takes the newest UE_* it finds),
and python (a real Python 3 for the Unreal bridge if python isn't already on your PATH — see
Connect Unreal).
Also codex — the full path to the Codex CLI binary, only needed if Phoenix cannot find codex itself.GEMMA_MODEL replaces the metaprompter's model and LOCAL_API replaces the endpoints.local URL, for the current process only. Normally you set these in the config or Settings instead.