diff --git a/AssignmentChecker/.env.vault b/AssignmentChecker/.env.vault
index e57de34e3caa09ee540530e1c44544f89ad85663..82a65b05d4bab98e1a177330a43ca027cc9f6fd1 100644
--- a/AssignmentChecker/.env.vault
+++ b/AssignmentChecker/.env.vault
@@ -4,8 +4,8 @@
 #/--------------------------------------------------/
 
 # development
-DOTENV_VAULT_DEVELOPMENT="/LrM2dHMdkZ4WcPfZG1Fl75M7RmB0QBs4qQSGHS7l0H4FHODTSBqnny8vu4RxYn3lJwGackRGHVmChXk7D5PwDGL8S4tCGaEtKB7oIYjJ16b5xw41+z64KWrqZcgcCIM6qw5XQawfOefSV2ua08ZzOMb3Dt/qllZAkAk96VtTm3Z0TtzzU5C8KGqQOarxTTnQi1d4C0rLnrhkWBHa/KfPrlEipJvR/UR6UkS47eMzbuiKIclQpn6rifuV4dDN4krVBAIXRqoz8UHJemICVeTZutzJvWrrkldkGNdPxzmW34X5fC4ylcXwEoMOtGhtTZ8VMD4RSoAjetSIN782Uqv5AZVYA3WvvNCkEcxegEOhu+4HsCp9TVNRA7b5tC9CdFyNbWAQy1jKlEpnd3eQgK5K7l9OGUmq5+b/SU7Y3mcQIv+p3iDqQMa7jnl/O5iNQUDT0s/FeGTuuFaQjbCmb3L5J4VEJKVovSz/SXro5GjAnk2JUHg7njukYpX68xo6usYXqk6La77/cc7amsKw5703SnPtEU1bd+bKM/sklS5wvKDJXkE6l+lgygJmZ+TxZy3pHMxsrgvnaTxL2CTYL9nP55iUW17skx32R4Cv7WZNrXdll8Uvswrl/eUKmucrigeSV+tVXvCCsrTEhm79yEYzE4PU8ktIurBB2Wvxy4GKEVVOgcOK3AuUle9yApJVVtOzOaNAFQaSlVRZCqWA1U1A5N0SC+aLRbkkxEYM7LzfIXVlsVFDvTSSDogny380mFQDAfMnXqFRJasAUgfDHvFCHYKbCoUzRcdGvn8xIVLejhxUeYoO4fEHy1jxp6BrZWsvC8ByqPI8llIJyfqzpIrnZ7hKzKtNtwYN93NUwFsaf6Ke1ghLOziJejZfBoBMa0ny6GKhFyhfYtCMlW4hRvRpwUCbUtGGd8/EXanu9A+/C2mF9U7BtFtiXD9pDLoFT7RxHddhDyC6WyVKf2qJkBPLg=="
+DOTENV_VAULT_DEVELOPMENT="avJmMhVKLmzILAGQBuj8x667vtJTDiLFsfbxc/S+STLmfS8ZeVfyByaHqIUAckC5dVMSM3Uc4yTZiKG6ivifOl9+KCR4Wz28s385licesH7ULAlCT0Ioq8EExxZ9/o2csNP9d23uKouwHXDPQPpt0F7YvxiaYnuWDqXnFLjYYVAe28usNnM9mjW3gWtWcIWfxOIU1P5RpCDBZqNdDFTeEqXxbBaRha5tb2uhJsgG41X3uPWMiToMOp6FAtDynO3cKVMBzKkaK6MRlI1O2dF1nRa5iYmNi6UDs8ZnSelJ+NMULcYGKn+ByZWhelJm0wD575L0wHvJMTESKRrsXS4rJ+Y2bT4TjrA9geJK3gFaWUaNOjDitRe21Q3mD6kONvrFOO5IzK8SsiqORZ2eeot3YXAlc/NsC3F6w+BHhi+X1V0mg6tJSw0qKtA8izbuWbu2mDqGBqAGhu4ffBscqaruoXsY/uPvl+FxiNYMElC/aQn6GyETEOgzfTWldFNqTufwNSAHxAy58ZNt7P/F50VK9r9PAKOHgZAWpUaGmgjv9Y2U+DCdnhFdEiJBr6mUaU6mldUjcSEbdzww6npt2NHPmeksKMa73JL0jIoGJR1rQLIwKGHTqah3fmfKKCc/aKuJEa7tpI8fzqcXLHMEU3vwKFxiT1mxkElEd2mj++qlnr2tjfM4tcDOxYJTwVt6kiKkYLFZg2yDwp757hlS0sR6YCBLaFEkIFL3W/ciBSn12wSSdoYJRLwT1Mrv7zv+yUXF/r+cDLmHdujitsMxJz7OMutzksocyJcH6Ls15z/7C+xPcbuyrKc0HNSdQL5dTqrT934uryIQhLZaEbyb/FcVLTn86hFlj9f+corJOhFHDAflko+HSosXR+OTHv22270Po+OlfglJvDOW7tdaylP53RtPUnlfxcdb1RrvRbQbUt4v5lG38nilPcHTShDPX0qdDearUWBJdunLGVHR4Of289DtraabEvmOOPEPuYCT8+8="
 
 # production
