- 0.2.x → 0.3.0 — current pre-release cutover. Package scope rename
- symbol consolidation (single Provider, single mount component). Most readers want this.
- 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
lipsync-native → @mascotbot/native and
lipsync-react-native → @mascotbot/react-native for RN integrators.
React mount — one Provider, one component
<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/LipsyncLoggerLipsyncStreamSource/LipsyncStreamFrameLicenseError/NetworkError/EngineError/RefusedErrorVisemeTimeline/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
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
LegacyuseMascot() returned a memoised, stable object;
useMascotRive() / useMascotInputs() return a fresh wrapper every
render.
- Putting their return (
custom,has, the whole handle) in auseEffect/useCallbackdependency array re-runs it every render — e.g. a Rive event listener that re-binds ~60×/s. Capture what you need in auseRefand depend only on the stableriveinstance (stable once loaded).riveInputsidentity is stable, but the wrapper object andhasare fresh per render — so this rule applies to them.
Next
Quickstart
The current happy path.
Realtime overview
Provider wiring.
Troubleshooting
Post-migration issues.