Skip to Content
v1.36.0 · shipped One-screen report · Looks like your app Read the changelog →
Migration guidesShake → Mushi Mushi

Shake → Mushi Mushi

Hours Low risk

Shake (shakebugs.com) is a hosted bug-reporting service built around shake-to-report. This guide swaps it for Mushi Mushi and keeps the same trigger on mobile.

Shake-to-report is available in the Mushi Mushi React Native and Capacitor SDKs. The Mushi Mushi web SDK has no shake trigger: on the web, users open the widget from its launcher (a floating button on desktop, an edge tab on phones), or you open it from your own button.

Why switch

  • Open-source server. Mushi Mushi’s SDKs are MIT and its server and admin console are AGPLv3, so you can run all of it yourself. (Shake’s SDKs are MIT on npm; its backend is a hosted service.)
  • Self-host. Mushi Mushi runs on your own Supabase / Postgres.
  • AI triage. Mushi Mushi’s two-stage classifier and judge loop ship in the box.
  • Pricing. Self-hosting is free. The cloud is free for one app and 100 diagnoses a month; paid plans are priced by number of apps (see pricing).

API mapping

Mushi Mushi calls are on the SDK instance: useMushi() in React Native, or const mushi = Mushi.init({...}) on the web.

ShakeMushi Mushi
Shake.start(apiKey)<MushiProvider projectId apiKey> (RN) / Mushi.init({ projectId, apiKey }) (web)
Shake.show()mushi.open()
Shake.registerUser(id) + Shake.updateUserMetadata({ email, name })mushi.setUser({ id, email, name })
Shake.setMetadata(key, value)mushi.setMetadata(key, value)
Shake.setInvokeShakeOnShakeDeviceEvent(true)RN: config.widget.trigger: 'shake' (needs expo-sensors)
Shake.setShowFloatingReportButton(true)RN: config.widget.trigger: 'button' (or 'both' with shake); web: the default launcher (a floating button on desktop, an edge tab on phones)
Shake.addPrivateView(viewRef)Web: add data-mushi-redact to the element, or list selectors in privacy.redactSelectors. RN: the reporter sees the screenshot and can remove it before sending.

Before / After

React Native

// BEFORE: Shake import Shake from '@shakebugs/react-native-shake' Shake.start('YOUR_API_KEY') Shake.setInvokeShakeOnShakeDeviceEvent(true) Shake.setMetadata('tier', 'pro')
// AFTER: Mushi Mushi import { MushiProvider } from '@mushi-mushi/react-native' export default function App() { return ( <MushiProvider projectId="YOUR_PROJECT_ID" apiKey="YOUR_PUBLIC_KEY" config={{ widget: { trigger: 'shake' }, capture: { console: true, network: true }, }} > <RootNavigator /> </MushiProvider> ) } // Inside any screen: import { useEffect } from 'react' import { useMushi } from '@mushi-mushi/react-native' function AccountScreen() { const mushi = useMushi() useEffect(() => { mushi.setMetadata('tier', 'pro') }, [mushi]) // ... }

Web

// BEFORE: Shake web SDK import Shake from '@shakebugs/browser' Shake.start('YOUR_API_KEY') Shake.registerUser('user-42')
// AFTER: Mushi Mushi web import { Mushi } from 'mushi-mushi' const mushi = Mushi.init({ projectId: 'YOUR_PROJECT_ID', apiKey: 'YOUR_PUBLIC_KEY', }) mushi.setUser({ id: 'user-42', email: 'jane@example.com', name: 'Jane Doe' })

Migration checklist

Migration checklist
8 required steps
  1. Step 01
    Create a Mushi Mushi project, mint an API key
  2. Step 02
    Install the right Mushi Mushi SDK
  3. Step 03
    Mount Mushi Mushi alongside Shake (do NOT remove Shake yet)
  4. Step 04
    Replicate Shake.registerUser / setMetadata calls in Mushi Mushi
  5. Step 05
    Verify Mushi Mushi captures the same context Shake did
  6. Step 06
    Run dual-SDK in beta for ≥ 2 days
  7. Step 07
    Uninstall the Shake SDK
  8. Step 08
    Revoke your Shake API key

Feature parity

CapabilityShakeMushi Mushi
Shake-to-report✅✅ on React Native and Capacitor (not web)
Floating button✅✅
Screenshot on report✅✅ (with markup on web)
Console + network capture✅✅ (default on)
Activity history / repro steps✅✅ (auto from captured streams)
Crash reporting✅❌ (keep Sentry / Crashlytics)
Self-host❌ (none found)✅
Open-source server❌ (SDKs are MIT)✅
MCP server for IDE agentsnot checked✅

References

Last updated on