diff --git a/package-lock.json b/package-lock.json
index 5cdb17fb2a61c1ed770b62da825ce2adba66ee23..f0827a8c4dd7b44c5f3a68e5278730d5cc0dc135 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -19,7 +19,7 @@
         "lint-staged": "^15.2.2",
         "semantic-release": "^23.0.8",
         "semantic-release-mattermost": "^1.2.1",
-        "typescript": "5.4.5",
+        "typescript": "^5.6.2",
         "vue": "3.4.26"
       },
       "engines": {
@@ -29792,9 +29792,9 @@
       }
     },
     "node_modules/typescript": {
-      "version": "5.4.5",
-      "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz",
-      "integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==",
+      "version": "5.6.2",
+      "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.2.tgz",
+      "integrity": "sha512-NW8ByodCSNCwZeghjN3o+JX5OFH0Ojg6sadjEKY4huZ52TqbJTJnDo5+Tw98lSy63NZvi4n+ez5m2u5d4PkZyw==",
       "bin": {
         "tsc": "bin/tsc",
         "tsserver": "bin/tsserver"
@@ -31863,7 +31863,7 @@
         "eslint-plugin-promise": "^6.1.1",
         "eslint-plugin-sql": "^2.5.0",
         "supertest": "^7.0.0",
-        "typescript": "^5.4.5",
+        "typescript": "^5.6.2",
         "vitest": "^2.0.5"
       }
     },
@@ -32192,7 +32192,7 @@
         "@typescript-eslint/parser": "^7.12.0",
         "@vitest/coverage-v8": "^2.0.5",
         "prettier": "^3.2.5",
-        "typescript": "^5.4.5",
+        "typescript": "^5.6.2",
         "vitest": "^2.0.5"
       }
     },
@@ -32578,7 +32578,7 @@
         "storybook": "^8.2.9",
         "ts-node": "^10.9.2",
         "tus-js-client": "^4.1.0",
-        "typescript": "^5.4.5",
+        "typescript": "^5.6.2",
         "typescript-plugin-css-modules": "^5.1.0",
         "vite": "^5.2.10",
         "vitest": "^2.0.5",
diff --git a/package.json b/package.json
index 8636f5f4860c6d7ec5f3e3bf1cdefce9cd702cc1..f644f3ddf886812c98929aa7e192a0734e3a9119 100644
--- a/package.json
+++ b/package.json
@@ -6,7 +6,11 @@
     "npm": ">=10.7.0"
   },
   "description": "Le cadastre minier numérique ouvert",
