Skip to content

Commit c3b2a13

Browse files
authored
Add usage statistics collection (#1418)
* add usage statistics collection * add app version * some privacy improvements * Reset client ID when disabling stats collection * Round install time to make it harder to use as a unique identifier * add doc
1 parent 77e146e commit c3b2a13

29 files changed

+113
-0
lines changed

docs/statistics.md

+17
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
## Usage statistics collection in Min
2+
3+
By default, Min sends some statistics about how it's used. Currently, these include:
4+
5+
* Your operating system and computer language
6+
* When you installed Min
7+
* The version of Min that you're using
8+
* How often you use certain features in Min
9+
* An anonymous ID representing your installation of Min
10+
11+
Collecting this data allows us to prioritize which devices and operating systems we test and which features we work on.
12+
13+
Min does not send:
14+
* Anything that can be used to personally identify you
15+
* Any browsing history, passwords, or other data stored locally in Min
16+
17+
If you want to opt-out of statistics collection, you can do so by going to the preferences page within Min and de-selecting "send usage statistics".

js/default.js

+1
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,7 @@ require('passwordManager/passwordCapture.js').initialize()
149149
require('passwordManager/passwordViewer.js').initialize()
150150
require('util/theme.js').initialize()
151151
require('userscripts.js').initialize()
152+
require('statistics.js').initialize()
152153

153154
// default searchbar plugins
154155

js/statistics.js

+45
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
const settings = require('util/settings/settings.js')
2+
3+
const statistics = {
4+
upload: function () {
5+
if (settings.get('collectUsageStats') === false) {
6+
return
7+
}
8+
9+
fetch('https://services.minbrowser.org/stats/v1/collect', {
10+
method: 'post',
11+
headers: {
12+
'Content-Type': 'application/json'
13+
},
14+
body: JSON.stringify({
15+
clientID: settings.get('clientID'),
16+
installTime: settings.get('installTime'),
17+
os: process.platform,
18+
lang: navigator.language,
19+
appVersion: window.globalArgs['app-version']
20+
})
21+
})
22+
.catch(e => console.warn('failed to send usage statistics', e))
23+
},
24+
initialize: function () {
25+
setTimeout(statistics.upload, 10000)
26+
setInterval(statistics.upload, 24 * 60 * 60 * 1000)
27+
28+
settings.listen('collectUsageStats', function (value) {
29+
if (value === false) {
30+
// disabling stats collection should reset client ID
31+
settings.set('clientID', undefined)
32+
} else if (!settings.get('clientID')) {
33+
settings.set('clientID', Math.random().toString().slice(2))
34+
}
35+
})
36+
37+
if (!settings.get('installTime')) {
38+
// round install time to nearest hour to reduce uniqueness
39+
const roundingFactor = 60 * 60 * 1000
40+
settings.set('installTime', Math.floor(Date.now() / roundingFactor) * roundingFactor)
41+
}
42+
}
43+
}
44+
45+
module.exports = statistics

localization/languages/ar.json

+1
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,7 @@
154154
},
155155
"settingsUserAgentToggle": null, //missing translation
156156
"settingsUpdateNotificationsToggle": null, //missing translation
157+
"settingsUsageStatisticsToggle": null, //missing translation
157158
"settingsSearchEngineHeading": "محرك بحث",
158159
"settingsDefaultSearchEngine": "اختر محرك بحث اساسي",
159160
"settingsDDGExplanation": "كمحرك بحث اساسي لرؤية النتائج الآنية في مربع البحث DuckDuckGo ",

localization/languages/bg.json

+1
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,7 @@
153153
},
154154
"settingsUserAgentToggle": "Използване на персонализиран потребителски агент",
155155
"settingsUpdateNotificationsToggle": "Автоматично проверяване за актуализации",
156+
"settingsUsageStatisticsToggle": null, //missing translation
156157
"settingsSearchEngineHeading": "Търсачки",
157158
"settingsDefaultSearchEngine": "Изберете търсачка по подразбиране:",
158159
"settingsDDGExplanation": "Поставете DuckDuckGo като търсачка по подразбиране, за да получавате моментални отговори в лентата за търсене.",

