Feedback that fixes itself

Close the loop between "it's broken" and "it's fixed."

One tap on your site, one shake of a phone, or a crash on your server — each files a report with the console, the network and the screen attached. It lands as an Issue that is already written up, in one queue. Then Ship it and a hosted agent opens the PR.

Masked by default · web · Expo · Node · ~2 min to live

Install

Three SDKs. One queue.

The browser SDK is a script tag or an npm package, the Expo SDK is one provider around your app, and the Node SDK is a single init call at the top of your server. They carry the same trace, the same masking, and file into the same board.

~2 min to live
<script src="https://unpkg.com/@fixback/sdk"></script><script>  Fixback.init({ key: "pk_live_9f2c4a…" });</script>

One tag. No build step, no framework, nothing to wire up.

How it works

Capture → Analyze → Queue → Act

The same four steps whether the report came from a browser tab, a phone in someone's hand, or a server that threw at three in the morning.

  1. 01

    Capture

    The overlay plus an always-on ring buffer. One tap files a report with the element, the screenshot, and the seconds before it. Uncaught errors file themselves.

  2. 02

    Analyze

    Deduped against what is already open, then titled and written up as a Brief — summary, repro, expected vs actual. Upload sourcemaps and the stack points at your real file and line.

  3. 03

    Queue

    One board with occurrence counts and the whole Evidence bundle: replay, console, network, annotation. Email lands when an Issue is filed. You decide what matters.

  4. 04

    Act

    Ship it and a hosted agent opens the PR in an isolated sandbox — or hand the Brief to your own agent. Fixback watches the branch, the PR and the merge, closes the Issue and tells the reporter.

The Issue it produced

That tap, in your dashboard.

No one wrote this up — not the title, not the Kind, not the Brief. The report arrived, analysis suggested what it duplicates, and the write-up was waiting before you looked.

Issues · Acme
Revenue KPI mismatches the export
ACM-1051 · ×1 · new · web
Public
Booking screen freezes after picking a date
ACM-1049 · ×4 · iOS · Expo
Invited
PrismaClientKnownRequestError on POST /api/invoices
ACM-1047 · ×318 · production · Node
Internal
Export to CSV, not just PDF
ACM-1044 · ×7 · web
Internal
Bug Revenue KPI mismatches the export
ACM-1051 · Public reporter · masked · trace 0:31
BriefReplayConsoleNetworkAnnotation

The Revenue card rounds to the nearest ten before rendering; the export does not, so the two disagree by up to $150 on any day with cents.

Repro Open Overview, note the Revenue card, export the same range, compare.
Expected vs actual Card and export agree. Card reads $48,120, export reads $47,980.
GET /api/v2/revenue?range=30d · 200 · 412 ms — payload carries 47980.44
  • Console Every level, each argument kept as a typed value. Warnings and errors pinned so a burst of chatter can't bury them.
  • Network Every fetch, XHR and beacon — method, scrubbed URL, status, timing — with failures classified. Metadata only, never a body.
  • Annotation The element they pointed at, their drawing, and a screenshot that was masked before it left the page.
  • Replay The 30–60 seconds before they reported, played back from the DOM — scrubbing the rail moves the console and network streams with it.

The return path

And then it closes itself.

Connect the repo and Fixback watches what happens next. A hosted agent — or your own — does the work; the Issue follows the branch, the pull request and the merge on its own, and so does the person who reported it.

  1. Handoff Brief + Evidence
  2. Branch fixback/FIX-140
  3. PR opened
  4. Merged Issue closed
  5. Live your CD deployed

Hand it off, don't retype it

Open the Issue in your own coding agent with one click, or copy the prompt. It carries the Brief, the Evidence and the code-area pointer, with the reporter's words fenced as data.

Linked by convention

A Fixback: fixes FIX-140 trailer, or a fixback/FIX-140 branch. Squash-merge, merge commit, or a push straight to main — all three still find their way back to the Issue.

Closed by the merge

Merging resolves the Issue and appends the trail: branch pushed, PR opened, merged, deployed. A successful deploy from your own CD marks it live. Fixback never deploys for you.

The reporter hears back

“Your report is fixed” lands in their inbox the moment the merge closes it — naming the Issue and the page they filed it from, and nothing they didn't submit themselves.

The return-path GitHub App only reads — it listens for branches, pull requests, merges and deploys, and writes nothing back to your repository. When you Ship, the hosted agent opens the PR through a separate token scoped to your one repo, minted only at push. How the connection works →

Everywhere your product runs

Your site, your app and your server, in one queue.

Most feedback tools stop at the browser. A bug reported by shaking a phone in the airport, and the 500 the server threw a second earlier, arrive in the same board with the same Evidence as one reported from a laptop.

@fixback/sdk

Any web app

A script tag or an npm package. Self-isolating — two shadow roots, no CSS either way.

  • Point at the element — the node, its DOM path, computed context
  • Draw on a masked screenshot: arrow, box, pen, text
  • Console, network and click trace from before they reported
  • Uncaught errors file themselves, with no prompt
Read the @fixback/sdk docs →
@fixback/expo

Expo & React Native

One provider around your app. Works in Expo Go — no custom dev client to build.

  • Shake the device to open the composer — or call present()
  • A screenshot the reporter reviews and can remove before it sends
  • Console and network trace, plus the screen they were on
  • Uncaught JS errors file themselves, screenshot-free
Read the @fixback/expo docs →
@fixback/node

Your Node server

One init at the top of your entry file. Express and NestJS adapters included.

  • Uncaught exceptions and rejections, without changing how your process exits
  • captureException and captureMessage where you already catch
  • The route pattern, method and status of the request that failed
  • A crash loop folds into one Issue with a rising count, not ten thousand
Read the @fixback/node docs →
  • One Project, one queue
  • The same trust tiers and Gate
  • Scrubbed before transport
  • Symbolicated against the same uploaded sourcemaps

The trust model

Autonomy follows identity, not a global switch.

How far a fix runs on its own depends on who reported it. Fixback derives the tier on the server, on every submission — a reporter can never claim one. That is what makes it safe to leave the overlay open to the public.

  • Internal You and your team — an Invite bound to a Member account. Straight through. The agent implements and merges; your CD takes it live.
  • Invited Testers and clients holding an Invite link. The agent drafts the fix, a human reviews before the PR opens.
  • Public Anyone on the page, on an Open project. Tracked as an Issue. Nothing runs until a Member Promotes it.

Every default is overridable per Issue — fast-track a typo from a stranger, hold a logic change from a teammate. Inputs are masked before the screenshot is taken, and URLs, console text and network metadata are scrubbed before any of it leaves the page.

Replaces
Sentry+ Hotjar+ Linear
One evidence-rich queue
Frontend errors, backend errors, replay and issues — no glue to maintain.

Usage-based

Free to install. Pay per fix.

Start free →
  • Install & collect $0

    All three SDKs, capture, traces, replay, projects, invites, and the whole queue.

  • Analyzed Issue metered

    Pay when a report is deduped, enriched and becomes a triaged Issue.

  • Agent fix soon

    Ship opens the PR today; metered pricing per Run that ships is coming.

Nothing to meter until Fixback has already done work you can see. Adding the SDK to another project costs nothing, which is the point.

Put the overlay on your site tonight.

One tag, one provider, or one init call. Your first Issue lands with the write-up already done.

Start free — install the SDK →