Upload & decode
You upload a bundle. A separate agent figures out what the model can do — you never rig anything.
Live2D models ship with no shared convention: parameter names, expression groups, and motion sets differ wildly between artists. yuzu absorbs that mess with a decode agentso you don't have to.
The bundle
A Live2D Cubism 4 export, zipped — the .model3.json plus everything it references:
| File | Role | Required |
|---|---|---|
| *.model3.json | manifest | The entry point. required |
| *.moc3 | rig | The deformable mesh. Required. |
| textures/ | art | Atlas pages the moc references. Required. |
| *.physics3.json | sway | Hair/cloth physics. Optional; improves idle. |
| expressions / motions | poses & clips | Used if present; synthesized if absent. |
What happens on upload
You drop the zip
In the app under Appearance, or yuzu appearance set ./model.model3.zip.
The decode agent inspects it
It reads the manifest, enumerates parameters, expression groups, and motion sets, and probes what each actually does — independent of how it's named.
It builds a reaction map
A mapping from conversational signals to this model's specific capabilities. Stored with the presence — decoded once, not per session.
It comes online
The presence renders as the model and begins reacting. No configuration from you at any point.
The reaction map
The decoder maps signals the presence already produces onto capabilities it discovered in the model:
tone:warm → expr "smile_soft" · param EyeSmile tone:focused → motion "lean_in" · param BrowDown event:tx_signed → motion "nod" · expr "spark" idle → synthesized blink + breath sway
Signals come from the conversation — affect, and beats like a message sending or an on-chain action landing (see Acting on-chain).
Missing capabilities
A model with no eye-blink group or no expressions still works. The decoder synthesizes gentle idle motion — blink, breath, small gaze — from raw parameters so it never looks frozen, and falls back gracefully when a mapped capability isn't there.
Reactions are always driven for you. There is no API to puppet the model frame-by-frame — appearance reflects the presence; it is not a separate thing to program.