-DOTENV_VAULT_PRODUCTION="WylDNF/SdylCEvaQ1NAo9WOWmv8PvLA8L7wKhASX9ERiuKYPpuySEcQ1O14d2vOhs3Fb/ByftJRVEID8qQwuPjgXY81sLiMp7SknUYGmmM9ONHny6rpM412mP75MnaDKXTULSPmOy6j5mrq+vux1J04EAK8qsAe/AabamFU2wGgiZAREtZhCaV901/hh1qa7fgyjTCfz0hOpOs9SWFlHvJ4JjPatfi6h72+gfsVvtXDW+IPXTa4wYiXSty0j/PBf7x0ecvJoD3Xk3IQD+YtwNDTOK+Y2TgOo/GKRitj365cgHMW5enuZyWzXJkaBfyzofbNY9LWIk3YRiFtm2ixnadeHNMTotMo0XtQuNQ7yn7F34UGIM9cKcdLwzRfT8nbFQIsxwD8YQAttr6csNs7RDuQkgoF55eZNp+5mp87kJhVDHGdU2BnigeLwa2Em/kx3Mjacy00jggtrIokp2Di3023dUA6aAhpuyEAdQzBZBxELAisXdX5kyMe265Q9AGyc2OfFImLkdKfFgM/jDJMWRKg5NANoEAhv3UnPlhI6gzNiZuXCEl4+TEUkPxemxp9ylfL4wr9RARcVv+IarH6I996yZ8v2kWwYAd3jPw48OJYUgE+LVFualU5JTAse5jpiWtffn95od8VGtNj0O8BgotMTcH1F"
+DOTENV_VAULT_PRODUCTION="+zsZmUoTEDJcrLk+EwjPXvyGT1jPcMhwVyMUjR3nYN3ztzREdea/vqqqOw78lm2kwzZC0guUMB4lShVprEEiUs7cW+iXjDOHZivvZ6xZZEFl2gbt15XaoZ19WMRQoKypO80VqULGib3BmrXQFYz4OQ6sqQiBnBovm4mb++DkIjnN+6e2wxGbPnhxhyeHi7H+C/D3b8rrQfAijlpWUgGG1x6aKS53PJxLmTB7/tHdOHyBWpgekiDurkTBYckYBWVZOrPLm3xJFBqeJLNmq2CHcvxt/4SaGBQ06ggonzyiatb20JJsKI2P6SwDxV/ae7k8Aj5PKfMVweCOsgPj5kII0mAAB9SkxZ+Jbohm0WxqwxZ3488mm/7BhK53MjOgFyhbf0eI09FPPYgBBZ2uvo0PuLbErnQ//ND+wNFCWGPSDTQO8T6kDYAGRWCH7ZeY1d0ZIf58wW+Zd7ipGu2J7b+NMk/ZaJLehJrc8KgTmQUTjvO4Yt5QSQ+kFQePuFfQNjvakCkyWkh/ElaHD6sMhDO/LCbr42J0a4fGUZn7RgCZDdYWwO2Gxutak2lbHV9JjAN5hJFbH2nXMnLAyWAVYJ2j0YE/SHjjkYiQp0CIuofKCfZN/DQNSMnvqXBOyTP0tUrCT0KVMRr3sptQ9DJ1fJvYtTxSigNECl3rPjEKxPSxD9F2zQO7zNNj8ujxn4SqZgjMq2nvELfokiuLQcZZniPAFLX5xRiWV1DJAklNPOB6HGcjgQ0w6tvqdo6sdXEV6/tpRP0Sl/AAQZPEz6BF5FR2+wNP/98mMeko+sWcZz35G3DpU5tnCDNTjpxNZUI="
 
