Upload of mails to report bugs #421
Closed
opened 2026-06-04 17:23:31 +00:00 by guettli
·
1 comment
No Branch/Tag Specified
main
issue-563-agentloop-validation
dummy-pr-test
issue-560-fix-firebase-run-url
issue-539-stable-imap-uid
issue-533-shared-email-list
plan-issue-555
drop-nix
plan-issue-484
plan-issue-539
plan-issue-535
plan-issue-474
plan-issue-533
fix-dagger-engineless-precommit
issue-521-fix-deploy-yml-wait-time-api
issue-502-fix-email-id-collision-mailbox
issue-492-eliminate-duplicate-build-runner
issue-494-website-change-detection
issue-491-parallelize-check
issue-478-fix-stalwart-dual-stack-bind
issue-475-allowed-addresses-glob
issue-473-search-result-reorder
issue-453-update-agentloop-defaults
issue-466-structured-search
issue-505-exclude-chaos-monkey-from-regular-ci
issue-509-fix-search-result-sorting
fix-ink-sparkle-remaining-tests
issue-506-fix-search-emails-tests
issue-504-runner-wait-time
issue-488-search-notes
issue-472-changelog-issue-links
issue-501-folder-search-local-sqlite
issue-486-fix-stale-test-shader-mismatch
fix/prevent-settled-search-rerun-473
issue-467-fix-search-stale-results
issue-446-installed-versions-in-changelog
issue-462-fix-pr
issue-448-chaos-monkey-test
issue-436-notes-on-emails
issue-429-unify-mail-display
issue-422-move-to-folder-create-new
issue-414-ensure-not-run-as-root
issue-424-unify-email-list-views
issue-419-trusted-senders-page
issue-425-fix-prs
test-foo
issue-421-bug-report
issue-383-fix-ci
issue-394-fix-deploy-flutter-version
issue-391-fix-ci-double-trigger
issue-376-combined-inbox-v2
issue-376-combined-inbox
issue-384-fix-open-prs
sops-migrate
issue-339-safe-first-on-imap-fetch
issue-340-try-catch-measure-height
issue-342-pin-intl-version
issue-341-guard-threademails-last
issue-335-agentloop-code-test
issue-329-fix
issue-315-fix
issue-320-fix
issue-325-fix
issue-312-fix
issue-311-fix
issue-305-fix
issue-304-fix
issue-299-fix
issue-300-fix
issue-298-fix
issue-296-fix
issue-294-fix
issue-289-fix
issue-288-fix
issue-287-fix
issue-286-fix
issue-277-fix
issue-282-fix
issue-280-fix
issue-272-fix
issue-268-fix
issue-267-fix
issue-266-fix
issue-258-fix
issue-260-fix
issue-257-fix
issue-253-fix
issue-216-fix
issue-251-fix
issue-249-fix
issue-question-fixes
issue-235-fix
issue-236-fix-v2
issue-237-fix
issue-236-fix
issue-228-fix
issue-217-fix
issue-214-fix
issue-213-fix
issue-208-fix
issue-205-fix
issue-204-fix
issue-203-fix
issue-202-fix
issue-129-fix
issue-161-fix
issue-160-fix
issue-201-fix
issue-210-fix
issue-198-fix
issue-200-fix
issue-144-fix
issue-199-fix
fix/playstore-upload-use-requests
issue-193-fix
issue-186-fix
issue-185-fix
issue-192-fix
issue-183-fix
issue-175-fix
issue-172-fix
issue-171-fix
issue-167-fix
issue-136-fix
issue-162-fix
issue-179-fix
issue-155-fix
issue-154-fix
issue-152-fix
issue-151-fix
issue-141-fix
issue-150-fix
issue-164-fix
migrate-to-dagger
task/d1-ci-matrix
task/a4-typeconverter-json
task/u7-onboarding-walkthrough
task/d3-sync-doc
task/a5-layer-boundary-lint
task/t5-golden-tests
task/p5-date-cache
task/s4-link-handling
task/p3-html-parse-isolate
task/u8-mark-all-read
task/u3-recent-searches
task/a3-jmap-injectable-http-client
task/r5-tls-error-handling
fix/playstore-redirect-retry
task/t3-repository-contract-tests
task/p2-email-list-pagination
task/p1-fts5-search
fix/playstore-upload-timeout
task/a1-email-detail-notifier
fix/upgrade-workmanager-0.9
fix/android-core-library-desugaring
task/p4-db-indexes
task/r3-html-error-boundary
task/d2-check-coverage
task/a2-email-tile
task/t4-migration-tests
task/t2-widget-tests
task/t1-email-repo-coverage
task/u6-connection-status
task/u4-push-notifications
task/u2-draft-sync
task/u1-list-unsubscribe
task/s2-hostname-validation
task/r6-reliability-fuzz-tests
task/r4-sync-error-banner
task/r2-force-resync
task/r1-undo-history-persistence
No results found.
Labels
Clear labels
NeedSupervisor
State/InProgress
State/Later
State/Planned
automerge
ci-failure
do-not-merge
loop/code
loop/code-ci-pending
loop/code-done
loop/code-in-process
loop/merge
loop/merge-done
loop/merge-in-process
loop/plan
loop/plan-done
loop/plan-in-process
Issue escalated to a human supervisor; agentloop will skip it until cleared.
Eligible for automatic merge by CI
Issue opened by agentloop to track a failing CI workflow; used for deduplication.
Plan PR — review only, do not merge.
Add to run the built-in "code" prompt; override at prompts/code.md.
Prompt "code" finished; waiting for the PR's CI to pass before advancing.
Prompt "code" finished successfully.
Agent for the "code" prompt is currently running on this issue.
Managed by agentloop
Managed by agentloop
Managed by agentloop
Add to run the built-in "plan" prompt; override at prompts/plan.md.
Prompt "plan" finished successfully.
Agent for the "plan" prompt is currently running on this issue.
No labels
loop/plan-done
Milestone
No items
No Milestone
Projects
Clear projects
No projects
No Assignees
Notifications
Due Date
No due date set.
Dependencies
No dependencies set.
Reference: guettli/sharedinbox#421
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
From single Mail View, the current mail should be uploadable to an API to report bugs.
Additionally the about-data will be added. Reuse the code.
The user has a text field to report his issue. Additionally files (for example screenshots) can be added.
Encourage the user to upload screenshots, so that is easier to understand the issue.
The bug report will be handled confidentially, it will not be uploaded to the public issue tracker. Tell that the user.
If you have additional ideas, feel free to add them.
We need both: a backend to receive the bug report (only API, no UI) and the code in the app to upload the data.
The user can optionaly add his email address (checkbox, if checked take address of current account, but user can change it, if the wants to)
Backend: upload must not be bigger than 20 MB. Do rate limit: only 10 uploads per minute (overall) is allowed.
Think about additional features.
Ask if unsure.
I have everything I need. Here is the implementation plan to post as a comment on issue #421:
Implementation Plan: Bug Report Upload Feature
Two components: a new Go HTTP backend to receive reports, and a new
BugReportScreenin the Flutter app accessible from both the email detail view and the About screen.Backend (
server/bugreport/)Language: Go (consistent with
ci/main.go).Endpoint:
POST /api/v1/bug-reports,Content-Type: multipart/form-datadescriptionabout_infobuildAboutMarkdown()emailemail_dataattachments[]Constraints:
Retry-After: 6headerStorage: Each report saved as a timestamped directory under
$BUGREPORT_STORAGE_DIR:Config (env vars):
BUGREPORT_STORAGE_DIR(default:./reports)BUGREPORT_PORT(default:8090)BUGREPORT_NOTIFY_EMAIL(optional — SMTP notification to developer on new report)Returns
201 Createdwith{"id": "<uuid>"}on success. Raw IP is hashed (SHA-256) before storage — abuse tracking without retaining PII.Flutter App
1. New route
Add to
lib/ui/router.dart:The
emailIdquery parameter is optional. Navigation from email detail:context.push('/bug-report?emailId=${widget.emailId}'). From About screen:context.push('/bug-report').2. New service (
lib/core/services/bug_report_service.dart)BugReportServicewraps the multipart HTTP upload. Uses the existinghttpClientProviderfromdi.dart. Provider registered asbugReportServiceProviderindi.dart.API base URL via
String.fromEnvironment('BUG_REPORT_API_URL')with a compile-time constant fallback, injected at build time likeGIT_HASHis today.Returns the report UUID on success; throws a typed
BugReportExceptionon failure.3. New screen (
lib/ui/screens/bug_report_screen.dart)BugReportScreen({String? emailId})—ConsumerStatefulWidgetLayout:
"Your report is handled confidentially and will not be posted to the public issue tracker."
TextField, autofocusedemailId != null: info chip — "The current email will be attached automatically"OutlinedButton.icon(Icons.add_a_photo, "Add screenshots")syncLogRepositoryProviderto fetch last 50 entries, serializes to textTextFieldpre-filled with the active account's email address (read fromaccountRepositoryProvider)buildAboutMarkdown()output — reuses the existing utility fromlib/ui/utils/about_markdown.dartunchangedFilledButton"Send Bug Report" (full-width)States: idle → submitting (spinner, fields disabled) → success → error.
Success shows: "Thank you! Your report ID is
<uuid>. We will look into it." with a Close button.Errors surface as a
SnackBarwith a Retry action.If
emailIdis set the screen pre-fills the description field with a template:"Problem with email from [from]: [subject]".4. Trigger points
lib/ui/screens/email_detail_screen.dart: Add "Report a bug" item (Icons.bug_report) to the existing overflow action menu, passing the currentwidget.emailIdlib/ui/screens/about_screen.dart: Add a third button "Report a bug" in the bottom button row alongside "Copy to clipboard" and "Create issue"Additional ideas included in scope
report.json: abuse tracking without PII storageSyncLogstableBUGREPORT_NOTIFY_EMAIL— developer gets an email when a report arrivesOpen questions before coding starts
BUG_REPORT_API_URLpoint to? Is it the same server as the existing deployment?