diff --git a/AssignmentChecker/.env.vault b/AssignmentChecker/.env.vault
index 333e918b10845d7d743ec6993b4fb0e6cd713fe2..4635b629118dd17b4e004464827c3910d4f11f95 100644
--- a/AssignmentChecker/.env.vault
+++ b/AssignmentChecker/.env.vault
@@ -4,11 +4,11 @@
 #/--------------------------------------------------/
 
 # development
-DOTENV_VAULT_DEVELOPMENT="wXBOtcsze+pmmGLl2aIrzqcQYvVWwO2wXyQW8rLrhdxDwU/10OfF49+nWmHxl8OVA3YrkHZ5UmdGbVyecwa+y6eH6pZv42MoP8MhkqXUVocnTAy86AqpLMeqj7/pTBae3UW+v4kZJnMCtsvPDnJKs/vuvAOBnXQbRB+SLCFpXtz+ZlQWqzKvxxakm60rrjazRQE9KiUVwFHPAKW+YdzdxXloaFP6Rzc3eCxRv6Je0C0QIiIs7MkuPqDNNF9J/5Yc+FKmzFaavVdlKBdxzzQ93FUbBFJzQ4bG6cEIutGkuKJtLRNOC7FR2M9tHMHb2q1csz5LmrqQ+HZd/qb8kTyuKGoKzjeEVEn4FK3tCQm6Qzbbw0Ktnzk7EsMT8E5hFa2bBx0XdDMUQzC7UYXS2BkIOP9JLrxStkMcwaCRAau+0nhbMdEynKHGubNtnQH0umY5TXtVC97huQjE09HtT0Ggx8VPiq3qE0gGYsa1y1c9LLV8ljQiUJDsUqri26QKu+iVJ/eIW4XSoEN+NgmDzEq8fd2rx6X0a9HcXDtpb3VX80FzZzwlvx+FUXOyrNY4WsQQTkwaPMpau8ppwSeQH1mjqNDAPNfR2cPv4mI8xE7Nz4XJAkC3/5H4rH511GrQ66ZyMpsTItOEOfX6gHabzdkqY4Vrv5ZYHVPzdh4+S+OAzuGR1wscxaZagHYrvi0/Hca/KX/d0mRWhFWCqD7tFV1w9cQasz0n2RDHIUMXYjO9ieBBPX/bQRbf4PW8MbxlVjtRrOJgrsi13Dn+UJI9m0V8DmQ4L/4+tmdI010e0/XA//IMiMKMLAM5EcXljy2et5ZscS1bejDaCsseKoN8BiYc3gtw93X8CGLHyr4m5F4Y+FcS02cts9QeQCVrBDgGBmZxYZSIxeg4sVNKgaXdbXKuhTctpwpKv4pIWyhGnm3yeXX4El3LZ3QtqpDwvnIk0JoNYCEnX2alQEfrl2LqIxMKgcyCir6pSkChuKov84oN1af1wfiJGt4NFfhRjR8oMjliY6dQB95HX+RS4A=="
+DOTENV_VAULT_DEVELOPMENT="Ar4+WxQJ+Cx4+ypVs8w+/OlT6sJ2UwqvvWuT9YcAufPxHgo1/YDyQpwS6CGNdsA5FEnhM9dyuodCw8Mjdi3N1m3VFjPPelfq5v4O3qZPAiuAkpwRkf/pD9kfZ5/b/EhrCIJzJopQQCE8c3TuF6y+IfSv+/stw+bx3LzCmG7JIsRPXPJBjIYmj4vvXHRwRsLlsY/F0Vc7P2FCvyk8s4+bUzHZwAt2oMDFP8Q348eJdZ4QyJZzMVQf5XE6SMqMtR3nMxvE5H/UhH7nv6yN87CElDKtzSh4jCQS55rdaX209y4D+ogn5PFniUsGb8SAM04Igiu7OMqcbDXMH6axAHm3jBf2onbUwRnbLLdkF0lBngSJsYouQkcDhHXmqio3xGrH/jBwSkJK2UXs76ZnVMlqSi7ny5Hc5rXNjpBQKJXLk88uaHfN9Osh5lkDIUF6we6zYzXXQJpy3+9DJVmyBxTyQUnb1ku8/ttPDlWAV0CNUmju4M1MJAIcQqwEbvJ5xRd6ia2LywGqlAmVOSSqSEf72W+RktqjsNop1OFHEY+oYPjUVq35H2qxJWPDf3Mja3iULhaRegcoT1N45Uu9GWl4EY2VWt2kTfYcbEMSdXj3mHJuvQEHdRGCD/HK52Gfa9WCaVoltR5NQ5G06/x1IRELCOjVoAjs9jhDwNnHTuxGLX6vUZX5RsOFnyvIhtX/LRMyAturYPODuw8ToPlHeZaQuVk8kMjfzSzCW2ixRkG79JWTHSBHhdJ/jQ3sFsby7c8u475rNc/ECeqOWRgjthjLf3JUnbjSQ5Y="
 
 # production
