Skip to content

Motion catalog

Human-readable map of every motion id in configs/motions.json — what it looks like, its playback policy, and the source clip it was extracted from. Keep this in sync with the registry.

  • Sources: clips come from three origins.
    • Mate Engine (Shiny) — the bulk set, extracted from the Unity project (Assets/MATE ENGINE - Animations/…) to .vrma via the unity-cli exec → YuiExport.YuiVrmaExport.ExportBatch pipeline (30 FPS, T-pose reference, model-independent retarget). Used under Mate Engine's non-commercial terms — attribution to Shiny required; commercial use needs separate permission.
    • necocoya — EmoteSet_Free_v130sulk only (Unity Humanoid 06_suneru, 拗ね = sulk/pout). Attribution to necocoya required; modification/conversion and bundling-with-credit are permitted, standalone resale of the raw file is prohibited.
    • もいらんど — thinkingthinking only. A purchased licensed asset kept at public/purchased_motions/thinking.vrma, gitignored and never committed to a public repository (see public/purchased_motions/AGENTS.md). When the file is absent locally, the renderer falls back to idle.
    • Mixamowalk ("Walking", in-place), jump ("Jump", in-place), falling ("Falling_2"), landing ("Falling_and_landing"), and the climb set climb_up ("Climbing Up Wall"), climb_up_done ("Climbing To Top"), climb_down ("Climbing Down Wall"), climb_down_landing ("Climbing Down_landing"), and the seat transitions sit_down ("Sitting"), stand_up ("Sit To Stand"). Royalty-free under the Mixamo terms; converted to .vrma through the Mate-Engine YuiExport.YuiVrmaExport pipeline (30 FPS) with a with-skin (bind-pose) source avatar; jump, the fall pair, the climb set and the seat transitions are exported from the "Maria WProp J J Ong" character.
  • Durations are the source clip length.
  • Pools: idle, idle_lively, window_sit, dance are single registry entries with a variants[] list and variant_policy: "random" — each trigger plays a random variant (immediate-repeat avoided). The character-facing id is the pool id; individual variant files are not separate registry entries.
  • Triggers: AI via generate_express motion_id plays any broker-published oneshot/pool; idle is the ambient baseline; drag is the reactive pickup; head_pat loops while a press is held on the head region; window_sit is a held state engaged by a dev trigger; thinking is a client-played TTFT latency affordance (loops from the start of a backend turn until the response speech begins); walk is the ambient floor or foreign-window-top stroll, played by the client's walk schedulers while the OS window translates along the supporting edge — the floor stroll runs whenever the body is on idle, thinking, or walk, through a turn's thinking, its filler and its response speech (expressions and lip-sync apply as they arrive), and ends in place when a response motion_id takes the body; a floor stroll may continue past its own monitor's edge onto a neighbouring monitor that shares its floor line and scale factor, the window translating frame by frame; a stroll that starts over a stretch where the window would hang over a monitor beneath it with a different scale factor instead parks the OS window once over the whole path, moves the character inside the parked canvas, and parks the window once more where she lands; a reflex turn cancels it at once, and the perched stroll and the climb still yield to any turn in flight; jump is played by the client when the perched stroll crosses a height difference or a gap to an adjacent window's top while the OS window travels the arc — a neighbour whose top is level with the host's within perch_walk.level_tolerance_px and overlaps or touches it is one ledge with the host, and the stroll's own leg walks across the seam onto it; falling and landing are the fall chain, played by the client whenever the character is left in mid-air — a drag release that misses, a perched sit that loses its host window, a jump that loses its target, and the ambient step-off that walks a perched stroll off the outer edge of the ledge it is on — and the window drops to the first landing surface below it: a foreign window top with standing room either side, or the work-area floor of the monitor under the feet — except that a drag release whose feet hang below the floor line of a monitor above them by less than fall.min_drop_frac character heights lands on that line instead of falling down the monitor below; climb_up, climb_up_done, climb_down and climb_down_landing are the climb chain, played by the client's climb scheduler while the OS window travels up or down a foreign window's side edge; the screen edges of a monitor that has another monitor directly above it are climb targets alongside window sides; that ascent parks the OS window once over the whole climb, moves the character inside the parked canvas, and parks the window once more standing on the upper monitor's floor line rather than on a seat. A floor segment ending over a lower monitor has a descent edge at that monitor's screen edge; at stroll planning time, descend.chance chooses whether she walks there and descends. On arrival, descend.climb_down_chance chooses between climbing down to climb.descent_wall_offset_frac character heights inside the edge and walking fall.land_room_frac character widths beyond it before falling; the whole descent uses one parked travel frame. sit_down and stand_up are the seat transitions, played by the client's sitter on every seat entry (a drag drop onto a window top, a climb that reaches the ledge, a perched stroll sitting back down, a fall that lands on a window top) and on the voluntary seat exits (a perched stroll standing up, a climb descent leaving the seat) — a drag pickup and a lost host window leave the seat at once, with no stand-up.
  • Broker publication (broker_publish, default true): a false entry stays renderable locally but is kept out of the agent-facing broker vocabulary, so the agent never selects it. The broker-published, agent-selectable set is happy, laugh, embarrassed, sheepish, calm, sleeping, idle_lively, dance, sulk. Excluded from the broker: idle (ambient baseline, auto-played), drag (kind: reactive pickup), head_pat (kind: reactive pat loop), peek and window_sit (broker_publish: false, client-held perch states), thinking (broker_publish: false, client-played TTFT affordance), walk (kind: reactive + broker_publish: false, the client-scheduled ambient stroll), jump (broker_publish: false, its window-to-window crossing), falling, landing (broker_publish: false, the client-owned fall chain), and climb_up, climb_up_done, climb_down, climb_down_landing (broker_publish: false, the client-owned climb chain), and sit_down, stand_up (broker_publish: false, the client-owned seat transitions).
  • Idle selection: each idle variant carries an on/off switch in the Character tab. The selection is a localStorage overlay (yui.idle_motions, the disabled set keyed by variant file path) — configs/motions.json is never written. The ambient cycle picks only from the enabled variants and re-reads the selection on every rotation, so a change lands after the playing variant finishes its cycle. The pool's vrma_path (calm.vrma) is the fallback baseline and cannot be disabled.
  • Expression selection: each broker-published motion carries an on/off switch in the Character tab, grouped by category. The selection is a localStorage overlay (yui.express_motions, the disabled set keyed by motion id) — configs/motions.json is never written. It narrows the vocabulary published to the broker and the motion_id enum of the Chat-Completions generate_express tool; turning every motion off drops motion_id from that schema. It is a vocabulary filter, not a render gate: a cue naming a deselected motion still plays.
  • Vertical root lock (root_lock_y, default false): the loader strips a clip's baked horizontal root drift from every entry, but leaves vertical motion alone because that is the bob. A true entry has its hips-Y track levelled instead — every key onto the hips height the VRM has in its rest pose — and the curve that came out is kept beside the clip. Set on the four climb clips and the two seat transitions, whose rise and fall is the movement: the OS window replays that curve, so the clip and the window compose to the authored motion exactly once, a loop has no seam left to snap at, and a clip captured with the hips a metre above standing no longer plays a metre up the canvas. The flag rides in the clip-cache key, so two entries sharing one .vrma can disagree on it.
  • Missing-clip fallback: any motion whose clip fails to load (missing or invalid .vrma for the live VRM — e.g. a gitignored purchased motion absent locally) recovers to idle. The renderer force-commits idle so the failed id never pins controller state or blocks a later idle by priority.

