authorgravatar for julius0216@outlook.comJulius Marminge <julius0216@outlook.com> 2026-10-06 13:55:07-07:00
committergravatar for noreply@github.comGitHub <noreply@github.com> 2026-10-06 13:55:07-07:00
log115640ae49924c9e4e6215bd8d911445ad932bff
tree320b02c82b07949c2513c83c0372f779a7461ade
parent3b44698d07c722471279d6a933499d6108148632
signature Signed by PGP key B5690EEEBB952194

feat(web): note anonymous usage data in onboarding and link the privacy policy (#16564)

Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

4 files changed, 37 insertions(+), 1 deletions(-)

apps/web/src/components/onboarding/WelcomeWizard.tsx+16-1
......@@ -35,6 +35,7 @@ import { useCallback, useEffect, useMemo, useRef, useState } from "react";
3535import { TYPOGRAPHY_ADVANCED_STORAGE_KEY } from "../../appearanceFonts";
3636import { useLocalStorage } from "../../hooks/useLocalStorage";
3737import { hasCloudPublicConfig } from "../../cloud/publicConfig";
38import { PRIVACY_POLICY_URL } from "../../legalLinks";
3839import { useT3ConnectAuthPrompt } from "../clerk/useT3ConnectAuthPrompt";
3940import { useCompleteOnboarding } from "../../onboarding/firstRun";
4041import {
......@@ -413,8 +414,22 @@ function ConnectionStep({
413414 </Collapsible>
414415 </div>
415416 </div>
416 <div className="mt-6 flex items-center justify-end gap-3">
417 <div className="mt-6 flex flex-col-reverse gap-4 sm:flex-row sm:items-center sm:justify-between sm:gap-6">
418 <p className="min-w-0 text-xs leading-relaxed text-muted-foreground">
419 T3 Code collects anonymous usage data to help us improve it. To read more about how your
420 data is used and how to opt out, see our{" "}
421 <a
422 className="underline underline-offset-2 hover:text-foreground"
423 href={PRIVACY_POLICY_URL}
424 target="_blank"
425 rel="noreferrer noopener"
426 >
427 privacy policy
428 </a>
429 .
430 </p>
417431 <Button
432 className="shrink-0 self-end"
418433 ref={continueRef}
419434 autoFocus={!expandPairingInitially}
420435 disabled={!ready || isPairing}
apps/web/src/components/settings/SettingsPanels.tsx+14
......@@ -1,6 +1,7 @@
11import { SettingsGroup } from "./SettingsGroup";
22import { Spinner } from "~/components/ui/spinner";
33import { NotificationSettings } from "./NotificationSettings";
4import { PRIVACY_POLICY_URL } from "../../legalLinks";
45import { ArchiveIcon, ArchiveX, CheckIcon, ChevronRightIcon, SettingsIcon } from "lucide-react";
56import { Link, useNavigate } from "@tanstack/react-router";
67import type { CSSProperties, ReactNode } from "react";
......@@ -3342,6 +3343,19 @@ export function GeneralSettingsPanel() {
33423343 {IS_NIGHTLY_BUILD ? <NightlyMobileBetaRow /> : null}
33433344 </>
33443345 )}
3346 <SettingsRow
3347 {...searchableSetting("privacy-policy")}
3348 description="How we handle your data, including the anonymous usage data T3 Code collects."
3349 control={
3350 <Button
3351 render={<a href={PRIVACY_POLICY_URL} target="_blank" rel="noreferrer noopener" />}
3352 size="sm"
3353 variant="outline"
3354 >
3355 View policy
3356 </Button>
3357 }
3358 />
33453359 </SettingsSection>
33463360 <SettingsSection title="Diagnostics">
33473361 <SettingsRow
apps/web/src/components/settings/settingsSearch.ts+6
......@@ -503,6 +503,12 @@ export const SETTINGS_SEARCH_ITEMS = [
503503 scope: "project-defaults",
504504 searchTerms: ["generated thread titles source control content default provider"],
505505 },
506 {
507 id: "privacy-policy",
508 title: "Privacy policy",
509 to: "/settings/general",
510 searchTerms: ["telemetry analytics usage data tracking legal opt out"],
511 },
506512 {
507513 id: "diagnostics",
508514 title: "Diagnostics",
apps/web/src/legalLinks.ts created+1
......@@ -0,0 +1 @@
1export const PRIVACY_POLICY_URL = "https://t3.codes/privacy-policy";