-DOTENV_VAULT_PRODUCTION="Rcz6CubfWYYhOvVAbYeVx+T7GLZH0eJ0s2Q27YSw826Cdy1T667ZxiW/mAByMuGO7hILoZDrpOzcRAXs0vV6h1yH7cF7ZPt1bip+Xbpowuz+ietTKEG2xQefwQCHi3n4hnU9mE5LYU/HKmux9NVwlTOJ990t9YKnzwvq3RlWSdLWqHqPTsRfCfcfss0SpSUiJ0IcvSb11JOmZaA+x2vcE9o3emPIirGa3Vctkrtj9LZ8ZCT60VeKGh2PAi5ZK4aekV/B3lTzenXXzht6ukGJrhvp7EZCCAfubrq4EKXZtFlzBqXjtK1Yspcnq3igY4Tyr7xry+wnPBHw0nlO8gBmG9nYWv0eNqDpf4r7p7K2zTk1RqDQB+avvjFhPvcpKIkpFQNimL+1bDNwI9v60gYH2hhn5vEZ2ILCaMeVlEfL9oQIiKtusJJon+6LcyykshpXSLqtmSm00A8h5eab4DpvCTk+ancvJzzuIxnX4b11xVtSChBxN9QGAsjN0O8SS6C+ZEybphUOiMHRS2deqKu65tF7+8sLnRf0WXWuaEZppuRv2wLft6Qaf09+JSCgtk4BXF/8vKBDNIO8Dnp3iQyShP+h29+BuNFzs4dpIvv51DBZ3uUEzBXdgm89eyRzr/xWueg1VqsEZ+ztDXCMRzN/aSg7DSv9V6TwKaKPyhSUeyfhbFfzr2OW145IUzFGEgtaM/8Yw4HWE+hqMbVL+tsp+Pz5fR1jb52+oQE5pibmTjNcQ2eivUid5A5kVD622tnC3h5+rV55wVIbKVJ/ZzunajA064LH6Alqx6sBJVhe4j3UwT/yuxAWqWiu/6bBloIx6bXxnOskpDddAfkXuQUk7DchABYMvAlko+O3OPE6fgx3bGNhC48fm5etbDlF92w6HUqCrpGHZ2xZkdGwwho4p9oUkE0QgPXBIgYUmYq4987PXrE="
+DOTENV_VAULT_PRODUCTION="Jc0E0rOwIHh1GduNwYWFwU8AYEmkNVK1IKErjPSlPrS5mKr7RpWZyC5297/q0Hvla0VkEvID5qzs04F9SufOWqXgLlFUPL/gizc1p9poHyV1EVQqD8BsV6prlma6z6Wu3DP3i5GfcHIcaZTMq8CBuWcSNoQs7OhJNpUhy0Mw3kJgk6EeLRQ11qNJBSFyLUB2LZ5Y065tQXxxCTPuC9FteyUSi4J8jxBTE8xW4Fy9Fi7+0e6yRFp92aS13qbJKunNeFF27DRIVdr8qpiXgTCovE2B7fJ7aiPe4CC37WB7mPXtxB2AxkHDi6uU6U/4TtNTCtkP9erQ7LKPReCsxg+U9EMmE5zesvxfYeBBkG2Ex9IaNfC7d8GBz60mlK5BtJd2cIF1MDkH5hS1t/ogRpi7t0WV6cWhFGakoz+vULqDVcrYYX7I9Wnw+sfMFOgjO5c1/SvZe8waNav3m7Ji/IFztWWu1d7UI0PdaK3sJBHN/G01+La9S0WInGl2yPFoPQrPEEn0DusEFC6ISeezTwdNdzCmf28/PEag8ghfXj1c11Egrwfwjo2x6d/Qy6/0tqXlPSwdUqAZ5o/xwIjpa5JtUxKlxwEEEbc8oOIBnsKglWSlbOpkb8J+ITXjk7Q/y6uf6ey7LprYtIO8rOovQLtwfppMS441WoIVpKB6FAmfmPYqabz5vQzdWz3RGZKG87un"
 
 # test
-DOTENV_VAULT_TEST="1OLBaEdDI49XBdJOU8NyqevOHbM9PhUYmtRXRTdxeJL9WtSU/kp1gk8bmDlUoUe5tGnzZDuu3O9GEMyp+c5VQquaWsj5vH9+m1GRPwf5UbKETHvHfrGEknytjMahZF5kAydDnp1DZHWRYpG/KBgC2UvN3/jUP4xkDdmpt+iDUIjV7Uto5Lw6B6iWEu5i5eaye9SiPjtouMzyHoAUNP3ViCI0pB/H/8yOUYiWVNtZs/88MUN+QAtekBWfeRQ+nDSYsJMQ0JwD6eDlxSuJ9HkXRGwzIISsHUd/7qFh3dAjQRJZDAjEezcrw2QoCliaxWcnhu6POmZUfJTQYj+g6hSK3Hpv780o+BYIXLyvXJoKdvLiUQyElyibgOYOzPTwuDWTA3MbM3660Sjpbf+ZvukFS3nnKJmv7eH61/UFTbZMAR78Fy1WUD5qwZYxp61W8NGWaoGqwWOe30ZyLWDZH3M9aNarp7U4rjizcvfFiUfUo+9CyPlgk05hT+cklaoqdckNjAPzlwoOdng34bSfBvpjAtCCyS8vH5RPtw4KerEESO7/8bqUEf/YIyFHYcUitUPVSgXJnuyysqrTmPq5TPiBezwRquBMvTW46KMQTrnk4+6bKxd+Mqev16rW1UsMJqlEM35cSMjKaxPa7LT0KuGvkcVqpHHdypdvQtZ0PlTlmTutuqNwqmBfEPRZqnSOKVirlL159A1fZIOof6mWy4lzQe1f/AQb9vIL5K8QjHHZ0MJt2lZG/vlZRpXcVWegZyYUQOXKjLgijuozjg09xOakhLPncjM1Krgr70d7f0zN/OFTjcaBPIKOSAf3vDrpSetQyZTNDWl9+vB+J0/b+nbwx0Wv5D8Il2rMfnvLpg=="
+DOTENV_VAULT_TEST="Uby3FPI51CVAoTBVItqiAewUKWWVgK5t5OF5JpkzWFqREtJMrIp8UKQdh1mBOkf5Le4Xt55Sy0wtCY/VjZg+qDWfJE61Sw35Ba+zZa11gbJJEFeEZC59/sVikIK+wKRCuw/k39c1Kb8EDBXwzxLkMFGeBTlAfYjNvua+svAmwKo9JhQrOPMLCO7KmZgLd5GJLJsLiHhTZLOOJKEHbjJ1XSct2IxQ4H9PulWqF9BlGj+xthko6Tl+Y1+xmxP+AKC0pCTGaKU9tdQQDW007jeBJEk2BN8lhgAmfyOHKHA9WAoDndG8nFMckVjN+x52OD8dRat20Z0i/rJbfhuN9Mc2Sqvz/4ztJM94vKjI+TPX5msc2VVavRPCEaAAHoFhKyDK7E9OiSD4hdYJPaehZg0cfV+Lmg9e+FE3UX9LVjJxqTNw40FtNyGHl4UsrbbTiPhK2EB02rD6j99y1JizMaoC5h0Qj5f0gDUlxNQi3lLT5r4jR2pjxPr8SOjOiE0j99xuIlr/UbW/hS6fLMfEERD3deJhieOpF20ESe3e3dFnDkVWpPjVeWVMMhgad+jHS2RGoy87n3KaJML1VJpiDBNQeM1ndmYhcqK6ULmPwcPgeg+X"
 
diff --git a/AssignmentChecker/.gitlab-ci/01_functions.yml b/AssignmentChecker/.gitlab-ci/01_functions.yml
index 898ab5584a7a2e26f17a9b739ea27e86002c8c6a..8a8d25779b99da0bdaba423d80f5cb473baaabf9 100644
--- a/AssignmentChecker/.gitlab-ci/01_functions.yml
+++ b/AssignmentChecker/.gitlab-ci/01_functions.yml
@@ -75,7 +75,7 @@
         - >
             platform_array=$(echo $DOCKER_PLATFORMS | tr "," "\n");
             for platform in $platform_array; do
