Package Exports
- @mushi-mushi/capacitor
Readme
@mushi-mushi/capacitor
Capacitor plugin for Mushi Mushi — the open-source, LLM-driven bug intake, classification, and autofix platform.
One-command setup:
npx mushi-mushiauto-detects Capacitor and installs this package.Other frameworks:
@mushi-mushi/react·@mushi-mushi/vue·@mushi-mushi/svelte·@mushi-mushi/angular·@mushi-mushi/react-native·@mushi-mushi/web(vanilla JS)
Status: V0.4.5 Surface stable; minor changes still possible before V1.0.
The npm package vendors the standalone iOS and Android SDK sources for the native side, so Capacitor apps do not need a separate Maven or SwiftPM Mushi dependency at build time.
Install
npm install @mushi-mushi/capacitor
npx cap syncQuickstart
import { Mushi } from '@mushi-mushi/capacitor';
await Mushi.configure({
projectId: 'proj_...',
apiKey: 'mush_pk_...',
triggerMode: 'both',
captureScreenshot: true,
minDescriptionLength: 20,
});
// Programmatic report:
await Mushi.report({
description: 'Profile photo upload spinner never stops on tablets',
category: 'bug',
});
// Listen for successful submissions (e.g. to mirror into Sentry):
const handle = await Mushi.addListener('reportSubmitted', (payload) => {
console.log('Mushi submitted', payload);
});
// Native widget:
await Mushi.showWidget();Breadcrumbs
Append entries to the native ring buffer (50-entry FIFO, flushed with
every report). The bridge round-trips through the iOS / Android
Mushi.addBreadcrumb() so the same shape lands on every platform.
await Mushi.addBreadcrumb({
category: 'ui.tap', // or 'navigation' | 'console' | 'network' | 'lifecycle' | 'custom'
level: 'info', // optional — 'debug' | 'info' | 'warning' | 'error' (default 'info')
message: 'Tapped Save',
data: { screen: 'profile' }, // optional — non-string values are coerced to strings
});
const { breadcrumbs } = await Mushi.getBreadcrumbs();Native enums emit
ui.tapandnetwork(touch devices, native network stacks); the web SDK emitsui.click/xhr/fetch. Admin tooling treats them as the same buckets.
Web fallback
When the app runs in a browser preview (ionic serve), the plugin falls back
to a pure-TS implementation that calls the same @mushi-mushi/core API
client used by the standalone web SDK. Behaviour matches production exactly.
Permissions
No runtime permissions required. iOS uses motionShake; Android uses the
accelerometer (no permission needed). The widget is rendered via the native
bottom sheet from the standalone SDKs.
Configuration
| Field | Default | Notes |
|---|---|---|
projectId |
required | Project UUID |
apiKey |
required | Public ingest key (mush_pk_...) |
endpoint |
https://api.mushimushi.dev |
Override for self-hosting |
triggerMode |
'shake' |
'shake' / 'button' / 'both' / 'none' |
captureScreenshot |
true |
Disable for HIPAA-sensitive flows |
minDescriptionLength |
20 |
Matches the web/native SDK contracts |
useNativeWidget |
false |
When true, uses the bottom-sheet from the native SDK |
triggerInset |
{ right: 24, bottom: 32 } |
Per-edge offset (in points / dp) forwarded to the iOS MushiConfig.TriggerInset and Android MushiConfig.TriggerInset so the native FAB clears tab bars and primary CTAs |
triggerInsetPreset |
none | 'tabBarSafe' (≈72 pt bottom — apps with a bottom tab bar) or 'dockSafe' (≈96 pt bottom — apps with a tall iOS-style dock or mini-player). Only fills in fields you didn't already set on triggerInset, so you can override per-edge while keeping the safe baseline |
License
MIT — see LICENSE at the repo root.