Naming convention

A motion id is named for the emotion or state it expresses, with a few patterns:

  • Default — {emotion}: the bare emotion or state — happy, laugh, embarrassed, sheepish, calm.
  • Indexed — {emotion}_NN: when several clips express the same id, suffix a zero-padded number (idle_01, dance_13, sit_01).
  • Descriptive exception: motions whose action or pose is itself the clearest identifier keep that descriptive name instead of an emotion label — idle, drag, head_pat, peek, window_sit, sleeping, thinking, walk, jump, climb_up, climb_down, dance.

Top-level motions

idkindloopdescriptionsource clip~len
idleambientyes (cycle)Calm ambient baseline — random pool of calm.vrma and the three calmest idle variants (see below). pingpong: true with loop_cycles: [1, 3]: each variant plays forward↔reverse a random 1–3 round trips, then rotates to a fresh variant.PET_POSE / PET_IDLE / PET_MISC
idle_livelyoneshotnoBroker-published random lively-fidget pool (see below). Plays one variant once, then returns to the prior stable motion.PET_IDLE / UPDATE_2
dragreactiveyesPickup reaction while the window is being dragged. broker_publish: false.PET_MISC/PET_DRAGGING
head_patreactiveyesHead-pat reaction, held for as long as the press stays on the head region. pingpong: true (single variant): plays forward↔reverse continuously until the release clears it. broker_publish: false. Reuses idle_10.vrma as the pat loop.PET_IDLE/PET_IDLE_1011.0s
fallingreactiveyesFalling loop, held for the whole descent to the surface below. broker_publish: false.Mixamo "Falling_2"2.78s
landingoneshotnoTouchdown at the end of a fall, then recover to standing. A fall that came down on a window top takes its seat once this clip hands the body back. broker_publish: false.Mixamo "Falling_and_landing"7.18s
climb_upreactiveyesWall-climb loop held for the length of an ascent. root_lock_y: true: the clip's rise per cycle comes out of the hips and goes into the window, so the VRM climbs in place at scene origin while the OS window rises along the chosen window edge and the root yaws ±90° toward the wall. The window tracks the clip's own rise curve, counting each loop restart, so the hands do not slide. broker_publish: false.Mixamo "Climbing Up Wall"1.98s
climb_up_doneoneshotnoPull-over onto the ledge that ends an ascent. root_lock_y: true: the window follows the clip's own rise, leaving the feet on the window's top edge. broker_publish: false.Mixamo "Climbing To Top"4.0s
climb_downreactiveyesWall-descent loop held for the length of a descent, root_lock_y: true, the window following the clip's own ~1.05 m per cycle. It also covers the step off the ledge: the clip crossfades in over a 400 ms slide down the wall, which is the one stretch the window drives on its own clock. broker_publish: false.Mixamo "Climbing Down Wall"2.0s
climb_down_landingoneshotnoTouchdown at the end of a descent. root_lock_y: true: the window follows the clip's own ~0.24 m drop onto the work-area floor. broker_publish: false.Mixamo "Climbing Down_landing"1.38s
sit_downoneshotnoSitting down onto a window top, played before window_sit takes the seat. root_lock_y: true: the perch pin stays off while the clip plays and the window follows the clip's own hips curve, scaled so its total drop is the measured standing-feet → seated-hips distance — the last frame lands the hips on the edge, then window_sit crossfades in and the pin engages. A drag drop keeps the window where the user left it and plays the clip in place. broker_publish: false.Mixamo "Sitting"4.4s
stand_uponeshotnoStanding up from a window seat, played before a perched stroll or a climb descent leaves the seat. root_lock_y: true: the pin is released and the window follows the clip's rise, scaled to the same seat distance, so the feet end on the edge. broker_publish: false.Mixamo "Sit To Stand"2.03s
happyoneshotnoHappy reaction.PET_MISC/PET_HAPPY
laughoneshotnoLaughing reaction.PET_MISC/PET_LAUGHING
embarrassedoneshotnoStrongly embarrassed; shy finger-point gesture.PET_MISC/PET_SHY_POINT
sheepishoneshotnoSheepish/awkward standing gesture; one hand raised to the head/hair.PET_POSE/PET_POSE_26.8s
calmoneshotnoCalm standing gesture; hands folded together in front.PET_POSE/PET_POSE_35.0s
peekstateyes (cycle)Held while side-perched; the hips stay pinned inside the app-window edge so the clip's walk-away never leaves frame, and the clip mirrors on its configured side. crossfade_loop: true: the clip clamps on its last frame and crossfades back to frame 0 (fade_ms: 700) each loop, hiding the wrap seam. broker_publish: false.PET_HIDING/PET_HIDE14.0s
sleepingoneshotyesLies down on the floor on her side — sleeping. Drops the hips low (off a feet-anchored frame).PET_SLEEPING/PET_SLEEPING35.2s
thinkingstateyesLooping thinking pose — client-played TTFT latency affordance; loops from the start of a backend turn until the response speech begins. pingpong: true (single variant): plays forward↔reverse continuously, seam-free at the turnaround, until interrupted. Priority 50 (above idle, below window_sit perch and reactive emotes). broker_publish: false. Purchased asset at public/purchased_motions/thinking.vrma; falls back to idle when absent.もいらんど thinking
sulkoneshotnoSulk/pout (拗ね) emotion gesture.necocoya EmoteSet_Free_v130 / 06_suneru4.2s
walkreactiveyesIn-place walk cycle (39 keyframes at 30 FPS) held for the length of an ambient stroll. The VRM stays at scene origin while the OS window translates along the work-area bottom and the root yaws ±90° toward the travel direction; the window is paced at 1.34 m of stride per cycle, divided by the loaded clip's own duration, so the feet do not slide. Priority 45 (above idle, below thinking and the emote oneshots, which end the stroll by taking the clip). kind: reactive keeps it out of the return target a finishing oneshot resumes, so a stroll cut short never leaves the character walking on the spot. broker_publish: false.Mixamo Walking1.27s
jumponeshotnoStanding jump, played once when a perched stroll crosses a height difference or a gap to an adjacent window's top. The VRM jumps in place at scene origin while the OS window travels a parabola between the two tops over the clip's airborne stretch (0.40–0.67 of its length); the crouch and the recovery play with the window held still. Priority 45, above the idle baseline the walk hands the body back to before takeoff and below the drag pickup that ends the jump. broker_publish: false.Mixamo "Jump"1.6s
window_sitstateyesHeld window-perch (see below). Plays a sit variant, pingpong: true with loop_cycles: [1, 3] (forward↔reverse a random 1–3 round trips), crossfades to a different variant, repeats until interrupted. broker_publish: false. Engaged by a dev trigger.PET_SITTING/*
danceoneshotnoRandom dance pool (see below).PET_DANCING/*

sheepish and calm are standing gestures, not sitting.

idle variants (ambient baseline pool)

4 variants.

variant filedescriptionsource clip~len
calm.vrmaCalm standing gesture; hands folded together in front.PET_POSE/PET_POSE_35.0s
idle_01.vrmaStanding, hands framed together at the chest, slight turn — playful.PET_MISC/HoverReaction2.5s
idle_04.vrmaStanding, 3/4 turn, one hand raised to touch her hair — coy.UPDATE_2/PET_IDLE_UPDATE2_0311.4s
idle_12.vrmaStanding, weight shifted onto one hip, subtle head tilt and knowing smile — sultry calm.PET_IDLE/PET_IDLE_123.5s

idle_lively variants (oneshot, random)

10 variants.

variant filedescriptionsource clip~len
idle_02.vrmaStanding, arm lifts to the chin then crosses at the chest, cape swirling — energetic.UPDATE_2/PET_IDLE_UPDATE2_0116.5s
idle_03.vrmaStanding, one arm raised high in an open-palm wave — cheerful greeting.UPDATE_2/PET_IDLE_UPDATE2_0213.2s
idle_05.vrmaStanding, both arms thrown overhead in a big stretch, cape flaring wide — energetic.UPDATE_2/PET_IDLE_UPDATE2_0412.0s
idle_06.vrmaStanding, quick half-turn with a leg cross and hip dip, hair swinging out — playful twirl.PET_IDLE/PET_IDLE_65.7s
idle_07.vrmaStanding, glancing back over the shoulder with one hand raised in a small wave, hair swept aside — flirty.PET_IDLE/PET_IDLE_79.3s
idle_08.vrmaStanding, arms sweep open wide then settle back at sides, sleeves fluttering — breezy sway.PET_IDLE/PET_IDLE_86.0s
idle_09.vrmaHands on hips, confident smirk, quick turn sends hair whipping to the side — playful, sassy.PET_IDLE/PET_IDLE_910.0s
idle_10.vrmaSide turn, hair caught in a windswept flick, hands settle clasped behind the back — coy, flirty.PET_IDLE/PET_IDLE_1011.0s
idle_11.vrmaStanding, hands raised to shoulder height with fingers curled like claws, playful jab — feisty.PET_IDLE/PET_IDLE_114.1s
idle_13.vrmaStanding, glances back over the shoulder then leans in with hip cocked — flirty tease.PET_IDLE/PET_IDLE_134.1s

window_sit variants (random)

7 variants — a mix of floor sits and edge/perch sits. All lower the hips when seated. window_sit is a looping held state that ping-pongs each variant forward↔reverse a random 1–3 round trips (loop_cycles: [1, 3]), then crossfades to a different variant over fade_ms: 700 with no settled-frame dwell (cycle_dwell_ms: 0).

variant filedescriptionsource clip~len
sit_01.vrmaFloor sit, legs folded to one side, one hand supporting — elegant.PET_SITTING/ME_02/PET_SIT_013.2s
sit_02.vrmaSits upright on an edge, knees together — best for window-perch.PET_SITTING/ME_02/PET_SIT_026.5s
sit_03.vrmaSideways floor sit, hand to chin — cute.PET_SITTING/ME_02/PET_SIT_036.5s
sit_04.vrmaEdge sit, knees together, hands resting on lap — demure.PET_SITTING/ME_02/PET_SIT_042.0s
sit_05.vrmaCross-legged floor sit, one hand to the head — relaxed/casual.PET_SITTING/ME_02/PET_SIT_054.0s
suwari1.vrmaCompact floor sit, knees drawn up.PET_SITTING/ME_02/suwari13.2s
suwari3.vrmaFloor sit leaning back, one hand propped behind — relaxed.PET_SITTING/ME_02/suwari32.9s

dance variants (oneshot, random)

13 variants, ranging from short gestures (~1.3s) to full routines (~27s).

variant filedescriptionsource clip~len
dance_01.vrmaEnergetic — both arms spread, scarf flowing.PET_DANCING/PET_DANCING14.2s
dance_02.vrmaShort — hands at the waist.PET_DANCING/PET_DANCING_21.3s
dance_03.vrmaOne hand reaching out to the side, legs apart.PET_DANCING/PET_DANCING_33.9s
dance_04.vrmaIdol-style — hands in fists near the chest.PET_DANCING/PET_DANCING_42.3s
dance_05.vrmaSubtle hand gesture.PET_DANCING/PET_DANCING_51.7s
dance_06.vrmaWeight-shift step, one arm crossed to chest.PET_DANCING/PET_DANCING_62.4s
dance_07.vrmaMedium routine (calmer).PET_DANCING/PET_DANCING_75.0s
dance_08.vrmaOne arm extended, scarf flaring dramatically.PET_DANCING/PET_DANCING_82.4s
dance_09.vrmaRaised hand / wave-like move.PET_DANCING/PET_DANCING_94.5s
dance_10.vrmaLong full routine, expressive.PET_DANCING/PET_DANCING_1021.8s
dance_11.vrmaLongest — full routine with spins.PET_DANCING/PET_DANCING_1127.4s
dance_12.vrmaGentle, cute.PET_DANCING/PET_DANCING_126.3s
dance_13.vrmaCelebratory — both arms raised in a V.PET_DANCING/PET_DANCING_1319.6s