Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 5 additions & 5 deletions PRIVACY.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# Roo Code Privacy Policy

**Last Updated: August 20th, 2025**
**Last Updated: September 11th, 2025**

Roo Code respects your privacy and is committed to transparency about how we handle your data. Below is a simple breakdown of where key pieces of data go—and, importantly, where they don’t.

Expand All @@ -10,19 +10,19 @@ Roo Code respects your privacy and is committed to transparency about how we han
- **Commands**: Any commands executed through Roo Code happen on your local environment. However, when you use AI-powered features, the relevant code and context from your commands may be transmitted to your chosen AI model provider (e.g., OpenAI, Anthropic, OpenRouter) to generate responses. We do not have access to or store this data, but AI providers may process it per their privacy policies.
- **Prompts & AI Requests**: When you use AI-powered features, your prompts and relevant project context are sent to your chosen AI model provider (e.g., OpenAI, Anthropic, OpenRouter) to generate responses. We do not store or process this data. These AI providers have their own privacy policies and may store data per their terms of service. If you choose Roo Code Cloud as the provider (proxy mode), prompts may transit Roo Code servers only to forward them to the upstream model and are not stored.
- **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 only collect feature usage and error data if you explicitly opt-in. This telemetry is powered by PostHog and helps us understand feature usage to improve Roo Code. This includes your VS Code machine ID and feature usage patterns and exception reports. We do **not** collect personally identifiable information, your code, or AI prompts.
- **Marketplace Requests**: When you browse or search the Marketplace for Model Configuration Profiles (MCPs) or Custom Modes, Roo Code makes a secure API call to Roo Codes backend servers to retrieve listing information. These requests send only the query parameters (e.g., extension version, search term) necessary to fulfill the request and do not include your code, prompts, or personally identifiable information.
- **Telemetry (Usage Data)**: We collect anonymous feature usage and error data to help us improve Roo Code. This telemetry is powered by PostHog and includes your VS Code machine ID, feature usage patterns, and exception reports. This telemetry does **not** collect personally identifiable information, your code, or AI prompts. You can opt out of this telemetry at any time through the settings.
- **Marketplace Requests**: When you browse or search the Marketplace for Model Configuration Profiles (MCPs) or Custom Modes, Roo Code makes a secure API call to Roo Code's backend servers to retrieve listing information. These requests send only the query parameters (e.g., extension version, search term) necessary to fulfill the request and do not include your code, prompts, or personally identifiable information.

### **How We Use Your Data (If Collected)**

- If you opt-in to telemetry, we use it to understand feature usage and improve Roo Code.
- We use telemetry to understand feature usage and improve Roo Code.
- We do **not** sell or share your data.
- We do **not** train any models on your data.

### **Your Choices & Control**

- You can run models locally to prevent data being sent to third-parties.
- By default, telemetry collection is off and if you turn it on, you can opt out of telemetry at any time.
- Telemetry collection is enabled by default to help us improve Roo Code, but you can opt out at any time through the settings.
- You can delete Roo Code to stop all data collection.

