@mushi-mushi/capacitor
v1.1.0
Published
Capacitor plugin for Mushi Mushi — shake-to-report, screenshot capture, offline queue, and bottom-sheet widget for iOS/Android Capacitor apps.
Maintainers
Readme
@mushi-mushi/capacitor
Your AI wrote it. Mushi tells you why it broke. Plain-English diagnosis + a paste-ready fix, right inside Cursor. MIT-licensed SDKs · self-hostable · no second LLM key.
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.8.x surface stable; API may evolve before a coordinated 1.0 across all packages.
The Capacitor plugin uses a public ingest key (mush_pk_…) — not the mushi_… web key. See Project ID & API keys.
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.
Monorepo scale (June 2026): 47 edge functions · 256 SQL migrations · 13 outbound plugins · 11 inbound adapters · 18 pipeline agents. Canonical counts: docs/stats.md · pnpm docs-stats