localization/languages/bn.json

+1
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,7 @@
154154
},
155155
"settingsUserAgentToggle": "একটি কাস্টম ব্যবহারকারী এজেন্ট ব্যবহার করুন",
156156
"settingsUpdateNotificationsToggle": "স্বয়ংক্রিয়ভাবে আপডেটগুলির জন্য পরীক্ষা করুন",
157+
"settingsUsageStatisticsToggle": null, //missing translation
157158
"settingsSearchEngineHeading": "খোঁজ যন্ত্র",
158159
"settingsDefaultSearchEngine": "একটি ডিফল্ট অনুসন্ধান ইঞ্জিন চয়ন করুন:",
159160
"settingsDDGExplanation": "Searchbar এ তাত্ক্ষণিক উত্তর দেখতে ডিফল্ট অনুসন্ধান ইঞ্জিন হিসাবে DuckDuckGo সেট করুন।",

localization/languages/cs.json

+1
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,7 @@
154154
},
155155
"settingsUserAgentToggle": "Použít vlastní user agent",
156156
"settingsUpdateNotificationsToggle": "Automaticky kontrolovat aktualizace",
157+
"settingsUsageStatisticsToggle": null, //missing translation
157158
"settingsSearchEngineHeading": "Vyhledávač",
158159
"settingsDefaultSearchEngine": "Zvolte si výchozí vyhledávač:",
159160
"settingsDDGExplanation": "Nastavte DuckDuckGo jako výchozí vyhledávač pro zobrazování okamžitých odpovědí ve vyhledávacím panelu.",

localization/languages/de.json

+1
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,7 @@
154154
},
155155
"settingsUserAgentToggle": "Benutzerdefiniertes Benutzer-Agent nutzen",
156156
"settingsUpdateNotificationsToggle": "Automatisch nach Aktualisierungen überprüfen",
157+
"settingsUsageStatisticsToggle": null, //missing translation
157158
"settingsSearchEngineHeading": "Suchmaschine",
158159
"settingsDefaultSearchEngine": "Standardsuchmaschine auswählen:",
159160
"settingsDDGExplanation": "DuckDuckGo als Standardsuchmaschine einstellen, um sofort Vorschläge in der Suchleiste zu erhalten.",

localization/languages/en-US.json

+3
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,9 @@
154154
},
155155
"settingsUserAgentToggle": "Use a custom user agent",
156156
"settingsUpdateNotificationsToggle": "Automatically check for updates",
157+
"settingsUsageStatisticsToggle": {
158+
"unsafeHTML": "Send usage statistics (<a href=\"https://github.com/minbrowser/min/blob/master/docs/statistics.md\">More info</a>)"
159+
},
157160
"settingsSearchEngineHeading": "Search Engine",
158161
"settingsDefaultSearchEngine": "Choose a default search engine:",
159162
"settingsDDGExplanation": "Set DuckDuckGo as the default search engine to see instant answers in the searchbar.",

localization/languages/es.json

+1
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,7 @@
152152
"settingsUserscriptsExplanation": null, //missing translation
153153
"settingsUserAgentToggle": null, //missing translation
154154
"settingsUpdateNotificationsToggle": null, //missing translation
155+
"settingsUsageStatisticsToggle": null, //missing translation
155156
"settingsSearchEngineHeading": "Motor de búsqueda",
156157
"settingsDefaultSearchEngine": "Elija un motor de búsqueda predeterminado:",
157158
"settingsDDGExplanation": "Establezca DuckDuckGo como motor de búsqueda predeterminado para ver respuestas instantáneas en la barra de búsqueda.",

localization/languages/fa.json

+1
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,7 @@
154154
},
155155
"settingsUserAgentToggle": null, //missing translation
156156
"settingsUpdateNotificationsToggle": null, //missing translation
157+
"settingsUsageStatisticsToggle": null, //missing translation
157158
"settingsSearchEngineHeading": "موتور جستجو",
158159
"settingsDefaultSearchEngine": "انتخاب موتور جستجوی پیش فرض:",
159160
"settingsDDGExplanation": "DuckDuckGo را به عنوان موتور جستجوی پیش فرض تنظیم کنید تا در نوار جستجو نتایج آنی ببینید.",

