Rive state machine · built for the Forseo brief

Forseo, alive.

Your robot rebuilt in moveable layers and running in the real Rive runtime. Every button below drives the same inputs your app will use.

SPEC Spec piece by Luka Skhiladze.
Not licensed for use.
state = 0 · idle
Loading the Rive runtime…

State state

Triggers

Talking talk lipsync

With lip-sync on, the mouth follows talk (0–100), so you can feed it your speech volume. With it off, Forseo uses his built-in talking loop.

Eye follow follow lookX lookY

lookX 0 · lookY 0
Inside your app

On your home screen, then in the corner.

Your own home screen with the static image swapped for the live rig, and the speech bubble set to "Forseo". The small bubble version is what Forseo turns into on other pages.

9:41
I'm ForseoYour AI assistant for leads, quotes, scheduling and more.

Floating bubble

The bubble starts hidden. Fire popIn when it appears and popOut when it's dismissed.

Actual size

The bubble artboard at 64, 72 and 80 px, drawn 1:1 on your app background.

64 px
72 px
80 px
Handoff

The inputs your developer gets.

Two artboards in one file. Every state is switchable from code with simple inputs, and transitions blend smoothly from any state to any other.

242 KB.riv file, 71 KB gzipped
2artboards: Forseo + ForseoBubble
36timelines across 7 state machine layers
Vectorno images; transparent background
Artboard Forseo · state machine Forseo
InputTypeWhat it does
stateNumber0 idle · 1 listening · 2 thinking · 3 talking · 4 working · 5 sleeping (yawns going in, stretches coming out)
happyTriggerJump with sparkles, then back to the current state
confusedTriggerHead tilt and a question mark, then back
waveTriggerHello wave. Fire it on mount as the intro
wakeTriggerWakes Forseo from sleep, even if state is still 5
talkNumber 0–100Mouth openness while talking, when lipsync is on
lipsyncBooleanOn: mouth follows talk. Off: built-in talking loop
followBooleanEyes and head follow lookX / lookY
lookX lookYNumber −100–100Where to look, relative to Forseo's face
Artboard ForseoBubble · state machine Bubble
InputTypeWhat it does
stateNumber0 idle · 1 listening · 2 thinking · 3 talking · 5 sleeping (4 shows as thinking)
popIn popOutTriggerAppear and dismiss. The bubble starts hidden
talk lipsyncNumber / BooleanSame as the main artboard
@rive-app/canvas
import { Rive } from '@rive-app/canvas';

const forseo = new Rive({
  src: 'forseo.riv',
  canvas: document.querySelector('#forseo'),
  artboard: 'Forseo',
  stateMachines: 'Forseo',
  autoplay: true,
  onLoad: () => forseo.resizeDrawingSurfaceToCanvas(),
});
const input = (name) =>
  forseo.stateMachineInputs('Forseo').find((i) => i.name === name);

input('state').value = 2;      // thinking
input('happy').fire();          // one-shot reaction
input('lipsync').value = true;
input('talk').value = volume * 100; // each frame while speaking
input('follow').value = true;
input('lookX').value = 40;    // -100 left … 100 right