“It’s broken” isn’t a bug report.
This is.
Brainbox is a tiny widget in your app. Users point at what broke and say what happened. You get a ticket you can start on, in GitHub or Azure DevOps.



Your users point at it and say what happened.
No account, no browser extension. The widget runs inside your app, in its own Shadow DOM, so your styles and ours never meet.


- 1
Open the widget
From the button in the corner, or from your own. They can screenshot the page, record it, or suggest a feature.
- 2
Point at what broke
A box, an arrow, a pen line or a note, drawn on a frozen copy of the page.
- 3
Say what happened
Talk it through, or type it if they would rather. Then send.
Everything you'd have asked them for.
Each report arrives with the context that usually takes three emails to get, so you can start on the fix instead of the follow-up.
- Screenshot and marks
- The page as they saw it, with their marks on it and the area they pointed at cropped out and enlarged.
- Their words
- A voice note or a typed description. Nobody has to learn how to write a bug report.
- Console errors
- Errors and unhandled promise rejections from the page, with where each one was thrown.
- Screen recording
- When a screenshot isn't enough, they record what they're doing, with narration if they like. Typed values are masked.
- Environment
- URL, page title, browser, viewport, language, timezone and the element they pointed at.
- Who sent it
- Call Brainbox.identify() with your user's id or email, and it's on every report they send.
Filed where you already work.
Connect once for the whole team. Every new report is filed on its own, with the screenshot, their words and the console errors in the body.
- GitHub Issues
- Installed as the Brainbox GitHub App on your org or account. Pick the repo and the labels, and pause it whenever you like.
- Azure DevOps
- Pick the project, the board and the iteration, and a work item type for bugs and another for feature requests.
Every report also lands in the Brainbox inbox, where your team sets status and priority. A delivery that fails shows why, and you can send it again.
I tap Pay and nothing happens. Tried twice, the button doesn't even sho…
I tap Pay and nothing happens. Tried twice, the button doesn't even show a spinner.
| Page | Checkout · Acme Store |
|---|---|
| Viewport | 1440 × 900 @2x |
| Browser | Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.1 Safari/605.1.15 |
| Locale | en-GB, Asia/Calcutta |
| User | anonymous |
| Element | button#pay |
| Reported | 2026-10-30T19:54:56.392884+00:00 |
1 console error
TypeError: Cannot read properties of undefined (reading 'confirmCardPayment')
at HTMLButtonElement.<anonymous> (http://shop.acme.example/checkout:50:84)Open in Brainbox · Full screenshot
Feature requests, counted.
Users suggest features from the same widget and say how much it matters to them. You sort each request into a feature, and the most asked for rise to the top.


One script tag.
Paste it before </body> and the widget is live. Your project key is in the dashboard.
<script
src="https://app.brainbox.sh/widget.js"
data-project="pk_your_project_key"
data-endpoint="https://app.brainbox.sh/ingest"
></script>Step by step for Next.js, React, React Router and Remix, Vue, Nuxt, SvelteKit, Astro, Angular, Ruby on Rails, Laravel, Django, WordPress, Plain HTML.
- Your own button, if you want one
- Any element with
data-brainboxopens it, or callBrainbox.open(). React apps can use the component instead. - Private by default
- Typed values are always masked in recordings. Add
rr-blockorrr-maskto anything else you want kept out. - Light until it's used
- The code that takes screenshots and recordings loads only when someone starts a report.
- Yours to host
- The source is on GitHub. Run the backend on your own Postgres or Convex, with S3 or R2 for files.
Priced by reports, not seats.
Every plan has unlimited projects, teammates and pageviews, with recordings and console errors included.
Pro
For founders and small product teams.
$348 billed yearly · save 41%, 4 months free
Get Pro1,000 tickets a month
- Unlimited projects, seats & pageviews
- Voice notes, screen recording & session replay
- Screenshot with the broken area highlighted
- GitHub Issues & Azure DevOps
- 12 months of history
Business
Most popularFor teams shipping to a lot of users.
$948 billed yearly · save 47%, 5 months free
Get Business5,000 tickets a month
- Everything in Pro
- Unlimited history
- Priority support queue
- Onboarding call with the founder
60-day money-back guarantee, and you can cancel any time. Go over your allowance and it’s $0.05 per extra ticket; we never drop your users’ feedback to enforce a limit.
Questions
Do my users need an account or a browser extension?
No. The widget runs inside your app. They click it, mark the page, say what happened and send.
Will it slow my app down?
The page loads one script for the launcher. The code that takes screenshots and recordings is fetched only when someone starts a report.
What about passwords and personal data?
Typed values are always masked in recordings, so passwords, emails and card numbers never leave the browser as plain text. Add rr-block or rr-mask to any element you want kept out, and you can apply the same rules to screenshots.
Who needs a seat?
Nobody pays per seat. Invite your whole team as owners, admins or members, on any plan.
What counts as a ticket?
Each bug report or feature request a user sends. If you go over your plan's allowance it's $0.05 per extra ticket, and nothing a user sends is ever dropped.
Where do reports go?
Always to your Brainbox inbox. Connect GitHub or Azure DevOps and each one is also filed there as an issue or work item, automatically.
Does it work in mobile apps?
Brainbox is for web apps. There is no iOS or Android SDK.
Can I host it myself?
Yes. The source is on GitHub under the O'Saasy license: run it for your own products on your own Postgres or Convex, with S3 or R2 for files. The one thing it rules out is selling Brainbox itself as a hosted service.
What if it isn't right for us?
Ask for a refund within 60 days and you get your money back. You can cancel any time.