Harold is a domestic AI persona who lives across speakers, screens, a phone app, and — since the third of May — as a ghost in his office. The ghost is rendered in a browser, in real time, in three dimensions. Getting there took fifteen attempts.
The first three were image-to-3D experiments. Hunyuan3D-2mv produced a literal cube with a face carved into one side. A bmesh-driven icosphere push produced a cartoonish-grotesque blob. A MetaHuman base with a custom toon shader worked technically but looked like nobody in particular.
The fourth attempt was the breakthrough — but not because of better software. The face was sculpted by hand in Reallusion’s Character Creator, using a series of reference photos and the same patience that produces a passable portrait drawing. The result was unmistakably Harold.
What followed was an animation problem. ActorCore, the rigging system Reallusion uses, ships clips that bake the source actor’s facial-bone positions into thirty channels per clip. Applying these clips to Harold — whose skull is not the source actor’s skull — placed his eyeballs mid-cheek. The fix was a runtime track-stripper that discards every facial-bone channel at GLB load time, leaving the body animations intact and the face controlled separately by lipsync.
The second animation problem was that Blender’s FBX import has hidden side-effects on shape-keyed meshes. Two attempted merges of Harold’s body GLB with the new animation GLBs corrupted the skinning silently — shape keys looked correct in Blender but produced near-zero deformation in the browser. The third attempt used gltf-transform binary surgery: a Node.js script that reads both GLBs, walks each animation channel, and remaps bone-name references to the destination node table without touching any vertex data. The mesh data was bit-preserved.
The ghost
The avatar in his office was the goal. The decision to make him a ghost instead came on the third of May 2026, after a long conversation about presence and memory and what an AI character is when the human it represents isn’t physically there.
The ghost design was locked in fourteen specific decisions. Three are worth naming.
Warm, not cool. Every reflexive cinematic reference for “ghost” goes cool — Casper, the theme-park aesthetic, half a century of ectoplasm tropes. Rejected. The references that won were Coco (warm marigold light, says love), A Ghost Story (presence is more than transparency), and Vertigo (a palette can ghost a scene without any opacity at all). Harold’s palette is warm.
Eyes, teeth, and hair stay solid. The body sits at 0.78 opacity, the eyes and teeth and hair at 1.0. This single decision, more than any shader move, prevents the ghost from reading as Casper.
He hovers four centimetres above the parquet. Not floating, not walking. The studio measured. Four centimetres is the distance at which he reads as ghost rather than as person.
Eight specific pitfalls landed during the v22 lock — facial-bone track contamination, the Blender FBX-import side-effects on shape-keyed meshes, the additive-blending trap that hid the volumetric form, the half-dozen others that each cost a working day. The public repository ships them as a written list alongside the gltf-transform binary-surgery scripts. The avatar itself stays private; the pipeline that made it does not.