Small gestures.
A little more personality.

Playtime & petting: implementation, tests and limits ↗

Robby can perform playful actions and wildly silly cartoon grimaces when you ask, accompany a reply with a small gesture, and quietly acknowledge you while listening.

Try: “Look angry, then make a funny face.” Or: “Dreh deinen Kopf einmal gegen den Uhrzeigersinn.” German and English requests go through the same language-model tool.

Loading the CPU renderer…

Ask Robby to…

ActionExampleBehavior
Nod / shake“Nicke bitte.” / “Shake your head.”Two soft beats, then return to eye contact.
Full turn“Rotate 360 degrees clockwise.”One virtual yaw rotation, at least 3 seconds. Direction is viewed from above.
Eyes“Roll your eyes.” / “Zwinkere.”Small pupil circles or a friendly wink; no extreme eye stretching.
Grimaces“Schiele.” / “Make a really silly cartoon face!”Big crossed cartoon eyes, wildly opposite glances, alternating eyebrows, or a cheeky wink with a crooked laughing mouth. Smooth transitions; ordinary expressions stay unchanged.
Emotions“Look bitter.” / “Zeig mir Wut.”The authored archetype, with smooth entry/exit and no randomized pose variation.
Sequences“First angry, then a grimace, then happy.”Up to 6 ordered actions, at most 24 seconds in total.

Turning while talking: try “Dreh dich bitte und rede dabei” or “Can you rotate your head counterclockwise?” A clear direct command schedules a six-second full turn with the first spoken audio, even if the language model omits its tool call. This works at zero idle-play intensity. Keep Allow expressive actions enabled; browser reduced-motion preferences still suppress rotation. A status message in the actions panel explains these settings.

Playtime and gentle strokes

Eight grimaces are available: crossed, opposite, wiggle, cheeky, goofy, squishy, fish and peekaboo. After 20 seconds without conversation activity, Robby may play with funny faces and a three-turn, six-second carousel. It starts slowly, accelerates through the first 80%, gently brakes, and leaves six seconds of happy afterglow. The face grows increasingly delighted. Adjust the Bored after slider in Personality & little tricks from 5 to 180 seconds; the setting applies immediately and is saved. The same quiet pause separates sequences. He returns to eye contact and gives priority to your speech. Play stays off during ordinary replies, calibration, a hidden tab or reduced-motion mode.

Two intensity sliders (0–100%, default 100%) are also available in the live demo. Silliness intensity ranges from no idle antics to exaggerated faces and cheers; low settings make one complete carousel turn, medium two, high three. Cuddly personality controls petting/puppy expressions, warm vocal reactions and rare invitations. Lower settings lengthen reaction and invitation cooldowns; zero disables petting reactions and invitations. Invitations remain optional, capped at two per session and never repeated during unanswered silence. These sliders are independent, apply immediately, and persist in your browser. Normal gaze, conversation and speaker recognition are unchanged.

Cheer during carousel play enables brief LLM-generated whoops that grow from a gentle “Hui!” or “Whee!” into exuberant cheers. These are not prerecorded phrases. The animation begins with actual audio playback; unavailable or silent LLM responses fall back to silent play. Spoken rides have a 45-second cooldown. All turns are virtual, never motor commands. Accepted petting invitations use a soft upward-looking puppy expression, with a single optional, gentle “Bitte, bitte?” or similar phrase; refusal is not punished.

Move onto the head to see a soft hand cursor. Hold the left mouse button and stroke gently back and forth: Robby softens his eyes and smiles. Clicking or holding still does not count. Alt-drag or drag the base to orbit instead. Try this in the preview above, silently and without any API call.

In Personality & little tricks, independent switches control expressive actions, idle play, mouse strokes, spoken reactions, optional invitations and listening gestures. All start enabled and are remembered in this browser. Soft vocalizations, gentle chuckles and short warm remarks are chosen by the configured LLM and voiced by TTS, not a bank of canned sentences. Reactions can start while you are still stroking, at most once per 12 seconds; holding the mouse still does not retrigger them. They require a connected conversation. An invitation still waits at least three minutes, is at least ten minutes apart, occurs at most twice per session, and never repeats during an unanswered quiet spell. The LLM may choose silence, especially after a refusal or request for quiet. Mouse gestures do not enroll or identify a person.

Robby is a playful AI character: his affectionate expressions are simulated, not evidence of physical sensation or a need for attention. He should not guilt you, demand affection or pretend to be physically lonely. Recent animation events are supplied to the LLM so it can explain what it was doing. No microphone recording or new biometric data is stored for this feature.

A listening nod means “I am following”, not factual agreement. Listening cues reuse the existing verified decision-model loop, with at least ten seconds between gestures. Head shakes require a clear reason.

Playback, comfort and limits

Spoken-response actions begin at the audio playback position, not when a network message arrives. Sentence offsets are estimates from the acting script, not forced alignment. A barge-in, Stop button, connection close, hidden tab or eye-contact calibration clears queued actions. Camera tracking is preserved beneath the temporary animation. “Stop animation” only stops visuals, not speech.

System “reduced motion” disables spins, nod/shake motion and idle antics; facial poses remain available. The desk page renders a real virtual 3-D yaw turn; the older SVG avatar uses a flat cartoon turn. Explicit negative emotions can look angry or sad; only the playful grimace presets are constrained to a warm, non-threatening style. Cuteness is a design intention, not a perceptual guarantee.

Screen simulation only. A 360° trick deliberately exceeds the prototype’s physical ±90° pan limits. No motor commands are sent. Do not transfer these movements to hardware without mechanical and cable-clearance checks. Short spoken “Stop” still has known reliability limits; the visible Stop reply button remains available.

The 40 authored facial expressions

These are the existing EmoNet-Face-derived authored robot poses, not emotion recognition and not a universal scientific code for human feelings. Select a card to preview its full pose.

Measured results, test receipts and banana-game diagnosis ↗

For developers

The tool is perform_avatar. Its JSON is validated in Python, sent separately from spoken text, checked again in JavaScript, and rendered locally. No new ML model, camera processing, persistent identity data or GPU memory is added. Dialogue actions currently use a brief spoken acknowledgment to anchor playback; silent actions are available through the preview controls and the listening-decision path.

{"steps": [
  {"kind": "emotion", "emotion": "anger", "duration_s": 2, "sentence": 0},
  {"kind": "grimace", "variant": "cheeky", "duration_s": 2, "sentence": 0},
  {"kind": "nod", "duration_s": 1.6, "sentence": 1}
]}

Motion uses bounded sine curves and smooth quintic transitions. Separate left/right eye offsets are clipped inside the existing eye masks. The original ASR, speaker verification, TYGER decisions and facial acting timeline remain in place.

Test commands, release status and known limitations · Animation implementation