Zum Hauptinhalt springen

Telemetrie

MailCopilot erhebt eine geringe Menge anonymer Diagnose- und Nutzungsdaten, wenn Sie unter Einstellungen -> Ueber den Schalter Anonyme Diagnose- und Nutzungsdaten senden aktivieren. Diese Seite dokumentiert genau, was erhoben wird und -- ebenso wichtig -- was niemals erhoben wird.

Was wir niemals erheben

MailCopilot uebertraegt unter keinen Umstaenden:

  • Den Inhalt Ihrer Nachrichten (Betreff, Body, Anhaenge, Entwuerfe)
  • Ihre E-Mail-Adressen oder die Ihrer Kontakte
  • Ordnernamen oder -pfade auf Ihrem IMAP-Server
  • Dateinamen von Anhaengen
  • Den Text Ihrer Suchanfragen
  • Den Inhalt von KI-Chats oder des KI-Speichers
  • Server-Hostnamen, Ports oder Zugangsdaten

Wie Daten weitergeleitet werden

Saemtliche Telemetrie geht an Sentry, unsere Plattform fuer Fehler- und Performance-Monitoring. Wenn Sie den Schalter in den Einstellungen ausschalten, wird die Pipeline vollstaendig umgangen -- es wird nichts gesendet. Wenn Sie das Debug-Logging aktivieren, erscheinen dieselben Ereignisse zusaetzlich in Ihrer lokalen main.log, sodass Sie genau pruefen koennen, was uebertragen werden wuerde.

Anonyme Installations-Kennung

Beim ersten Start erzeugt MailCopilot eine zufaellige UUID und speichert sie in der lokalen Konfigurationsdatei. Diese UUID verlaesst Ihr Geraet niemals. Uebertragen wird stattdessen ein SHA-256-Hash davon -- auf 16 Hex-Zeichen gekuerzt -- den wir install_id_hash nennen. Er wird jedem Telemetrie-Ereignis als Sentry user id beigefuegt, damit wir Fragen wie „Wie viele eindeutige Installationen laufen auf Version X?" oder „Betrifft Crash Y eine Person oder hundert?" beantworten koennen. Der Hash ist:

  • Anonym -- nicht abgeleitet von oder korreliert mit einer Konto-E-Mail, einem Geraete-Fingerabdruck, einer IP-Adresse oder einem Hardware-Identifikator.
  • Stabil ueber Releases hinweg -- dieselbe Installation behaelt nach einem Auto-Update den gleichen Hash, sodass Retention-Metriken Versionsspruenge ueberleben.
  • Nicht umkehrbar -- es gibt auf unserer Seite keine Zuordnung vom Hash zurueck zur UUID oder zu Ihrem Geraet.
  • Wird beim Deaktivieren der Telemetrie verworfen -- das Umlegen des Schalters in Einstellungen entfernt die Kennung sofort aus dem Sentry-Client und stoppt jede weitere Uebertragung.

Wir verwenden diese Kennung wie ein Webanalyse-Werkzeug eine anonyme Besucher-ID: sie erlaubt uns, eindeutige Installationen zu zaehlen statt Gesamtereignisse. Genau dieser Unterschied ist der Grund, warum Telemetrie ueberhaupt nuetzlich ist -- ohne ihn saehe eine sehr aktive Installation aus wie hundert ruhige.

Ereignisse

App-Lebenszyklus

EreignisTypAggregiertTagsZweck
app.session_startedeventneinversion, platform, theme, lang, accounts_count, install_id_hashEinmal beim App-Start. Traegt install_id_hash fuer DAU/MAU.
app.session_endedhistogramneinreason, install_id_hashEinmal beim regulaeren Beenden. value_ms = Sitzungsdauer.
app.updatedeventneinfrom_version, to_versionEinmal nach der Installation einer neuen Version durch Auto-Update.
app.startup_mshistogramneinaccounts_countZeit von app.whenReady bis zum ersten sichtbaren BrowserWindow.

Nutzungszusammenfassung

EreignisTypAggregiertTagsZweck
usage.session_summaryeventneinsearch_used, compose_used, snooze_used, read_later_used, ai_used, rules_used, templates_used, followup_used, install_id_hashBitmap am Sitzungsende: welche Funktionen wurden mindestens einmal benutzt?

Onboarding

