Shake → Mushi
Hours Low riskShake (shakebugs.com) is a closed-source bug reporting SDK with strong shake-to-report ergonomics. This guide swaps it for Mushi while preserving the same trigger UX.
Shake’s shake-to-report defaults are the closest of any competitor to Mushi’s, so the user-facing UX after migration looks nearly identical. Most apps cut over in a single afternoon.
Why switch
- Open source. Mushi’s SDK + admin console are MIT-licensed; Shake is closed.
- Self-host. Mushi runs on your own Supabase / Postgres; Shake is SaaS-only.
- AI triage. Mushi’s two-stage classifier and judge loop ship in the box.
- Pricing predictability. Mushi is free at the SDK + community-cloud tier; commercial cloud has flat per-project pricing.
API mapping
| Shake | Mushi |
|---|---|
Shake.start(apiKey) (web) | Mushi.init({ projectId, apiKey }) |
Shake.show() | Mushi.openWidget() |
Shake.setUser(id, email, name) | Mushi.setUser({ id, email, name }) |
Shake.addEventKey(key, value) | Mushi.setMetadata({ [key]: value }) |
allowToReportBugByShakingMobile(true) | widget: { trigger: 'shake' } |
allowToReportBugByScreenCapture(true) | widget: { trigger: 'button' } (or 'both') |
setEnableBlackBox(true) | Console + network capture is default-on |
setMetadata(meta) | Mushi.setMetadata(meta) |
addPrivateView(view) | capture: { redactSelectors: [...] } (web) |
Before / After
React Native
// BEFORE — Shake
import Shake from '@shakebugs/react-native-shake'
Shake.start('YOUR_API_KEY')
Shake.setEnableBlackBox(true)
Shake.setUserMetadata({ tier: 'pro' })// AFTER — 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 { useMushi } from '@mushi-mushi/react-native'
const mushi = useMushi()
mushi.setMetadata({ tier: 'pro' })Web
// BEFORE — Shake JS
import Shake from '@softnoesis/shakebug-js'
Shake.start('YOUR_API_KEY')
Shake.setUser('user-42', 'jane@example.com', 'Jane Doe')// AFTER — Mushi web
import { Mushi } from '@mushi-mushi/web'
Mushi.init({
projectId: 'YOUR_PROJECT_ID',
apiKey: 'YOUR_PUBLIC_KEY',
widget: { trigger: 'both' },
})
Mushi.setUser({ id: 'user-42', email: 'jane@example.com', name: 'Jane Doe' })Migration checklist
Migration checklist
8 required steps
- Step 01Create a Mushi project, mint an API key
- Step 02Install the right Mushi SDK
- Step 03Mount Mushi alongside Shake (do NOT remove Shake yet)
- Step 04Replicate Shake.setUser / addEventKey calls in Mushi
- Step 05Verify 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 |
|---|---|---|
| Shake-to-report | ✅ | ✅ |
| Floating button | ✅ | ✅ |
| Screenshot on report | ✅ | ✅ (web) |
| Black-box (console + network) | ✅ (setEnableBlackBox) | ✅ (default on) |
| Activity history / repro steps | ✅ | ✅ (auto from captured streams) |
| Crash reporting | ✅ | ❌ (keep Sentry/Crashlytics) |
| Self-host | ❌ | ✅ |
| Open source | ❌ | ✅ |
| AI triage | ❌ | ✅ |
| MCP server for IDE agents | ❌ | ✅ |
References
Last updated on