diff --git a/src/app/app.component.ts b/src/app/app.component.ts
index 19b8696818fdd102a39627999877f289c3b9e176..2169ad712f2a6f34327cdfad0905de2abe43891a 100644
--- a/src/app/app.component.ts
+++ b/src/app/app.component.ts
@@ -1,4 +1,4 @@
-import { Component, OnInit, OnDestroy, HostListener, ViewChild, ElementRef } from "@angular/core";
+import { Component, OnInit, OnDestroy, HostListener, ViewChild, ElementRef, isDevMode } from "@angular/core";
 import { Router, Event, NavigationEnd, ActivationEnd } from "@angular/router";
 import { MatDialog } from "@angular/material/dialog";
 import { MatSidenav } from "@angular/material/sidenav";
@@ -101,35 +101,37 @@ export class AppComponent implements OnInit, OnDestroy, Observer {
     ServiceFactory.instance.formulaireService = formulaireService;
     ServiceFactory.instance.notificationsService = notificationsService;
 
-    // évite de mettre en place un bandeau RGPD
-    this.matomoTracker.disableCookies();
-    // Set custom dimension for Electron / Cordova / pure Web browser
-    this.matomoTracker.setCustomDimension(1, this.getRunningPlatform());
-    // Matomo open-source Web analytics
-    this.matomoInjector.init("https://stasi.g-eau.fr/", 1);
-
-    this.router.events.subscribe((event: Event) => {
-      // close side navigation when clicking a calculator tab
-      if (event instanceof NavigationEnd) {
-        this.sidenav.close();
-        window.scrollTo(0, 0);
-      }
-      // [de]activate calc tabs depending on loaded route
-      if (event instanceof ActivationEnd) {
-        const path = event.snapshot.url[0].path;
-        if (path === "calculator") {
-          const calcUid = event.snapshot.params.uid;
-          if (this.calculatorExists(calcUid)) {
-            this.setActiveCalc(calcUid);
+    if (! isDevMode()) {
+      // évite de mettre en place un bandeau RGPD
+      this.matomoTracker.disableCookies();
+      // Set custom dimension for Electron / Cordova / pure Web browser
+      this.matomoTracker.setCustomDimension(1, this.getRunningPlatform());
+      // Matomo open-source Web analytics
+      this.matomoInjector.init("https://stasi.g-eau.fr/", 1);
+
+      this.router.events.subscribe((event: Event) => {
+        // close side navigation when clicking a calculator tab
+        if (event instanceof NavigationEnd) {
+          this.sidenav.close();
+          window.scrollTo(0, 0);
+        }
+        // [de]activate calc tabs depending on loaded route
+        if (event instanceof ActivationEnd) {
+          const path = event.snapshot.url[0].path;
+          if (path === "calculator") {
+            const calcUid = event.snapshot.params.uid;
+            if (this.calculatorExists(calcUid)) {
+              this.setActiveCalc(calcUid);
+            } else {
+              // if required calculator does not exist, redirect to list page
+              this.toList();
+            }
           } else {
-            // if required calculator does not exist, redirect to list page
-            this.toList();
+            this.setActiveCalc(null);
           }
-        } else {
-          this.setActiveCalc(null);
         }
-      }
-    });
+      });
+    }
 
     // hotkeys listeners
     this.hotkeysService.add(new Hotkey("alt+s", AppComponent.onHotkey(this.saveForm, this)));
@@ -520,7 +522,9 @@ export class AppComponent implements OnInit, OnDestroy, Observer {
    */
   private saveSession(calcList: any[], filename: string) {
     const session: string = this.buildSessionFile(calcList);
-    this.matomoTracker.trackEvent("userAction", "saveSession");
+    if (! isDevMode()) {
+      this.matomoTracker.trackEvent("userAction", "saveSession");
+    }
     this.formulaireService.downloadTextFile(session, filename);
   }
 
@@ -664,7 +668,9 @@ export class AppComponent implements OnInit, OnDestroy, Observer {
         this.notificationsService.notify(this.intlService.localizeText("ERROR_PROBLEM_LOADING_SESSION"), 3500);
       } else {
         if (data.loaded && data.loaded.length > 0) {
-          this.matomoTracker.trackEvent("userAction", "loadSession");
+          if (! isDevMode()) {
+            this.matomoTracker.trackEvent("userAction", "loadSession");
+          }
           // notes merge detection: was there already some notes ?
           const currentNotes = Session.getInstance().documentation;
           if (existingNotes !== "" && currentNotes !== existingNotes) {
diff --git a/src/app/components/app-setup/app-setup.component.ts b/src/app/components/app-setup/app-setup.component.ts
index 85b0d4512ae6dcdbddd9cd44990c14f9ff3da40d..66b9df46216df020241301b28f5f222a0584c024 100644
--- a/src/app/components/app-setup/app-setup.component.ts
+++ b/src/app/components/app-setup/app-setup.component.ts
@@ -1,4 +1,4 @@
-import { Component, OnInit } from "@angular/core";
+import { Component, OnInit, isDevMode } from "@angular/core";
 
 import { ParamDomainValue, Observer, ParamDomain } from "jalhyd";
 
@@ -36,7 +36,9 @@ export class ApplicationSetupComponent implements Observer, OnInit {
         private matomoTracker: MatomoTracker
     ) {
         this.appSetupService.addObserver(this);
-        this.matomoTracker.trackPageView("setup");
+        if (! isDevMode()) {
+            this.matomoTracker.trackPageView("setup");
+        }
     }
 
     public get availableLanguages() {
diff --git a/src/app/components/generic-calculator/calculator.component.ts b/src/app/components/generic-calculator/calculator.component.ts
index a72bd526e7e48fcb3a5638e015a38fdb3e170426..b31a21eb5c77d8eeabf733f890b041583d3b17df 100644
--- a/src/app/components/generic-calculator/calculator.component.ts
+++ b/src/app/components/generic-calculator/calculator.component.ts
@@ -1,5 +1,5 @@
 import { Component, OnInit, DoCheck, OnDestroy, ViewChild, ViewChildren,
-         QueryList, AfterViewChecked, ElementRef, Inject, forwardRef } from "@angular/core";
+         QueryList, AfterViewChecked, ElementRef, Inject, forwardRef, isDevMode } from "@angular/core";
 import { ActivatedRoute, Router } from "@angular/router";
 
 import {
@@ -334,7 +334,9 @@ export class GenericCalculatorComponent implements OnInit, DoCheck, AfterViewChe
     }
 
     public doCompute() {
-        this.matomoTracker.trackEvent("userAction", "triggerCalculation", CalculatorType[this._formulaire.currentNub.calcType]);
+        if (! isDevMode()) {
+            this.matomoTracker.trackEvent("userAction", "triggerCalculation", CalculatorType[this._formulaire.currentNub.calcType]);
+        }
         this._formulaire.resetResults([]);
         this.appComponent.showProgressBar = true;
         this._computeClicked = true;
diff --git a/src/app/components/modules-diagram/modules-diagram.component.ts b/src/app/components/modules-diagram/modules-diagram.component.ts
index b701aeac988e740c29a50945eff8cc63718fb7bb..150764b2089c833b495becd94e05fb26d3d9f361 100644
--- a/src/app/components/modules-diagram/modules-diagram.component.ts
+++ b/src/app/components/modules-diagram/modules-diagram.component.ts
@@ -4,7 +4,8 @@ import {
     AfterContentInit,
     OnInit,
     AfterViewChecked,
-    AfterViewInit
+    AfterViewInit,
+    isDevMode
 } from "@angular/core";
 import { Router } from "@angular/router";
 
@@ -59,7 +60,9 @@ export class ModulesDiagramComponent implements AfterContentInit, AfterViewCheck
         private matomoTracker: MatomoTracker
     ) {
         this.error = false;
-        this.matomoTracker.trackPageView("diagram");
+        if (! isDevMode()) {
+            this.matomoTracker.trackPageView("diagram");
+        }
     }
 
     public get uitextTitle(): string {
diff --git a/src/app/components/session-properties/session-properties.component.ts b/src/app/components/session-properties/session-properties.component.ts
index eb025789ea0b83a32cb4714422d26b7d7452e472..d9cbf6111f62aab70f2f74ff7cf1ee2b7ac45f11 100644
--- a/src/app/components/session-properties/session-properties.component.ts
+++ b/src/app/components/session-properties/session-properties.component.ts
@@ -1,4 +1,4 @@
-import { Component, OnInit } from "@angular/core";
+import { Component, OnInit, isDevMode } from "@angular/core";
 import { Router } from "@angular/router";
 
 import { I18nService } from "../../services/internationalisation.service";
@@ -30,7 +30,9 @@ export class SessionPropertiesComponent implements OnInit {
             throwOnError: false,
             errorColor: "#cc0000"
         };
-        this.matomoTracker.trackPageView("notes");
+        if (! isDevMode()) {
+            this.matomoTracker.trackPageView("notes");
+        }
     }
 
     public get content(): string {
diff --git a/src/app/services/internationalisation.service.ts b/src/app/services/internationalisation.service.ts
index b4424f3e44ad34a561b6714ff1422b219b7590ea..bc3f5b5a692494816e9f9c33d053dfb7804af262 100644
--- a/src/app/services/internationalisation.service.ts
+++ b/src/app/services/internationalisation.service.ts
@@ -176,7 +176,8 @@ export class I18nService extends Observable implements Observer {
 
         // replace "FORM_ID_X" by form name in current session, if any
         m = m.replace(/FORM_ID_(\w{6})/g, (match, p1) => {
-            const form = ServiceFactory.instance.formulaireService.getFormulaireFromNubId(p1); // cannot inject FormulaireService => cyclic dependency :/
+            // cannot inject FormulaireService => cyclic dependency :/
+            const form = ServiceFactory.instance.formulaireService.getFormulaireFromNubId(p1);
             let formName = "**UNKNOWN_FORM**";
             if (form !== undefined) {
                 formName = form.calculatorName;