diff --git a/example.env b/example.env
index aca7de23251b29814861e946ff1fa244adeed468..dc2aa2d8b54513ed4646624c468d528db5865183 100644
--- a/example.env
+++ b/example.env
@@ -61,6 +61,9 @@ PROXY=false
 # Reform name must belong to a name of an OpenFisca reform in metadata.json
 # REFORM=universal_basic_income
 
+# Show intro balloons.
+SHOW_TUTORIAL=true
+
 # Directory containing JSON of simulations saved by users
 SIMULATIONS_DIR="../simulations"
 
diff --git a/src/hooks.ts b/src/hooks.ts
index 1cfdaf957d946f2ff2567a827fe14fcc894f823c..c66a1632a6dbbe14fa116d8361df948f5ba0fa97 100644
--- a/src/hooks.ts
+++ b/src/hooks.ts
@@ -55,6 +55,7 @@ export const getSession: GetSession<{}, Session> = async (request) => {
     },
     portalUrl: config.portalUrl,
     reformName: config.reformName,
+    showTutorial: config.showTutorial,
     title: config.title,
     user,
   }
diff --git a/src/lib/auditors/config.ts b/src/lib/auditors/config.ts
index b2cb2811d7a23754fdabe8dd9249fd3e7af9137f..841b00e8c35831bf65753c76e82627dd6b3d23ec 100644
--- a/src/lib/auditors/config.ts
+++ b/src/lib/auditors/config.ts
@@ -31,7 +31,7 @@ export function auditConfig(
   const errors: { [key: string]: unknown } = {}
   const remainingKeys = new Set(Object.keys(data))
 
-  for (const key of ["advanced", "allowRobots", "proxy"]) {
+  for (const key of ["advanced", "allowRobots", "proxy", "showTutorial"]) {
     audit.attribute(
       data,
       key,
diff --git a/src/lib/server/config.ts b/src/lib/server/config.ts
index 3a2b3d3dc2dfea9af6a6d83bcb86865a9880c8ad..528817291b4fc2c8772d0b8190f27a08f5518757 100644
--- a/src/lib/server/config.ts
+++ b/src/lib/server/config.ts
@@ -37,6 +37,7 @@ export interface Config {
   portalUrl: string
   proxy: boolean
   reformName?: string
+  showTutorial?: boolean
   simulationsDir: string
   title: string
 }
@@ -80,6 +81,7 @@ const [validConfig, error] = validateConfig({
   portalUrl: process.env["PORTAL_URL"],
   proxy: process.env["PROXY"],
   reformName: process.env["REFORM"],
+  showTutorial: process.env["SHOW_TUTORIAL"],
   simulationsDir: process.env["SIMULATIONS_DIR"],
   title: process.env["TITLE"],
 })
diff --git a/src/lib/sessions.ts b/src/lib/sessions.ts
index 2bb4e797891312c2c55f54bd5be9d596f4394508..c28aa6161f07301565bffbac7a4a6a4a4629fc7a 100644
--- a/src/lib/sessions.ts
+++ b/src/lib/sessions.ts
@@ -19,6 +19,7 @@ export interface Session {
   openfiscaRepository: SessionOpenFiscaRepository
   portalUrl: string
   reformName?: string
+  showTutorial?: boolean
   title: string
   user?: User
 }
diff --git a/src/routes/index.svelte b/src/routes/index.svelte
index 1d7fa6423aaff040435cda47a2a17f8e46e2b473..989433c9abd569ada6ccfebef6a700f46b19a47c 100644
--- a/src/routes/index.svelte
+++ b/src/routes/index.svelte
@@ -115,7 +115,7 @@
 
   $: editionModeFromAction($action)
 
-  if (browser) {
+  if (browser && $session.showTutorial) {
     introJs()
       .setOptions({
         doneLabel: "Fermer",