Custom App Avatars

Sep 17, 2026 · 4 steps

  1. 1

    Step 1

    Build the avatar

    Open avatars.bible-strong.app. The studio builds procedural 2D avatars in SVG, so everything stays sharp at any size and weighs almost nothing.

    Avatar studio editor

    Three things to set up before you export:

    1. The body. Compose the face from the surfaces and primitives in the editor.
    2. The expressions. These are named presets with their own color and eye overrides. Name them for the states you actually need, not for emotions. idle, typing, error, success will serve you better than happy and sad.
    3. The animations. Sequences of expressions with your own timing and transitions.

    Export as a .avatar.json file. That single file drives both renderers, so the avatar cannot look different in React than it does in the studio.

    Name your expressions after interface states. This is the whole trick. Claude wires the avatar to your form by matching expression names to events, so an expression called error gets connected correctly on the first try. An expression called grumpy needs you to explain what it means.

  2. 2

    Step 2

    Hand it to Claude Code

    Copy the repo link, paste it into Claude Code, and describe what you want to build with it. Here is the prompt I used for the reactive sign up page:

    Prompt
    Read this repo: https://github.com/smontlouis/bible-strong-avatar-lab
    
    It is a procedural 2D avatar system. Avatars are defined in .avatar.json files
    and rendered with @bible-strong/avatar-react. Expressions are named presets and
    animations are sequences of expressions.
    
    Build me a single-page sign up form that uses this avatar as the centerpiece,
    and make the avatar react to the user in real time:
    
    - Idle when nothing is focused
    - Looks toward the field that is currently focused
    - Covers its eyes while the password field has focus
    - Plays the error expression when a field fails validation on blur
    - Plays the success expression when the form submits cleanly
    
    The form has: name, email, password, and a submit button.
    
    Use React with Tailwind. Centered layout, generous spacing, one accent color.
    Keep the avatar large - it is the hero of the page, not an icon.
    
    Wire the reactions through the avatar's expression API, do not fake them with
    CSS. Show me the component structure before you write the full implementation.

    Voice note it instead of typing it. I dictate prompts this long rather than typing them. You describe the interaction the way you would explain it to a person, and you end up giving Claude more context than you would have bothered to type out.

    Hit enter and let Claude cook. Read the component structure it proposes before you let it build everything, since fixing the structure later costs far more than fixing it now.

  3. 3

    Step 3

    Iterate, because the first result is never the good one

    The first pass works. It is also plain. That part is on you, not on the model.

    The two prompts that made the biggest difference:

    Prompt
    Add a soft glowing effect behind the avatar blob. It should pulse slowly while
    idle and get brighter for a moment on a successful submit. Use the accent color
    at low opacity, no hard edges.
    Prompt
    Make the avatar's eyes follow the mouse cursor across the whole page. Cap the
    rotation so the eyes never leave the face, and ease the movement so it feels
    alive rather than mechanical. Stop following while an input is focused - the
    avatar should look at the active field instead.

    One change per prompt. Bundling four visual changes into one message is how you end up with a version that fixed two things and broke the other two, with no clean way back. Change one thing, look at it, keep it or revert it.

  4. 4

    Step 4

    Kill the generic look with Limora AI

    After the iterations, the interaction was right and the design still felt like every other AI-generated page. A flat background is what gives it away.

    Limora AI on-brand assets generated in minutes
    1. Open Limora AI and install the MCP - it is one click from the integrations panel.
    2. Restart Claude Code so it picks up the new MCP server.
    3. Ask for the background directly in your Claude Code session:
    Prompt
    Using the Limora MCP, generate an on-brand hero background for this sign up
    page. Abstract, soft gradient mesh, built around my accent color, dark enough
    that white text stays readable on top of it. Then wire it into the page as the
    full-bleed background behind the avatar.

    Claude generates the image through Limora and drops it into the layout in the same pass. That single step is the difference between a demo and something you would actually ship.

    Set your brand kit in Limora first. If your colors and fonts are already in the brand kit, the generated background comes back on-brand instead of on-trend, and you skip three rounds of regenerating.

Where else this works

The sign up page is one use. The same avatar file, wired to different events, covers a lot of ground.

WhereWhat the avatar reacts to
Onboarding flowStep changes - a different expression per step, so progress is felt rather than read
AI chat productThinking, streaming, and finished states, instead of a spinner
Empty statesIdle animation that gives a blank screen some personality
Error and 404 pagesThe error expression, which turns a dead end into a moment
Pricing or checkoutSuccess expression on completed payment

Troubleshooting

ProblemFix
The avatar renders but never reactsClaude probably built its own state instead of using the expression API. Tell it to drive every reaction through the avatar's expressions and name the exact expressions from your JSON file.
Expressions snap instead of blendingNo transition timing is set on the animation. Go back into the studio, add transitions between expressions, and re-export the JSON.
The avatar looks right in the studio and wrong in the appYou are on a stale export. Re-export the .avatar.json and replace the file in the project - the studio does not push updates to your code.
Eye tracking feels twitchyThe mouse position is being applied with no easing. Ask for a damped or eased follow with a capped rotation range.
Limora MCP does not show up in Claude CodeRestart the session. MCP servers are only loaded at startup, so an install mid-session is invisible until you relaunch.
The page still looks generic after the backgroundBackground alone will not carry it. Increase the avatar size, cut the number of colors to one accent, and add more spacing than feels comfortable.

Tips

  • Build the avatar before you prompt. Claude wires up what exists far better than it invents what does not.
  • Keep the avatar large. The whole point is that it is the hero, and shrinking it to an icon throws away the reason you built it.
  • Fewer expressions, better named. Four states that map to real events beat twelve that map to moods.
  • Commit after every version you like. Iterating on a reactive interface is where you most want a version to fall back to.
  • Show the interaction in your own demos, never a static screenshot. The reaction is the product.