EreignisTypAggregiertTagsZweck
onboarding.wizard_openedeventneinfirst_runAnwender oeffnete den Konto-Hinzufuegen-Assistenten.
onboarding.method_selectedeventneinmethodWahl zwischen OAuth und manueller IMAP/SMTP-Einrichtung.
onboarding.autoconfig_resulteventneinsuccess, providerAutoconfig-Probe abgeschlossen -- wurden IMAP/SMTP-Einstellungen gefunden?
onboarding.connection_test_resulteventneinkind, success, failure_kindIMAP- oder SMTP-Konnektivitaetstest abgeschlossen.
onboarding.google_oauth_resulteventneinsuccess, failure_kindGoogle-OAuth2-Flow abgeschlossen.
onboarding.account_savedeventneinprovider, auth_typeKonto-Zugangsdaten in keytar/electron-store geschrieben.
onboarding.first_headers_sync_completedhistogramneinprovider, folder_count_bucketZeit von account_saved bis zur ersten abgeschlossenen Header-Synchronisation (value_ms).
onboarding.first_message_openedeventneintime_since_sync_bucketAnwender oeffnete nach Anmeldung seine erste Nachricht.

Verfassen

EreignisTypAggregiertTagsZweck
compose.openedeventneinsource, has_draftVerfassen-Fenster geoeffnet; verfolgt den Einstiegspunkt.

Sendewarteschlange

EreignisTypAggregiertTagsZweck
send_queue.enqueuedeventneinscheduled, send_and_archive, has_attachments, body_size_bucketAusgehende Nachricht zu send_queue hinzugefuegt (sofort oder geplant).
send_queue.senthistogramneinscheduledZeit von der Einreihung bis zur erfolgreichen Zustellung -- SMTP fuer die meisten Konten, Microsoft Graph fuer Outlook (value_ms).
send_queue.failedeventneinfailure_kindSendeversuch endgueltig fehlgeschlagen (Warteschlange hat aufgegeben). Deckt sowohl SMTP- als auch Microsoft-Graph-Pfade ab.
send_queue.retriedeventneinattempt_numberVoruebergehender Sendefehler -- Nachricht neu eingeplant. Deckt sowohl SMTP- als auch Microsoft-Graph-Pfade ab.

Falsch-Adressaten-Warnungen

EreignisTypAggregiertTagsZweck
misdirection.promptedeventneinkindVerfassen-Fenster zeigte den Warndialog.
misdirection.outcomeeventneinoutcome, kindAnwender hat auf die Warnung reagiert.

Vorlagen

EreignisTypAggregiertTagsZweck
template.appliedeventneinvar_countAnwender hat eine Vorlage in das Verfassen-Fenster eingefuegt.

Follow-up-Erinnerungen

EreignisTypAggregiertTagsZweck
followup.createdeventneinduration_days_bucketEiner ausgehenden Nachricht wurde eine Follow-up-Erinnerung beigefuegt.

Suche

EreignisTypAggregiertTagsZweck
search.duration_mshistogramneinscope, folder_role, account_count, sort, pagination, len_bucket, token_count, result_bucket, duration_bucket, zero_resultsEnd-to-End-Latenz der FTS-Suche (Main-Seite, vor dem Merge mit Server-Treffern). Wird in PR 2 durch search.completed ersetzt.
search.erroreventneinscope, kindSuchhandler hat eine Exception geworfen -- entweder Anwender-Abbruch oder echter Fehler.

Body-Indexer

EreignisTypAggregiertTagsZweck
body_indexer.tick.duration_mshistogramneinindexed, folders_scannedEin vollstaendiger Indexer-Tick ueber alle Ordner.
body_indexer.coverage_pctgaugeneintotal_messages, indexed_messagesAnteil der zwischengespeicherten Nachrichten mit indiziertem body_text.
body_indexer.backloggaugenein--Absolute Anzahl zwischengespeicherter Nachrichten ohne body_text.
body_indexer.folder_erroreventneinfolder_role, error_streak, backoff_msBody-Indexer ist auf einer Fehlerfolge in einem Ordner haengen geblieben und ging in Backoff.

Volltextindex-Wartung

EreignisTypAggregiertTagsZweck
fts.optimize.duration_mshistogramneinsegments_before, segments_after, reductionFTS5-Optimize-Lauf: Dauer und Segmentanzahl vor/nach.
fts.optimize.failedeventneinreasonFTS5-Optimize hat einen Fehler geworfen.

Header-Synchronisation

