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

Where the report button lives

Mushi Mushi ships a default bug-report launcher, but you decide where it appears — corner stamp, edge tab, help menu, or your own custom button.

Choosing a Mode

ModeBest forBehavior
autoQuick installs, prototypes, internal toolsShows the stamp button in the configured corner on desktop. On phones (768px wide or less) it draws the edge tab instead.
edge-tabApps with bottom nav, chat bubbles, or dense CTAsA 22×48px tab flush with the screen edge, with a 44px-wide tap area. Visitors can drag it up and down the edge.
attachProduction apps with a help menu or existing feedback linkHides the default trigger and binds Mushi Mushi to attachToSelector.
manual / hiddenWhite-label apps, mobile flows, or regulated screensRenders no launcher; call Mushi.open(), Mushi.openWith(category), or Mushi.captureEvent() yourself.

Bring Your Own Button

import { Mushi } from 'mushi-mushi' const mushi = Mushi.init({ projectId: '00000000-0000-0000-0000-000000000000', apiKey: 'mushi_xxx', widget: { trigger: 'attach', attachToSelector: '[data-mushi-feedback]', }, }) // You can also bind later, which is useful in SPAs. mushi.attachTo('#support-menu-feedback')

Staying out of the way

The floating launcher does these by default, with no configuration:

BehaviourDefaultOption
On phones, trigger: 'auto' draws the edge tab, not the 52px button. If you shaped the button yourself (a left or right anchor or inset, draggable, or a word triggerText), it stays a button.onmobileTrigger: 'auto' or 'edge-tab'
Lifts above fixed or sticky bars that touch the bottom of the screen (tab bars, cookie strips). The panel and toasts lift with it.onavoidFixedBars: false
Fades while the page scrolls (the edge tab also slides most of the way off its edge) and comes back when scrolling stopsontuckOnScroll: false
The edge tab can be dragged along its edge. The spot is saved for your site.ondraggable: false
A “Hide the bug button for this visit” link in the report panel. It lasts until the tab closes, also through Mushi.show() calls; Mushi.open() still opens the panel.ondismissible: false
Safe-area insets (notch, home indicator)onrespectSafeArea: false

The lift above a bar is a floor. When you already set inset.bottom or anchor.bottom high enough, your value wins:

Mushi.init({ projectId: '00000000-0000-0000-0000-000000000000', apiKey: 'mushi_xxx', widget: { trigger: 'edge-tab', // Explicit offset from the bottom edge, in px. inset: { bottom: 96 }, }, })

The edge tab always sits flush with its screen edge (inside the safe area). A horizontal inset or anchor value moves the panel, not the tab.

Smart Hide

Mushi.init({ projectId: '00000000-0000-0000-0000-000000000000', apiKey: 'mushi_xxx', widget: { trigger: 'auto', smartHide: { onMobile: 'edge-tab', onScroll: 'shrink', onIdleMs: 900, }, inset: { bottom: 96, right: 20 }, }, })

Use hideOnSelector for screens with known collisions:

Mushi.init({ projectId: '00000000-0000-0000-0000-000000000000', apiKey: 'mushi_xxx', widget: { hideOnSelector: '[data-fullscreen-player]', hideOnRoutes: ['/checkout/payment', '/immersive'], }, })

Native SDKs

iOS, Android, React Native, Flutter, and Capacitor expose the same idea:

  • button / both shows the native trigger.
  • shake installs the gesture without a visible trigger.
  • none / manual gives you a programmatic-only integration.
  • Native trigger insets are configurable so the launcher can clear tab bars, player controls, and host-app CTAs.

For production installs, prefer a host-owned help menu or contextual action and keep Mushi Mushi as the capture layer behind it.

Last updated on