diff --git a/CLAUDE.md b/CLAUDE.md index 291800ac..b6f5893f 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -10,6 +10,7 @@ All-in-one developer toolkit (~80 tools: formatters, security, generators, notes - Identity is local: fixed `uid` `"local"` from `utils/useAuth`, editable display name/avatar in local preferences (`useAppUser`). - All app data goes through `lib/backend-api.ts` / `lib/desktop/api-fetch.ts` → Tauri `local_api` → SQLCipher. The `/api/v1/...` paths are the local Rust router's contract, never HTTP. - Vault/masterkey creation is offline-only (desktop Rust mirror). +- Usage analytics = `lib/telemetry.ts` only: opt-in, anonymous (rotating session id, app version, locale), two events (`app_started`, `tool_opened {tool}`). Never send tool input, paths, or any stable id. Vercel Analytics / Clarity are marketing-site-only — never re-add them to `apps/desktop-ui`. ## Monorepo (pnpm) diff --git a/apps/desktop-ui/messages/af.json b/apps/desktop-ui/messages/af.json index 4eacd8c7..1223018e 100644 --- a/apps/desktop-ui/messages/af.json +++ b/apps/desktop-ui/messages/af.json @@ -216,6 +216,10 @@ "vaultIcons": { "label": "Wys werfikone in die kluis", "helpText": "Standaard af. Om 'n ikoon te haal vertel 'n derdeparty-diens by watter werwe jy rekeninge het." + }, + "telemetry": { + "label": "Deel anonieme gebruiksdata", + "helpText": "Standaard af. Stuur watter gereedskap jy oopmaak, die weergawe van die program en jou taal. Geen rekening, geen toestel-ID, en niks wat jy in 'n hulpmiddel tik nie." } }, "language": { @@ -5114,5 +5118,13 @@ "close": "Sluit", "pill": "Word bygewerk…", "pillPct": "Word bygewerk… {pct}%" + }, + "Telemetry": { + "consent": { + "title": "Help besluit wat volgende gebou word?", + "body": "Deel anonieme gebruik: watter gereedskap jy oopmaak, die weergawe van die program en jou taal. Geen rekening, geen toestel-ID, en niks wat jy in 'n hulpmiddel tik nie. Jy kan dit enige tyd in Instellings verander.", + "accept": "Deel anoniem", + "decline": "Nee dankie" + } } } diff --git a/apps/desktop-ui/messages/ar.json b/apps/desktop-ui/messages/ar.json index 43afe65e..38d21da9 100644 --- a/apps/desktop-ui/messages/ar.json +++ b/apps/desktop-ui/messages/ar.json @@ -216,6 +216,10 @@ "vaultIcons": { "label": "إظهار أيقونات المواقع في الخزنة", "helpText": "معطّل افتراضيًا. جلب الأيقونة يُخبر خدمة خارجية بالمواقع التي تملك فيها حسابات." + }, + "telemetry": { + "label": "مشاركة بيانات الاستخدام المجهولة", + "helpText": "معطّل افتراضيًا. يُرسل الأدوات التي تفتحها وإصدار التطبيق ولغتك. بدون حساب، وبدون معرّف جهاز، وبدون أي شيء تكتبه داخل الأدوات." } }, "language": { @@ -5103,5 +5107,13 @@ "close": "إغلاق", "pill": "جارٍ التحديث…", "pillPct": "جارٍ التحديث… {pct}%" + }, + "Telemetry": { + "consent": { + "title": "هل تساعدنا في تحديد ما نبنيه لاحقًا؟", + "body": "شارك الاستخدام بشكل مجهول: الأدوات التي تفتحها وإصدار التطبيق ولغتك. بدون حساب، وبدون معرّف جهاز، وبدون أي شيء تكتبه داخل الأدوات. يمكنك تغيير ذلك في أي وقت من الإعدادات.", + "accept": "المشاركة بشكل مجهول", + "decline": "لا، شكرًا" + } } } diff --git a/apps/desktop-ui/messages/ca.json b/apps/desktop-ui/messages/ca.json index 499ddfc4..44bedc74 100644 --- a/apps/desktop-ui/messages/ca.json +++ b/apps/desktop-ui/messages/ca.json @@ -216,6 +216,10 @@ "vaultIcons": { "label": "Mostra icones dels llocs a la caixa forta", "helpText": "Desactivat per defecte. Baixar una icona revela a un servei extern a quins llocs tens comptes." + }, + "telemetry": { + "label": "Comparteix dades d'ús anònimes", + "helpText": "Desactivat per defecte. Envia quines eines obres, la versió de l'aplicació i el teu idioma. Sense compte, sense identificador de dispositiu i sense res del que escrius a les eines." } }, "language": { @@ -5103,5 +5107,13 @@ "close": "Tanca", "pill": "S'està actualitzant…", "pillPct": "S'està actualitzant… {pct}%" + }, + "Telemetry": { + "consent": { + "title": "Vols ajudar a decidir què construïm després?", + "body": "Comparteix l'ús de manera anònima: quines eines obres, la versió de l'aplicació i el teu idioma. Sense compte, sense identificador de dispositiu i sense res del que escrius a les eines. Ho pots canviar en qualsevol moment a Configuració.", + "accept": "Comparteix anònimament", + "decline": "No, gràcies" + } } } diff --git a/apps/desktop-ui/messages/cs.json b/apps/desktop-ui/messages/cs.json index 82171f1d..28dc5e22 100644 --- a/apps/desktop-ui/messages/cs.json +++ b/apps/desktop-ui/messages/cs.json @@ -216,6 +216,10 @@ "vaultIcons": { "label": "Zobrazovat ikony webů v trezoru", "helpText": "Ve výchozím stavu vypnuto. Načtení ikony prozradí externí službě, na kterých webech máte účty." + }, + "telemetry": { + "label": "Sdílet anonymní data o používání", + "helpText": "Ve výchozím nastavení vypnuto. Odesílá, které nástroje otevíráte, verzi aplikace a váš jazyk. Žádný účet, žádné ID zařízení a nic, co v nástroji napíšete." } }, "language": { @@ -5103,5 +5107,13 @@ "close": "Zavřít", "pill": "Aktualizace…", "pillPct": "Aktualizace… {pct}%" + }, + "Telemetry": { + "consent": { + "title": "Pomůžete rozhodnout, co vznikne příště?", + "body": "Sdílejte používání anonymně: které nástroje otevíráte, verzi aplikace a váš jazyk. Žádný účet, žádné ID zařízení a nic, co v nástroji napíšete. Kdykoli to můžete změnit v Nastavení.", + "accept": "Sdílet anonymně", + "decline": "Ne, děkuji" + } } } diff --git a/apps/desktop-ui/messages/da.json b/apps/desktop-ui/messages/da.json index b8e33803..5e24bb60 100644 --- a/apps/desktop-ui/messages/da.json +++ b/apps/desktop-ui/messages/da.json @@ -216,6 +216,10 @@ "vaultIcons": { "label": "Vis webstedsikoner i boksen", "helpText": "Slået fra som standard. At hente et ikon fortæller en tredjepartstjeneste, hvilke websteder du har konti på." + }, + "telemetry": { + "label": "Del anonyme brugsdata", + "helpText": "Slået fra som standard. Sender hvilke værktøjer du åbner, appens version og dit sprog. Ingen konto, intet enheds-id og intet af det, du skriver i et værktøj." } }, "language": { @@ -5103,5 +5107,13 @@ "close": "Luk", "pill": "Opdaterer…", "pillPct": "Opdaterer… {pct} %" + }, + "Telemetry": { + "consent": { + "title": "Vil du hjælpe med at bestemme, hvad der bygges næst?", + "body": "Del brug anonymt: hvilke værktøjer du åbner, appens version og dit sprog. Ingen konto, intet enheds-id og intet af det, du skriver i et værktøj. Du kan altid ændre det under Indstillinger.", + "accept": "Del anonymt", + "decline": "Nej tak" + } } } diff --git a/apps/desktop-ui/messages/de.json b/apps/desktop-ui/messages/de.json index 8613c094..b36a0801 100644 --- a/apps/desktop-ui/messages/de.json +++ b/apps/desktop-ui/messages/de.json @@ -216,6 +216,10 @@ "vaultIcons": { "label": "Website-Symbole im Tresor anzeigen", "helpText": "Standardmäßig aus. Das Laden eines Symbols verrät einem Drittanbieter, bei welchen Seiten Sie Konten haben." + }, + "telemetry": { + "label": "Anonyme Nutzungsdaten teilen", + "helpText": "Standardmäßig aus. Sendet, welche Tools Sie öffnen, die App-Version und Ihre Sprache. Kein Konto, keine Geräte-ID und nichts, was Sie in ein Tool eingeben." } }, "language": { @@ -5103,5 +5107,13 @@ "close": "Schließen", "pill": "Wird aktualisiert…", "pillPct": "Wird aktualisiert… {pct} %" + }, + "Telemetry": { + "consent": { + "title": "Möchten Sie mitentscheiden, was als Nächstes entsteht?", + "body": "Nutzung anonym teilen: welche Tools Sie öffnen, die App-Version und Ihre Sprache. Kein Konto, keine Geräte-ID und nichts, was Sie in ein Tool eingeben. Sie können das jederzeit in den Einstellungen ändern.", + "accept": "Anonym teilen", + "decline": "Nein, danke" + } } } diff --git a/apps/desktop-ui/messages/el.json b/apps/desktop-ui/messages/el.json index 2865e2d6..dfbb9a66 100644 --- a/apps/desktop-ui/messages/el.json +++ b/apps/desktop-ui/messages/el.json @@ -216,6 +216,10 @@ "vaultIcons": { "label": "Εμφάνιση εικονιδίων ιστότοπων", "helpText": "Ανενεργό από προεπιλογή. Η λήψη εικονιδίου αποκαλύπτει σε τρίτη υπηρεσία σε ποιους ιστότοπους έχετε λογαριασμούς." + }, + "telemetry": { + "label": "Κοινοποίηση ανώνυμων δεδομένων χρήσης", + "helpText": "Απενεργοποιημένο από προεπιλογή. Στέλνει ποια εργαλεία ανοίγετε, την έκδοση της εφαρμογής και τη γλώσσα σας. Χωρίς λογαριασμό, χωρίς αναγνωριστικό συσκευής και χωρίς τίποτα από όσα πληκτρολογείτε σε ένα εργαλείο." } }, "language": { @@ -5103,5 +5107,13 @@ "close": "Κλείσιμο", "pill": "Ενημέρωση…", "pillPct": "Ενημέρωση… {pct}%" + }, + "Telemetry": { + "consent": { + "title": "Θέλετε να βοηθήσετε να αποφασιστεί τι θα φτιαχτεί στη συνέχεια;", + "body": "Μοιραστείτε ανώνυμα τη χρήση: ποια εργαλεία ανοίγετε, την έκδοση της εφαρμογής και τη γλώσσα σας. Χωρίς λογαριασμό, χωρίς αναγνωριστικό συσκευής και χωρίς τίποτα από όσα πληκτρολογείτε σε ένα εργαλείο. Μπορείτε να το αλλάξετε οποιαδήποτε στιγμή στις Ρυθμίσεις.", + "accept": "Ανώνυμη κοινοποίηση", + "decline": "Όχι, ευχαριστώ" + } } } diff --git a/apps/desktop-ui/messages/en.json b/apps/desktop-ui/messages/en.json index 20100c30..ee10a0be 100644 --- a/apps/desktop-ui/messages/en.json +++ b/apps/desktop-ui/messages/en.json @@ -216,6 +216,10 @@ "vaultIcons": { "label": "Show site icons in the vault", "helpText": "Off by default. Fetching an icon tells a third-party service which sites you hold accounts on." + }, + "telemetry": { + "label": "Share anonymous usage data", + "helpText": "Off by default. Sends which tools you open, the app version and your language. No account, no device ID, and nothing you type in a tool." } }, "language": { @@ -5124,5 +5128,13 @@ "close": "Close", "pill": "Updating…", "pillPct": "Updating… {pct}%" + }, + "Telemetry": { + "consent": { + "title": "Help decide what gets built next?", + "body": "Share anonymous usage: which tools you open, the app version and your language. No account, no device ID, and nothing you type in a tool. You can change this any time in Settings.", + "accept": "Share anonymously", + "decline": "No thanks" + } } } diff --git a/apps/desktop-ui/messages/es.json b/apps/desktop-ui/messages/es.json index 2826b57e..247e3ca5 100644 --- a/apps/desktop-ui/messages/es.json +++ b/apps/desktop-ui/messages/es.json @@ -216,6 +216,10 @@ "vaultIcons": { "label": "Mostrar iconos de sitios en la bóveda", "helpText": "Desactivado por defecto. Descargar un icono revela a un servicio externo en qué sitios tienes cuentas." + }, + "telemetry": { + "label": "Compartir datos de uso anónimos", + "helpText": "Desactivado por defecto. Envía qué herramientas abres, la versión de la aplicación y tu idioma. Sin cuenta, sin identificador de dispositivo y sin nada de lo que escribes en una herramienta." } }, "language": { @@ -5114,5 +5118,13 @@ "close": "Cerrar", "pill": "Actualizando…", "pillPct": "Actualizando… {pct}%" + }, + "Telemetry": { + "consent": { + "title": "¿Nos ayudas a decidir qué construir a continuación?", + "body": "Comparte el uso de forma anónima: qué herramientas abres, la versión de la aplicación y tu idioma. Sin cuenta, sin identificador de dispositivo y sin nada de lo que escribes en una herramienta. Puedes cambiarlo cuando quieras en Ajustes.", + "accept": "Compartir de forma anónima", + "decline": "No, gracias" + } } } diff --git a/apps/desktop-ui/messages/fa.json b/apps/desktop-ui/messages/fa.json index 59b06ac0..fd960552 100644 --- a/apps/desktop-ui/messages/fa.json +++ b/apps/desktop-ui/messages/fa.json @@ -216,6 +216,10 @@ "vaultIcons": { "label": "نمایش نمادهای سایت در گاوصندوق", "helpText": "بهطور پیشفرض خاموش. دریافت نماد به سرویس ثالث میگوید در چه سایتهایی حساب دارید." + }, + "telemetry": { + "label": "اشتراکگذاری دادههای ناشناس استفاده", + "helpText": "بهطور پیشفرض خاموش است. ارسال میکند که چه ابزارهایی را باز میکنید، نسخهٔ برنامه و زبان شما. بدون حساب کاربری، بدون شناسهٔ دستگاه و بدون هیچ چیزی که در ابزار مینویسید." } }, "language": { @@ -5114,5 +5118,13 @@ "close": "بستن", "pill": "در حال بهروزرسانی…", "pillPct": "در حال بهروزرسانی… {pct}٪" + }, + "Telemetry": { + "consent": { + "title": "کمک میکنید تصمیم بگیریم بعد چه چیزی ساخته شود؟", + "body": "استفاده را بهصورت ناشناس به اشتراک بگذارید: چه ابزارهایی را باز میکنید، نسخهٔ برنامه و زبان شما. بدون حساب کاربری، بدون شناسهٔ دستگاه و بدون هیچ چیزی که در ابزار مینویسید. هر زمان میتوانید این را در تنظیمات تغییر دهید.", + "accept": "اشتراکگذاری ناشناس", + "decline": "نه، ممنون" + } } } diff --git a/apps/desktop-ui/messages/fr.json b/apps/desktop-ui/messages/fr.json index f4177547..dd2b7081 100644 --- a/apps/desktop-ui/messages/fr.json +++ b/apps/desktop-ui/messages/fr.json @@ -216,6 +216,10 @@ "vaultIcons": { "label": "Afficher les icônes de sites dans le coffre", "helpText": "Désactivé par défaut. Récupérer une icône indique à un service tiers sur quels sites vous avez des comptes." + }, + "telemetry": { + "label": "Partager des données d'utilisation anonymes", + "helpText": "Désactivé par défaut. Envoie les outils que vous ouvrez, la version de l'application et votre langue. Aucun compte, aucun identifiant d'appareil et rien de ce que vous saisissez dans un outil." } }, "language": { @@ -5114,5 +5118,13 @@ "close": "Fermer", "pill": "Mise à jour…", "pillPct": "Mise à jour… {pct} %" + }, + "Telemetry": { + "consent": { + "title": "Vous voulez aider à décider de la suite ?", + "body": "Partagez votre utilisation de façon anonyme : les outils que vous ouvrez, la version de l'application et votre langue. Aucun compte, aucun identifiant d'appareil et rien de ce que vous saisissez dans un outil. Vous pouvez changer d'avis à tout moment dans les Paramètres.", + "accept": "Partager anonymement", + "decline": "Non merci" + } } } diff --git a/apps/desktop-ui/messages/id.json b/apps/desktop-ui/messages/id.json index 9b1b3f6e..f04b3d09 100644 --- a/apps/desktop-ui/messages/id.json +++ b/apps/desktop-ui/messages/id.json @@ -216,6 +216,10 @@ "vaultIcons": { "label": "Tampilkan ikon situs di brankas", "helpText": "Mati secara bawaan. Mengambil ikon memberi tahu layanan pihak ketiga di situs mana Anda punya akun." + }, + "telemetry": { + "label": "Bagikan data penggunaan anonim", + "helpText": "Nonaktif secara bawaan. Mengirim alat apa yang Anda buka, versi aplikasi, dan bahasa Anda. Tanpa akun, tanpa ID perangkat, dan tanpa apa pun yang Anda ketik di dalam alat." } }, "language": { @@ -5103,5 +5107,13 @@ "close": "Tutup", "pill": "Memperbarui…", "pillPct": "Memperbarui… {pct}%" + }, + "Telemetry": { + "consent": { + "title": "Bantu tentukan apa yang dibuat berikutnya?", + "body": "Bagikan penggunaan secara anonim: alat apa yang Anda buka, versi aplikasi, dan bahasa Anda. Tanpa akun, tanpa ID perangkat, dan tanpa apa pun yang Anda ketik di dalam alat. Anda dapat mengubahnya kapan saja di Pengaturan.", + "accept": "Bagikan secara anonim", + "decline": "Tidak, terima kasih" + } } } diff --git a/apps/desktop-ui/messages/it.json b/apps/desktop-ui/messages/it.json index b217e98e..a5d4201b 100644 --- a/apps/desktop-ui/messages/it.json +++ b/apps/desktop-ui/messages/it.json @@ -216,6 +216,10 @@ "vaultIcons": { "label": "Mostra icone dei siti nella cassaforte", "helpText": "Disattivato per impostazione predefinita. Scaricare un'icona rivela a un servizio esterno su quali siti hai account." + }, + "telemetry": { + "label": "Condividi dati di utilizzo anonimi", + "helpText": "Disattivato per impostazione predefinita. Invia quali strumenti apri, la versione dell'app e la tua lingua. Nessun account, nessun ID dispositivo e nulla di ciò che digiti in uno strumento." } }, "language": { @@ -5114,5 +5118,13 @@ "close": "Chiudi", "pill": "Aggiornamento…", "pillPct": "Aggiornamento… {pct}%" + }, + "Telemetry": { + "consent": { + "title": "Vuoi aiutarci a decidere cosa costruire dopo?", + "body": "Condividi l'utilizzo in forma anonima: quali strumenti apri, la versione dell'app e la tua lingua. Nessun account, nessun ID dispositivo e nulla di ciò che digiti in uno strumento. Puoi cambiare idea in qualsiasi momento nelle Impostazioni.", + "accept": "Condividi in forma anonima", + "decline": "No, grazie" + } } } diff --git a/apps/desktop-ui/messages/ja.json b/apps/desktop-ui/messages/ja.json index a5744b15..049c0a75 100644 --- a/apps/desktop-ui/messages/ja.json +++ b/apps/desktop-ui/messages/ja.json @@ -216,6 +216,10 @@ "vaultIcons": { "label": "保管庫でサイトアイコンを表示", "helpText": "既定はオフ。アイコンの取得は、どのサイトにアカウントがあるかを外部サービスに知らせます。" + }, + "telemetry": { + "label": "匿名の利用データを共有", + "helpText": "既定はオフ。開いたツール、アプリのバージョン、言語を送信します。アカウントも端末IDもなく、ツールに入力した内容は一切送信されません。" } }, "language": { @@ -5103,5 +5107,13 @@ "close": "閉じる", "pill": "更新中…", "pillPct": "更新中… {pct}%" + }, + "Telemetry": { + "consent": { + "title": "次に作るものを決めるのを手伝いませんか?", + "body": "利用状況を匿名で共有します。送るのは、開いたツール、アプリのバージョン、言語だけです。アカウントも端末IDもなく、ツールに入力した内容は一切送信されません。設定からいつでも変更できます。", + "accept": "匿名で共有", + "decline": "共有しない" + } } } diff --git a/apps/desktop-ui/messages/ko.json b/apps/desktop-ui/messages/ko.json index 3940bb7f..57c45243 100644 --- a/apps/desktop-ui/messages/ko.json +++ b/apps/desktop-ui/messages/ko.json @@ -216,6 +216,10 @@ "vaultIcons": { "label": "보관함에 사이트 아이콘 표시", "helpText": "기본값은 끔. 아이콘을 가져오면 어떤 사이트에 계정이 있는지 외부 서비스에 알려집니다." + }, + "telemetry": { + "label": "익명 사용 데이터 공유", + "helpText": "기본적으로 꺼져 있습니다. 어떤 도구를 열었는지, 앱 버전, 언어를 전송합니다. 계정도 기기 ID도 없으며, 도구에 입력한 내용은 전송되지 않습니다." } }, "language": { @@ -5103,5 +5107,13 @@ "close": "닫기", "pill": "업데이트 중…", "pillPct": "업데이트 중… {pct}%" + }, + "Telemetry": { + "consent": { + "title": "다음에 무엇을 만들지 정하는 데 도움을 주시겠어요?", + "body": "사용 정보를 익명으로 공유합니다: 어떤 도구를 열었는지, 앱 버전, 언어. 계정도 기기 ID도 없으며, 도구에 입력한 내용은 전송되지 않습니다. 설정에서 언제든지 변경할 수 있습니다.", + "accept": "익명으로 공유", + "decline": "괜찮습니다" + } } } diff --git a/apps/desktop-ui/messages/ms.json b/apps/desktop-ui/messages/ms.json index 6ca70daa..098a4975 100644 --- a/apps/desktop-ui/messages/ms.json +++ b/apps/desktop-ui/messages/ms.json @@ -216,6 +216,10 @@ "vaultIcons": { "label": "Tunjukkan ikon tapak dalam peti besi", "helpText": "Dimatikan secara lalai. Mengambil ikon memberitahu perkhidmatan pihak ketiga tapak mana anda mempunyai akaun." + }, + "telemetry": { + "label": "Kongsi data penggunaan tanpa nama", + "helpText": "Dimatikan secara lalai. Menghantar alat yang anda buka, versi aplikasi dan bahasa anda. Tiada akaun, tiada ID peranti, dan tiada apa-apa yang anda taip dalam alat." } }, "language": { @@ -5114,5 +5118,13 @@ "close": "Tutup", "pill": "Mengemas kini…", "pillPct": "Mengemas kini… {pct}%" + }, + "Telemetry": { + "consent": { + "title": "Bantu tentukan apa yang dibina seterusnya?", + "body": "Kongsi penggunaan tanpa nama: alat yang anda buka, versi aplikasi dan bahasa anda. Tiada akaun, tiada ID peranti, dan tiada apa-apa yang anda taip dalam alat. Anda boleh mengubahnya bila-bila masa dalam Tetapan.", + "accept": "Kongsi tanpa nama", + "decline": "Tidak, terima kasih" + } } } diff --git a/apps/desktop-ui/messages/nb.json b/apps/desktop-ui/messages/nb.json index b999fef0..ea489d08 100644 --- a/apps/desktop-ui/messages/nb.json +++ b/apps/desktop-ui/messages/nb.json @@ -216,6 +216,10 @@ "vaultIcons": { "label": "Vis nettstedsikoner i hvelvet", "helpText": "Av som standard. Å hente et ikon forteller en tredjepartstjeneste hvilke nettsteder du har kontoer på." + }, + "telemetry": { + "label": "Del anonyme bruksdata", + "helpText": "Av som standard. Sender hvilke verktøy du åpner, appversjonen og språket ditt. Ingen konto, ingen enhets-ID og ingenting av det du skriver i et verktøy." } }, "language": { @@ -5103,5 +5107,13 @@ "close": "Lukk", "pill": "Oppdaterer…", "pillPct": "Oppdaterer… {pct} %" + }, + "Telemetry": { + "consent": { + "title": "Vil du hjelpe med å bestemme hva som lages neste gang?", + "body": "Del bruk anonymt: hvilke verktøy du åpner, appversjonen og språket ditt. Ingen konto, ingen enhets-ID og ingenting av det du skriver i et verktøy. Du kan endre dette når som helst i Innstillinger.", + "accept": "Del anonymt", + "decline": "Nei takk" + } } } diff --git a/apps/desktop-ui/messages/nl.json b/apps/desktop-ui/messages/nl.json index 91862d92..4c09bf9c 100644 --- a/apps/desktop-ui/messages/nl.json +++ b/apps/desktop-ui/messages/nl.json @@ -216,6 +216,10 @@ "vaultIcons": { "label": "Site-iconen in de kluis tonen", "helpText": "Standaard uit. Een icoon ophalen vertelt een externe dienst bij welke sites je accounts hebt." + }, + "telemetry": { + "label": "Anonieme gebruiksgegevens delen", + "helpText": "Standaard uit. Verstuurt welke tools je opent, de app-versie en je taal. Geen account, geen apparaat-ID en niets van wat je in een tool typt." } }, "language": { @@ -5103,5 +5107,13 @@ "close": "Sluiten", "pill": "Bijwerken…", "pillPct": "Bijwerken… {pct}%" + }, + "Telemetry": { + "consent": { + "title": "Help je bepalen wat we hierna bouwen?", + "body": "Deel je gebruik anoniem: welke tools je opent, de app-versie en je taal. Geen account, geen apparaat-ID en niets van wat je in een tool typt. Je kunt dit altijd wijzigen in Instellingen.", + "accept": "Anoniem delen", + "decline": "Nee, bedankt" + } } } diff --git a/apps/desktop-ui/messages/pl.json b/apps/desktop-ui/messages/pl.json index 523b9d5a..a2e52692 100644 --- a/apps/desktop-ui/messages/pl.json +++ b/apps/desktop-ui/messages/pl.json @@ -216,6 +216,10 @@ "vaultIcons": { "label": "Pokazuj ikony witryn w sejfie", "helpText": "Domyślnie wyłączone. Pobranie ikony ujawnia zewnętrznej usłudze, na jakich witrynach masz konta." + }, + "telemetry": { + "label": "Udostępniaj anonimowe dane o użyciu", + "helpText": "Domyślnie wyłączone. Wysyła, które narzędzia otwierasz, wersję aplikacji i Twój język. Bez konta, bez identyfikatora urządzenia i bez niczego, co wpisujesz w narzędziu." } }, "language": { @@ -5103,5 +5107,13 @@ "close": "Zamknij", "pill": "Aktualizowanie…", "pillPct": "Aktualizowanie… {pct}%" + }, + "Telemetry": { + "consent": { + "title": "Pomożesz zdecydować, co powstanie w następnej kolejności?", + "body": "Udostępnij anonimowe dane o użyciu: które narzędzia otwierasz, wersję aplikacji i Twój język. Bez konta, bez identyfikatora urządzenia i bez niczego, co wpisujesz w narzędziu. Możesz to zmienić w każdej chwili w Ustawieniach.", + "accept": "Udostępnij anonimowo", + "decline": "Nie, dziękuję" + } } } diff --git a/apps/desktop-ui/messages/pt-BR.json b/apps/desktop-ui/messages/pt-BR.json index 129ae8ea..b683c90e 100644 --- a/apps/desktop-ui/messages/pt-BR.json +++ b/apps/desktop-ui/messages/pt-BR.json @@ -216,6 +216,10 @@ "vaultIcons": { "label": "Mostrar ícones dos sites no cofre", "helpText": "Desativado por padrão. Buscar um ícone informa a um serviço externo em quais sites você tem contas." + }, + "telemetry": { + "label": "Compartilhar dados de uso anônimos", + "helpText": "Desativado por padrão. Envia quais ferramentas você abre, a versão do app e seu idioma. Sem conta, sem ID de dispositivo e sem nada do que você digita em uma ferramenta." } }, "language": { @@ -5103,5 +5107,13 @@ "close": "Fechar", "pill": "Atualizando…", "pillPct": "Atualizando… {pct}%" + }, + "Telemetry": { + "consent": { + "title": "Quer ajudar a decidir o que construir em seguida?", + "body": "Compartilhe o uso de forma anônima: quais ferramentas você abre, a versão do app e seu idioma. Sem conta, sem ID de dispositivo e sem nada do que você digita em uma ferramenta. Você pode mudar isso quando quiser em Configurações.", + "accept": "Compartilhar anonimamente", + "decline": "Não, obrigado" + } } } diff --git a/apps/desktop-ui/messages/pt.json b/apps/desktop-ui/messages/pt.json index a4a880de..0ebe342f 100644 --- a/apps/desktop-ui/messages/pt.json +++ b/apps/desktop-ui/messages/pt.json @@ -216,6 +216,10 @@ "vaultIcons": { "label": "Mostrar ícones dos sites no cofre", "helpText": "Desativado por predefinição. Obter um ícone revela a um serviço externo em que sites tem contas." + }, + "telemetry": { + "label": "Partilhar dados de utilização anónimos", + "helpText": "Desativado por predefinição. Envia que ferramentas abre, a versão da aplicação e o seu idioma. Sem conta, sem identificador de dispositivo e sem nada do que escreve numa ferramenta." } }, "language": { @@ -5103,5 +5107,13 @@ "close": "Fechar", "pill": "A atualizar…", "pillPct": "A atualizar… {pct}%" + }, + "Telemetry": { + "consent": { + "title": "Quer ajudar a decidir o que se constrói a seguir?", + "body": "Partilhe a utilização de forma anónima: que ferramentas abre, a versão da aplicação e o seu idioma. Sem conta, sem identificador de dispositivo e sem nada do que escreve numa ferramenta. Pode alterar isto a qualquer momento nas Definições.", + "accept": "Partilhar anonimamente", + "decline": "Não, obrigado" + } } } diff --git a/apps/desktop-ui/messages/ru.json b/apps/desktop-ui/messages/ru.json index 73f6d43e..279dd21f 100644 --- a/apps/desktop-ui/messages/ru.json +++ b/apps/desktop-ui/messages/ru.json @@ -216,6 +216,10 @@ "vaultIcons": { "label": "Показывать значки сайтов в хранилище", "helpText": "По умолчанию выключено. Загрузка значка сообщает стороннему сервису, на каких сайтах у вас есть аккаунты." + }, + "telemetry": { + "label": "Делиться анонимными данными об использовании", + "helpText": "По умолчанию выключено. Отправляет, какие инструменты вы открываете, версию приложения и ваш язык. Без аккаунта, без идентификатора устройства и без того, что вы вводите в инструментах." } }, "language": { @@ -5103,5 +5107,13 @@ "close": "Закрыть", "pill": "Обновление…", "pillPct": "Обновление… {pct}%" + }, + "Telemetry": { + "consent": { + "title": "Поможете решить, что делать дальше?", + "body": "Делитесь анонимными данными: какие инструменты вы открываете, версия приложения и ваш язык. Без аккаунта, без идентификатора устройства и без того, что вы вводите в инструментах. Изменить это можно в любой момент в настройках.", + "accept": "Делиться анонимно", + "decline": "Нет, спасибо" + } } } diff --git a/apps/desktop-ui/messages/sv.json b/apps/desktop-ui/messages/sv.json index 73268739..f44fa205 100644 --- a/apps/desktop-ui/messages/sv.json +++ b/apps/desktop-ui/messages/sv.json @@ -216,6 +216,10 @@ "vaultIcons": { "label": "Visa webbplatsikoner i valvet", "helpText": "Av som standard. Att hämta en ikon berättar för en tredjepartstjänst vilka webbplatser du har konton på." + }, + "telemetry": { + "label": "Dela anonym användningsdata", + "helpText": "Av som standard. Skickar vilka verktyg du öppnar, appens version och ditt språk. Inget konto, inget enhets-ID och inget av det du skriver i ett verktyg." } }, "language": { @@ -5114,5 +5118,13 @@ "close": "Stäng", "pill": "Uppdaterar…", "pillPct": "Uppdaterar… {pct} %" + }, + "Telemetry": { + "consent": { + "title": "Vill du hjälpa till att avgöra vad som byggs härnäst?", + "body": "Dela användning anonymt: vilka verktyg du öppnar, appens version och ditt språk. Inget konto, inget enhets-ID och inget av det du skriver i ett verktyg. Du kan ändra detta när som helst i Inställningar.", + "accept": "Dela anonymt", + "decline": "Nej tack" + } } } diff --git a/apps/desktop-ui/messages/tr.json b/apps/desktop-ui/messages/tr.json index bd8ae86b..796be883 100644 --- a/apps/desktop-ui/messages/tr.json +++ b/apps/desktop-ui/messages/tr.json @@ -216,6 +216,10 @@ "vaultIcons": { "label": "Kasada site simgelerini göster", "helpText": "Varsayılan olarak kapalı. Simge indirmek, hangi sitelerde hesabınız olduğunu üçüncü taraf bir hizmete bildirir." + }, + "telemetry": { + "label": "Anonim kullanım verilerini paylaş", + "helpText": "Varsayılan olarak kapalı. Hangi araçları açtığınızı, uygulama sürümünü ve dilinizi gönderir. Hesap yok, cihaz kimliği yok ve bir araca yazdığınız hiçbir şey gönderilmez." } }, "language": { @@ -5114,5 +5118,13 @@ "close": "Kapat", "pill": "Güncelleniyor…", "pillPct": "Güncelleniyor… %{pct}" + }, + "Telemetry": { + "consent": { + "title": "Sırada ne yapılacağına karar vermeye yardım eder misiniz?", + "body": "Kullanımı anonim olarak paylaşın: hangi araçları açtığınız, uygulama sürümü ve diliniz. Hesap yok, cihaz kimliği yok ve bir araca yazdığınız hiçbir şey gönderilmez. Bunu istediğiniz zaman Ayarlar'dan değiştirebilirsiniz.", + "accept": "Anonim olarak paylaş", + "decline": "Hayır, teşekkürler" + } } } diff --git a/apps/desktop-ui/messages/uk.json b/apps/desktop-ui/messages/uk.json index 602d0002..ec3ee262 100644 --- a/apps/desktop-ui/messages/uk.json +++ b/apps/desktop-ui/messages/uk.json @@ -216,6 +216,10 @@ "vaultIcons": { "label": "Показувати значки сайтів у сховищі", "helpText": "Типово вимкнено. Завантаження значка повідомляє сторонньому сервісу, на яких сайтах у вас є облікові записи." + }, + "telemetry": { + "label": "Ділитися анонімними даними про використання", + "helpText": "Типово вимкнено. Надсилає, які інструменти ви відкриваєте, версію застосунку та вашу мову. Без облікового запису, без ідентифікатора пристрою й без того, що ви вводите в інструментах." } }, "language": { @@ -5114,5 +5118,13 @@ "close": "Закрити", "pill": "Оновлення…", "pillPct": "Оновлення… {pct}%" + }, + "Telemetry": { + "consent": { + "title": "Допоможете вирішити, що створити далі?", + "body": "Діліться анонімними даними: які інструменти ви відкриваєте, версія застосунку та ваша мова. Без облікового запису, без ідентифікатора пристрою й без того, що ви вводите в інструментах. Це можна змінити будь-коли в налаштуваннях.", + "accept": "Ділитися анонімно", + "decline": "Ні, дякую" + } } } diff --git a/apps/desktop-ui/messages/vi.json b/apps/desktop-ui/messages/vi.json index 7da1b8db..e1f27695 100644 --- a/apps/desktop-ui/messages/vi.json +++ b/apps/desktop-ui/messages/vi.json @@ -216,6 +216,10 @@ "vaultIcons": { "label": "Hiện biểu tượng trang web trong kho", "helpText": "Mặc định tắt. Việc tải biểu tượng cho dịch vụ bên thứ ba biết bạn có tài khoản ở những trang nào." + }, + "telemetry": { + "label": "Chia sẻ dữ liệu sử dụng ẩn danh", + "helpText": "Mặc định tắt. Gửi những công cụ bạn mở, phiên bản ứng dụng và ngôn ngữ của bạn. Không tài khoản, không ID thiết bị và không có bất kỳ nội dung nào bạn nhập trong công cụ." } }, "language": { @@ -5103,5 +5107,13 @@ "close": "Đóng", "pill": "Đang cập nhật…", "pillPct": "Đang cập nhật… {pct}%" + }, + "Telemetry": { + "consent": { + "title": "Bạn muốn giúp quyết định điều gì sẽ được xây dựng tiếp theo?", + "body": "Chia sẻ ẩn danh cách bạn dùng ứng dụng: những công cụ bạn mở, phiên bản ứng dụng và ngôn ngữ. Không tài khoản, không ID thiết bị và không có bất kỳ nội dung nào bạn nhập trong công cụ. Bạn có thể thay đổi bất cứ lúc nào trong Cài đặt.", + "accept": "Chia sẻ ẩn danh", + "decline": "Không, cảm ơn" + } } } diff --git a/apps/desktop-ui/messages/zh.json b/apps/desktop-ui/messages/zh.json index 03ad0d23..3e9414ec 100644 --- a/apps/desktop-ui/messages/zh.json +++ b/apps/desktop-ui/messages/zh.json @@ -216,6 +216,10 @@ "vaultIcons": { "label": "在保险库中显示网站图标", "helpText": "默认关闭。获取图标会让第三方服务知道你在哪些网站有账户。" + }, + "telemetry": { + "label": "共享匿名使用数据", + "helpText": "默认关闭。发送你打开了哪些工具、应用版本和语言。没有账号,没有设备 ID,也不会发送你在工具中输入的任何内容。" } }, "language": { @@ -5103,5 +5107,13 @@ "close": "关闭", "pill": "正在更新…", "pillPct": "正在更新… {pct}%" + }, + "Telemetry": { + "consent": { + "title": "帮我们决定下一步做什么?", + "body": "匿名共享使用情况:你打开了哪些工具、应用版本和语言。没有账号,没有设备 ID,也不会发送你在工具中输入的任何内容。你可以随时在设置中更改。", + "accept": "匿名共享", + "decline": "不用了" + } } } diff --git a/apps/desktop-ui/package.json b/apps/desktop-ui/package.json index 8c5922e3..edc4b60e 100644 --- a/apps/desktop-ui/package.json +++ b/apps/desktop-ui/package.json @@ -19,7 +19,6 @@ "@dnd-kit/sortable": "^10.0.0", "@dnd-kit/utilities": "^3.2.2", "@hookform/resolvers": "^3", - "@microsoft/clarity": "^1.0.2", "@milkdown/crepe": "7.21.3", "@milkdown/kit": "7.21.3", "@monaco-editor/react": "^4.7.0", @@ -57,8 +56,6 @@ "@tauri-apps/plugin-opener": "^2.5.4", "@tauri-apps/plugin-process": "^2.3.1", "@tauri-apps/plugin-updater": "^2.10.1", - "@vercel/analytics": "^1.5.0", - "@vercel/speed-insights": "^1.2.0", "@zxcvbn-ts/core": "^4.1.2", "@zxcvbn-ts/language-common": "^4.1.3", "aws4fetch": "^1.0.20", diff --git a/apps/desktop-ui/src/app/settings/page.tsx b/apps/desktop-ui/src/app/settings/page.tsx index ff5b7670..ee664f2d 100644 --- a/apps/desktop-ui/src/app/settings/page.tsx +++ b/apps/desktop-ui/src/app/settings/page.tsx @@ -8,6 +8,7 @@ import { Sun, Globe, Palette, Check, Lock } from 'lucide-react' import { IDLE_TIMEOUT_KEY, getIdleTimeoutMinutes } from '@/lib/use-idle-lock' import { Switch } from '@/components/ui/switch' import { getVaultIconsEnabled, setVaultIconsEnabled } from '@/lib/vault-icon-pref' +import { getConsent, setConsent } from '@/lib/telemetry' import { useTheme } from 'next-themes' import { cn } from '@/lib/utils' import { useLocale, useTranslations } from 'next-intl' @@ -38,11 +39,13 @@ export default function SettingsPage() { const [mounted, setMounted] = useState(false) const [idleTimeout, setIdleTimeout] = useState('15') const [vaultIcons, setVaultIcons] = useState(false) + const [telemetry, setTelemetry] = useState(false) useEffect(() => { setMounted(true) setIdleTimeout(String(getIdleTimeoutMinutes())) setVaultIcons(getVaultIconsEnabled()) + setTelemetry(getConsent() === 'granted') }, []) const handleIdleTimeoutChange = (value: string) => { @@ -196,6 +199,23 @@ export default function SettingsPage() { }} /> + + {/* Off until explicitly granted — see lib/telemetry.ts for what + a granted event actually contains. */} +
{t('security.telemetry.helpText')}
+{t('consent.title')}
+{t('consent.body')}
+- Free for everyone — every tool, every feature, no paid tier and no limits — and open source under the GNU AGPL v3, so you can read exactly what it does. No ads, no tracking, no data harvesting. Compare MyDevTools to Postman (API client alternative), DBeaver (database GUI), scattered single-purpose websites, and other dev tool platforms—we unify what others scatter across 20 tabs. + Free for everyone — every tool, every feature, no paid tier and no limits — and open source under the GNU AGPL v3, so you can read exactly what it does. No ads, no data harvesting, and no tracking: usage stats are anonymous, off by default, and yours to switch on. Compare MyDevTools to Postman (API client alternative), DBeaver (database GUI), scattered single-purpose websites, and other dev tool platforms—we unify what others scatter across 20 tabs.