diff --git a/AssignmentChecker/assets/.gitkeep b/AssignmentChecker/assets/.gitkeep
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/AssignmentChecker/package-lock.json b/AssignmentChecker/package-lock.json
index 39d1cccc9b25faa48ea5f3d2dab13f186a349764..d9279417895dcefb3db0534d6335d8c007350d28 100644
--- a/AssignmentChecker/package-lock.json
+++ b/AssignmentChecker/package-lock.json
@@ -15,12 +15,14 @@
                 "chalk": "^4.1.2",
                 "dockerode": "^3.3.5",
                 "dotenv": "^16.3.1",
+                "dotenv-expand": "^10.0.0",
                 "fs-extra": "^11.1.1",
                 "http-status-codes": "^2.2.0",
                 "json5": "^2.2.3",
                 "ora": "^5.4.1",
                 "tar-stream": "^3.1.6",
-                "winston": "^3.10.0"
+                "winston": "^3.10.0",
+                "yaml": "^2.3.2"
             },
             "bin": {
                 "dirmanager": "dist/app.js"
@@ -1450,6 +1452,14 @@
                 "url": "https://github.com/motdotla/dotenv?sponsor=1"
             }
         },
+        "node_modules/dotenv-expand": {
+            "version": "10.0.0",
+            "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-10.0.0.tgz",
+            "integrity": "sha512-GopVGCpVS1UKH75VKHGuQFqS1Gusej0z4FyQkPdwjil2gNIv+LNsqBlboOzpJFZKVT95GkCyWJbBSdFEFUWI2A==",
+            "engines": {
+                "node": ">=12"
+            }
+        },
         "node_modules/dotenv-vault": {
             "version": "1.25.0",
             "resolved": "https://registry.npmjs.org/dotenv-vault/-/dotenv-vault-1.25.0.tgz",
@@ -3718,6 +3728,14 @@
             "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
             "dev": true
         },