-              echo "Buildind for : $platform"
+              echo "Building for: $platform"
               docker buildx build --pull --platform $platform --file $DOCKERFILE --tag $CONTAINER_IMAGE .
             done
 
diff --git a/AssignmentChecker/.idea/dataSources b/AssignmentChecker/.idea/dataSources
new file mode 120000
index 0000000000000000000000000000000000000000..dad593ac636a6315d6d91992d4b1e57e31182df2
--- /dev/null
+++ b/AssignmentChecker/.idea/dataSources
@@ -0,0 +1 @@
+jetbrainsConfiguration/dataSources/
\ No newline at end of file
diff --git a/AssignmentChecker/config.env b/AssignmentChecker/config.env
new file mode 100644
index 0000000000000000000000000000000000000000..924ad2dbdeb1fd84579278433020d6516a7020bd
--- /dev/null
+++ b/AssignmentChecker/config.env
@@ -0,0 +1,15 @@
+########################### Node env vars
+NODE_ENV=production
+
+
+########################### App env vars
+APP_NAME='DOJO ASSIGNMENT CHECKER'
+
+ASSIGNMENT_FILENAME=dojo_assignment.json
+ASSIGNMENT_NEEDED_FILES='["${ASSIGNMENT_FILENAME}", "docker-compose.yml"]'
+
+LOGS_FOLDER=logs
+EXERCISE_RESULTS_VOLUME=$CI_PROJECT_DIR/Results_of_exercise_$DOJO_EXERCISE_ID/
+EXERCISE_RESULTS_FILENAME=results.json
+
+DOCKER_COMPOSE_PROJECT_NAME=dojo
\ No newline at end of file
diff --git a/AssignmentChecker/package-lock.json b/AssignmentChecker/package-lock.json
index 17196ad4f74438d5a72ea49f3e835faf5ec88a63..237fb2f73371c040cfb4dab575a57272c97310e6 100644
--- a/AssignmentChecker/package-lock.json
+++ b/AssignmentChecker/package-lock.json
@@ -167,371 +167,411 @@
             }
         },
         "node_modules/@esbuild/aix-ppc64": {
-            "version": "0.21.5",
-            "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz",
-            "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==",
+            "version": "0.23.1",
+            "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.23.1.tgz",
+            "integrity": "sha512-6VhYk1diRqrhBAqpJEdjASR/+WVRtfjpqKuNw11cLiaWpAT/Uu+nokB+UJnevzy/P9C/ty6AOe0dwueMrGh/iQ==",
             "cpu": [
                 "ppc64"
             ],
             "dev": true,
+            "license": "MIT",
             "optional": true,
             "os": [
                 "aix"
             ],
             "engines": {
-                "node": ">=12"
+                "node": ">=18"
             }
         },
         "node_modules/@esbuild/android-arm": {
-            "version": "0.21.5",
-            "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz",
-            "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==",
+            "version": "0.23.1",
+            "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.23.1.tgz",
+            "integrity": "sha512-uz6/tEy2IFm9RYOyvKl88zdzZfwEfKZmnX9Cj1BHjeSGNuGLuMD1kR8y5bteYmwqKm1tj8m4cb/aKEorr6fHWQ==",
             "cpu": [
                 "arm"
             ],
             "dev": true,
+            "license": "MIT",
             "optional": true,
             "os": [
                 "android"
             ],
             "engines": {
-                "node": ">=12"
+                "node": ">=18"
             }
         },
         "node_modules/@esbuild/android-arm64": {
-            "version": "0.21.5",
-            "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz",
-            "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==",
+            "version": "0.23.1",
+            "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.23.1.tgz",
+            "integrity": "sha512-xw50ipykXcLstLeWH7WRdQuysJqejuAGPd30vd1i5zSyKK3WE+ijzHmLKxdiCMtH1pHz78rOg0BKSYOSB/2Khw==",
             "cpu": [
                 "arm64"
             ],
             "dev": true,
+            "license": "MIT",
             "optional": true,
             "os": [
                 "android"
             ],
             "engines": {
-                "node": ">=12"
+                "node": ">=18"
             }
         },
         "node_modules/@esbuild/android-x64": {
-            "version": "0.21.5",
-            "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz",
-            "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==",
+            "version": "0.23.1",
+            "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.23.1.tgz",
+            "integrity": "sha512-nlN9B69St9BwUoB+jkyU090bru8L0NA3yFvAd7k8dNsVH8bi9a8cUAUSEcEEgTp2z3dbEDGJGfP6VUnkQnlReg==",
             "cpu": [
                 "x64"
             ],
             "dev": true,
+            "license": "MIT",
             "optional": true,
             "os": [
                 "android"
             ],
             "engines": {
-                "node": ">=12"
+                "node": ">=18"
             }
         },
         "node_modules/@esbuild/darwin-arm64": {
-            "version": "0.21.5",
-            "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz",
-            "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==",
+            "version": "0.23.1",
+            "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.23.1.tgz",
+            "integrity": "sha512-YsS2e3Wtgnw7Wq53XXBLcV6JhRsEq8hkfg91ESVadIrzr9wO6jJDMZnCQbHm1Guc5t/CdDiFSSfWP58FNuvT3Q==",
             "cpu": [
                 "arm64"
             ],
             "dev": true,
+            "license": "MIT",
             "optional": true,
             "os": [
                 "darwin"
             ],
             "engines": {
-                "node": ">=12"
+                "node": ">=18"
             }
         },
         "node_modules/@esbuild/darwin-x64": {
-            "version": "0.21.5",
-            "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz",
-            "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==",
+            "version": "0.23.1",
+            "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.23.1.tgz",
+            "integrity": "sha512-aClqdgTDVPSEGgoCS8QDG37Gu8yc9lTHNAQlsztQ6ENetKEO//b8y31MMu2ZaPbn4kVsIABzVLXYLhCGekGDqw==",
             "cpu": [
                 "x64"
             ],
             "dev": true,
+            "license": "MIT",
             "optional": true,
             "os": [
                 "darwin"
             ],
             "engines": {
-                "node": ">=12"
+                "node": ">=18"
             }
         },
         "node_modules/@esbuild/freebsd-arm64": {
-            "version": "0.21.5",
-            "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz",
-            "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==",
+            "version": "0.23.1",
+            "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.23.1.tgz",
+            "integrity": "sha512-h1k6yS8/pN/NHlMl5+v4XPfikhJulk4G+tKGFIOwURBSFzE8bixw1ebjluLOjfwtLqY0kewfjLSrO6tN2MgIhA==",
             "cpu": [
                 "arm64"
             ],
             "dev": true,
+            "license": "MIT",
             "optional": true,
             "os": [
                 "freebsd"
             ],
             "engines": {
-                "node": ">=12"
+                "node": ">=18"
             }
         },
         "node_modules/@esbuild/freebsd-x64": {
-            "version": "0.21.5",
-            "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz",
-            "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==",
+            "version": "0.23.1",
+            "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.23.1.tgz",
+            "integrity": "sha512-lK1eJeyk1ZX8UklqFd/3A60UuZ/6UVfGT2LuGo3Wp4/z7eRTRYY+0xOu2kpClP+vMTi9wKOfXi2vjUpO1Ro76g==",
             "cpu": [
                 "x64"
             ],
             "dev": true,
+            "license": "MIT",
             "optional": true,
             "os": [
                 "freebsd"
             ],
             "engines": {
-                "node": ">=12"
+                "node": ">=18"
             }
         },
         "node_modules/@esbuild/linux-arm": {
-            "version": "0.21.5",
-            "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz",
-            "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==",
+            "version": "0.23.1",
+            "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.23.1.tgz",
+            "integrity": "sha512-CXXkzgn+dXAPs3WBwE+Kvnrf4WECwBdfjfeYHpMeVxWE0EceB6vhWGShs6wi0IYEqMSIzdOF1XjQ/Mkm5d7ZdQ==",
             "cpu": [
                 "arm"
             ],
             "dev": true,
+            "license": "MIT",
             "optional": true,
             "os": [
                 "linux"
             ],
             "engines": {
-                "node": ">=12"
+                "node": ">=18"
             }
         },
         "node_modules/@esbuild/linux-arm64": {
-            "version": "0.21.5",
-            "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz",
-            "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==",
+            "version": "0.23.1",
+            "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.23.1.tgz",
+            "integrity": "sha512-/93bf2yxencYDnItMYV/v116zff6UyTjo4EtEQjUBeGiVpMmffDNUyD9UN2zV+V3LRV3/on4xdZ26NKzn6754g==",
             "cpu": [
                 "arm64"
             ],
             "dev": true,
+            "license": "MIT",
             "optional": true,
             "os": [
                 "linux"
             ],
             "engines": {
-                "node": ">=12"
+                "node": ">=18"
             }
         },
         "node_modules/@esbuild/linux-ia32": {
-            "version": "0.21.5",
-            "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz",
-            "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==",
+            "version": "0.23.1",
+            "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.23.1.tgz",
+            "integrity": "sha512-VTN4EuOHwXEkXzX5nTvVY4s7E/Krz7COC8xkftbbKRYAl96vPiUssGkeMELQMOnLOJ8k3BY1+ZY52tttZnHcXQ==",
             "cpu": [
                 "ia32"
             ],
             "dev": true,
+            "license": "MIT",
             "optional": true,
             "os": [
                 "linux"
             ],
             "engines": {
-                "node": ">=12"
+                "node": ">=18"
             }
         },
         "node_modules/@esbuild/linux-loong64": {
-            "version": "0.21.5",
-            "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz",
-            "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==",
+            "version": "0.23.1",
+            "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.23.1.tgz",
+            "integrity": "sha512-Vx09LzEoBa5zDnieH8LSMRToj7ir/Jeq0Gu6qJ/1GcBq9GkfoEAoXvLiW1U9J1qE/Y/Oyaq33w5p2ZWrNNHNEw==",
             "cpu": [
                 "loong64"
             ],
             "dev": true,
+            "license": "MIT",
             "optional": true,
             "os": [
                 "linux"
             ],
             "engines": {
-                "node": ">=12"
+                "node": ">=18"
             }
         },
         "node_modules/@esbuild/linux-mips64el": {
-            "version": "0.21.5",
-            "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz",
-            "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==",
+            "version": "0.23.1",
+            "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.23.1.tgz",
+            "integrity": "sha512-nrFzzMQ7W4WRLNUOU5dlWAqa6yVeI0P78WKGUo7lg2HShq/yx+UYkeNSE0SSfSure0SqgnsxPvmAUu/vu0E+3Q==",
             "cpu": [
                 "mips64el"
             ],
             "dev": true,
+            "license": "MIT",
             "optional": true,
             "os": [
                 "linux"
             ],
             "engines": {
-                "node": ">=12"
+                "node": ">=18"
             }
         },
         "node_modules/@esbuild/linux-ppc64": {
-            "version": "0.21.5",
-            "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz",
-            "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==",
+            "version": "0.23.1",
+            "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.23.1.tgz",
+            "integrity": "sha512-dKN8fgVqd0vUIjxuJI6P/9SSSe/mB9rvA98CSH2sJnlZ/OCZWO1DJvxj8jvKTfYUdGfcq2dDxoKaC6bHuTlgcw==",
             "cpu": [
                 "ppc64"
             ],
             "dev": true,
+            "license": "MIT",
             "optional": true,
             "os": [
                 "linux"
             ],
             "engines": {
-                "node": ">=12"
+                "node": ">=18"
             }
         },
         "node_modules/@esbuild/linux-riscv64": {
-            "version": "0.21.5",
-            "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz",
-            "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==",
+            "version": "0.23.1",
+            "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.23.1.tgz",
+            "integrity": "sha512-5AV4Pzp80fhHL83JM6LoA6pTQVWgB1HovMBsLQ9OZWLDqVY8MVobBXNSmAJi//Csh6tcY7e7Lny2Hg1tElMjIA==",
             "cpu": [
                 "riscv64"
             ],
             "dev": true,
+            "license": "MIT",
             "optional": true,
             "os": [
                 "linux"
             ],
             "engines": {
-                "node": ">=12"
+                "node": ">=18"
             }
         },
         "node_modules/@esbuild/linux-s390x": {
-            "version": "0.21.5",
-            "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz",
-            "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==",
+            "version": "0.23.1",
+            "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.23.1.tgz",
+            "integrity": "sha512-9ygs73tuFCe6f6m/Tb+9LtYxWR4c9yg7zjt2cYkjDbDpV/xVn+68cQxMXCjUpYwEkze2RcU/rMnfIXNRFmSoDw==",
             "cpu": [
                 "s390x"
             ],
             "dev": true,
+            "license": "MIT",
             "optional": true,
             "os": [
                 "linux"
             ],
             "engines": {
-                "node": ">=12"
+                "node": ">=18"
             }
         },
         "node_modules/@esbuild/linux-x64": {
-            "version": "0.21.5",
-            "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz",
-            "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==",
+            "version": "0.23.1",
+            "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.23.1.tgz",
+            "integrity": "sha512-EV6+ovTsEXCPAp58g2dD68LxoP/wK5pRvgy0J/HxPGB009omFPv3Yet0HiaqvrIrgPTBuC6wCH1LTOY91EO5hQ==",
             "cpu": [
                 "x64"
             ],
             "dev": true,
+            "license": "MIT",
             "optional": true,
             "os": [
                 "linux"
             ],
             "engines": {
-                "node": ">=12"
+                "node": ">=18"
             }
         },
         "node_modules/@esbuild/netbsd-x64": {
-            "version": "0.21.5",
-            "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz",
-            "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==",
+            "version": "0.23.1",
+            "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.23.1.tgz",
+            "integrity": "sha512-aevEkCNu7KlPRpYLjwmdcuNz6bDFiE7Z8XC4CPqExjTvrHugh28QzUXVOZtiYghciKUacNktqxdpymplil1beA==",
             "cpu": [
                 "x64"
             ],
             "dev": true,
+            "license": "MIT",
             "optional": true,
             "os": [
                 "netbsd"
             ],
             "engines": {
-                "node": ">=12"
+                "node": ">=18"
+            }
+        },
+        "node_modules/@esbuild/openbsd-arm64": {
+            "version": "0.23.1",
+            "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.23.1.tgz",
+            "integrity": "sha512-3x37szhLexNA4bXhLrCC/LImN/YtWis6WXr1VESlfVtVeoFJBRINPJ3f0a/6LV8zpikqoUg4hyXw0sFBt5Cr+Q==",
+            "cpu": [
+                "arm64"
+            ],
+            "dev": true,
+            "license": "MIT",
+            "optional": true,
+            "os": [
+                "openbsd"
+            ],
+            "engines": {
+                "node": ">=18"
             }
         },
         "node_modules/@esbuild/openbsd-x64": {
-            "version": "0.21.5",
-            "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz",
-            "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==",
+            "version": "0.23.1",
+            "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.23.1.tgz",
+            "integrity": "sha512-aY2gMmKmPhxfU+0EdnN+XNtGbjfQgwZj43k8G3fyrDM/UdZww6xrWxmDkuz2eCZchqVeABjV5BpildOrUbBTqA==",
             "cpu": [
                 "x64"
             ],
             "dev": true,
+            "license": "MIT",
             "optional": true,
             "os": [
                 "openbsd"
             ],
             "engines": {
-                "node": ">=12"
+                "node": ">=18"
             }
         },
         "node_modules/@esbuild/sunos-x64": {
-            "version": "0.21.5",
-            "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz",
-            "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==",
+            "version": "0.23.1",
+            "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.23.1.tgz",
+            "integrity": "sha512-RBRT2gqEl0IKQABT4XTj78tpk9v7ehp+mazn2HbUeZl1YMdaGAQqhapjGTCe7uw7y0frDi4gS0uHzhvpFuI1sA==",
             "cpu": [
                 "x64"
             ],
             "dev": true,
+            "license": "MIT",
             "optional": true,
             "os": [
                 "sunos"
             ],
             "engines": {
-                "node": ">=12"
+                "node": ">=18"
             }
         },
         "node_modules/@esbuild/win32-arm64": {
-            "version": "0.21.5",
-            "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz",
-            "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==",
+            "version": "0.23.1",
+            "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.23.1.tgz",
+            "integrity": "sha512-4O+gPR5rEBe2FpKOVyiJ7wNDPA8nGzDuJ6gN4okSA1gEOYZ67N8JPk58tkWtdtPeLz7lBnY6I5L3jdsr3S+A6A==",
             "cpu": [
                 "arm64"
             ],
             "dev": true,
+            "license": "MIT",
             "optional": true,
             "os": [
                 "win32"
             ],
             "engines": {
-                "node": ">=12"
+                "node": ">=18"
             }
         },
         "node_modules/@esbuild/win32-ia32": {
-            "version": "0.21.5",
-            "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz",
-            "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==",
+            "version": "0.23.1",
+            "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.23.1.tgz",
+            "integrity": "sha512-BcaL0Vn6QwCwre3Y717nVHZbAa4UBEigzFm6VdsVdT/MbZ38xoj1X9HPkZhbmaBGUD1W8vxAfffbDe8bA6AKnQ==",
             "cpu": [
                 "ia32"
             ],
             "dev": true,
+            "license": "MIT",
             "optional": true,
             "os": [
                 "win32"
             ],
             "engines": {
-                "node": ">=12"
+                "node": ">=18"
             }
         },
         "node_modules/@esbuild/win32-x64": {
-            "version": "0.21.5",
-            "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz",
-            "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==",
+            "version": "0.23.1",
+            "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.23.1.tgz",
+            "integrity": "sha512-BHpFFeslkWrXWyUPnbKm+xYYVYruCinGcftSBaa8zoF9hZO4BcSCFUvHVTtzpIY6YzUnYtuEhZ+C9iEXjxnasg==",
             "cpu": [
                 "x64"
             ],
             "dev": true,
+            "license": "MIT",
             "optional": true,
             "os": [
                 "win32"
             ],
             "engines": {
-                "node": ">=12"
+                "node": ">=18"
             }
         },
         "node_modules/@eslint-community/eslint-utils": {
@@ -2094,41 +2134,43 @@
             }
         },
         "node_modules/esbuild": {
-            "version": "0.21.5",
-            "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz",
-            "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==",
+            "version": "0.23.1",
+            "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.23.1.tgz",
+            "integrity": "sha512-VVNz/9Sa0bs5SELtn3f7qhJCDPCF5oMEl5cO9/SSinpE9hbPVvxbd572HH5AKiP7WD8INO53GgfDDhRjkylHEg==",
             "dev": true,
             "hasInstallScript": true,
+            "license": "MIT",
             "bin": {
                 "esbuild": "bin/esbuild"
             },
             "engines": {
-                "node": ">=12"
+                "node": ">=18"
             },
             "optionalDependencies": {
-                "@esbuild/aix-ppc64": "0.21.5",
-                "@esbuild/android-arm": "0.21.5",
-                "@esbuild/android-arm64": "0.21.5",
-                "@esbuild/android-x64": "0.21.5",
-                "@esbuild/darwin-arm64": "0.21.5",
-                "@esbuild/darwin-x64": "0.21.5",
-                "@esbuild/freebsd-arm64": "0.21.5",
-                "@esbuild/freebsd-x64": "0.21.5",
-                "@esbuild/linux-arm": "0.21.5",
-                "@esbuild/linux-arm64": "0.21.5",
-                "@esbuild/linux-ia32": "0.21.5",
-                "@esbuild/linux-loong64": "0.21.5",
-                "@esbuild/linux-mips64el": "0.21.5",
-                "@esbuild/linux-ppc64": "0.21.5",
-                "@esbuild/linux-riscv64": "0.21.5",
-                "@esbuild/linux-s390x": "0.21.5",
-                "@esbuild/linux-x64": "0.21.5",
-                "@esbuild/netbsd-x64": "0.21.5",
-                "@esbuild/openbsd-x64": "0.21.5",
-                "@esbuild/sunos-x64": "0.21.5",
-                "@esbuild/win32-arm64": "0.21.5",
-                "@esbuild/win32-ia32": "0.21.5",
-                "@esbuild/win32-x64": "0.21.5"
+                "@esbuild/aix-ppc64": "0.23.1",
+                "@esbuild/android-arm": "0.23.1",
+                "@esbuild/android-arm64": "0.23.1",
+                "@esbuild/android-x64": "0.23.1",
+                "@esbuild/darwin-arm64": "0.23.1",
+                "@esbuild/darwin-x64": "0.23.1",
+                "@esbuild/freebsd-arm64": "0.23.1",
+                "@esbuild/freebsd-x64": "0.23.1",
+                "@esbuild/linux-arm": "0.23.1",
+                "@esbuild/linux-arm64": "0.23.1",
+                "@esbuild/linux-ia32": "0.23.1",
+                "@esbuild/linux-loong64": "0.23.1",
+                "@esbuild/linux-mips64el": "0.23.1",
+                "@esbuild/linux-ppc64": "0.23.1",
+                "@esbuild/linux-riscv64": "0.23.1",
+                "@esbuild/linux-s390x": "0.23.1",
+                "@esbuild/linux-x64": "0.23.1",
+                "@esbuild/netbsd-x64": "0.23.1",
+                "@esbuild/openbsd-arm64": "0.23.1",
+                "@esbuild/openbsd-x64": "0.23.1",
+                "@esbuild/sunos-x64": "0.23.1",
+                "@esbuild/win32-arm64": "0.23.1",
+                "@esbuild/win32-ia32": "0.23.1",
+                "@esbuild/win32-x64": "0.23.1"
             }
         },
         "node_modules/escalade": {
@@ -2669,6 +2711,7 @@
             "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
             "dev": true,
             "hasInstallScript": true,
+            "license": "MIT",
             "optional": true,
             "os": [
                 "darwin"
@@ -2750,10 +2793,11 @@
             }
         },
         "node_modules/get-tsconfig": {
-            "version": "4.7.5",
-            "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.5.tgz",
-            "integrity": "sha512-ZCuZCnlqNzjb4QprAzXKdpp/gh6KTxSJuw3IBsPnV/7fV4NxC9ckB+vPTt8w7fJA0TaSD7c55BR47JD6MEDyDw==",
+            "version": "4.8.1",
+            "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.8.1.tgz",
+            "integrity": "sha512-k9PN+cFBmaLWtVz29SkUoqU5O0slLuHJXt/2P+tMVFT+phsSGXGkp9t3rQIqdz0e+06EHNGs3oM6ZX1s2zHxRg==",
             "dev": true,
+            "license": "MIT",
             "dependencies": {
                 "resolve-pkg-maps": "^1.0.0"
             },
@@ -4208,6 +4252,7 @@
             "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz",
             "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==",
             "dev": true,
+            "license": "MIT",
             "funding": {
                 "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1"
             }
@@ -4757,12 +4802,13 @@
             }
         },
         "node_modules/tsx": {
-            "version": "4.16.2",
-            "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.16.2.tgz",
-            "integrity": "sha512-C1uWweJDgdtX2x600HjaFaucXTilT7tgUZHbOE4+ypskZ1OP8CRCSDkCxG6Vya9EwaFIVagWwpaVAn5wzypaqQ==",
+            "version": "4.19.1",
+            "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.19.1.tgz",
+            "integrity": "sha512-0flMz1lh74BR4wOvBjuh9olbnwqCPc35OOlfyzHba0Dc+QNUeWX/Gq2YTbnwcWPO3BMd8fkzRVrHcsR+a7z7rA==",
             "dev": true,
+            "license": "MIT",
             "dependencies": {
-                "esbuild": "~0.21.5",
+                "esbuild": "~0.23.0",
                 "get-tsconfig": "^4.7.5"
             },
             "bin": {
diff --git a/AssignmentChecker/package.json b/AssignmentChecker/package.json
index fc2a51c574a76a01d9ff46832b142816c953b6cf..e7cf7a2cd07e9259d9b923c576d06d4820a69836 100644
--- a/AssignmentChecker/package.json
+++ b/AssignmentChecker/package.json
@@ -4,7 +4,6 @@
     "version"        : "5.0.0",
     "license"        : "AGPLv3",
     "author"         : "Michaƫl Minelli <dojo@minelli.me>",
-    "type"           : "module",
     "main"           : "dist/app.js",
     "bin"            : {
         "dirmanager": "./dist/app.js"
@@ -26,7 +25,7 @@
         "lint"        : "npx eslint .",
         "genversion"  : "npx genversion -s -e src/config/Version.ts",
         "build"       : "npm run genversion; npx tsc",
-        "start:dev"   : "npm run genversion; npm run lint; tsc --noEmit && npx tsx dist/app.js",
+        "start:dev"   : "npm run genversion; npm run lint; tsc --noEmit && npx tsx --no-warnings src/app.ts",
         "test"        : "echo \"Error: no test specified\" && exit 1"
     },
     "dependencies"   : {
diff --git a/AssignmentChecker/src/app.ts b/AssignmentChecker/src/app.ts
index 6f6db64862d96a8410e280da9bf861212f0996f2..fa0d5ce014b6a1da2c9e011e7b12a419dd1c7c06 100644
--- a/AssignmentChecker/src/app.ts
+++ b/AssignmentChecker/src/app.ts
@@ -6,9 +6,14 @@ import Styles                        from './types/Style.js';
 import HttpManager                   from './managers/HttpManager.js';
 import Config                        from './config/Config.js';
 import Icon                          from './shared/types/Icon.js';
+import SharedAssignmentHelper        from './shared/helpers/Dojo/SharedAssignmentHelper';
 
 
 (async () => {
+    await Config.init();
+
+    SharedAssignmentHelper.init(Config.gitlabManager);
+
     HttpManager.registerAxiosInterceptor();
 
     console.log(Styles.APP_NAME(`${ Config.appName } (version {{VERSION}})`));
diff --git a/AssignmentChecker/src/config/Config.ts b/AssignmentChecker/src/config/Config.ts
index 94cb8b6e67ed34c99a7046ed25445296059b71af..729deac3e15e79d20e0f1e5defd0a85e945649c0 100644
--- a/AssignmentChecker/src/config/Config.ts
+++ b/AssignmentChecker/src/config/Config.ts
@@ -1,34 +1,47 @@
-import fs   from 'fs-extra';
-import path from 'path';
+import fs                  from 'fs-extra';
+import path                from 'path';
+import GitlabManager       from '../managers/GitlabManager';
+import ClientsSharedConfig from '../sharedByClients/config/ClientsSharedConfig';
 
 
 class Config {
-    public readonly appName: string;
+    public gitlabManager!: GitlabManager;
 
-    public readonly folders: {
+    public appName!: string;
+
+    public folders!: {
         project: string; resultsVolume: string; resultsDojo: string; resultsExercise: string;
     };
 
-    public readonly dockerhub: {
+    public dockerhub!: {
         repositories: {
             assignmentChecker: string
         }
     };
 
-    constructor() {
-        this.appName = process.env.APP_NAME || '';
+    constructor() { }
+
+    async init() {
+        const apiUrl = process.env.API_URL ?? '';
+
+        await ClientsSharedConfig.init(apiUrl);
+        const getEnvVar = ClientsSharedConfig.envVarGetter();
+
+        this.gitlabManager = new GitlabManager(ClientsSharedConfig.gitlab.URL, ClientsSharedConfig.login.gitlab.client.id, ClientsSharedConfig.login.gitlab.url.redirect, ClientsSharedConfig.login.gitlab.url.token);
+
+        this.appName = getEnvVar('APP_NAME', '');
 
         this.folders = {
-            project        : process.env.PROJECT_FOLDER?.convertWithEnvVars() ?? './',
-            resultsVolume  : process.env.EXERCISE_RESULTS_VOLUME?.convertWithEnvVars() ?? '',
-            resultsDojo    : path.join(process.env.EXERCISE_RESULTS_VOLUME?.convertWithEnvVars() ?? '', 'Dojo/'),
-            resultsExercise: path.join(process.env.EXERCISE_RESULTS_VOLUME?.convertWithEnvVars() ?? '', 'Exercise/')
+            project        : getEnvVar('PROJECT_FOLDER', './').convertWithEnvVars(),
+            resultsVolume  : getEnvVar('EXERCISE_RESULTS_VOLUME', '').convertWithEnvVars(),
+            resultsDojo    : path.join(getEnvVar('EXERCISE_RESULTS_VOLUME', '').convertWithEnvVars(), 'Dojo/'),
+            resultsExercise: path.join(getEnvVar('EXERCISE_RESULTS_VOLUME', '').convertWithEnvVars(), 'Exercise/')
         };
         this.resetResultsVolume();
 
         this.dockerhub = {
             repositories: {
-                assignmentChecker: process.env.DOCKERHUB_ASSIGNMENT_CHECKER_REPOSITORY || ''
+                assignmentChecker: getEnvVar('DOCKERHUB_ASSIGNMENT_CHECKER_REPOSITORY', '')
             }
         };
     }
diff --git a/AssignmentChecker/src/init.ts b/AssignmentChecker/src/init.ts
index 8c19f91bfce0275dda2204a92735c41c1468e73d..4920df1d1beabaf6477fe8ae28de8219242456e8 100644
--- a/AssignmentChecker/src/init.ts
+++ b/AssignmentChecker/src/init.ts
@@ -7,4 +7,6 @@ import './shared/helpers/TypeScriptExtensions.js';
 dotenvExpand.expand(dotenv.config({
                                       path      : path.join(__dirname, '../.env'),
                                       DOTENV_KEY: 'dotenv://:key_f1778b6998874f6fd78c716ccef982c5595fa300f174b129eafc88ba7044d69b@dotenv.local/vault/.env.vault?environment=development'
-                                  }));
\ No newline at end of file
+                                  }));
+
+dotenvExpand.expand(dotenv.config({ path: path.join(__dirname, '../config.env') }));
\ No newline at end of file
diff --git a/AssignmentChecker/src/managers/GitlabManager.ts b/AssignmentChecker/src/managers/GitlabManager.ts
index 2228decdd2acea5058098df2f78ae09145c51e27..142662c38285059584fc50f69f5d938fde473b69 100644
--- a/AssignmentChecker/src/managers/GitlabManager.ts
+++ b/AssignmentChecker/src/managers/GitlabManager.ts
@@ -4,10 +4,10 @@ import SharedGitlabManager from '../shared/managers/SharedGitlabManager.js';
 // File present only for prevent errors from shared submodules
 
 class GitlabManager extends SharedGitlabManager {
-    constructor() {
-        super('');
+    constructor(public gitlabUrl: string, clientId?: string, urlRedirect?: string, urlToken?: string) {
+        super(gitlabUrl, '', clientId, urlRedirect, urlToken);
     }
 }
 
 
-export default new GitlabManager();
\ No newline at end of file
+export default GitlabManager;
\ No newline at end of file
diff --git a/AssignmentChecker/src/shared b/AssignmentChecker/src/shared
index bf75a99ba472386daa111c2fefbe69a4272ef48c..d9ecaee5f58b1b94413903ebf737b4d235bc2858 160000
--- a/AssignmentChecker/src/shared
+++ b/AssignmentChecker/src/shared
@@ -1 +1 @@
-Subproject commit bf75a99ba472386daa111c2fefbe69a4272ef48c
+Subproject commit d9ecaee5f58b1b94413903ebf737b4d235bc2858
diff --git a/AssignmentChecker/src/sharedByClients b/AssignmentChecker/src/sharedByClients
index 4e33e70f6035898f119369ae5db784d51d8298a0..64dc406659114f3afcbc89258afe84c8553c6b8f 160000
--- a/AssignmentChecker/src/sharedByClients
+++ b/AssignmentChecker/src/sharedByClients
@@ -1 +1 @@
-Subproject commit 4e33e70f6035898f119369ae5db784d51d8298a0
+Subproject commit 64dc406659114f3afcbc89258afe84c8553c6b8f
diff --git a/AssignmentChecker/tsconfig.json b/AssignmentChecker/tsconfig.json
index 96fb4746956f00be06516b61b2d50cdc8d621d56..bdd2d43b6302727fc871a6dfccac57243b628b7f 100644
--- a/AssignmentChecker/tsconfig.json
+++ b/AssignmentChecker/tsconfig.json
@@ -1,18 +1,18 @@
 {
     "compilerOptions": {
-        "rootDir"         : "src",
-        "outDir"          : "dist",
-        "strict"          : true,
-        "target"          : "ES2022",
-        "module"          : "commonjs",
-        "sourceMap"       : true,
-        "noImplicitAny"   : true,
-        "esModuleInterop" : true,
-        "lib"             : [
+        "rootDir"        : "src",
+        "outDir"         : "dist",
+        "strict"         : true,
+        "target"         : "ES2022",
+        "module"         : "commonjs",
+        "sourceMap"      : true,
+        "noImplicitAny"  : true,
+        "esModuleInterop": true,
+        "lib"            : [
             "ES2022",
             "DOM"
         ],
-        "types"           : [
+        "types"          : [
             "node"
         ]
     },
@@ -20,6 +20,7 @@
         "node_modules"
     ],
     "include"        : [
-        "src/**/*.ts"
+        "src/**/*.ts",
+        "eslint.config.mjs"
     ]
 }
\ No newline at end of file
diff --git a/deploy_on_dockerhub.sh b/deploy_on_dockerhub.sh
new file mode 100755
index 0000000000000000000000000000000000000000..6980a39211d37a5690834ad68e07ae748bc49ff1
--- /dev/null
+++ b/deploy_on_dockerhub.sh
@@ -0,0 +1,135 @@
+#!/bin/bash
+
+# Define color codes
+RED='\033[0;31m'
+GREEN='\033[0;32m'
+YELLOW='\033[1;33m'
+NC='\033[0m' # No Color
+
+
+DOCKERFILE=Dockerfile_AssignmentChecker
+
+PROJECT_FOLDER=AssignmentChecker
+
+test_if_command_unsuccessful() {
+    local status=$1
+    local title=$2
+    local text_if_failed=$3
+    if [ "$status" -ne 0 ]; then
+        echo -e "${title}: ${RED}${text_if_failed}: $status${NC}\n"
+        exit 1
+    fi
+}
+
+
+##########################################################
+# Function to prompt for input if not provided
+prompt_if_empty() {
+    local var_name=$1
+    local prompt_message=$2
+    local var_value=${!var_name}
+
+    if [ -z "$var_value" ]; then
+        read -p "$prompt_message: " var_value
+        export "$var_name"="$var_value"
+    fi
+}
+
+# Parse parameters
+while [ "$1" != "" ]; do
+    case $1 in
+        --dockerhub-user )       shift
+                                DOCKER_REGISTRY_USER=$1
+                                ;;
+        --dockerhub-password )   shift
+                                DOCKER_REGISTRY_PASSWORD=$1
+                                ;;
+        --dockerhub-repo )       shift
+                                DOCKER_REGISTRY_IMAGE=$1
+                                ;;
+        --backend-url )       shift
+                                API_URL=$1
+                                ;;
+        * )                     echo -e "${RED}Invalid parameter: $1${NC}"
+                                exit 1
+    esac
+    shift
+done
+
+# Prompt for values if not provided
+prompt_if_empty "DOCKER_REGISTRY_USER" "Docker Hub user"
+prompt_if_empty "DOCKER_REGISTRY_PASSWORD" "Docker Hub password"
+prompt_if_empty "DOCKER_REGISTRY_IMAGE" "Docker Hub repository"
+prompt_if_empty "API_URL" "Backend url"
+
+
+##########################################################
+# Function to check if a command exists
+check_dependency() {
+    local cmd=$1
+    if ! command -v $cmd &> /dev/null; then
+        echo -e "${RED}Error: $cmd is not installed.${NC}"
+        exit 1
+    fi
+}
+
+# Check for dependencies
+echo -e "Dependencies: ${YELLOW}Checking...${NC}"
+check_dependency jq
+check_dependency docker
+check_dependency sed
+echo -e "Dependencies: ${GREEN}OK${NC}\n"
+
+
+VERSION=$(jq -r .version $PROJECT_FOLDER/package.json)
+CONTAINER_IMAGE=$DOCKER_REGISTRY_IMAGE:$VERSION
+
+
+##########################################################
+# Login to Docker Hub
+echo -e "Docker Hub: ${YELLOW}Login in...${NC}"
+echo "$DOCKER_REGISTRY_PASSWORD" | docker login -u "$DOCKER_REGISTRY_USER" --password-stdin "$DOCKER_REGISTRY" > /dev/null
+test_if_command_unsuccessful $? "Docker Hub" "FAILED to login in"
+echo -e "Docker Hub: ${GREEN}Logged in${NC}\n"
+
+
+##########################################################
+echo -e "Project files: ${YELLOW}Configuring...${NC}"
+
+(
+
+cd $PROJECT_FOLDER || exit 1
+
+sed -i -r "s/\{\{VERSION\}\}/${VERSION}/g" src/app.ts 2> /dev/null
+if [ $? -ne 0 ]; then # If on macOS
+    sed -i -r "s/{{VERSION}}/${VERSION}/g" src/app.ts 2> /dev/null
+fi
+
+sed -i -r "s/(DOTENV_KEY[ ]*:[ ]*[\'\"\`])[^'\"\`]*([\'\"\`])([ ]*\,)?//g" src/init.ts
+sed -i -r "s/,[\ \n]*\}/\}/g" src/init.ts
+
+# Write the content to the file
+cat <<EOL > ".env"
+##################### App env vars
+API_URL=${API_URL}
+DOCKERHUB_ASSIGNMENT_CHECKER_REPOSITORY=${DOCKER_REGISTRY_IMAGE}
+EOL
+
+)
+
+echo -e "Project files: ${GREEN}Configured${NC}\n"
+
+
+##########################################################
+echo -e "Docker: ${YELLOW}Building/Uploading to Docker Hub...${NC}"
+
+docker buildx create --use --platform=linux/amd64 > /dev/null 2> /dev/null
+test_if_command_unsuccessful $? "Docker" "FAILED to initialize builder"
+
+docker buildx build --platform=linux/amd64 --file $DOCKERFILE --push --tag "$CONTAINER_IMAGE" . > /dev/null 2> /dev/null
+test_if_command_unsuccessful $? "Docker" "FAILED to build"
+
+docker buildx imagetools create "$CONTAINER_IMAGE" --tag "$DOCKER_REGISTRY_IMAGE":latest > /dev/null 2> /dev/null
+test_if_command_unsuccessful $? "Docker" "FAILED to set latest tag"
+
+echo -e "Docker: ${GREEN}Uploaded to Docker Hub${NC}\n"
\ No newline at end of file