EreignisTypAggregiertTagsZweck
sync.headers.wall_mshistogramneinfolder_role, upsert_ms, other_ms, batches, rows, max_batch_msVollstaendiger syncFolderHeaders-Lauf -- Aufteilung in Upsert vs. Sonstiges fuer Profiling.
sync.headers.coalescedeventneinfolder_roleDoppelter syncFolderHeaders-Versuch wurde an einen laufenden Lauf angedockt.

Instrumentierung des E-Mail-Oeffnens

EreignisTypAggregiertTagsZweck
mail.openhistogramneincache_hit_level, body_size_bucket, attachments_countEnde-zu-Ende-Latenz des Nachrichteoeffnens, gemessen auf Renderer-Seite (vom Klick bis zum Rendern des Inhalts). Der Tag cache_hit_level gibt an, aus welcher Cache-Ebene der Inhalt stammt: memory, db, eml, imap oder imap_timeout.
net.message_details.wall_mshistogramneincache_hit_levelWall-Zeit des IPC-Handlers net:messageDetails im Hauptprozess. Isoliert die serverseitige Latenz vom Rauschen des Renderer-zu-Main-Round-Trips. Ein Messwert pro terminalem Pfad (memory, db, eml, imap, imap_timeout).
imap.pool_queue_wait_mseventneinrequester, wait_ms_bucketWartezeit beim Abrufen einer Verbindung aus dem per-Account IMAP-Pool. Wird nur emittiert, wenn die Wartezeit 500 ms ueberschreitet, damit Dashboards den Long-Tail erfassen ohne Rauschen durch schnelle Akquisitionen.

OAuth-Token-Refresh fuer IMAP

EreignisTypAggregiertTagsZweck
imap.auth_refresh_attempteventneinproviderOAuth-Token-Refresh wurde durch einen IMAP-Auth-Fehler ausgeloest (XOAUTH2 / AUTHENTICATE).
imap.auth_refresh_successeventneinproviderRefresh erfolgreich -- der IMAP-Retry verwendet das frische Token.
imap.auth_refresh_failureeventneinprovider, reasonRefresh fehlgeschlagen -- der urspruengliche Auth-Fehler wird an den Aufrufer weitergereicht.
imap.auth_refresh_suppressedeventneinreasonDer Per-Account-Cooldown hat einen Refresh-Versuch unterdrueckt, um /token-Anfragesturmen vorzubeugen, wenn ein Refresh-Token widerrufen wurde.
imap.idle_auth_refreshedeventneinproviderDie IDLE-Schleife hat sich von einem Auth-Fehler mitten im Zyklus durch einen In-Loop-Refresh erholt -- Push-Zustellung lief ohne den 60-Minuten-Auth-Backoff weiter.
imap.auth_refresh_exhaustedeventneinprovider, consecutiveDie IDLE-Schleife loeste die Storm-Brake aus -- N Refreshes hintereinander beim Anbieter erfolgreich, aber IMAP wies die frischen Tokens weiter ab; deshalb fallen wir auf den ueblichen Auth-Backoff zurueck.

Cache-Aufbewahrung

EreignisTypAggregiertTagsZweck
cache.eml_prunedeventneincount_bucket, freed_bytes_bucketDie Aufbewahrungsbereinigung hat .eml-Dateien geloescht, die aelter als der konfigurierte Zeitraum sind. Anzahl und Groessen werden nur als Bereiche uebermittelt -- keine exakten Pfade oder Zahlen.
cache.folder_index_disabledeventneincount, roleEin Ordner wurde von der Volltextsuche ausgeschlossen -- automatisch fuer Junk/Spam/Papierkorb bei der ersten Registrierung oder manuell ueber das Ordner-Kontextmenue. role: spam, trash oder manual.

Cache-Sicherheit und Datenverlust-Signale

EreignisTypAggregiertTagsZweck
db.mass_delete_messageseventneinfolder_role, reason, deleted_count_bucket, watermark_preservedOrdnerweites DELETE FROM messages wurde abgesetzt. Jede Aufrufstelle liefert einen Grund mit, sodass eine Regression, die einen gesunden Cache loescht, von einem regulaeren UIDVALIDITY-Bump unterscheidbar ist.
imap.stale_wipe_guard_trippedeventneinfolder_role, providerDie Mass-Delete-Schutzschicht hat das Loeschen des lokalen Ordnercaches verweigert, weil mailbox.exists nicht-numerisch zurueckkam. Ein Spike deutet auf ein Anbieter- oder Verbindungsproblem, nicht auf Datenverlust.
db.shutdown_wal_checkpoint_mshistogramneinbusy, reclaimed_kb_bucket, okWallclock-Dauer des PRAGMA wal_checkpoint(TRUNCATE) vor dem Beenden, damit committed-but-not-checkpointed-Schreibungen Sitzungswechsel ueberleben.

