← Back to Privacy

Privacy · Telemetry details

Telemetry disclosure.

Every piece of data ThoughtMic sends off your Mac, documented in full. For the plain-English overview of what stays on your Mac and what goes to the cloud, start with the main privacy page.

TL;DR

  • No transcript content is ever sent anywhere
  • No vault paths, filenames, or note contents leave your Mac
  • No email addresses or personally identifiable information
  • Usage metrics are opt-out (on by default) — anonymous aggregates only
  • Crash reports are opt-in (off by default) — stack traces are scrubbed
  • Both can be toggled in Preferences → Privacy at any time
  • You can verify this yourself — the client SDK is open source

What stays where

Stays on your Mac

Audio recordings, Whisper transcriptions, vault contents, note titles, tags, file paths, your license key, all preferences.

Sent to the cloud (if enabled)

Anonymous event names + coarse metadata (see catalog below). Crash stack traces (opt-in only). Rephrased text goes to our Worker for Pro users only.

Never leaves your Mac

Raw audio. Raw Whisper transcript. Vault paths and filenames. Email addresses. Any content that could identify you or your notes.

Event catalog

Every event ThoughtMic can send via TelemetryDeck. Each event is an anonymous signal with optional coarse metadata fields.

appLaunched
Sent once per app launch. No additional payload.
onboardingStepCompleted
Sent when a user completes an onboarding step.
Fields: step — step name (e.g., "permissions", "model", "obsidian", "privacy")
firstDictationCompleted
Sent exactly once, on the user's first-ever dictation. Activation metric.
dictationCompleted
Sent after each successful dictation.
Fields: durationBucket — coarse duration range (e.g., "<5s", "5-15s", "15-30s", "30-60s", "1-2m", ">2m"), didRephrase — "true"/"false", isPrivate — "true"/"false"
featureEnabled
Sent when a user enables a feature toggle.
Fields: featureName — feature name (e.g., "vault", "autoTitle", "autoTag")
rephrasingModeUsed
Sent when a dictation uses cloud rephrasing.
Fields: mode — rephrasing mode name (e.g., "Clean Up", "Professional", "Email")
targetAppBucket
Sent when text is injected. Never sends the actual app name or bundle ID — only a coarse category.
Fields: bucket — app category ("browser", "terminal", "code_editor", "messaging", "knowledge_base", "email", "writing", "other")
injectionFailed
Sent when text injection at the cursor fails.
Fields: errorType — error category (e.g., "ax_not_trusted", "no_focused_element")
sttFailed
Sent when speech-to-text transcription fails.
Fields: errorType — error type name (never includes the error message itself)
vaultEnrichmentFailed
Sent when smart enrichment (title/tags/backlinks) fails for a Pro user.
Fields: step — which enrichment step failed (e.g., "combined_llm_call")
trialStarted
Sent once when a 14-day Pro trial begins.
trialDayReached
Sent at trial milestones to help us understand retention.
Fields: day — milestone day number (1, 3, 7, or 14 only)
trialConverted
Sent when a trial user subscribes to Pro.
trialCancelled
Sent when a trial expires without conversion.

Example payloads

Here's exactly what a TelemetryDeck signal looks like on the wire for representative events.

appLaunched

{ "type": "appLaunched", "appID": "B1234567-...", "clientUser": "sha256-of-anonymous-id", "sessionID": "uuid", "payload": {} }

dictationCompleted

{ "type": "dictationCompleted", "appID": "B1234567-...", "clientUser": "sha256-of-anonymous-id", "sessionID": "uuid", "payload": { "durationBucket": "5-15s", "didRephrase": "true", "isPrivate": "false" } }

targetAppBucket

{ "type": "targetAppBucket", "appID": "B1234567-...", "clientUser": "sha256-of-anonymous-id", "sessionID": "uuid", "payload": { "bucket": "code_editor" } }

trialDayReached

{ "type": "trialDayReached", "appID": "B1234567-...", "clientUser": "sha256-of-anonymous-id", "sessionID": "uuid", "payload": { "day": "7" } }

sttFailed

{ "type": "sttFailed", "appID": "B1234567-...", "clientUser": "sha256-of-anonymous-id", "sessionID": "uuid", "payload": { "errorType": "WhisperError" } }

Note: clientUser is a SHA-256 hash generated by the TelemetryDeck SDK from a random device identifier. It cannot be reversed to identify you. appID is ThoughtMic's public TelemetryDeck app identifier.

PII defense in depth

Even if a bug accidentally passed personal data to the telemetry layer, it would be caught and scrubbed before leaving your Mac:

  • Every payload field is checked against regex patterns for email addresses, file paths (e.g., /Users/...), vault paths (*.md), and home directory references (~/...).
  • Any matching field is replaced with [redacted] before the event is dispatched.
  • Sentry crash reports run through a separate beforeSend hook that scrubs event messages, extra context, and breadcrumbs using the same patterns.

How to disable telemetry

In the app

  1. Open ThoughtMic Preferences (click the menu bar icon → Preferences)
  2. Go to the Privacy tab
  3. Toggle off "Send anonymous usage metrics" and/or "Send crash reports"

Changes take effect immediately. No restart needed.

Via Terminal

  1. defaults write com.thoughtmic.ThoughtMic telemetryEnabled -bool false
  2. defaults write com.thoughtmic.ThoughtMic crashReportsEnabled -bool false

Via Little Snitch / firewall

Block outbound connections from ThoughtMic to:

  • nom.telemetrydeck.com (TelemetryDeck ingest)
  • *.ingest.sentry.io (Sentry crash reports)

This will not affect core functionality. Dictation, transcription, and vault writes all happen locally. Only cloud rephrasing (for Pro users) requires network access to thoughtmic-worker.thoughtmic.workers.dev.

Verify it yourself

The TelemetryDeck Swift SDK is fully open source. You can read every line of code that runs on your Mac:

github.com/TelemetryDeck/SwiftSDK

The Sentry Cocoa SDK is also open source:

github.com/getsentry/sentry-cocoa