diff --git a/package.json b/package.json
index a697ef03..081c9919 100644
--- a/package.json
+++ b/package.json
@@ -33,6 +33,7 @@
"@iconscout/unicons": "^4.0.1",
"@masscode/json-server": "^0.18.0",
"@sipec/vue3-tags-input": "^3.0.4",
+ "@types/universal-analytics": "^0.4.5",
"@vueuse/core": "^8.1.2",
"ace-builds": "^1.4.14",
"electron-store": "^8.0.1",
@@ -41,6 +42,7 @@
"mitt": "^3.0.0",
"nanoid": "^3.3.1",
"pinia": "^2.0.12",
+ "universal-analytics": "^0.5.3",
"vue": "^3.2.26",
"vue-router": "^4.0.12",
"vue3-perfect-scrollbar": "^1.6.0"
diff --git a/src/main/preload.ts b/src/main/preload.ts
index d4dec540..c57cc1f1 100644
--- a/src/main/preload.ts
+++ b/src/main/preload.ts
@@ -2,6 +2,11 @@ import { contextBridge, ipcRenderer } from 'electron'
import { isDbExist, migrate, move } from './services/db'
import { store } from './store'
import type { ElectronBridge } from '@shared/types/main'
+import { version } from '../../package.json'
+import type { TrackEvents } from '@shared/types/main/analytics'
+import { analytics } from './services/analytics'
+
+const isDev = process.env.NODE_ENV === 'development'
contextBridge.exposeInMainWorld('electron', {
ipc: {
@@ -25,5 +30,14 @@ contextBridge.exposeInMainWorld('electron', {
migrate: path => migrate(path),
move: (from, to) => move(from, to),
isExist: path => isDbExist(path)
+ },
+ track: (event: TrackEvents, payload?: string) => {
+ if (isDev) return
+
+ const path = payload
+ ? `${version}/${event}/${payload}`
+ : `${version}/${event}`
+
+ analytics.pageview(path).send()
}
} as ElectronBridge)
diff --git a/src/main/services/analytics/index.ts b/src/main/services/analytics/index.ts
new file mode 100644
index 00000000..a4e12bdf
--- /dev/null
+++ b/src/main/services/analytics/index.ts
@@ -0,0 +1,4 @@
+import ua from 'universal-analytics'
+const analytics = ua('UA-56182454-13')
+
+export { analytics }
diff --git a/src/renderer/components/editor/TheEditor.vue b/src/renderer/components/editor/TheEditor.vue
index 1e304532..51aac0a1 100644
--- a/src/renderer/components/editor/TheEditor.vue
+++ b/src/renderer/components/editor/TheEditor.vue
@@ -36,6 +36,7 @@ import type { Language } from '@shared/types/renderer/editor'
import { languages } from './languages'
import { useAppStore } from '@/store/app'
import { useSnippetStore } from '@/store/snippets'
+import { track } from '@/electron'
interface Props {
lang: Language
@@ -143,6 +144,7 @@ const setValue = () => {
const setLang = () => {
editor.session.setMode(`ace/mode/${localLang.value}`)
+ track('snippets/set-language', localLang.value)
}
const setTheme = () => {
diff --git a/src/renderer/components/preferences/Storage.vue b/src/renderer/components/preferences/Storage.vue
index 0a0003df..f3c1ff2d 100644
--- a/src/renderer/components/preferences/Storage.vue
+++ b/src/renderer/components/preferences/Storage.vue
@@ -33,7 +33,7 @@