-  "workspaces": ["packages/api", "packages/common", "packages/ui"],
+  "workspaces": [
+    "packages/api",
+    "packages/common",
+    "packages/ui"
+  ],
   "private": true,
   "repository": {
     "type": "git",
@@ -56,11 +60,13 @@
     "lint-staged": "^15.2.2",
     "semantic-release": "^23.0.8",
     "semantic-release-mattermost": "^1.2.1",
-    "vue": "3.4.26",
-    "typescript": "5.4.5"
+    "typescript": "^5.6.2",
+    "vue": "3.4.26"
   },
   "release": {
-    "branches": ["prod"],
+    "branches": [
+      "prod"
+    ],
     "plugins": [
       "@semantic-release/commit-analyzer",
       "@semantic-release/release-notes-generator",
diff --git a/packages/api/package.json b/packages/api/package.json
index b8d1995b3e3922ae13bdf754225fb917696931bf..25070e3a0c7a3d7d5397f886997db15eeaafea15 100644
--- a/packages/api/package.json
+++ b/packages/api/package.json
@@ -115,7 +115,7 @@
     "eslint-plugin-promise": "^6.1.1",
     "eslint-plugin-sql": "^2.5.0",
     "supertest": "^7.0.0",
-    "typescript": "^5.4.5",
+    "typescript": "^5.6.2",
     "vitest": "^2.0.5"
   },
   "prettier": {
diff --git a/packages/api/src/api/rest/statistiques/dgtm.ts b/packages/api/src/api/rest/statistiques/dgtm.ts
index ec96294bcd61ec117e4c750332e6c9cfb556c711..f3b9feabbbb507c5ffa1381fce6de4112b86501c 100644
--- a/packages/api/src/api/rest/statistiques/dgtm.ts
+++ b/packages/api/src/api/rest/statistiques/dgtm.ts
@@ -9,7 +9,7 @@ import { ETAPES_TYPES, EtapeTypeId } from 'camino-common/src/static/etapesTypes'
 import { EtapeStatutId } from 'camino-common/src/static/etapesStatuts'
 import { getProductionOr } from './dgtm.queries'
 import type { Pool } from 'pg'
-import { isNotNullNorUndefinedNorEmpty } from 'camino-common/src/typescript-tools'
+import { isNotNullNorUndefined, isNotNullNorUndefinedNorEmpty } from 'camino-common/src/typescript-tools'
 
 const anneeDepartStats = 2015
 
@@ -70,7 +70,7 @@ export const getDGTMStatsInside =
 
       const anneeDepot = result.depotEtInstructions[annee]
       const anneeSdom = result.sdom[annee]
-      if (anneeDepot && anneeSdom) {
+      if (isNotNullNorUndefined(anneeDepot) && isNotNullNorUndefined(anneeSdom)) {
         anneeDepot.totalTitresOctroyes++
         if (!demarche.sdomZoneIds || demarche.sdomZoneIds.length === 0) {
           anneeSdom['3'].octroye++
@@ -129,7 +129,7 @@ export const getDGTMStatsInside =
 
       const anneeDepot = result.depotEtInstructions[annee]
       const anneeSdom = result.sdom[annee]
-      if (anneeDepot && anneeSdom) {
+      if (isNotNullNorUndefined(anneeDepot) && isNotNullNorUndefined(anneeSdom)) {
         anneeDepot.totalTitresDeposes++
         if (!etape.sdomZoneIds || etape.sdomZoneIds.length === 0) {
           anneeSdom[3].depose++
@@ -206,7 +206,7 @@ export const getDGTMStatsInside =
           days = Math.abs(days)
         }
         const delaiAnnee = result.delais[annee]
-        if (delaiAnnee && delaiAnnee[instruction.titretypeid]) {
+        if (isNotNullNorUndefined(delaiAnnee) && delaiAnnee[instruction.titretypeid]) {
           delaiAnnee[instruction.titretypeid]?.delaiInstructionEnJours.push(days)
         }
       }
@@ -218,7 +218,7 @@ export const getDGTMStatsInside =
           days = Math.abs(days)
         }
         const delaiAnnee = result.delais[annee]
-        if (delaiAnnee && delaiAnnee[instruction.titretypeid]) {
+        if (isNotNullNorUndefined(delaiAnnee) && delaiAnnee[instruction.titretypeid]) {
           delaiAnnee[instruction.titretypeid]?.delaiCommissionDepartementaleEnJours.push(days)
         }
         if (instruction.decisionadministration) {
@@ -228,7 +228,7 @@ export const getDGTMStatsInside =
             days = Math.abs(days)
           }
           const delaiAnnee = result.delais[annee]
-          if (delaiAnnee && delaiAnnee[instruction.titretypeid]) {
+          if (isNotNullNorUndefined(delaiAnnee) && delaiAnnee[instruction.titretypeid]) {
             delaiAnnee[instruction.titretypeid]?.delaiDecisionPrefetEnJours.push(days)
           }
         }
diff --git a/packages/api/src/api/rest/statistiques/metaux-metropole.ts b/packages/api/src/api/rest/statistiques/metaux-metropole.ts
index 862fa28f426c4cc74871ff88d082c58493a9a093..15a45b1c3b2cbb98ef7b852bafa6e04f947adef4 100644
--- a/packages/api/src/api/rest/statistiques/metaux-metropole.ts
+++ b/packages/api/src/api/rest/statistiques/metaux-metropole.ts
@@ -7,7 +7,7 @@ import { isTitreValide, TitresStatutIds } from 'camino-common/src/static/titresS
 import { SubstancesFiscale, SUBSTANCES_FISCALES_IDS, SubstanceFiscaleId } from 'camino-common/src/static/substancesFiscales'
 import { Departements, departementsMetropole, toDepartementId } from 'camino-common/src/static/departement'
 import { REGION_IDS, regions } from 'camino-common/src/static/region'
-import { onlyUnique } from 'camino-common/src/typescript-tools'
+import { isNotNullNorUndefined, onlyUnique } from 'camino-common/src/typescript-tools'
 import { TITRES_TYPES_TYPES_IDS } from 'camino-common/src/static/titresTypesTypes'
 import { evolutionTitres } from './evolution-titres'
 import type { Pool } from 'pg'
@@ -152,7 +152,7 @@ const buildSubstances = async (pool: Pool): Promise<Pick<StatistiquesMinerauxMet
         }
         const substanceData = acc[substance][annee]
         const valeur = fromUniteFiscaleToUnite(SubstancesFiscale[substance].uniteId, new Decimal(stat.substances[substance] ?? 0)).toNumber()
-        if (substanceData) {
+        if (isNotNullNorUndefined(substanceData)) {
           substanceData[regionId] = valeur + (substanceData[regionId] ?? 0)
         }
       }
diff --git a/packages/api/src/database/queries/utilisateurs.queries.ts b/packages/api/src/database/queries/utilisateurs.queries.ts
index 6efff8d97bf990833989d0f81c3a6e710d828148..042455b8e6bd581ca5a569db5ee3df8bbe54813b 100644
--- a/packages/api/src/database/queries/utilisateurs.queries.ts
+++ b/packages/api/src/database/queries/utilisateurs.queries.ts
@@ -164,10 +164,12 @@ export const getUtilisateurById = async (pool: Pool, id: UtilisateurId, user: Us
 }
 
 const userDbToUser = (
-  user: GetUtilisateur
-): Pick<UserNotNull, 'telephone_fixe' | 'telephone_mobile' | 'id' | 'nom' | 'prenom' | 'role' | 'email'> &
-  Nullable<Pick<AdminUserNotNull, 'administrationId'>> &
-  Pick<EntrepriseUserNotNull, 'entrepriseIds'> => {
+  user: DeepReadonly<GetUtilisateur>
+): DeepReadonly<
+  Pick<UserNotNull, 'telephone_fixe' | 'telephone_mobile' | 'id' | 'nom' | 'prenom' | 'role' | 'email'> &
+    Nullable<Pick<AdminUserNotNull, 'administrationId'>> &
+    Pick<EntrepriseUserNotNull, 'entrepriseIds'>
+> => {
   return { ...user, prenom: user.prenom ?? '', entrepriseIds: user.entreprise_ids ?? [], administrationId: user.administration_id }
 }
 
diff --git a/packages/api/tsconfig.json b/packages/api/tsconfig.json
index 1bc200872d1f4de7b623a11070e66e7477de1e1e..6f61185a536170e8b845957baf8ed151360f0091 100644
--- a/packages/api/tsconfig.json
+++ b/packages/api/tsconfig.json
@@ -9,7 +9,7 @@
     "alwaysStrict": true,
     "esModuleInterop": true,
     "inlineSources": false,
-    "lib": ["es2020", "dom", "ESNext.Array"],
+    "lib": ["es2020", "dom", "es2023.Array"],
     "module": "ESNext",
     "moduleResolution": "Node",
     "noFallthroughCasesInSwitch": true,
diff --git a/packages/common/package.json b/packages/common/package.json
index cee5ab55c3faf9a02f3bdc7423af36d4047db702..7c614963b5a2109ab6fb7a5e525ef50499dd4bcf 100644
--- a/packages/common/package.json
+++ b/packages/common/package.json
@@ -15,7 +15,7 @@
     "@typescript-eslint/parser": "^7.12.0",
     "@vitest/coverage-v8": "^2.0.5",
     "prettier": "^3.2.5",
-    "typescript": "^5.4.5",
+    "typescript": "^5.6.2",
     "vitest": "^2.0.5"
   },
   "prettier": {
diff --git a/packages/common/src/static/statistiques.ts b/packages/common/src/static/statistiques.ts
index 9faa74d1abb4ad0af29a0ed4fdeffe6b64d55d7a..fe4fa11076bce20e5dfa7a979f12dec47c0cbe59 100644
--- a/packages/common/src/static/statistiques.ts
+++ b/packages/common/src/static/statistiques.ts
@@ -5,7 +5,7 @@ import { StatistiquesDataGouv } from '../statistiques'
 // prettier-ignore
 const IDS = ['Nombre d\'utilisateurs sur la plateforme', 'Nombre d\'utilisateurs affiliés à une entreprise', 'Nombre d\'utilisateurs rattachés à une préfecture','Nombre d\'utilisateurs rattachés à un ministère','Nombre d\'utilisateurs rattachés à une Dréal','Nombre d\'utilisateurs rattachés à une Autorité'] as const
 
-const caminoStatistiquesDataGouvIdValidator = z.enum(IDS)
+export const caminoStatistiquesDataGouvIdValidator = z.enum(IDS)
 export type CaminoStatistiquesDataGouvId = z.infer<typeof caminoStatistiquesDataGouvIdValidator>
 type TemplateDataGouv = Pick<StatistiquesDataGouv, 'indicateur' | 'unite_mesure' | 'frequence_monitoring' | 'date_debut' | 'dataviz_wish'>
 
diff --git a/packages/common/src/statistiques.ts b/packages/common/src/statistiques.ts
index c82938ae8a1b11d82a777648275e359655fad46a..9e987a37e4132651829a3275b6dc2c6ecf4406bb 100644
--- a/packages/common/src/statistiques.ts
+++ b/packages/common/src/statistiques.ts
@@ -5,7 +5,7 @@ import { regionIdValidator } from './static/region'
 import { SDOMZoneIds } from './static/sdom'
 import { SUBSTANCES_FISCALES_IDS, SubstanceFiscaleId } from './static/substancesFiscales'
 import { TitresTypes } from './static/titresTypes'
-import { CaminoStatistiquesDataGouvId } from './static/statistiques'
+import { CaminoStatistiquesDataGouvId, caminoStatistiquesDataGouvIdValidator } from './static/statistiques'
 
 export const yearMonthValidator = z
   .string()
@@ -196,7 +196,7 @@ export const indicateurByAdministrationId: Record<Exclude<AdministrationTypeId,
 export const statistiquesDataGouvValidator = z.object({
   administration_rattachement: z.literal('DGALN'),
   nom_service_public_numerique: z.literal('CAMINO'),
-  indicateur: z.string(),
+  indicateur: caminoStatistiquesDataGouvIdValidator,
   valeur: z.number(),
   unite_mesure: z.string(),
   est_cible: z.boolean(),
diff --git a/packages/ui/package.json b/packages/ui/package.json
index 9db180768859066445e75ee048fe8711eb4b1485..befeda6b8afe8e795b230c149c4f1f6071c71a9d 100644
--- a/packages/ui/package.json
+++ b/packages/ui/package.json
@@ -82,7 +82,7 @@
     "storybook": "^8.2.9",
     "ts-node": "^10.9.2",
     "tus-js-client": "^4.1.0",
-    "typescript": "^5.4.5",
+    "typescript": "^5.6.2",
     "typescript-plugin-css-modules": "^5.1.0",
     "vite": "^5.2.10",
     "vitest": "^2.0.5",
diff --git a/packages/ui/src/api/statistiques.ts b/packages/ui/src/api/statistiques.ts
index c620bfb8fa882a627959ecba827d4705f4e4c1da..11c26ff867086a727f72cb1c308a364411858299 100644
--- a/packages/ui/src/api/statistiques.ts
+++ b/packages/ui/src/api/statistiques.ts
@@ -1,7 +1,22 @@
 import gql from 'graphql-tag'
 import { apiGraphQLFetch } from './_client'
+import { QuantiteParMois } from 'camino-common/src/statistiques'
 
-export const statistiquesGlobales = apiGraphQLFetch(gql`
+type StatistiquesGlobales = {
+  statistiquesGlobales: {
+    titresActivitesBeneficesEntreprise: number
+    titresActivitesBeneficesAdministration: number
+    recherches: QuantiteParMois[]
+    titresModifies: QuantiteParMois[]
+    actions: number
+    sessionDuree: number
+    telechargements: number
+    demarches: number
+    signalements: number
+    reutilisations: number
+  }
+}
+export const statistiquesGlobales: () => Promise<StatistiquesGlobales> = apiGraphQLFetch(gql`
   query StatistiquesGlobales {
     statistiquesGlobales {
       titresActivitesBeneficesEntreprise
diff --git a/packages/ui/src/components/statistiques/globales.tsx b/packages/ui/src/components/statistiques/globales.tsx
index a35eda1813a2a4dd4ce1a89e49d2d9f5772f929b..37754d81b92fd1358a60ba7211f56b8836dc9a3e 100644
--- a/packages/ui/src/components/statistiques/globales.tsx
+++ b/packages/ui/src/components/statistiques/globales.tsx
@@ -76,11 +76,26 @@ export const Globales = defineComponent(() => {
     try {
       const [statsGlobales, statsUtilisateurs] = await Promise.all([statistiquesGlobales(), getWithJson('/rest/statistiques/datagouv', {})])
 
-      const statistiques = statsUtilisateurs.reduce((acc, value) => {
-        acc[value.indicateur] = value.valeur
+      const statistiques: CaminoStats = statsUtilisateurs.reduce(
+        (acc, value) => {
+          acc[value.indicateur] = value.valeur
 
-        return acc
-      }, statsGlobales)
+          return acc
+        },
+        {
+          ...statsGlobales,
+          titresModifies: [],
+          "Nombre d'utilisateurs affiliés à une entreprise": 0,
+          "Nombre d'utilisateurs rattachés à un ministère": 0,
+          "Nombre d'utilisateurs rattachés à une Autorité": 0,
+          "Nombre d'utilisateurs rattachés à une Dréal": 0,
+          "Nombre d'utilisateurs rattachés à une préfecture": 0,
+          "Nombre d'utilisateurs sur la plateforme": 0,
+          demarches: 0,
+          titresActivitesBeneficesAdministration: 0,
+          titresActivitesBeneficesEntreprise: 0,
+        }
+      )
 
       if (statistiques !== null) {
         data.value = { status: 'LOADED', value: statistiques }
diff --git a/packages/ui/src/components/titres/mapUtil.ts b/packages/ui/src/components/titres/mapUtil.ts
index 580e30bb3fb5bfd65b2599077e69bd3855305834..4d4c3166e0faccf1dd31d9e2d9425da3a4c64b0e 100644
--- a/packages/ui/src/components/titres/mapUtil.ts
+++ b/packages/ui/src/components/titres/mapUtil.ts
@@ -7,7 +7,7 @@ import { TitreId } from 'camino-common/src/validators/titres'
 import { dsfrVariableCouleurParDomaine } from '../_common/domaine'
 import { capitalize } from 'camino-common/src/strings'
 import { GeojsonPoint, MultiPolygon } from 'camino-common/src/perimetre'
-import { isNotNullNorUndefinedNorEmpty } from 'camino-common/src/typescript-tools'
+import { isNotNullNorUndefined, isNotNullNorUndefinedNorEmpty } from 'camino-common/src/typescript-tools'
 import { Entreprise, EntrepriseId } from 'camino-common/src/entreprise'
 import { REGION_IDS, RegionId } from 'camino-common/src/static/region'
 import { CaminoRouter } from '@/typings/vue-router'
@@ -169,7 +169,7 @@ export const clustersBuild = (): { [key in DomaineId]?: CaminoMarkerClusterGroup
       showCoverageOnHover: false,
     })
     const cluster = clusters[id]
-    if (cluster) {
+    if (isNotNullNorUndefined(cluster)) {
       cluster.caminoDomaineId = id
     }