MCP-stdio-Gate (Renderer-zu-RCE-Schutz)

EreignisTypAggregiertTagsZweck
mcp.stdio.connect_attemptedeventneinapproved_sourceDer stdio-MCP-Transport wird gleich gestartet -- emittiert einmal pro erfolgreichem Connect, nachdem Approval- und Allowlist-Gates passiert wurden.
mcp.stdio.connect_blockedeventneinreasonstdio-Connect oder -Speicherung wurde vom Gate abgelehnt (not_approved, unapproved_command, forbidden_field, forbidden_env_key, env_disabled).
mcp.stdio.approval_grantedeventneinsource, scopeDer Anwender hat die stdio-MCP-Freigabe erteilt (globale Aktivierung oder pro Verbindung); source unterscheidet env vs native-confirm, scope global vs pro Verbindung.
mcp.stdio.env_sanitized_on_loadeventneincount_bucketDie Settings-Migration hat verbotene Loader-Hook-Env-Keys aus persistierten MCP-Verbindungen beim Laden entfernt. Maximal einmal pro Start.

KI-Aktions-Audit (Preview -> Apply Bestaetigungsbarriere)

EreignisTypAggregiertTagsZweck
ai.action.preview_createdeventneinkindEin *_preview-MCP-Tool hat eine ausstehende mutierende Aktion registriert, die auf den Apply-Klick wartet.
ai.action.appliedeventneinkindEin *_apply-MCP-Tool hat eine zuvor bestaetigte mutierende Aktion erfolgreich ausgefuehrt.
ai.action.rejectedeventneinkind, reasonEin *_apply-Aufruf wurde am Validierungs-Gate abgelehnt (Preview fehlt/abgelaufen, Token fehlt/passt nicht, kind mismatch, Callback fehlt oder Rate-Limit).
ai.action.expiredeventneinkindEine ausstehende mutierende Aktion ist abgelaufen, ohne dass der Anwender Apply geklickt hat (TTL).
ai.action.apply_duration_mshistogramneinkindWallclock-Dauer eines erfolgreichen Apply -- wie lange die zugrunde liegende Mutation gedauert hat (DB / IMAP / SMTP).

KI-Egress-Gate (Ausgehende Tool-Aufrufe)

EreignisTypAggregiertTagsZweck
ai.egress.blockedeventneintool_name, account_idEin ausgehender Tool-Aufruf (z. B. WebSearch, WebFetch, generisches externes MCP-Tool) wurde abgelehnt, waehrend Nutzer-E-Mail-Daten im Geltungsbereich waren -- entweder aus dem SDK-Toolset gefiltert oder am Runtime-Gate gestoppt.
ai.egress.allowed_onceeventneintool_name, account_idDer Anwender hat eine einmalige Egress-Zustimmung erteilt und die KI hat sie genutzt. Hilft, „Anwender uebersteuern routinemaessig" von „das Gate haelt, Versuche sind ueberwiegend Injektion-getrieben" zu trennen.

IPC-Performance

EreignisTypAggregiertTagsZweck
ipc.slow_mshistogramja (10-s-Fenster)channel, duration_bucketIPC-Handler hat den Schwellwert fuer „langsam" ueberschritten.

UI-Reaktionsfaehigkeit

EreignisTypAggregiertTagsZweck
ui.freeze.renderer_mshistogramja (10-s-Fenster)duration_bucket, inflight_count, top_inflightRenderer-Event-Loop war laenger blockiert als der Freeze-Schwellwert.
ui.freeze.main_mshistogramja (10-s-Fenster)duration_bucket, inflight_count, top_inflightMain-Prozess-Event-Loop war blockiert (ueber perf_hooks-Delay).

Kontakt

Fragen oder Bedenken zu dem, was wir erheben? Oeffnen Sie ein Issue auf github.com/mailcopilot/mailcopilot oder kontaktieren Sie das Team direkt ueber das Feedback-Formular unter Einstellungen -> Ueber.