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
| Mode | Best for | Behavior |
|---|---|---|
auto | Quick installs, prototypes, internal tools | Shows the stamp button in the configured corner on desktop. On phones (768px wide or less) it draws the edge tab instead. |
edge-tab | Apps with bottom nav, chat bubbles, or dense CTAs | A 22×48px tab flush with the screen edge, with a 44px-wide tap area. Visitors can drag it up and down the edge. |
attach | Production apps with a help menu or existing feedback link | Hides the default trigger and binds Mushi Mushi to attachToSelector. |
manual / hidden | White-label apps, mobile flows, or regulated screens | Renders 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:
| Behaviour | Default | Option |
|---|---|---|
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. | on | mobileTrigger: '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. | on | avoidFixedBars: false |
| Fades while the page scrolls (the edge tab also slides most of the way off its edge) and comes back when scrolling stops | on | tuckOnScroll: false |
| The edge tab can be dragged along its edge. The spot is saved for your site. | on | draggable: 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. | on | dismissible: false |
| Safe-area insets (notch, home indicator) | on | respectSafeArea: 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/bothshows the native trigger.shakeinstalls the gesture without a visible trigger.none/manualgives 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