localization/languages/fr.json

+1
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,7 @@
154154
},
155155
"settingsUserAgentToggle": "Utiliser un user-agent particulier",
156156
"settingsUpdateNotificationsToggle": "Vérifier automatiquement pour des mises à jour",
157+
"settingsUsageStatisticsToggle": null, //missing translation
157158
"settingsSearchEngineHeading": "Moteur de recherche",
158159
"settingsDefaultSearchEngine": "Choisir un moteur de recherche par défaut :",
159160
"settingsDDGExplanation": "Définir DuckDuckGo comme moteur de recherche par défaut pour voir instantanément des résulats dans la barre de recherche.",

localization/languages/hu.json

+1
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,7 @@
152152
"settingsUserscriptsExplanation": "Felhasználói szkript magyarázat",
153153
"settingsUserAgentToggle": null, //missing translation
154154
"settingsUpdateNotificationsToggle": null, //missing translation
155+
"settingsUsageStatisticsToggle": null, //missing translation
155156
"settingsSearchEngineHeading": "Keresőmotor",
156157
"settingsDefaultSearchEngine": "Válasza ki az alap keresőmotort:",
157158
"settingsDDGExplanation": "Állitsa be a DuckDuckGo keresőmotort, hogy lássa a válaszokat a keresősorban.",

localization/languages/it.json

+1
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,7 @@
154154
},
155155
"settingsUserAgentToggle": null, //missing translation
156156
"settingsUpdateNotificationsToggle": "Controlla automaticamente la presenza di aggiornamenti",
157+
"settingsUsageStatisticsToggle": null, //missing translation
157158
"settingsSearchEngineHeading": "Motore di ricerca",
158159
"settingsDefaultSearchEngine": "Scegli un motore di ricerca predefinito:",
159160
"settingsDDGExplanation": "Imposta DuckDuckGo come motore di ricerca predefinito per vedere risposte istantanee nella barra di ricerca.",

localization/languages/ja.json

+1
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,7 @@
154154
},
155155
"settingsUserAgentToggle": "カスタムユーザーエージェントを使用する",
156156
"settingsUpdateNotificationsToggle": "アップデートを自動的に確認する",
157+
"settingsUsageStatisticsToggle": null, //missing translation
157158
"settingsSearchEngineHeading": "検索エンジン",
158159
"settingsDefaultSearchEngine": "デフォルトの検索エンジン:",
159160
"settingsDDGExplanation": "検索バーにインスタントアンサーを表示するには、DuckDuckGoをデフォルトの検索エンジンに設定してください。",

localization/languages/ko.json

+1
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,7 @@
154154
},
155155
"settingsUserAgentToggle": "사용자 정의 에이전트(UserAgent) 사용",
156156
"settingsUpdateNotificationsToggle": "판올림 자동 확인",
157+
"settingsUsageStatisticsToggle": null, //missing translation
157158
"settingsSearchEngineHeading": "검색 도구",
158159
"settingsDefaultSearchEngine": "기본 검색 도구:",
159160
"settingsDDGExplanation": "덕덕고(DuckDuckGo)를 기본 검색 도구로 설정하여 검색 창에서 바로 검색해 보세요.",

localization/languages/lt.json

+1
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,7 @@
154154
},
155155
"settingsUserAgentToggle": null, //missing translation
156156
"settingsUpdateNotificationsToggle": "Automatiškai tikrinti ar yra atnaujinimų",
157+
"settingsUsageStatisticsToggle": null, //missing translation
157158
"settingsSearchEngineHeading": "Paieškos sistema",
158159
"settingsDefaultSearchEngine": "Pasirinkite numatytąją paieškos sistemą:",
159160
"settingsDDGExplanation": "Nustatykite DuckDuckGo kaip numatytąją paieškos sistemą, norėdami paieškos juostoje matyti greitus atsakymus.",

