August 2026: triage on every issue, and SDKs that tell you when they're broken
It’s been a quiet blog and a busy repo. Here’s what changed since May, roughly in the order you’ll notice it.
AI triage on every new issue
Every booboo.dev plan has always said “AI triage included”. Until now that meant the first handful of issues an organisation ever had; after that it was a button.
As of this week every new issue gets triaged automatically, on every plan, within a monthly allowance that is generous for what it is:
| Plan | Auto-triaged new issues / month |
|---|---|
| Free | 25 |
| Starter | 250 |
| Team | 1,000 |
Noise (scanner traffic hitting /wp-admin, bots probing for .env) is
pre-classified and skipped, so the allowance goes to errors that are actually
yours. The manual Generate triage button stays unlimited. What you get is a
written summary, a confidence badge, ranked likely causes, suggested steps, and
the evidence from the event that backs them up:

SDKs: Python 0.16, JavaScript 0.9
Both SDKs shipped two releases this month. The theme: an error tracker should tell you when it is broken.
- Delivery failures are logged. A rejected event — wrong DSN (403), quota
exhausted (429), payload too large — or an unreachable endpoint used to fail
silently. It now logs a warning (
logger.warningon thebooboologger in Python,console.warnin the browser) with the server’s reason, rate-limited to once a minute per cause so a misconfigured install doesn’t flood your logs.debug=True/{ debug: true }logs every send. - Install handshake.
init()now sends a tiny ping, so your project shows as connected in the dashboard before the first error ever happens. It isn’t an event: it never counts toward your quota and yourbefore_sendhook never sees it. Opt out withBOOBOO_HANDSHAKE=0orinit({ handshake: false }). - Flask: HTTP errors stay HTTP errors. The auto-installed handler used to
re-raise everything but
NotFound, which turnedabort(403)and 405s into 500s. WerkzeugHTTPExceptions are now returned as-is (5xx ones are still reported). releasetagging on both SDKs — pass a git SHA and issues know which release introduced them; the JS SDK uses it to match uploaded source maps.
pip install -U booboo-sdk # 0.16.0
npm install @booboo.dev/js@latest # 0.9.0
Sharper grouping
Fingerprints now hash the innermost stack frames, preferring your own
(in_app) frames when the SDK marked them. Previously the outermost five frames
were used — which for a Django or Flask app are the WSGI server and framework
dispatcher, identical for every error, so unrelated bugs could end up grouped
under one issue per exception type. Existing issues regroup as new events arrive;
nothing is deleted.
Setup that tells you what’s happening
A handful of Quickstart changes, all aimed at the minute between “I pasted the snippet” and “I see my first issue”:
- Named rejections. If events arrive but get rejected, the Quickstart says why — unrecognised DSN, origin not allowed, payload too large — instead of a generic “check your configuration”. An unrecognised DSN is now recorded too, even when we can’t tell which project it belongs to.
- “Event received”. When your first event is in the database but still being grouped, the page says so, rather than “listening”.
- “SDK connected”. The handshake above, surfaced.
- “Email me this.” Signed up on your phone? One tap mails you the quickstart link, your DSN and the install snippet for the platform you picked, to finish at a keyboard.
- Blank exception messages (
raise ValueError()) are accepted; the issue is titled by exception type.
Metric checks and the Board
Two larger features landed over the summer and never got a post of their own — they get one now: Metric checks and the Board. The short version: point a monitor at any endpoint that returns a small JSON shape and booboo.dev charts the gauges next to your errors; the Board is a shared per-organisation dashboard built from those and your error data.
Smaller things
- The status page now probes the public ingest hostname from the outside, the same way your SDK reaches it, instead of trusting in-process checks alone.
- Lifecycle emails (tips, check-ins) carry a one-click unsubscribe link and come from a person you can reply to. Transactional mail is unchanged.
- Email addresses are case-insensitive everywhere. If you ever signed up as
Tom@and couldn’t log in astom@, that’s fixed. - The per-IP ingest rate limit no longer lumps every app behind the same Cloudflare edge into one bucket.
As always: the free plan is 5,000 events a month with all of the above, no card required. If something in this list doesn’t behave the way it’s described, reply to any of our emails — a person reads them.