+        "node_modules/yaml": {
+            "version": "2.3.2",
+            "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.2.tgz",
+            "integrity": "sha512-N/lyzTPaJasoDmfV7YTrYCI0G/3ivm/9wdG0aHuheKowWQwGTsK0Eoiw6utmzAnI6pkJa0DUVygvp3spqqEKXg==",
+            "engines": {
+                "node": ">= 14"
+            }
+        },
         "node_modules/yargs": {
             "version": "16.2.0",
             "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
diff --git a/AssignmentChecker/package.json b/AssignmentChecker/package.json
index c9502d951c41e2301900bb4791b82865d5b9a24f..8d91297f46368a8bc744d37eae3d426f65a0d536 100644
--- a/AssignmentChecker/package.json
+++ b/AssignmentChecker/package.json
@@ -34,12 +34,14 @@
         "chalk"            : "^4.1.2",
         "dockerode"        : "^3.3.5",
         "dotenv"           : "^16.3.1",
+        "dotenv-expand"    : "^10.0.0",
         "fs-extra"         : "^11.1.1",
         "http-status-codes": "^2.2.0",
         "json5"            : "^2.2.3",
         "ora"              : "^5.4.1",
         "tar-stream"       : "^3.1.6",
-        "winston"          : "^3.10.0"
+        "winston"          : "^3.10.0",
+        "yaml"             : "^2.3.2"
     },
     "devDependencies": {
         "@types/dockerode"  : "^3.3.19",
diff --git a/AssignmentChecker/src/app.ts b/AssignmentChecker/src/app.ts
index bb70d037ccab50afff41a9b5e1767a8a0d278881..7ae5b397ce3fb9109aab517649d63f0e1be69811 100644
--- a/AssignmentChecker/src/app.ts
+++ b/AssignmentChecker/src/app.ts
@@ -1,17 +1,21 @@
 // Read from the .env file
 // ATTENTION : This lines MUST be the first of this file (except for the path import)
 const path = require('node:path');
-require('dotenv').config({
-                             path      : path.join(__dirname, '../.env'),
-                             DOTENV_KEY: 'dotenv://:key_f1778b6998874f6fd78c716ccef982c5595fa300f174b129eafc88ba7044d69b@dotenv.local/vault/.env.vault?environment=development'
-                         });
+const myEnv = require('dotenv').config({
+                                           path      : path.join(__dirname, '../.env'),
+                                           DOTENV_KEY: 'dotenv://:key_f1778b6998874f6fd78c716ccef982c5595fa300f174b129eafc88ba7044d69b@dotenv.local/vault/.env.vault?environment=development'
+                                       });
+require('dotenv-expand').expand(myEnv);
 require('./shared/helpers/TypeScriptExtensions'); // ATTENTION : This line MUST be the second of this file
 
-import Styles      from './types/Style';
-import { exec }    from 'child_process';
-import util        from 'util';
-import HttpManager from './managers/HttpManager';
-import Config      from './config/Config';
+import ClientsSharedAssignmentHelper from './sharedByClients/helpers/Dojo/ClientsSharedAssignmentHelper';
+import AssignmentValidator           from './sharedByClients/helpers/Dojo/AssignmentValidator';
+import Styles                        from './types/Style';
+import { exec }                      from 'child_process';
+import util                          from 'util';
+import HttpManager                   from './managers/HttpManager';
+import Config                        from './config/Config';
+import Icon                          from './sharedByClients/types/Icon';
 
 
 (async () => {
@@ -20,4 +24,34 @@ import Config      from './config/Config';
     HttpManager.registerAxiosInterceptor();
 
     console.log(Styles.APP_NAME(`${ Config.appName } (version {{VERSION}})`));
+
+    const assignmentValidator = new AssignmentValidator(Config.folders.project);
+
+    try {
+        await new Promise<void>((resolve, reject) => {
+            assignmentValidator.events.on('step', (name: string, message: string) => {
+                console.log(Styles.CAT_INFO(`${ Icon.CAT_INFO } ${ message }`));
+            });
+
+            assignmentValidator.events.on('subStep', (name: string, message: string) => {
+                console.log(Styles.INFO(`\t${ Icon.INFO } ${ message }`));
+            });
+
+            assignmentValidator.events.on('endSubStep', (stepName: string, message: string, error: boolean) => {
+                if ( error ) {
+                    console.error(Styles.ERROR(`\t${ Icon.ERROR } ${ message }`));
+                }
+            });
+
+            assignmentValidator.events.on('finished', (success: boolean, exitCode: number) => {
+                success ? resolve() : reject();
+            });
+
+            assignmentValidator.run();
+        });
+    } catch ( error ) { }
+
+    ClientsSharedAssignmentHelper.displayExecutionResults(assignmentValidator, `The assignment is ready to be published.`, Styles);
+
+    process.exit(assignmentValidator.exitCode);
 })();
\ No newline at end of file
diff --git a/AssignmentChecker/src/shared b/AssignmentChecker/src/shared
index 8424367748a6fc47f8da10b85e7663f3f7d07620..efe1bf313f57d1826faf935c183d37a0835f8c2d 160000
--- a/AssignmentChecker/src/shared
+++ b/AssignmentChecker/src/shared
@@ -1 +1 @@
-Subproject commit 8424367748a6fc47f8da10b85e7663f3f7d07620
+Subproject commit efe1bf313f57d1826faf935c183d37a0835f8c2d
diff --git a/AssignmentChecker/src/sharedByClients b/AssignmentChecker/src/sharedByClients
index 97ba763f9517880ecfa6245c172a0e330ebdd11a..d9379b055a4626e4b35cf4cc4a7429040a4aeaf7 160000
--- a/AssignmentChecker/src/sharedByClients
+++ b/AssignmentChecker/src/sharedByClients
@@ -1 +1 @@
-Subproject commit 97ba763f9517880ecfa6245c172a0e330ebdd11a
+Subproject commit d9379b055a4626e4b35cf4cc4a7429040a4aeaf7
diff --git a/AssignmentChecker/src/types/Style.ts b/AssignmentChecker/src/types/Style.ts
index 3b9d9f986980bd4d132da2f91bb92522825920c7..c937a17ca7a1c55c02eb5f7ed12d5b53d4c5732f 100644
--- a/AssignmentChecker/src/types/Style.ts
+++ b/AssignmentChecker/src/types/Style.ts
@@ -3,6 +3,7 @@ import chalk from 'chalk';
 
 class Style {
     public readonly APP_NAME = chalk.bgBlue.black.bold;
+    public readonly CAT_INFO = chalk.magenta;
     public readonly INFO = chalk.blue;
     public readonly ERROR = chalk.red;
     public readonly SUCCESS = chalk.green;