“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.

Get startedFrom $29/mo · 60-day money-back guarantee
A report in the Brainbox dashboard: “I tap Pay and nothing happens. Tried twice, the button doesn't even show a spinner.” Filed from shop.acme.example/checkout, status New.The console error captured with it: TypeError: Cannot read properties of undefined (reading 'confirmCardPayment').

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.

A red box drawn around a checkout page's Pay button, with the Brainbox mark-up toolbar below it.
  1. 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. 2

    Point at what broke

    A box, an arrow, a pen line or a note, drawn on a frozen copy of the page.

  3. 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.

The GitHub issue it files

I tap Pay and nothing happens. Tried twice, the button doesn't even sho…

Highlighted region: the Pay $128.00 button, boxed in red.

I tap Pay and nothing happens. Tried twice, the button doesn't even show a spinner.

PageCheckout · Acme Store
Viewport1440 × 900 @2x
BrowserMozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.1 Safari/605.1.15
Localeen-GB, Asia/Calcutta
Useranonymous
Elementbutton#pay
Reported2026-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.

The Features page in the Brainbox dashboard on a phone: three features with their request counts, “Save my card for next time” first with 2 requests.

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-brainbox opens it, or call Brainbox.open(). React apps can use the component instead.
Private by default
Typed values are always masked in recordings. Add rr-block or rr-mask to 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.

Up to 5 months free on annual

Pro

For founders and small product teams.

$29/ month

$348 billed yearly · save 41%, 4 months free

Get Pro

1,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 popular

For teams shipping to a lot of users.

$79/ month

$948 billed yearly · save 47%, 5 months free

Get Business

5,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.