### **Security & Updates**
Expand Down
6 changes: 3 additions & 3 deletions packages/telemetry/src/TelemetryService.ts
Original file line number Diff line number Diff line change
Expand Up @@ -36,14 +36,14 @@ export class TelemetryService {

/**
* Updates the telemetry state based on user preferences and VSCode settings
* @param didUserOptIn Whether the user has explicitly opted into telemetry
* @param isOptedIn Whether the user is opted into telemetry
*/
public updateTelemetryState(didUserOptIn: boolean): void {
public updateTelemetryState(isOptedIn: boolean): void {
if (!this.isReady) {
return
}

this.clients.forEach((client) => client.updateTelemetryState(didUserOptIn))
this.clients.forEach((client) => client.updateTelemetryState(isOptedIn))
}

/**
Expand Down
2 changes: 1 addition & 1 deletion packages/types/src/telemetry.ts
Original file line number Diff line number Diff line change
Expand Up @@ -242,7 +242,7 @@ export interface TelemetryClient {

setProvider(provider: TelemetryPropertiesProvider): void
capture(options: TelemetryEvent): Promise<void>
updateTelemetryState(didUserOptIn: boolean): void
updateTelemetryState(isOptedIn: boolean): void
isTelemetryEnabled(): boolean
shutdown(): Promise<void>
}
6 changes: 3 additions & 3 deletions src/core/webview/webviewMessageHandler.ts
Original file line number Diff line number Diff line change
Expand Up @@ -490,10 +490,10 @@ export const webviewMessageHandler = async (
),
)

// If user already opted in to telemetry, enable telemetry service
// Enable telemetry by default (when unset) or when explicitly enabled
provider.getStateToPostToWebview().then((state) => {
const { telemetrySetting } = state
const isOptedIn = telemetrySetting === "enabled"
const isOptedIn = telemetrySetting !== "disabled"
TelemetryService.instance.updateTelemetryState(isOptedIn)
})

Expand Down Expand Up @@ -2289,7 +2289,7 @@ export const webviewMessageHandler = async (
case "telemetrySetting": {
const telemetrySetting = message.text as TelemetrySetting
await updateGlobalState("telemetrySetting", telemetrySetting)
const isOptedIn = telemetrySetting === "enabled"
const isOptedIn = telemetrySetting !== "disabled"
TelemetryService.instance.updateTelemetryState(isOptedIn)
await provider.postStateToWebview()
break
Expand Down
4 changes: 2 additions & 2 deletions webview-ui/src/App.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -192,11 +192,11 @@ const App = () => {
useEvent("message", onMessage)

useEffect(() => {
if (shouldShowAnnouncement) {
if (shouldShowAnnouncement && tab === "chat") {
setShowAnnouncement(true)
vscode.postMessage({ type: "didShowAnnouncement" })
}
}, [shouldShowAnnouncement])
}, [shouldShowAnnouncement, tab])

useEffect(() => {
if (didHydrateState) {
Expand Down
2 changes: 1 addition & 1 deletion webview-ui/src/components/chat/ChatView.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -1777,6 +1777,7 @@ const ChatViewComponent: React.ForwardRefRenderFunction<ChatViewRef, ChatViewPro
<div
data-testid="chat-view"
className={isHidden ? "hidden" : "fixed top-0 left-0 right-0 bottom-0 flex flex-col overflow-hidden"}>
{telemetrySetting === "unset" && <TelemetryBanner />}
{(showAnnouncement || showAnnouncementModal) && (
<Announcement
hideAnnouncement={() => {
Expand Down Expand Up @@ -1840,7 +1841,6 @@ const ChatViewComponent: React.ForwardRefRenderFunction<ChatViewRef, ChatViewPro
/>

<RooHero />
{telemetrySetting === "unset" && <TelemetryBanner />}

<div className="mb-2.5">
{cloudIsAuthenticated || taskHistory.length < 4 ? (
Expand Down
84 changes: 26 additions & 58 deletions webview-ui/src/components/common/TelemetryBanner.tsx
Original file line number Diff line number Diff line change
@@ -1,85 +1,53 @@
import { memo, useState } from "react"
import { VSCodeButton, VSCodeLink } from "@vscode/webview-ui-toolkit/react"
import styled from "styled-components"
import { Trans } from "react-i18next"
import { VSCodeLink } from "@vscode/webview-ui-toolkit/react"

import type { TelemetrySetting } from "@roo-code/types"

import { vscode } from "@src/utils/vscode"
import { useAppTranslation } from "@src/i18n/TranslationContext"

const BannerContainer = styled.div`
background-color: var(--vscode-banner-background);
padding: 12px 20px;
display: flex;
flex-direction: column;
gap: 10px;
flex-shrink: 0;
margin-bottom: 6px;
`

const ButtonContainer = styled.div`
display: flex;
gap: 8px;
width: 100%;
& > vscode-button {
flex: 1;
}
`

const TelemetryBanner = () => {
const { t } = useAppTranslation()
const [hasChosen, setHasChosen] = useState(false)
const [isDismissed, setIsDismissed] = useState(false)

const handleAllow = () => {
setHasChosen(true)
const handleClose = () => {
setIsDismissed(true)
vscode.postMessage({ type: "telemetrySetting", text: "enabled" satisfies TelemetrySetting })
}

const handleDeny = () => {
setHasChosen(true)
vscode.postMessage({ type: "telemetrySetting", text: "disabled" satisfies TelemetrySetting })
}

const handleOpenSettings = () => {
window.postMessage({
type: "action",
action: "settingsButtonClicked",
values: { section: "about" }, // Link directly to about settings with telemetry controls
values: { section: "about" },
})
}

if (isDismissed) {
return null
}

return (
<BannerContainer>
<div className="relative px-4 py-2.5 pr-10 bg-vscode-banner-background border-b border-vscode-panel-border text-sm leading-normal text-vscode-foreground">
{/* Close button (X) */}
<button
onClick={handleClose}
className="absolute top-1.5 right-2 bg-transparent border-none text-vscode-foreground cursor-pointer text-2xl p-1 opacity-70 hover:opacity-100 transition-opacity duration-200 leading-none"
aria-label="Close">
×
</button>

<div className="mb-0.5 font-bold">{t("welcome:telemetry.helpImprove")}</div>
<div>
<strong>{t("welcome:telemetry.title")}</strong>
<div className="mt-1">
<Trans
i18nKey="welcome:telemetry.anonymousTelemetry"
components={{
privacyLink: <VSCodeLink href="https://roocode.com/privacy" />,
}}
/>
<div className="mt-1">
<Trans
i18nKey="welcome:telemetry.changeSettings"
components={{
settingsLink: <VSCodeLink href="#" onClick={handleOpenSettings} />,
}}
/>
.
</div>
</div>
<Trans
i18nKey="welcome:telemetry.helpImproveMessage"
components={{
settingsLink: <VSCodeLink href="#" onClick={handleOpenSettings} />,
}}
/>
</div>
<ButtonContainer>
<VSCodeButton appearance="primary" onClick={handleAllow} disabled={hasChosen}>
{t("welcome:telemetry.allow")}
</VSCodeButton>
<VSCodeButton appearance="secondary" onClick={handleDeny} disabled={hasChosen}>
{t("welcome:telemetry.deny")}
</VSCodeButton>
</ButtonContainer>
</BannerContainer>
</div>
)
}

