brevwick
Flutter SDK for Brevwick — send rich QA feedback from inside your app by wrapping it in a single widget. Bug reports arrive with a screenshot, the recent console / network / route history, and device context already attached, so you spend less time asking "what were you doing when it broke?".
Runs on all six Flutter platforms — Android, iOS, macOS, Linux, Windows, and web.
Install
flutter pub add brevwick
Quick start
Wrap your app once. Brevwick.runGuarded captures uncaught errors,
BrevwickScreenshotScope enables screenshot capture, and BrevwickOverlay
adds the feedback affordance on top of every route.
import 'package:brevwick/brevwick.dart';
import 'package:flutter/material.dart';
void main() {
Brevwick.runGuarded<void>(() async {
WidgetsFlutterBinding.ensureInitialized();
await Brevwick.install(
const BrevwickConfig(
projectKey: 'pk_live_...',
environment: 'prod',
),
);
runApp(const MyApp());
});
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
// Wrap at the builder level so the feedback overlay persists
// across every named route.
builder: (context, child) =>
BrevwickOverlay(child: child ?? const SizedBox.shrink()),
navigatorObservers: [Brevwick.instance.routeObserver()],
home: const BrevwickScreenshotScope(child: HomePage()),
);
}
}
Launcher presentation
⚠️ Default change. The zero-config launcher is now a vertical tab flush against the right screen edge, vertically centered, with a rotated "Feedback" label — not the old bottom-right corner bubble. The bubble remains fully supported: any call site that passes an explicit corner
position(e.g.Alignment.bottomRight) keeps compiling and keeps the bubble at that corner. To keep the bubble with no other configuration, passvariant: BrevwickLauncherVariant.bubble.
BrevwickOverlay(child: app) // NEW default: right-edge tab
BrevwickOverlay(side: BrevwickLauncherSide.left, child: app) // left-edge tab
BrevwickOverlay(compact: true, child: app) // icon-only edge tab
BrevwickOverlay(offset: 80, child: app) // tab nudged 80 px down
BrevwickOverlay(
variant: BrevwickLauncherVariant.bubble, // legacy corner bubble
child: app,
)
BrevwickOverlay(
position: Alignment.bottomLeft, // legacy call site: still a bubble
child: app,
)
How variant / position / side resolve:
variant |
position / side |
Result |
|---|---|---|
| null | both null | tab, right edge (new default) |
| null | position non-null |
bubble at exactly that Alignment (legacy behaviour, including non-corner alignments) |
| null | side non-null |
tab on that edge |
.tab |
any | tab; edge = side if set, else the position alignment's horizontal side (default right). Tabs are always vertically centered (± offset) |
.bubble |
any | bubble at position ?? Alignment.bottomRight; side and offset are ignored |
An explicit variant always wins. label (default 'Feedback') is the tab's
rotated text and its tooltip/semantics label; compact drops the visible text
(the Flutter bubble is already icon-only, so compact is a no-op there).
To capture failing HTTP calls in the network ring, add the interceptor to your Dio instance:
final dio = Dio()..interceptors.add(Brevwick.instance.dioInterceptor());
What gets attached
Every report carries, automatically:
- Screenshot of the screen the user was on when they tapped the feedback button (captured before the composer opens, so the sheet itself isn't in the frame).
- Breadcrumb rings — the recent
consolelogs,networkrequests, androutetransitions, each toggleable viaRingFlagsonBrevwickConfig. - Device context — platform, OS, locale, viewport, and SDK version.
- User context — anything you supply via
BrevwickConfig.user/userContext.
Users can add a title, expected/actual notes, and up to a handful of attachments (10 MB each), and optionally let AI format the report.
Privacy & redaction
Every payload runs through a redaction pass before it leaves the device —
emails, tokens, and other sensitive values are scrubbed client-side. Set
fingerprintOptOut: true on BrevwickConfig to suppress device-fingerprint
signals.
Platform view caveat
The screenshot layer cannot capture AndroidView / UiKitView (maps,
webviews, and other embedded platform views), which appear as gaps in the
captured frame. Document this for any screen that embeds them.
Contract
The canonical SDK contract lives in
brevwick-ops/docs/brevwick-sdd.md § 12.
The wire format mirrors the brevwick-sdk-js
SDK byte-for-byte.
License
MIT — see LICENSE.
Libraries
- brevwick
- Brevwick Flutter SDK.