quibble.fyi
Early access

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.

Email for early access Try it live

Feedback straight into your tracker, wherever it comes from

What arrives with every note

Always

What they wrote, the page they were on, its title, where they came from, their screen size, browser, language and time zone.

Who sent it

Their name from the sign-in you already have. Without one, they can type it, and the issue says it's self-declared.

When something broke

The last five JavaScript errors the page threw, folded away under Diagnostics until you want them.

When they choose

The element they pointed at. A screenshot, with any region you mark private blanked out (GitHub for now; Gitea and Forgejo soon).

Additional context you need

Console output, failed network requests and any fields your app wants to add. Off until you turn them on.

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.

What that means for a security review

A hosted tool
  1. Browser
  2. Their servers
  3. Your tracker
quibble
  1. Browser
  2. Your app
  3. 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.

How quibble handles a submission

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.

Identity, and its limits

Behind your sign-in- Reported by: [email protected] (via quibble)

Typed in, no sign-in- Reported by: [email protected] (self-declared, via quibble)

FYI no database. No container. Nothing new to run.

Your issue 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. Others can easily integrate using a documented schema. 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.

Try it live

The live demo runs quibble itself in your browser. Nothing you type leaves it.

Which trackers work

TrackerTested against
GitHub.comLive
Gitea1.27.3
Forgejo12.0.4
GitHub Enterprise ServerNot 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 [email protected] and say what you'd use it for. A person reads every one.

Email for early access