In Dutch, mopperen means to grumble or to complain. This package turns those grumbles into actionable feedback — captured right inside your Flutter app.
Mopper is an in-app feedback widget that wraps your application, captures screenshots with annotation tools, collects device diagnostics, and dispatches submissions to configurable backends like GitLab and Sentry.
- Wrap any Flutter app with a single widget to enable feedback capture.
- Automatic screenshot capture via
RepaintBoundary. - Annotation tools: freehand draw, arrows, undo, and color picker.
- Built-in integrations for GitLab (issues) and Sentry (user feedback).
- Pluggable integration architecture — implement
MopperIntegrationfor any backend. - Automatic system diagnostics (device model, OS version, app build info).
- Themed feedback form with Material 3 design (scoped, won't affect your app).
- Localization support (English and Dutch).
dependencies:
mopper: ^0.1.0Wrap your app with MopperWrapper in MaterialApp.builder. This adds a floating action button that opens the feedback form when tapped.
import'package:flutter/material.dart';
import'package:mopper/mopper.dart';
voidmain() {
runApp(constMyApp());
}
classMyAppextendsStatelessWidget {
constMyApp({super.key});
@overrideWidgetbuild(BuildContext context) {
returnMaterialApp(
builder: (context, child) {
returnMopperWrapper(
integrations: [
GitLabIntegration(
projectId:'12345',
apiToken:'glpat-xxxxxxxxxxxx',
gitlabUrl:'gitlab.com',
),
SentryFeedbackIntegration(),
],
child: child ??constSizedBox.shrink(),
);
},
home:constMyHomePage(),
);
}
}The MopperWrapper will:
- Wrap your app in a
RepaintBoundaryfor screenshot capture. - Overlay a floating "Feedback" button.
- Open a full-screen feedback form with screenshot annotation, category selection, and diagnostics.
- Submit feedback in parallel to all configured integrations.
Creates a GitLab issue with the annotated screenshot attached:
GitLabIntegration(
projectId:'12345',
apiToken:'glpat-xxxxxxxxxxxx',
gitlabUrl:'gitlab.com', // or your self-hosted instance
)Submits feedback via Sentry's captureFeedback API with the screenshot as an attachment:
SentryFeedbackIntegration()Implement the MopperIntegration interface to add your own backend:
classSlackIntegrationimplementsMopperIntegration {
@overrideFuture<void> submit(MopperSubmission submission) async {
// Upload screenshot and post message to Slack...
}
}This package is maintained by Dutch Coding Company. Feel free to leave feedback or open a pull request on GitHub.