Nitpicks, now with issue numbers. Small gripes, properly filed. Petty? Maybe. Tracked? Always. It bugs them. Now it's a bug. From “ugh” to issue #412.
quibble is a feedback button for your web app. They write one sentence. You get an issue in your own tracker with the page, the browser and the error attached.
Feedback straight into your tracker, wherever it comes from
Hear from your customers
The people using your app tell you what's wrong, on the page where it went wrong, and it lands in your backlog with the details attached.
Speed up QA testing
Testers file as they click through a build: the page, the browser and the error in every report, and no copying into a tracker afterwards.
Tighten the loop with your coding agent
Try the build, say what's off, and the issue is ready for Claude Code, Copilot's coding agent or Codex to pick up.
FYI nothing leaves your infrastructure.
Hosted feedback tools receive your users' screenshots, console logs and URLs on their own servers. quibble has no servers. A note goes from the browser to your app, and from your app to your tracker, with a token only your app holds.
With nobody else in the path, there's no additional data processing agreement to sign, no additional subprocessor to list and no additional vendor security review to run.
- Browser
- Their servers
- Your tracker
- Browser
- Your app
- Your tracker
FYI a submission can never create a label.
People can tag a note, but only with labels your tracker already has. Anything else is dropped before the issue is written, so your label list stays the one you made.
Priorities stay on your scale too. Ask for a P0 and quibble files a P1.
They asked for uiurgent-from-the-ceoP0
quibble filed uiurgent-from-the-ceoP1
FYI nobody needs an account to complain.
One service token files every issue, so the people reporting never need a login on your tracker. Their name comes from the sign-in already in front of your app: Cloudflare Access, SAML, OIDC, oauth2-proxy or mTLS.
No sign-in at all? quibble can ask for a name or email, and marks it self-declared in the issue, so nobody mistakes it for a verified identity.
Behind your sign-in- Reported by: dana@corp.com (via quibble)
Typed in, no sign-in- Reported by: dana@x.com (self-declared, via quibble)
FYI no database. No container. Nothing new to run.
Your tracker is the datastore. quibble is a Python package with no dependencies of its own, one script tag, and an adapter for FastAPI, Django, Flask, Starlette or Litestar. Anything else can host it by following a short, documented backend contract. It runs inside the app you already deploy.
Which is also why it can run in your browser, with no server behind it. Try it live.
Watch it work
Under a minute, unedited: quibble added to a pretend app, a note filed while pointing at the broken button, an invented tag dropped, and a private box that never leaves.
The live demo runs quibble itself in your browser. Nothing you type leaves it.
Which trackers work
| Tracker | Tested against |
|---|---|
| GitHub.com | Live |
| Gitea | 1.27.3 |
| Forgejo | 12.0.4 |
| GitHub Enterprise Server | Not yet tested |
Every version here is one we ran quibble against, not one we read about. GitHub
Enterprise Server ships as a licensed appliance we can't stand up, so it stays marked
untested until someone runs it. This table is built from
quibble.tracker.supported_trackers() in quibble 1.15.0, so it
can't name a tracker quibble doesn't have. More are on the way.
Want it in your app?
quibble is in early access. Write to hello@quibble.fyi and say what you'd use it for. A person reads every one.