Skip to content
charmotion
Website mascot

A mascot that reacts to what happens on your website.

Upload your mascot and embed it as a Rive canvas whose mood your page sets on hover, scroll, form focus or a finished checkout. Where you only need motion, the transparent WebM with an HEVC MOV fallback plays over your page in Chrome, Firefox, Edge and Safari.

Embed
Rive canvas, mood 0–9 + triggers
Video
Transparent WebM + HEVC MOV
Code
Web embed + React component
Plan
Starter, $20/month
Kiko, a Charmotion demo character Live Rive file
Loops
Play once

This is the actual .riv our engine delivers, playing in your browser. It's the same state machine you drive from your app with one number input and a trigger per one-shot.

Page events, mapped to the mascot

Page eventMascotInput
Page loadsenter, then idletrigger, mood 0
Hover on a call to actionwave or happymood 2 or 1
Pricing scrolls into viewattentionmood 9
Form field gets focuslisteningmood 6
Form is submittingloadingmood 5
Signed in, message sentsuccesstrigger
Wrong passworderror or notrigger
No search resultssad or sleepingmood 4 or 8

Wire it to your page

const vm = r.viewModelInstance;       // after onLoad
const mood = (n) => (vm.number("mood").value = n);

cta.addEventListener("mouseenter", () => mood(2));   // wave
cta.addEventListener("mouseleave", () => mood(0));   // idle
email.addEventListener("focus", () => mood(6));      // listening
form.addEventListener("submit", () => mood(5));      // loading

// when your API answers:
vm.trigger(ok ? "success" : "no").trigger();

The delivered web embed and React component (with a mood prop and play()) set up the Rive instance.

Where it runs

Webflow has a native Rive element and Framer an official Rive plugin. WordPress and Shopify take the .riv through an embed, or the transparent video in a video block. See adding animation to a website.

Honest limits

  • No cursor-following eyes: the mascot switches between its 17 animations.
  • No walk-ons across the page: enter and exit play in place.
  • Facial expressions and arm waves need flat artwork; 3D mascots move as a whole.
Real output

Delivered files, exactly as you'd download them.

MP4 Every set

1080 × 1080 at 60 fps. Here: Gummo’s wave, from a delivered set.

Transparent WebM & MOV Every set

Alpha channel included, so the checkerboard shows through. MOV is HEVC with alpha for Apple apps and editors.

Kiko thinking, GIF output

GIF Every set

Light previews for docs, email and chat. Kiko’s “thinking” loop.

9:16 launch video Every set

1080 × 1920 for stories and splash screens. Sizzle’s launch intro.

kiko.riv · 150 KB

CharacterStateMachine
number input mood
0–9: idle, happy, wave, thinking, sad, loading, listening, talking, sleeping, attention
triggers: success · error · yes · no · enter · exit
LaunchStateMachine
launch → idle, plays once

Rive state machine Every set

One small file instead of 17 videos. It’s what powers the demo at the top of this page.

import { useRive, useStateMachineInput } from "@rive-app/react-canvas";

export function Kiko({ mood = 0 }) {
  const { rive, RiveComponent } = useRive({
    src: "/kiko.riv",
    stateMachine: "CharacterStateMachine",
    autoplay: true,
  });
  const input = useStateMachineInput(rive, "CharacterStateMachine", "mood");
  if (input) input.value = mood; // 0 idle · 1 happy · 2 wave · 3 thinking · 4 sad · 5 loading …
  return <RiveComponent style={{ width: 320, height: 320 }} />;
}

Paste-ready code Every set

Web, React and SwiftUI components named after your character.

Formats included per plan
FormatSpecsStarter & All in one
MP41080 × 1080, 60 fps, all 17 animationsIncluded
9:16 launch video1080 × 1920 MP4Included
GIF480 px previews, solid backgroundIncluded
Rive (.riv)Vector; Data Binding view model + legacy inputs: mood for loops, triggers for one-shots, launch machineIncluded
Transparent WebMVP9 with alpha, 1080 × 1080Included
Transparent MOVHEVC with alphaIncluded
CodeWeb (HTML), React and SwiftUI componentsIncluded
Download all (.zip)Rive file, code, README and posters in one archiveIncluded
Video exportMP4, GIF, transparent WebM and MOV, 9:16: pick formats and animations on the set page, ready in about a minuteIncluded
AI assistants (MCP)Claude, Cursor, VS Code and CodexIncluded
Plans

Start free. Upgrade when you need more.

The interactive .riv, transparent video and web code are in every paid plan, from Starter ($20/month). The MP4 and GIF have a solid background, which only blends in on a matching page color. Prices in USD; tax is calculated at checkout by Creem.

Free

$0forever

Try it with your own logo and character.

  • Logo animation ideas (3 concepts)
  • App-screen preview of your character
  • No card needed
  • 2 AI designs (logos or characters)
  • Works from Claude, Cursor, Codex
  • Email support

All in one

$100/month

For teams and several brands.

  • 15 logo animations a month
  • 10 character sets a month
  • Cinematic 3D video included
  • 40 AI designs a month
  • 3 refines per logo animation
  • Priority builds and support
FAQ

Before you start.

More in the full FAQ.

Can I add the mascot to Webflow, WordPress, Framer or Shopify?

Yes. Webflow's Rive element and Framer's Rive plugin can drive inputs from interactions. WordPress needs a Rive plugin or a Custom HTML block. Shopify has no Rive section, so upload the file and embed it with Custom Liquid, or use the transparent video in a theme video section.

Does the transparent mascot video work in Safari?

Yes, if you list both files. Safari ignores VP9 alpha, so put the HEVC-alpha MOV first with type='video/quicktime; codecs="hvc1.1.6.H120.b0"' and the WebM second. Safari picks the MOV; Chrome, Firefox and Edge take the WebM. The .riv is transparent in every browser.

Will a website mascot hurt my page speed?

Not if it loads after your main content. The flat-art .riv is about 40 KB, but the Rive web runtime adds about 373 KB brotli (canvas-lite), so lazy-load it when the mascot scrolls into view. Give the canvas a fixed width and height so nothing shifts while it loads.

Can the mascot react to a login form or to scrolling?

Yes. Set the mood when a field gets focus, while the form submits and as sections scroll into view (an IntersectionObserver works well), then fire success, error, yes or no with the result. The login form mascot guide walks through the wiring.

Can the mascot's eyes follow the cursor?

No. The set has no gaze or pointer input, so the mascot switches between its 17 animations rather than tracking the pointer. Eye tracking needs a custom Rive rig from an animator. Switching mood on hover still makes the mascot feel responsive.

How do I respect reduced motion with a website mascot?

Check matchMedia('(prefers-reduced-motion: reduce)'); when it matches, keep the mascot on idle or pause the Rive instance, and don't autoplay the video loops. Under WCAG 2.2, looping motion that lasts more than five seconds next to other content also needs a pause control.

Learn more

Guides for this job.

See it with your character first.

Free, in your browser. Your image stays on your device unless you ask for the short animated clip.

Free preview