Skip to main content
Two migrations live here:
  1. 0.2.x → 0.3.0 — current pre-release cutover. Package scope rename
    • symbol consolidation (single Provider, single mount component). Most readers want this.
  2. Legacy → 0.2.x — older architectural migration (server-side visemes → on-device WebAssembly). Kept for integrators on the pre-0.2 SDK.

0.2.x → 0.3.0

The 0.3.0 release unifies SDK naming across the package scope and the React component surface. Hard cutover — no deprecated aliases. The bytes computing visemes are unchanged; only names and the mount shape moved.

Package scope

.npmrc
The same renaming applies to lipsync-native@mascotbot/native and lipsync-react-native@mascotbot/react-native for RN integrators.

React mount — one Provider, one component

If you previously wrapped <MascotRive /> (or a loading slot) inside <MascotClient>, pass those as children of <Mascot> instead — they take over from the default canvas:

Symbol rename — quick reference

Unchanged on purpose (feature-descriptive — lipsync here names what the thing is, not who ships it):
  • useProcessAudio(url)
  • useLipsyncStream({ source })
  • useMascotRive() / useMascotInputs() / useMascotPlayback()
  • LipsyncError / LipsyncStatus / LipsyncLogger
  • LipsyncStreamSource / LipsyncStreamFrame
  • LicenseError / NetworkError / EngineError / RefusedError
  • VisemeTimeline / VisemeCue / MascotPlayback (the class) / NaturalLipSync*

Migration steps (0.2.x → 0.3.0)

1

Update .npmrc + package.json

Change @mascotbot-sdk:registry=… to @mascotbot:registry=…, then rewrite the four dep names. pnpm install --force after — pnpm caches tarballs by hash, the new scope needs a fresh resolve.
2

Run the rename grep

Every hit needs the substitution in the table above. useLipsyncStream, LipsyncError, etc. are intentionally preserved — they survive because the word lipsync precisely describes what they are.
3

Collapse the Provider + Mascot mount

<LipsyncProvider><MascotProvider>… → single <MascotProvider apiKey>. <MascotClient src><MascotRive /></MascotClient><Mascot src /> if you don’t need a custom layout slot. If you do, change the tag name from MascotClient to Mascot and keep the children.
4

Typecheck + smoke

npx tsc --noEmit is the gate. Runtime behavior is identical — if types pass, runtime almost always passes too.

Legacy → 0.2.x

The 0.2.x SDK was a new architecture, not a renamed release. If you integrated a pre-0.2 build, the changes below still apply (cascade 0.2.x → 0.3.0 from the section above on top).

What changed, conceptually

The dedicated provider guides (ElevenLabs, Gemini Live, OpenAI Realtime) and Realtime overview show the new wiring end to end.

Symbol map (legacy → 0.2.x — then add the 0.3.0 column above)

Hooks are not reference-stable

Legacy useMascot() returned a memoised, stable object; useMascotRive() / useMascotInputs() return a fresh wrapper every render.
  • Putting their return (custom, has, the whole handle) in a useEffect / useCallback dependency array re-runs it every render — e.g. a Rive event listener that re-binds ~60×/s. Capture what you need in a useRef and depend only on the stable rive instance (stable once loaded). riveInputs identity is stable, but the wrapper object and has are fresh per render — so this rule applies to them.
The one consumer responsibility that is real is full per-call teardown on a shared clientstop() + close() + null the stream state on every call-end path; see the Troubleshooting guide. A lingering pipeline on the shared client corrupts other widgets that use the same <MascotProvider>.

Next

Quickstart

The current happy path.

Realtime overview

Provider wiring.

Troubleshooting

Post-migration issues.