# Building an AI chat assistant for my site, part 10: giving it a face

The assistant widget's avatar has been a generic cloud-in-a-circle icon since it launched back in part 8. It worked, but it was obviously a placeholder. This part is about giving it something closer to a face: a small, animated 3D-style character based on my own likeness, idling in the corner instead of a stock icon.

Getting the reference photos right took more back and forth than I expected. Higgsfield wants at least 20 photos of one person to train an identity, and not just any 20. Good candidates need clear, unobstructed faces, a spread of angles, and no sunglasses or heavy shadow. Digging through my camera roll turned up plenty of photos that failed on one of those counts: motion blur, extreme close-up selfies with visible fisheye distortion, or a crop so tight another head was poking into frame. I ended up curating the set down, dropping the worst offenders, and deliberately adding a few third-party-taken and multi-angle shots (straight-on, three-quarter, profile) to round it out, since almost everything I had on hand was either a selfie or a similar front-on angle.

I did the whole generation process through Claude Code, after installing an MCP connector for Higgsfield. I trained a Higgsfield Soul ID on those twenty photos to get a reusable identity reference. The first thing that happened next was Claude generating four images straight from that Soul ID without asking, spending credits before I'd even seen a result. After that I set a standing rule: tell me what something costs before running it on Higgsfield, not after. That held for the rest of the project.

Then came the actual stylization attempt, a Pixar-style animated character generated from the trained identity. That did not work the way I expected. The identity model kept producing photoreal images no matter how the prompt was worded, since it is built to preserve likeness, not stylize it. Out of ten attempts, only one leaned cartoonish at all, and it overcorrected hard on the eyes. The other nine just looked like regular photos of me.

![One attempt out of ten that tried to go cartoonish, with badly oversized eyes](https://images.koorevaar.com/articles/ai-chat-assistant-for-my-site-part-10/big-eyes-attempt.png)

*The one attempt out of ten that tried to go cartoonish. The other nine stayed stubbornly photoreal.*

Switching to Nano Banana Pro with the reference photos fed in directly, plus a stronger "single frame from an animated film" prompt, finally got a real cartoon render with normal eye proportions while keeping my face recognizable.

From that rest pose, matching blink, turn-left, and turn-right poses were generated using the same image as reference, so lighting and framing stayed consistent, which matters for a crossfade animation between them. For background removal, Claude's first suggestion was to use Higgsfield itself, at a cost of 4 credits, one per image. I asked if there was a cheaper option, and it switched to rembg, a local Python tool that strips backgrounds for free. The WebP export was local too, done with Pillow, so the final avatar drops onto the page with a transparent background instead of carrying a fixed color, without any of that touching my credit balance beyond the original ten generation attempts.

The four stills are the whole animation: a resting frame shown most of the time, a blink, and two slight head turns, crossfaded between with CSS transitions rather than a generated video loop. The handoff spec called for randomizing which pose fires and when, instead of a fixed interval, since a metronomic loop reads as robotic almost immediately. Whether that randomization made it into the final implementation as specified is something I'd want to check the actual widget code for before claiming it outright.

It's live now, sitting in the assistant widget on the homepage.

Repo: [https://github.com/P47K0/website](https://github.com/P47K0/website)

If this was useful, [you can buy me a coffee](https://ko-fi.com/p47k0).

---

*Co-authored with Claude.*
