Shake → Mushi Mushi
Hours Low riskShake (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.
| Shake | Mushi 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
- Step 01Create a Mushi Mushi project, mint an API key
- Step 02Install the right Mushi Mushi SDK
- Step 03Mount Mushi Mushi alongside Shake (do NOT remove Shake yet)
- Step 04Replicate Shake.registerUser / setMetadata calls in Mushi Mushi
- Step 05Verify Mushi Mushi captures the same context Shake did
- Step 06Run dual-SDK in beta for ≥ 2 days
- Step 07Uninstall the Shake SDK
- Step 08Revoke your Shake API key
Feature parity
| Capability | Shake | Mushi 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 agents | not checked | ✅ |
References
Last updated on