localization/languages/pl.json

+1
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,7 @@
154154
},
155155
"settingsUserAgentToggle": "Użyj niestandardowego klienta użytkownika",
156156
"settingsUpdateNotificationsToggle": "Automatycznie sprawdź dostępność aktualizacji",
157+
"settingsUsageStatisticsToggle": null, //missing translation
157158
"settingsSearchEngineHeading": "Wyszukiwarka",
158159
"settingsDefaultSearchEngine": "Wybierz domyślną wyszukiwarkę:",
159160
"settingsDDGExplanation": "Ustaw DuckDuckGo jako domyślną wyszukiwarkę, aby zobaczyć błyskawiczne odpowiedzi na pasku wyszukiwania.",

localization/languages/pt-BR.json

+1
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,7 @@
154154
},
155155
"settingsUserAgentToggle": "Usar agente de usuário personalizado",
156156
"settingsUpdateNotificationsToggle": "Verificar atualizações automaticamente",
157+
"settingsUsageStatisticsToggle": null, //missing translation
157158
"settingsSearchEngineHeading": "Serviço de busca",
158159
"settingsDefaultSearchEngine": "Escolha o serviço de busca padrão:",
159160
"settingsDDGExplanation": "Defina DuckDuckGo como o serviço padrão de buscas para ver respostas instantâneas na barra de busca.",

localization/languages/pt-PT.json

+1
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,7 @@
154154
},
155155
"settingsUserAgentToggle": "Utilizar agente de utilizador personalizado",
156156
"settingsUpdateNotificationsToggle": "Procurar atualizações automaticamente",
157+
"settingsUsageStatisticsToggle": null, //missing translation
157158
"settingsSearchEngineHeading": "Motor de pesquisa",
158159
"settingsDefaultSearchEngine": "Escolha o motor de pesquisa padrão:",
159160
"settingsDDGExplanation": "Defina DuckDuckGo como motor de pesquisa padrão para poder obter sugestões imediatas na barra de pesquisa.",

localization/languages/ru.json

+1
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,7 @@
154154
},
155155
"settingsUserAgentToggle": "Использовать пользовательский user agent",
156156
"settingsUpdateNotificationsToggle": "Автоматически проверять наличие обновлений",
157+
"settingsUsageStatisticsToggle": null, //missing translation
157158
"settingsSearchEngineHeading": "Поиск",
158159
"settingsDefaultSearchEngine": "Выберите поисковую систему по умолчанию:",
159160
"settingsDDGExplanation": "Чтобы видеть мгновенные ответы в строке поиска, установите DuckDuckGo поисковиком по умолчанию.",

localization/languages/tr.json

+1
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,7 @@
154154
},
155155
"settingsUserAgentToggle": "Özel kullanıcı aracısı kullan",
156156
"settingsUpdateNotificationsToggle": "Güncelleştirmeleri otomatik olarak denetle",
157+
"settingsUsageStatisticsToggle": null, //missing translation
157158
"settingsSearchEngineHeading": "Arama Motoru",
158159
"settingsDefaultSearchEngine": "Bir varsayılan arama motoru seçin:",
159160
"settingsDDGExplanation": "Arama çubuğundaki anlık yanıtları görmek için DuckDuckGo’yu varsayılan arama motoru olarak ayarlayın.",

localization/languages/uk.json

+1
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,7 @@
155155
},
156156
"settingsUserAgentToggle": "Використовувати власний агент користувача",
157157
"settingsUpdateNotificationsToggle": "Автоматично перевіряти наявність оновлень",
158+
"settingsUsageStatisticsToggle": null, //missing translation
158159
"settingsSearchEngineHeading": "Пошукова система",
159160
"settingsDefaultSearchEngine": "Виберіть типову пошукову систему:",
160161
"settingsDDGExplanation": "Встановіть DuckDuckGo як типову пошукову систему, щоб побачити миттєві відповіді на панелі пошуку.",

localization/languages/uz.json

