Drop-in
One import, one apiKey, one prop. Zero backend wiring.
An embeddable feedback widget for your product. Install once, configure visually from the dashboard, override anything from code. Works with React, vanilla JS, and a single <script> tag.
One import, one apiKey, one prop. Zero backend wiring.
CSS variable override per token. Custom CSS escape hatch.
Per-key origin allowlist. Rotate or revoke any key instantly.
Get a working widget in under a minute.
Install
npm install @bugboard/reactUse
style="color:#c084fc">import { BugBoardFeedback } style="color:#c084fc">from "@bugboard/react";
style="color:#c084fc">export style="color:#c084fc">default style="color:#c084fc">function RootLayout({ children }) {
style="color:#c084fc">return (
<html lang="en">
<body>
{children}
<style="color:#f472b6">BugBoardFeedback
apiKey="pk_live_…"
mode="bubble"
position="bottom-right"
/>
</body>
</html>
);
}Everything you can control without touching code, from Dashboard → Developers.
Generate publishable keys with origin allowlists. Rotate or revoke any key — sessions tied to a revoked key stop instantly.
Pick the default display mode and corner. Devs can override per-install, but the default is your fallback.
Override your board theme color for the widget specifically. Set the trigger button label.
Turn off submit, vote, comment, roadmap, or changelog at the workspace level. Off here = off everywhere, even if the SDK requests it.
Settings
Generate keys and control how the widget renders.
Default mode
Bubble
Position
Bottom right
Primary color
Four ways to surface the widget. Pick the one that matches how your product is built.
target prop. The React wrapper does this automatically — drop the component where you want it mounted.Bubble placement. Modal/inline/trigger ignore this — they render where you mount them.
Three knobs cover 90% of brand needs without writing CSS.
primaryColorstringBrand color shortcut. Sets primary + auto-generates tints + contrast.
<style="color:#f472b6">BugBoardFeedback primaryColor="#0ea5e9" />radius'sm' | 'md' | 'lg'Modal/card corner radius. sm=12px · md=20px · lg=24px.
<style="color:#f472b6">BugBoardFeedback radius="lg" />appearance'light' | 'dark' | 'auto'Color scheme. `auto` follows the user's OS preference.
<style="color:#f472b6">BugBoardFeedback appearance="auto" />Granular override per token. Pass any subset via the cssVars prop — unspecified keys keep their defaults.
primaryBrand color used for buttons, focus rings, vote highlight.#452fdf (or your board theme color)primaryContrastText/icon color on top of the primary color.Auto (white or near-black via WCAG luminance check)surfaceModal / card / inline embed background.#ffffffsurfaceMutedSoft tint used for tabs, footer banner, hover states.#f2eeffborderStandard borders for items, inputs, releases.#e2e8f0textPrimary text color (titles, body).#0a0a0atextMutedSecondary text (metadata, descriptions).#5b5871radiusModal corner radius. Overrides `radius` prop.24px (with radius='lg')shadowBase shadow token used for small surfaces.0 4px 12px -6px rgba(25,24,56,0.12)fontFont stack used inside the widget.'Google Sans', ui-sans-serif, system-ui, sans-serif<style="color:#f472b6">BugBoardFeedback
apiKey="pk_live_…"
cssVars={{
primary: "#0ea5e9",
surface: "#ffffff",
surfaceMuted: "#f0f9ff",
border: "#e0f2fe",
text: "#0c4a6e",
textMuted: "#0369a1",
radius: "20px",
shadow: "0 10px 30px -10px rgba(14, 165, 233, 0.25)",
font: "'Inter', system-ui, sans-serif",
}}
/>Final escape hatch. Raw CSS appended after the base stylesheet. Wins over defaults except !important rules.
customCss string is rendered into the DOM via a <style> element. Treat it as code, not data. The SDK strips obvious break-out patterns (</style>, expression(), javascript:) but cannot prevent every CSS-based exfiltration vector. Never pass user-supplied CSS.<style="color:#f472b6">BugBoardFeedback
apiKey="pk_live_…"
customCss={style="color:#86efac">`
.bugboard-modal {
border-radius: 32px;
box-shadow: 0 40px 80px -20px rgba(0, 0, 0, 0.35);
}
.bugboard-trigger {
font-weight: 700;
letter-spacing: 0.02em;
text-transform: uppercase;
}
.bugboard-bubble {
animation: bounce 2s ease-in-out infinite;
}
@keyframes bounce {
0%, 100% { transform: translateY(0); }
50% { transform: translateY(-4px); }
}
`}
/>Class reference — most-overridden selectors: .bugboard-bubble, .bugboard-modal, .bugboard-header, .bugboard-body, .bugboard-tabs, .bugboard-tab, .bugboard-item, .bugboard-vote, .bugboard-button, .bugboard-input, .bugboard-textarea, .bugboard-footer-banner.
Capabilities the widget can expose. Toggle each on/off from the admin — the SDK can request a subset via the views prop but never override an admin-disabled feature.
Show existing requests with statuses + vote counts.
Open a form to capture new ideas from your users.
Let users prioritize the requests they care about.
Thread discussions on each individual feedback item.
Planned / in-progress / completed columns.
Release notes surfaced inside the widget.
<style="color:#f472b6">BugBoardFeedback
apiKey="pk_live_…"
views={["list", "vote", "submit"]}
/>Open or close the widget from anywhere in your app. Works with all modes.
style="color:#c084fc">import { useBugBoard } style="color:#c084fc">from "@bugboard/react";
style="color:#c084fc">export style="color:#c084fc">function HelpButton() {
style="color:#c084fc">const { open, close } = useBugBoard();
style="color:#c084fc">return (
<button onClick={open}>Open feedback</button>
);
}Or use the global functions from the vanilla SDK:
style="color:#c084fc">import { open, close, reset, destroy } style="color:#c084fc">from "@bugboard/sdk";
open(); style="color:#6b6890">// open the widget
close(); style="color:#6b6890">// close it
reset(); style="color:#6b6890">// clear the session
destroy(); style="color:#6b6890">// unmount + cleanupEvery prop accepted by BugBoardFeedback (React) and BugBoard.init (vanilla).
apiKeystring—Required. Publishable key generated from the dashboard.apiUrlstringhttps://api.bugboard.ioOverride the API endpoint. Only useful for self-hosting.mode'bubble' | 'modal' | 'inline' | 'trigger''bubble'Display mode. See Display modes section.position'bottom-right' | 'bottom-left' | 'top-right' | 'top-left''bottom-right'Where the floating bubble anchors. Ignored by other modes.triggerLabelstring'Feedback'Label inside the trigger / custom pill button.primaryColorstring (hex)Board theme colorQuick brand color override. Same as cssVars.primary.cssVarsPartial<BugBoardCssVars>—Granular token override (surface, border, text, radius, shadow, font, etc).customCssstring—Raw CSS injected after base styles. Sanitized for <style>/<script> break-outs.radius'sm' | 'md' | 'lg''md'Corner-radius scale. sm=12px · md=20px · lg=24px.appearance'light' | 'dark' | 'auto''auto'Color scheme. `auto` follows OS preference.zIndexnumber2147483600Stacking context for the bubble + overlay.viewsSdkFeature[]All enabled on adminSubset of features to expose. Disabled features in admin are never shown.targetstring | HTMLElement—Mount target for inline / trigger modes.onReady() => void—Fires once the widget mounts successfully.onError(err: Error) => void—Fires on init / network failures.Create your board, generate a publishable key, and you'll be collecting feedback in your product in under five minutes.
Get started