diff --git a/PRIVACY.md b/PRIVACY.md
index aab1afdb4d..f960c32d7d 100644
--- a/PRIVACY.md
+++ b/PRIVACY.md
@@ -32,14 +32,15 @@ go—and, importantly, where they don't.
- **API Keys & Credentials**: If you enter an API key (e.g., to connect an AI
model), it is stored locally on your device and never sent to us or any third
party, except the provider you have chosen.
-- **Telemetry (Usage Data)**: We collect feature usage and error data to help
+- **Telemetry (Usage Data)**: Telemetry is **off by default**. If you explicitly
+ opt in through the settings, we collect feature usage and error data to help
us improve Bolt Code. This telemetry is powered by PostHog and includes your
VS Code machine ID, feature usage patterns, and exception reports. The VS Code
machine ID is a persistent identifier and may be considered personal data in
some jurisdictions; we use it only for product analytics and error grouping.
We retain telemetry only as long as needed for product analytics and debugging.
- Telemetry does **not** collect your code or AI prompts, and you can opt out at
- any time through the settings.
+ Telemetry does **not** collect your code or AI prompts, and you can opt back
+ out at any time through the settings.
- **Marketplace Requests**: When you browse or search the Marketplace for Model
Configuration Profiles (MCPs) or Custom Modes, Bolt Code makes a secure API
call to Bolt Code's backend servers to retrieve listing information. These
@@ -56,8 +57,8 @@ go—and, importantly, where they don't.
## **Your Choices & Control**
- You can run models locally to prevent data being sent to third-parties.
-- Telemetry collection is enabled by default to help us improve Bolt Code, but
- you can opt out at any time through the settings.
+- Telemetry collection is disabled by default. You can opt in, and back out,
+ at any time through the settings.
- You can delete Bolt Code to stop all data collection.
## **Security & Updates**
diff --git a/src/core/webview/__tests__/telemetrySettingsTracking.spec.ts b/src/core/webview/__tests__/telemetrySettingsTracking.spec.ts
index a99c8862a3..1019898b11 100644
--- a/src/core/webview/__tests__/telemetrySettingsTracking.spec.ts
+++ b/src/core/webview/__tests__/telemetrySettingsTracking.spec.ts
@@ -31,8 +31,8 @@ describe("Telemetry Settings Tracking", () => {
const newSetting = "disabled" as TelemetrySetting
// Simulate the logic from webviewMessageHandler
- const isOptedIn = newSetting !== "disabled"
- const wasPreviouslyOptedIn = previousSetting !== "disabled"
+ const isOptedIn = newSetting === "enabled"
+ const wasPreviouslyOptedIn = previousSetting === "enabled"
// If turning telemetry OFF, fire event BEFORE disabling
if (wasPreviouslyOptedIn && !isOptedIn && TelemetryService.hasInstance()) {
@@ -50,12 +50,12 @@ describe("Telemetry Settings Tracking", () => {
expect(mockTelemetryService.updateTelemetryState).toHaveBeenCalledWith(false)
})
- it("should fire event when going from unset to disabled", () => {
+ it("should not fire event when going from unset to disabled", () => {
const previousSetting = "unset" as TelemetrySetting
const newSetting = "disabled" as TelemetrySetting
- const isOptedIn = newSetting !== "disabled"
- const wasPreviouslyOptedIn = previousSetting !== "disabled"
+ const isOptedIn = newSetting === "enabled"
+ const wasPreviouslyOptedIn = previousSetting === "enabled"
if (wasPreviouslyOptedIn && !isOptedIn && TelemetryService.hasInstance()) {
TelemetryService.instance.captureTelemetrySettingsChanged(previousSetting, newSetting)
@@ -63,7 +63,10 @@ describe("Telemetry Settings Tracking", () => {
TelemetryService.instance.updateTelemetryState(isOptedIn)
- expect(mockTelemetryService.captureTelemetrySettingsChanged).toHaveBeenCalledWith("unset", "disabled")
+ // Telemetry is opt-in, so "unset" was never opted in; nothing was on,
+ // so there is no transition event to capture (and nothing to send it).
+ expect(mockTelemetryService.captureTelemetrySettingsChanged).not.toHaveBeenCalled()
+ expect(mockTelemetryService.updateTelemetryState).toHaveBeenCalledWith(false)
})
})
@@ -72,8 +75,8 @@ describe("Telemetry Settings Tracking", () => {
const previousSetting = "disabled" as TelemetrySetting
const newSetting = "enabled" as TelemetrySetting
- const isOptedIn = newSetting !== "disabled"
- const wasPreviouslyOptedIn = previousSetting !== "disabled"
+ const isOptedIn = newSetting === "enabled"
+ const wasPreviouslyOptedIn = previousSetting === "enabled"
// Update the telemetry state first
TelemetryService.instance.updateTelemetryState(isOptedIn)
@@ -95,8 +98,8 @@ describe("Telemetry Settings Tracking", () => {
const previousSetting = "enabled" as TelemetrySetting
const newSetting = "enabled" as TelemetrySetting
- const isOptedIn = newSetting !== "disabled"
- const wasPreviouslyOptedIn = previousSetting !== "disabled"
+ const isOptedIn = newSetting === "enabled"
+ const wasPreviouslyOptedIn = previousSetting === "enabled"
// Neither condition should be met
if (wasPreviouslyOptedIn && !isOptedIn && TelemetryService.hasInstance()) {
@@ -114,14 +117,13 @@ describe("Telemetry Settings Tracking", () => {
expect(mockTelemetryService.updateTelemetryState).toHaveBeenCalledWith(true)
})
- it("should fire event when going from unset to enabled (telemetry banner close)", () => {
+ it("should fire event AFTER enabling when going from unset to enabled (explicit opt-in)", () => {
const previousSetting = "unset" as TelemetrySetting
const newSetting = "enabled" as TelemetrySetting
- const isOptedIn = newSetting !== "disabled"
- const wasPreviouslyOptedIn = previousSetting !== "disabled"
+ const isOptedIn = newSetting === "enabled"
+ const wasPreviouslyOptedIn = previousSetting === "enabled"
- // For unset -> enabled, both are opted in, so no event should fire
if (wasPreviouslyOptedIn && !isOptedIn && TelemetryService.hasInstance()) {
TelemetryService.instance.captureTelemetrySettingsChanged(previousSetting, newSetting)
}
@@ -132,8 +134,13 @@ describe("Telemetry Settings Tracking", () => {
TelemetryService.instance.captureTelemetrySettingsChanged(previousSetting, newSetting)
}
- // unset is treated as opted-in, so no event should fire
- expect(mockTelemetryService.captureTelemetrySettingsChanged).not.toHaveBeenCalled()
+ // "unset" is off under opt-in semantics, so enabling is a real
+ // transition and the event fires after telemetry is turned on.
+ expect(mockTelemetryService.updateTelemetryState).toHaveBeenCalledWith(true)
+ expect(mockTelemetryService.captureTelemetrySettingsChanged).toHaveBeenCalledWith("unset", "enabled")
+ expect(mockTelemetryService.updateTelemetryState).toHaveBeenCalledBefore(
+ mockTelemetryService.captureTelemetrySettingsChanged,
+ )
})
})
diff --git a/src/core/webview/webviewMessageHandler.ts b/src/core/webview/webviewMessageHandler.ts
index d35f98b585..50c7beadf0 100644
--- a/src/core/webview/webviewMessageHandler.ts
+++ b/src/core/webview/webviewMessageHandler.ts
@@ -633,10 +633,11 @@ export const webviewMessageHandler = async (
),
)
- // Enable telemetry by default (when unset) or when explicitly enabled
+ // Telemetry is opt-in: only enabled when the user explicitly turned it on.
+ // "unset" (the default) and "disabled" both keep telemetry off.
await provider.getStateToPostToWebview().then((state) => {
const { telemetrySetting } = state
- const isOptedIn = telemetrySetting !== "disabled"
+ const isOptedIn = telemetrySetting === "enabled"
TelemetryService.instance.updateTelemetryState(isOptedIn)
})
@@ -2569,8 +2570,9 @@ export const webviewMessageHandler = async (
case "telemetrySetting": {
const telemetrySetting = message.text as TelemetrySetting
const previousSetting = getGlobalState("telemetrySetting") || "unset"
- const isOptedIn = telemetrySetting !== "disabled"
- const wasPreviouslyOptedIn = previousSetting !== "disabled"
+ // Opt-in semantics: only an explicit "enabled" turns telemetry on.
+ const isOptedIn = telemetrySetting === "enabled"
+ const wasPreviouslyOptedIn = previousSetting === "enabled"
// If turning telemetry OFF, fire event BEFORE disabling
if (wasPreviouslyOptedIn && !isOptedIn && TelemetryService.hasInstance()) {
diff --git a/webview-ui/src/__tests__/TelemetryClient.spec.ts b/webview-ui/src/__tests__/TelemetryClient.spec.ts
index 968de4fdd6..d40c30bf82 100644
--- a/webview-ui/src/__tests__/TelemetryClient.spec.ts
+++ b/webview-ui/src/__tests__/TelemetryClient.spec.ts
@@ -84,6 +84,14 @@ describe("TelemetryClient", () => {
// Assert
expect(posthog.init).not.toHaveBeenCalled()
})
+
+ it("doesn't initialize PostHog when telemetry is unset even with an API key and distinct ID", () => {
+ // Regression test for opt-in semantics: the default "unset" state must
+ // stay off even when a build ships a real key.
+ telemetryClient.updateTelemetryState("unset", "test-key", "test-user")
+
+ expect(posthog.init).not.toHaveBeenCalled()
+ })
})
/**
diff --git a/webview-ui/src/components/common/TelemetryBanner.tsx b/webview-ui/src/components/common/TelemetryBanner.tsx
index 3d39b17115..b5a5b23822 100644
--- a/webview-ui/src/components/common/TelemetryBanner.tsx
+++ b/webview-ui/src/components/common/TelemetryBanner.tsx
@@ -13,7 +13,9 @@ const TelemetryBanner = () => {
const handleClose = () => {
setIsDismissed(true)
- vscode.postMessage({ type: "telemetrySetting", text: "enabled" satisfies TelemetrySetting })
+ // Telemetry is opt-in; dismissing the banner records an explicit decline
+ // rather than silently opting the user in.
+ vscode.postMessage({ type: "telemetrySetting", text: "disabled" satisfies TelemetrySetting })
}
const handleOpenSettings = () => {
diff --git a/webview-ui/src/i18n/locales/ca/welcome.json b/webview-ui/src/i18n/locales/ca/welcome.json
index 2a76654d83..d0b3a53ae6 100644
--- a/webview-ui/src/i18n/locales/ca/welcome.json
+++ b/webview-ui/src/i18n/locales/ca/welcome.json
@@ -10,9 +10,5 @@
"goBack": "Enrere",
"finish": "Finalitza"
},
- "telemetry": {
- "helpImprove": "Ajuda a millorar Bolt Code",
- "helpImproveMessage": "Bolt Code recopila dades d'errors i ús per ajudar-nos a corregir errors i millorar l'extensió. Aquesta telemetria no recopila codi, indicacions o informació personal. Pots desactivar-la a configuració."
- },
"importSettings": "Importa la configuració"
}
diff --git a/webview-ui/src/i18n/locales/de/welcome.json b/webview-ui/src/i18n/locales/de/welcome.json
index 14a8d3c90c..9e67111b80 100644
--- a/webview-ui/src/i18n/locales/de/welcome.json
+++ b/webview-ui/src/i18n/locales/de/welcome.json
@@ -10,9 +10,5 @@
"goBack": "Zurück",
"finish": "Beenden"
},
- "telemetry": {
- "helpImprove": "Hilf, Bolt Code zu verbessern",
- "helpImproveMessage": "Bolt Code sammelt Fehler- und Nutzungsdaten, um uns dabei zu helfen, Fehler zu beheben und die Erweiterung zu verbessern. Diese Telemetrie sammelt keine Code-, Prompt- oder persönliche Informationen. Du kannst diese in den Einstellungen deaktivieren."
- },
"importSettings": "Einstellungen importieren"
}
diff --git a/webview-ui/src/i18n/locales/en/welcome.json b/webview-ui/src/i18n/locales/en/welcome.json
index 589dde6ee5..e66c1b8bb6 100644
--- a/webview-ui/src/i18n/locales/en/welcome.json
+++ b/webview-ui/src/i18n/locales/en/welcome.json
@@ -12,7 +12,7 @@
},
"telemetry": {
"helpImprove": "Help Improve Bolt Code",
- "helpImproveMessage": "Bolt Code collects error and usage data to help us fix bugs and improve the extension. This telemetry does not collect code, prompts or personal information. You can turn this off in settings."
+ "helpImproveMessage": "Telemetry is off by default. If you like, you can help us fix bugs and improve the extension by enabling anonymous error and usage reporting in settings. No code, prompts, or personal information is ever collected."
},
"importSettings": "Import Settings"
}
diff --git a/webview-ui/src/i18n/locales/es/welcome.json b/webview-ui/src/i18n/locales/es/welcome.json
index 23ec1b9132..521a47f543 100644
--- a/webview-ui/src/i18n/locales/es/welcome.json
+++ b/webview-ui/src/i18n/locales/es/welcome.json
@@ -10,9 +10,5 @@
"goBack": "Atrás",
"finish": "Finalizar"
},
- "telemetry": {
- "helpImprove": "Ayuda a mejorar Bolt Code",
- "helpImproveMessage": "Bolt Code recopila datos de errores y uso para ayudarnos a corregir errores y mejorar la extensión. Esta telemetría no recopila código, prompts o información personal. Puedes desactivar esto en la configuración."
- },
"importSettings": "Importar configuración"
}
diff --git a/webview-ui/src/i18n/locales/fr/welcome.json b/webview-ui/src/i18n/locales/fr/welcome.json
index 2561729b75..f8ccbdc46d 100644
--- a/webview-ui/src/i18n/locales/fr/welcome.json
+++ b/webview-ui/src/i18n/locales/fr/welcome.json
@@ -10,9 +10,5 @@
"goBack": "Retour",
"finish": "Terminer"
},
- "telemetry": {
- "helpImprove": "Aide à améliorer Bolt Code",
- "helpImproveMessage": "Bolt Code collecte des données d'erreurs et d'utilisation pour nous aider à corriger les bugs et améliorer l'extension. Cette télémétrie ne collecte pas de code, de prompts ou d'informations personnelles. Tu peux désactiver ceci dans les paramètres."
- },
"importSettings": "Importer les paramètres"
}
diff --git a/webview-ui/src/i18n/locales/hi/welcome.json b/webview-ui/src/i18n/locales/hi/welcome.json
index 5d45b4a6fb..ce32b184a1 100644
--- a/webview-ui/src/i18n/locales/hi/welcome.json
+++ b/webview-ui/src/i18n/locales/hi/welcome.json
@@ -10,9 +10,5 @@
"goBack": "वापस",
"finish": "समाप्त"
},
- "telemetry": {
- "helpImprove": "Bolt Code को बेहतर बनाने में मदद करें",
- "helpImproveMessage": "Bolt Code बग ठीक करने और एक्सटेंशन को बेहतर बनाने में हमारी मदद करने के लिए त्रुटि और उपयोग डेटा एकत्र करता है। यह दूरसंचार कोड, प्रॉम्प्ट या व्यक्तिगत जानकारी एकत्र नहीं करता है। आप इसे सेटिंग्स में अक्षम कर सकते हैं।"
- },
"importSettings": "सेटिंग्स आयात करें"
}
diff --git a/webview-ui/src/i18n/locales/id/welcome.json b/webview-ui/src/i18n/locales/id/welcome.json
index af0780fb83..56823cb9ba 100644
--- a/webview-ui/src/i18n/locales/id/welcome.json
+++ b/webview-ui/src/i18n/locales/id/welcome.json
@@ -10,9 +10,5 @@
"goBack": "Kembali",
"finish": "Selesai"
},
- "telemetry": {
- "helpImprove": "Bantu Tingkatkan Bolt Code",
- "helpImproveMessage": "Bolt Code mengumpulkan data kesalahan dan penggunaan untuk membantu kami memperbaiki bug dan meningkatkan ekstensi. Telemetri ini tidak mengumpulkan kode, prompt, atau informasi pribadi. Anda dapat menonaktifkannya di pengaturan."
- },
"importSettings": "Impor Pengaturan"
}
diff --git a/webview-ui/src/i18n/locales/it/welcome.json b/webview-ui/src/i18n/locales/it/welcome.json
index 47057fb266..af4363f9da 100644
--- a/webview-ui/src/i18n/locales/it/welcome.json
+++ b/webview-ui/src/i18n/locales/it/welcome.json
@@ -10,9 +10,5 @@
"goBack": "Indietro",
"finish": "Fine"
},
- "telemetry": {
- "helpImprove": "Aiuta a migliorare Bolt Code",
- "helpImproveMessage": "Bolt Code raccoglie dati di errore e utilizzo per aiutarci a correggere i bug e migliorare l'estensione. Questa telemetria non raccoglie codice, prompt o informazioni personali. Puoi disabilitare questa funzione in impostazioni."
- },
"importSettings": "Importa impostazioni"
}
diff --git a/webview-ui/src/i18n/locales/ja/welcome.json b/webview-ui/src/i18n/locales/ja/welcome.json
index e6bceab9b2..a5aeeca00f 100644
--- a/webview-ui/src/i18n/locales/ja/welcome.json
+++ b/webview-ui/src/i18n/locales/ja/welcome.json
@@ -10,9 +10,5 @@
"goBack": "戻る",
"finish": "完了"
},
- "telemetry": {
- "helpImprove": "Bolt Codeの改善にご協力ください",
- "helpImproveMessage": "Bolt Codeは、バグを修正し、拡張機能を改善するために、エラーおよび使用データを収集します。このテレメトリはコード、プロンプト、または個人情報を収集しません。これは設定で無効にできます。"
- },
"importSettings": "設定のインポート"
}
diff --git a/webview-ui/src/i18n/locales/ko/welcome.json b/webview-ui/src/i18n/locales/ko/welcome.json
index ecebe21c51..d4aefa49fb 100644
--- a/webview-ui/src/i18n/locales/ko/welcome.json
+++ b/webview-ui/src/i18n/locales/ko/welcome.json
@@ -10,9 +10,5 @@
"goBack": "뒤로",
"finish": "완료"
},
- "telemetry": {
- "helpImprove": "Bolt Code 개선에 도움주세요",
- "helpImproveMessage": "Bolt Code는 버그를 수정하고 확장을 개선하기 위해 오류 및 사용 데이터를 수집합니다. 이 원격 분석은 코드, 프롬프트 또는 개인 정보를 수집하지 않습니다. 설정에서 이를 비활성화할 수 있습니다."
- },
"importSettings": "설정 가져오기"
}
diff --git a/webview-ui/src/i18n/locales/nl/welcome.json b/webview-ui/src/i18n/locales/nl/welcome.json
index 07ffe79aa5..6597e9cec7 100644
--- a/webview-ui/src/i18n/locales/nl/welcome.json
+++ b/webview-ui/src/i18n/locales/nl/welcome.json
@@ -10,9 +10,5 @@
"goBack": "Terug",
"finish": "Klaar"
},
- "telemetry": {
- "helpImprove": "Help Bolt Code te verbeteren",
- "helpImproveMessage": "Bolt Code verzamelt fout- en gebruiksgegevens om ons te helpen bugs op te lossen en de extensie te verbeteren. Deze telemetrie verzamelt geen code, prompts of persoonlijke informatie. Je kunt dit in instellingen uitschakelen."
- },
"importSettings": "Instellingen importeren"
}
diff --git a/webview-ui/src/i18n/locales/pl/welcome.json b/webview-ui/src/i18n/locales/pl/welcome.json
index 856eeafd7c..df690f345d 100644
--- a/webview-ui/src/i18n/locales/pl/welcome.json
+++ b/webview-ui/src/i18n/locales/pl/welcome.json
@@ -10,9 +10,5 @@
"goBack": "Wróć",
"finish": "Zakończ"
},
- "telemetry": {
- "helpImprove": "Pomóż ulepszyć Bolt Code",
- "helpImproveMessage": "Bolt Code zbiera dane o błędach i użytkowaniu, aby pomóc nam naprawiać błędy i ulepszać rozszerzenie. Ta telemetria nie zbiera kodu, podpowiedzi ani danych osobowych. Możesz je wyłączyć w ustawieniach."
- },
"importSettings": "Importuj ustawienia"
}
diff --git a/webview-ui/src/i18n/locales/pt-BR/welcome.json b/webview-ui/src/i18n/locales/pt-BR/welcome.json
index 4a0af541b1..f0f51d3339 100644
--- a/webview-ui/src/i18n/locales/pt-BR/welcome.json
+++ b/webview-ui/src/i18n/locales/pt-BR/welcome.json
@@ -10,9 +10,5 @@
"goBack": "Voltar",
"finish": "Concluir"
},
- "telemetry": {
- "helpImprove": "Ajude a melhorar o Bolt Code",
- "helpImproveMessage": "Bolt Code coleta dados de erro e uso para nos ajudar a corrigir bugs e melhorar a extensão. Esta telemetria não coleta código, prompts ou informações pessoais. Você pode desabilitar isso nas configurações."
- },
"importSettings": "Importar configurações"
}
diff --git a/webview-ui/src/i18n/locales/ru/welcome.json b/webview-ui/src/i18n/locales/ru/welcome.json
index fe4505443f..205f132151 100644
--- a/webview-ui/src/i18n/locales/ru/welcome.json
+++ b/webview-ui/src/i18n/locales/ru/welcome.json
@@ -10,9 +10,5 @@
"goBack": "Назад",
"finish": "Завершить"
},
- "telemetry": {
- "helpImprove": "Помогите улучшить Bolt Code",
- "helpImproveMessage": "Bolt Code собирает данные об ошибках и использовании, чтобы помочь нам исправлять ошибки и улучшать расширение. Эта телеметрия не собирает код, приглашения или личную информацию. Вы можете отключить это в настройках."
- },
"importSettings": "Импортировать настройки"
}
diff --git a/webview-ui/src/i18n/locales/tr/welcome.json b/webview-ui/src/i18n/locales/tr/welcome.json
index d8c69f2210..f778150a9a 100644
--- a/webview-ui/src/i18n/locales/tr/welcome.json
+++ b/webview-ui/src/i18n/locales/tr/welcome.json
@@ -10,9 +10,5 @@
"goBack": "Geri",
"finish": "Bitir"
},
- "telemetry": {
- "helpImprove": "Bolt Code'u iyileştirmeye yardımcı ol",
- "helpImproveMessage": "Bolt Code, hataları düzeltmemize ve uzantıyı iyileştirmemize yardımcı olmak için hata ve kullanım verilerini toplar. Bu telemetri kod, komutlar veya kişisel bilgileri toplamaz. Bunu ayarlardan devre dışı bırakabilirsin."
- },
"importSettings": "Ayarları İçe Aktar"
}
diff --git a/webview-ui/src/i18n/locales/vi/welcome.json b/webview-ui/src/i18n/locales/vi/welcome.json
index 9ba62a5d7c..de2c3ac123 100644
--- a/webview-ui/src/i18n/locales/vi/welcome.json
+++ b/webview-ui/src/i18n/locales/vi/welcome.json
@@ -10,9 +10,5 @@
"goBack": "Quay lại",
"finish": "Hoàn thành"
},
- "telemetry": {
- "helpImprove": "Giúp cải thiện Bolt Code",
- "helpImproveMessage": "Bolt Code thu thập dữ liệu lỗi và sử dụng để giúp chúng tôi sửa lỗi và cải thiện tiện ích mở rộng. Dữ liệu từ xa này không thu thập mã, lời nhắc hoặc thông tin cá nhân. Bạn có thể vô hiệu hóa nó trong cài đặt."
- },
"importSettings": "Nhập Cài đặt"
}
diff --git a/webview-ui/src/i18n/locales/zh-CN/welcome.json b/webview-ui/src/i18n/locales/zh-CN/welcome.json
index 87f38a1b04..d26067c1e9 100644
--- a/webview-ui/src/i18n/locales/zh-CN/welcome.json
+++ b/webview-ui/src/i18n/locales/zh-CN/welcome.json
@@ -10,9 +10,5 @@
"goBack": "返回",
"finish": "完成"
},
- "telemetry": {
- "helpImprove": "帮助改进 Bolt Code",
- "helpImproveMessage": "Bolt Code 收集错误和使用数据以帮助我们修复 Bug 并改进扩展。此遥测不收集代码、提示或个人信息。你可以在设置中将其关闭。"
- },
"importSettings": "导入设置"
}
diff --git a/webview-ui/src/i18n/locales/zh-TW/welcome.json b/webview-ui/src/i18n/locales/zh-TW/welcome.json
index b861f4eba7..867204bed5 100644
--- a/webview-ui/src/i18n/locales/zh-TW/welcome.json
+++ b/webview-ui/src/i18n/locales/zh-TW/welcome.json
@@ -10,9 +10,5 @@
"goBack": "返回",
"finish": "完成"
},
- "telemetry": {
- "helpImprove": "幫助改進 Bolt Code",
- "helpImproveMessage": "Bolt Code 會收集錯誤和使用情況資料以幫助我們修復錯誤並改進擴充功能。此遙測不會收集程式碼、提示詞或個人資訊。您可以在 設定 中關閉。"
- },
"importSettings": "匯入設定"
}
diff --git a/webview-ui/src/utils/TelemetryClient.ts b/webview-ui/src/utils/TelemetryClient.ts
index 3e28a4f234..3f63b13df8 100644
--- a/webview-ui/src/utils/TelemetryClient.ts
+++ b/webview-ui/src/utils/TelemetryClient.ts
@@ -9,7 +9,8 @@ class TelemetryClient {
public updateTelemetryState(telemetrySetting: TelemetrySetting, apiKey?: string, distinctId?: string) {
posthog.reset()
- if (telemetrySetting !== "disabled" && apiKey && distinctId) {
+ // Opt-in semantics: only an explicit "enabled" turns telemetry on.
+ if (telemetrySetting === "enabled" && apiKey && distinctId) {
TelemetryClient.telemetryEnabled = true
posthog.init(apiKey, {