
19 August 2026 · 4 min read
The x.ai orb does not do what you think
I wanted an interactive avatar, so I took the orb apart. It never reacts to your cursor at all.
I saw the glass orb on x.ai and wanted one with my face in it. Before copying an interaction it is worth understanding it, so I opened the page and took the thing apart. The finding was not what I expected.
It never looks at you
The orb does not react to your cursor. Not subtly, not at all. There is no pointer uniform in its shader, no pointermove listener anywhere in its chunk, and every instance is aria-hidden with pointer events switched off. Its one reactive input is live audio amplitude. When a voice sample plays, the orb spins up and its aurora surges.
Which means the aliveness I was responding to had nothing to do with interactivity. It came entirely from how the thing moves.
The part worth stealing
Amplitude is fed through two envelope followers with asymmetric attack and release. A fast one, roughly 40ms attack and 180ms release, drives motion. A slow one, 110ms and 300ms, drives light. Quick to wake, slow to settle. That asymmetry is most of the personality.
The rotation is not a spring either. It is a low-pass filter with a time constant around 350ms, which reads as springy but can never overshoot. On top sits a transient kick so sharp inputs jolt it, and three incommensurate sine waves so the idle state never visibly repeats.
Giving it a face
I kept that entire motion model and swapped the input: instead of audio amplitude, cursor proximity. One correction was needed. Their reference distance is the orb's own radius, and if you use that for head rotation the avatar saturates at maximum turn a few hundred pixels away and just stares. Head tilt needs a viewport-scaled reference so it tracks you proportionally across the screen.
Then the part an orb cannot do. I generated the memoji, then cut the irises out of the render as separate sprites so the eyes could move independently of the head. Removing them leaves two holes, and filling those with flat white breaks the eyelid line the moment an iris slides. The fix was to inpaint each hole with row-wise horizontal interpolation: for every row inside the disc, blend between the pixels just outside its left and right edges. Sclera rows blend white to white, eyelid rows blend dark to dark, so the lid survives intact and the eye reveals correct sclera as it moves.
Blinking
Blinking looked like it needed a rigged model. It needed a second image. I generated one more frame of the same character with the eyes closed, instructing the model not to move the head, and the two renders registered within a single pixel. An 80ms opacity cross-fade between them, with the iris layer fading out in step, reads as a real blink. It fires every few seconds, occasionally doubles, and triggers when you click him.
The most interesting thing I copied was not an effect. It was a set of time constants.
He is at the top of this site. Move your cursor around and he will follow it, and click him if you want to see the squish.