+1
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,7 @@
154154
},
155155
"settingsUserAgentToggle": "Maxsus foydalanvuchi agentidan foydalanish",
156156
"settingsUpdateNotificationsToggle": " Yangilanishlarni avtomatik ravishda tekshirish",
157+
"settingsUsageStatisticsToggle": null, //missing translation
157158
"settingsSearchEngineHeading": "Qidiruv Tizimi",
158159
"settingsDefaultSearchEngine": "Standart qidiruv tizimini tanlang:",
159160
"settingsDDGExplanation": "Qidiruv panelida tezkor javoblarni ko'rish uchun DuckDuckGo ni standart qidiruv tizimi sifatida o'rnating.",

localization/languages/vi.json

+1
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,7 @@
148148
},
149149
"settingsUserAgentToggle": null, //missing translation
150150
"settingsUpdateNotificationsToggle": "Tự động kiểm tra cập nhật",
151+
"settingsUsageStatisticsToggle": null, //missing translation
151152
"settingsSearchEngineHeading": "Công cụ tìm kiếm",
152153
"settingsDefaultSearchEngine": "Chọn công cụ tìm kiếm mặc định:",
153154
"settingsDDGExplanation": "Đặt DuckDuckGo thành công cụ tìm kiếm mặc định để xem câu trả lời ngay trong thanh tìm kiếm.",

localization/languages/zh-CN.json

+1
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,7 @@
154154
},
155155
"settingsUserAgentToggle": null, //missing translation
156156
"settingsUpdateNotificationsToggle": "自动检查更新",
157+
"settingsUsageStatisticsToggle": null, //missing translation
157158
"settingsSearchEngineHeading": "搜索引擎",
158159
"settingsDefaultSearchEngine": "选择默认的搜索引擎:",
159160
"settingsDDGExplanation": "将 DuckDuckGo 设为默认的搜索引擎可以直接在搜索栏查看搜索结果。",

localization/languages/zh-TW.json

+1
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,7 @@
154154
},
155155
"settingsUserAgentToggle": "使用自訂使用者代理",
156156
"settingsUpdateNotificationsToggle": "自動檢查更新",
157+
"settingsUsageStatisticsToggle": null, //missing translation
157158
"settingsSearchEngineHeading": "搜索引擎",
158159
"settingsDefaultSearchEngine": "選擇預設的搜索引擎:",
159160
"settingsDDGExplanation": "將 DuckDuckGo 設為預設的搜索引擎可以直接在網址欄查看搜尋結果",

pages/settings/index.html

+8
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,14 @@ <h3 data-string="settingsAdditionalFeaturesHeading"></h3>
182182
data-string="settingsUpdateNotificationsToggle"
183183
></label>
184184
</div>
185+
<div class="setting-section">
186+
<input type="checkbox" id="checkbox-usage-statistics" />
187+
<label
188+
for="checkbox-usage-statistics"
189+
data-string="settingsUsageStatisticsToggle"
190+
data-allowHTML
191+
></label>
192+
</div>
185193
</div>
186194

187195
<div class="settings-container" id="search-engine-settings-container">

pages/settings/settings.js

+16
Original file line numberDiff line numberDiff line change
@@ -306,6 +306,22 @@ updateNotificationsCheckbox.addEventListener('change', function (e) {
306306
settings.set('updateNotificationsEnabled', this.checked)
307307
})
308308

309+
/* usage statistics setting */
310+
311+
var usageStatisticsCheckbox = document.getElementById('checkbox-usage-statistics')
312+
313+
settings.get('collectUsageStats', function (value) {
314+
if (value === false) {
315+
usageStatisticsCheckbox.checked = false
316+
} else {
317+
usageStatisticsCheckbox.checked = true
318+
}
319+
})
320+
321+
usageStatisticsCheckbox.addEventListener('change', function (e) {
322+
settings.set('collectUsageStats', this.checked)
323+
})
324+
309325
/* default search engine setting */
310326

311327
var searchEngineDropdown = document.getElementById('default-search-engine')

0 commit comments

Comments
 (0)