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

Lines changed: 113 additions & 0 deletions

docs/statistics.md

Lines changed: 17 additions & 0 deletions
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

Lines changed: 1 addition & 0 deletions
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

Lines changed: 45 additions & 0 deletions
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

Lines changed: 1 addition & 0 deletions
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

Lines changed: 1 addition & 0 deletions
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

Lines changed: 1 addition & 0 deletions
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

Lines changed: 1 addition & 0 deletions
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

Lines changed: 1 addition & 0 deletions
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

Lines changed: 3 additions & 0 deletions
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

Lines changed: 1 addition & 0 deletions
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.",

0 commit comments

Comments
 (0)