Expand Down
2 changes: 1 addition & 1 deletion webview-ui/src/components/settings/About.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ export const About = ({ telemetrySetting, setTelemetrySetting, className, ...pro
<Section>
<div>
<VSCodeCheckbox
checked={telemetrySetting === "enabled"}
checked={telemetrySetting !== "disabled"}
onChange={(e: any) => {
const checked = e.target.checked === true
setTelemetrySetting(checked ? "enabled" : "disabled")
Expand Down
2 changes: 1 addition & 1 deletion webview-ui/src/i18n/locales/ca/settings.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

8 changes: 2 additions & 6 deletions webview-ui/src/i18n/locales/ca/welcome.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion webview-ui/src/i18n/locales/de/settings.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

8 changes: 2 additions & 6 deletions webview-ui/src/i18n/locales/de/welcome.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion webview-ui/src/i18n/locales/en/settings.json
Original file line number Diff line number Diff line change
Expand Up @@ -791,7 +791,7 @@
"feedback": "If you have any questions or feedback, feel free to open an issue at <githubLink>github.com/RooCodeInc/Roo-Code</githubLink> or join <redditLink>reddit.com/r/RooCode</redditLink> or <discordLink>discord.gg/roocode</discordLink>",
"telemetry": {
"label": "Allow anonymous error and usage reporting",
"description": "Help improve Roo Code by sending anonymous usage data and error reports. No code, prompts, or personal information is ever sent (unless you connect to Roo Code Cloud). See our <privacyLink>privacy policy</privacyLink> for more details."
"description": "Help improve Roo Code by sending anonymous usage data and error reports. This telemetry does not collect code, prompts or personal information. See our <privacyLink>privacy policy</privacyLink> for more details."
},
"settings": {
"import": "Import",
Expand Down
8 changes: 2 additions & 6 deletions webview-ui/src/i18n/locales/en/welcome.json
Original file line number Diff line number Diff line change
Expand Up @@ -16,12 +16,8 @@
"startRouter": "We recommend using an LLM Router:",
"startCustom": "Or you can bring your provider API key:",
"telemetry": {
"title": "Help Improve Roo Code",
"anonymousTelemetry": "Send anonymous error and usage data to help us fix bugs and improve the extension. No code, prompts, or personal information is ever sent (unless you connect to Roo Code Cloud). See our <privacyLink>privacy policy</privacyLink> for more details.",
"changeSettings": "You can always change this at the bottom of the <settingsLink>settings</settingsLink>",
"settings": "settings",
"allow": "Allow",
"deny": "Deny"
"helpImprove": "Help Improve Roo Code",
"helpImproveMessage": "Roo 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 <settingsLink>settings</settingsLink>."
},
"importSettings": "Import Settings"
}
2 changes: 1 addition & 1 deletion webview-ui/src/i18n/locales/es/settings.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

8 changes: 2 additions & 6 deletions webview-ui/src/i18n/locales/es/welcome.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion webview-ui/src/i18n/locales/fr/settings.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

8 changes: 2 additions & 6 deletions webview-ui/src/i18n/locales/fr/welcome.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading
Loading