What Analytics Does FluidVoice Collect and How It Protects User Privacy

FluidVoice collects only anonymous, low-cardinality usage metrics and hardware snapshots, while deliberately excluding user-generated content and personal identifiers through an opt-in/opt-out pipeline that can be disabled at any time in Settings.

FluidVoice, an open-source transcription application developed by altic-dev/FluidVoice, implements a privacy-first approach to telemetry. Understanding what analytics FluidVoice collects and how it protects user privacy requires examining the lightweight analytics pipeline built into the Swift source code. The system is designed to gather aggregate usage statistics without compromising sensitive user data or transcription content.

Anonymous Data Collection Only

Event Properties and Hardware Metadata

Every analytics event captured by AnalyticsService.shared.capture() automatically includes generic attributes such as app version, build number, OS version, and CPU architecture. According to Sources/Fluid/Analytics/AnalyticsService.swift (lines 55-94), these common event properties also track user-controlled settings like AI processing status, streaming preview mode, and hot-key configuration.

Additionally, a static hardware snapshot capturing CPU family, chip model, and hardware model is gathered once at startup and attached to every event (lines 103-114). This data helps developers understand performance across different Apple Silicon and Intel architectures without identifying individual users.

Anonymous Installation Identifier

Each installation receives a unique but anonymous identifier generated by AnalyticsIdentityStore.shared.anonymousInstallID. As implemented in Sources/Fluid/Analytics/AnalyticsIdentityStore.swift, this ID is strictly isolated from Apple ID, iCloud accounts, or any personal identifiers, ensuring pseudonymization of usage data while maintaining statistical accuracy.

The Analytics Pipeline Architecture

In-Memory Queue and Background Processing

The analytics service operates through an in-memory queue that drops oldest events when full and flushes batches in the background. According to Sources/Fluid/Analytics/AnalyticsService.swift (lines 4-8), the system uses fire-and-forget network requests to ensure the UI thread never blocks during transmission, maintaining app responsiveness during analytics uploads.

PostHog Integration and Data Transmission

When analytics is enabled, events serialize as JSON and POST to a configurable PostHog endpoint. If disabled, the queue clears immediately and no network traffic occurs (lines 18-30, 95-102). This opt-out mechanism ensures zero data leakage when users disable tracking, as pending events are discarded rather than transmitted.

User Privacy Controls

Settings and Default Behavior

The "Share Anonymous Analytics" toggle resides in Sources/Fluid/Persistence/SettingsStore.swift (lines 1274-1275) and defaults to ON. This design ensures existing installations upgrading to analytics-enabled versions do not silently opt-out, maintaining statistical continuity while respecting user choice through explicit visibility.

When users toggle analytics off, the app immediately records an analytics_consent_changed event and drops any pending events from the queue. This implementation in Sources/Fluid/UI/SettingsView.swift (line 1873) guarantees immediate cessation of data transmission upon opt-out, with no residual data lingering in memory.

Transparency in the UI

The AnalyticsPrivacyView.swift (lines 13-50) provides clear documentation within the Settings screen, explaining that only anonymous usage metrics are transmitted. The UI emphasizes that transcription content, personal files, and identity information remain strictly private and that analytics collection can be disabled at any time without affecting app functionality.

Code Examples

// Toggle analytics collection
AnalyticsService.shared.setEnabled(true)   // or false to disable

// Capture a generic event with custom properties
AnalyticsService.shared.capture(.transcriptionCompleted,
                                properties: ["duration_ms": 1234])

// Automatic properties attached to every event include:
// "app_version", "os_version", "hardware_arch_family", "cpu_family"

Summary

  • FluidVoice collects only low-cardinality, anonymous usage data (app opens, transcription completions, settings toggles) and hardware metadata, explicitly excluding transcription text or personal identifiers.
  • The analytics pipeline uses an in-memory queue with background flushing and fire-and-forget requests to prevent UI blocking.
  • An anonymous install ID provides pseudonymization without linking to Apple IDs or personal accounts.
  • Users maintain full control through a Settings toggle that defaults to ON but can be disabled instantly, immediately clearing pending events and stopping all network transmission.
  • The open-source implementation in altic-dev/FluidVoice ensures transparency about exactly what data leaves the device.

Frequently Asked Questions

Does FluidVoice collect my transcription text?

No. The analytics system deliberately excludes all user-generated content. According to the source code in Sources/Fluid/Analytics/AnalyticsService.swift, only predefined events like transcriptionCompleted are logged, containing metadata such as duration in milliseconds, never the actual transcribed text or audio samples.

What is the anonymous install ID?

The anonymous install ID is a unique identifier generated per installation by AnalyticsIdentityStore.swift. It enables understanding of user journeys and session counts without revealing personal identity. This ID is randomly generated on first launch and is never linked to your Apple ID, email, or any other personally identifying information.

Can I completely disable analytics?

Yes. Navigate to Settings and toggle "Share Anonymous Analytics" to OFF. Upon disabling, FluidVoice immediately records an analytics_consent_changed event, drops all pending queued events from memory, and ceases all network transmission to the analytics endpoint. The change takes effect instantly without requiring an app restart.

Where is the analytics data sent?

By default, events POST to a configurable PostHog endpoint as JSON payloads. The endpoint URL is configurable within the app settings, and when analytics is disabled, no network requests are generated and the in-memory queue is cleared, ensuring no residual data transmission occurs.

Have a question about this repo?

These articles cover the highlights, but your codebase questions are specific. Give your agent direct access to the source. Share this with your agent to get started:

Share the following with your agent to get started:
curl -s "https://instagit.com/install.md"

Works with
Claude Codex Cursor VS Code OpenClaw Any MCP Client

Maintain an open-source project? Get it listed too →