Migration guides
Long-form playbooks for moving an existing app onto Mushi Mushi — or between Mushi-supported runtimes — without losing your project, your API key, or your reports inbox. Every guide ships with an interactive checklist that saves your progress in this browser.
Capacitor → React Native
Full porting plan with both EAS Build and GitHub Actions + Fastlane CI/CD recipes, the plugin map, and the Mushi SDK swap.
Mobile / hybridWeeksHigh riskRead →Cordova → Capacitor
Replace Cordova with Capacitor in place. Plugin map, build pipeline swap, splash/icon regeneration, and Mushi widget reconfiguration.
Mobile / hybridDaysMed riskRead →Cordova → React Native
Two-hop migration: stabilise on Capacitor first, then port screen-by-screen to React Native. Preserves the Mushi project the whole way.
Mobile / hybridWeeksHigh riskRead →React Native CLI ↔ Expo
Both directions. Add Expo modules to a bare CLI app via install-expo-modules, or eject Expo with `expo prebuild`. Mushi works on both.
Mobile / hybridDaysLow riskRead →Native iOS / Android → Hybrid
When and how to wrap an existing native app shell with Capacitor or React Native, keeping the platform Mushi SDKs in place.
Mobile / hybridWeeksHigh riskRead →Create React App → Vite
CRA is unmaintained. Run `npx migrate-to-vite@latest cra` for the codemod, then handle the manual breaking changes (env vars, public/, types).
Web frameworkHoursLow riskRead →Next.js Pages → App Router
Page-by-page move to App Router with the right Mushi `<MushiProvider>` placement and the CSP-aware integration for static export.
Web frameworkDaysMed riskRead →Vue 2 → Vue 3
Composition API migration with `@mushi-mushi/vue` peer-dep alignment and the `app.use(MushiPlugin, ...)` shape.
Web frameworkDaysMed riskRead →SPA → SSR (Next.js / Nuxt / SvelteKit)
Move from a Vite SPA to a server-rendered framework. Mushi env-var prefix mapping (VITE_ → NEXT_PUBLIC_), provider placement, and hydration safety.
Web frameworkWeeksMed riskRead →Instabug (Luciq) → Mushi
API mapping for the rebrand-aware migration: `Luciq.init` → `Mushi.init`, `identifyUser` → `setUser`, shake invocation parity.
Switch to MushiHoursLow riskRead →Shake → Mushi
`Shake.start(apiKey)` → `Mushi.init`, `addEventKey` → `setMetadata`, with a Mushi widget config that matches Shake's shake-to-report defaults.
Switch to MushiHoursLow riskRead →LogRocket Feedback → Mushi
Move bug-feedback off LogRocket without losing session replay — keep LogRocket for replay, swap the feedback widget for Mushi, link the two via Mushi metadata.
Switch to MushiHoursLow riskRead →BugHerd → Mushi
Sidebar feedback widget → Mushi shake/button widget. Pixel-pin annotations replaced with Mushi's element selector + screenshot.
Switch to MushiHoursLow riskRead →Pendo Feedback → Mushi
`pendo.identify` → `Mushi.setUser`, route-tracking → `Mushi.setScreen`, in-app guides → external feature flag (Pendo stays where it shines).
Switch to MushiHoursLow riskRead →@mushi-mushi/* 0.x → 1.0
draftForward-looking upgrade rail. Tracks each package's breaking changes as we approach 1.0 so customers can plan ahead.
Mushi SDK upgradeHoursLow riskRead →
Don’t see your migration?
We pick guides based on demand. If your stack isn’t covered yet, open a migration request issue with the source framework / vendor and a sentence about why you’re moving — the most-requested ones get scheduled into the next docs wave.
Want a guide picked for you? Run
npx @mushi-mushi/cli migrate in your project root (or mushi migrate
if you have @mushi-mushi/cli installed globally) and we’ll point you at
the most relevant guide based on what’s in your package.json.
The unscoped mushi-mushi launcher is a thin shim around the wizard and
only knows the init flow — migrate lives in @mushi-mushi/cli.