diff --git a/.gitignore b/.gitignore
index 43a8d1508996bab2a79fd3dd26f21cbc919a37d3..fa250cd0cdb82094de1413d8f77db6b27b6de113 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,5 +1,6 @@
 aws.xml
 workspace.xml
+.gitlab-ci-local
 
 ############################ MacOS
 # General
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index e55904fd2c9dc1ddf364a98b5c911f584960fd45..46b9417d91ca72665753b9af283498ad3ac10557 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -1,429 +1,8 @@
-variables:
-    GIT_SUBMODULE_STRATEGY: recursive
-    GIT_SUBMODULE_FORCE_HTTPS: "true"
-    SECURE_FILES_DOWNLOAD_PATH: './'
+include: "NodeApp/.gitlab-ci/**.yml"
 
-    PROJECT_NAME: DojoCLI
-
-    BIN_NAME: dojo
-
-    MACOS_PKG_EXTENSION: '.pkg'
-    MACOS_PKG_BIN_NAME: "${BIN_NAME}${MACOS_PKG_EXTENSION}"
-
-    WINDOWS_BIN_EXTENSION: '.exe'
-    WINDOWS_BIN_NAME: "${BIN_NAME}${WINDOWS_BIN_EXTENSION}"
-
-    ARTIFACTS_FOLDER: /artifacts
-
-    GITLAB_API_PROJECT_URL: ${CI_API_V4_URL}/projects/${CI_PROJECT_ID}
-
-    BIN_FOLDER_MACOS: $ARTIFACTS_FOLDER/macOS
-    BIN_FOLDER_LINUX: $ARTIFACTS_FOLDER/Linux
-    BIN_FOLDER_WINDOWS: $ARTIFACTS_FOLDER/Windows
-
-    BIN_FOLDER_MACOS_ARM64: $BIN_FOLDER_MACOS/arm64
-    BIN_FOLDER_MACOS_X64: $BIN_FOLDER_MACOS/x64
-
-    BIN_FILE_MACOS_ARM64: $BIN_FOLDER_MACOS_ARM64/$BIN_NAME
-    BIN_FILE_MACOS_X64: $BIN_FOLDER_MACOS_X64/$BIN_NAME
-    BIN_PKG_FILE_MACOS_ARM64: $BIN_FOLDER_MACOS_ARM64/$MACOS_PKG_BIN_NAME
-    BIN_PKG_FILE_MACOS_X64: $BIN_FOLDER_MACOS_X64/$MACOS_PKG_BIN_NAME
-    BIN_FILE_LINUX_ARM64: $BIN_FOLDER_LINUX/arm64/$BIN_NAME
-    BIN_FILE_LINUX_X64: $BIN_FOLDER_LINUX/x64/$BIN_NAME
-    BIN_FILE_WINDOWS_ARM64: $BIN_FOLDER_WINDOWS/arm64/$WINDOWS_BIN_NAME
-    BIN_FILE_WINDOWS_X64: $BIN_FOLDER_WINDOWS/x64/$WINDOWS_BIN_NAME
-
-    VERSION_FILE: $ARTIFACTS_FOLDER/VERSION
-    VERSION_DEV_SUFFIX: '-dev'
-
-    PROJECT_FOLDER: NodeApp
-
-    PACKAGE_REGISTRY_URL: "${GITLAB_API_PROJECT_URL}/packages/generic/${BIN_NAME}"
-
-    WIKI_FOLDER: Wiki
-
-
-.get_version:
-    script:
-        - IS_DEV=$([[ $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH ]] && echo false || echo true)
-        - VERSION=$(jq -r .version $PROJECT_FOLDER/package.json)$([[ $IS_DEV == true ]] && echo $VERSION_DEV_SUFFIX || echo '')
-
-
-.get_packages_url:
-    script:
-        # Binaries
-        - PACKAGE_URL_MACOS_ARM64_BIN="${PACKAGE_REGISTRY_URL}_macOS-arm64/${VERSION}/${BIN_NAME}"
-        - PACKAGE_URL_MACOS_X64_BIN="${PACKAGE_REGISTRY_URL}_macOS-x64/${VERSION}/${BIN_NAME}"
-        - PACKAGE_URL_LINUX_ARM64_BIN="${PACKAGE_REGISTRY_URL}_Linux-arm64/${VERSION}/${BIN_NAME}"
-        - PACKAGE_URL_LINUX_X64_BIN="${PACKAGE_REGISTRY_URL}_Linux-x64/${VERSION}/${BIN_NAME}"
-        - PACKAGE_URL_WINDOWS_ARM64_BIN="${PACKAGE_REGISTRY_URL}_Windows-arm64/${VERSION}/${WINDOWS_BIN_NAME}"
-        - PACKAGE_URL_WINDOWS_X64_BIN="${PACKAGE_REGISTRY_URL}_Windows-x64/${VERSION}/${WINDOWS_BIN_NAME}"
-
-        # Packages
-        - PACKAGE_URL_MACOS_ARM64_PKG="${PACKAGE_REGISTRY_URL}_macOS-pkg-arm64/${VERSION}/${MACOS_PKG_BIN_NAME}"
-        - PACKAGE_URL_MACOS_X64_PKG="${PACKAGE_REGISTRY_URL}_macOS-pkg-x64/${VERSION}/${MACOS_PKG_BIN_NAME}"
-
-        # Wiki
-        - WIKI_ARCHIVE_NAME="${PROJECT_NAME}_Wiki_${VERSION}.tar.xz"
-        - PACKAGE_URL_WIKI="${PACKAGE_REGISTRY_URL}_Wiki/${VERSION}/${WIKI_ARCHIVE_NAME}"
-
-
-.build_cli:
-    script:
-        - cd "${PROJECT_FOLDER}"
-
-        # Install dependencies
-        - npm install
-
-        # Set version number shown in CLI
-        - sed -i -r "s/\{\{VERSION\}\}/${VERSION}/g" src/commander/CommanderApp.ts
-
-        # Decrypt env vars for production
-        - |
-            if [ $CI_COMMIT_REF_PROTECTED == "true" ]; then
-                echo "Decrypt production env vars"
-                sed -i -r "s/(DOTENV_KEY[ ]*:[ ]*[\'\"\`])[^'\"\`]*([\'\"\`])([ ]*\,)?//g" src/app.ts
-                sed -i -r "s/,[\ \n]*\}/\}/g" src/app.ts
-                npx dotenv-vault local decrypt "${DOTENV_PROD_KEY}" > .env
-            fi
-
-        # Build
-        - npm run build
-
-        # Build binaries
-        ## macOS
-        - npx pkg . -t node18-macos-arm64 --output $BIN_FILE_MACOS_ARM64 --no-bytecode --compress Brotli --public-packages "*" --public
-        - npx pkg . -t node18-macos-x64 --output $BIN_FILE_MACOS_X64 --no-bytecode --compress Brotli --public-packages "*" --public
-
-        ## Linux
-        - npx pkg . -t node18-linuxstatic-arm64 --output $BIN_FILE_LINUX_ARM64 --no-bytecode --compress Brotli --public-packages "*" --public
-        - npx pkg . -t node18-linuxstatic-x64 --output $BIN_FILE_LINUX_X64 --no-bytecode --compress Brotli --public-packages "*" --public
-
-        ## Windows
-        - npx pkg . -t node18-win-arm64 --output $BIN_FILE_WINDOWS_ARM64 --no-bytecode --compress Brotli --public-packages "*" --public
-        - npx pkg . -t node18-win-x64 --output $BIN_FILE_WINDOWS_X64 --no-bytecode --compress Brotli --public-packages "*" --public
-
-
-.sign_macos:
+lint_pass:
+    only:
+        variables:
+            - $FOO == "bar"
     script:
-        # Sign excecutable
-        - codesign --force --options=runtime --entitlements ../../../Resources/macApp/Signing/entitlements.plist --sign $SIGN_DEV_ID_APP --keychain $SIGN_LOGIN_KEYCHAIN_PATH --timestamp ${BIN_NAME}
-
-        # Package and notarize the app
-        - xcrun notarytool store-credentials --apple-id $SIGN_APPLE_ID --team-id $SIGN_TEAM_ID --password $SIGN_APP_PASSWORD --keychain $SIGN_LOGIN_KEYCHAIN_PATH $SIGN_KEYCHAIN_PROFILE
-        - ditto ${BIN_NAME} ${BIN_NAME}_pkg/usr/local/bin/
-        - productbuild --identifier $SIGN_IDENTIFIER --version $VERSION --sign $SIGN_DEV_ID_INST --keychain $SIGN_LOGIN_KEYCHAIN_PATH --timestamp --root ${BIN_NAME}_pkg / ${MACOS_PKG_BIN_NAME}
-        - xcrun notarytool submit ${BIN_NAME}.pkg --keychain $SIGN_LOGIN_KEYCHAIN_PATH --keychain-profile $SIGN_KEYCHAIN_PROFILE --wait
-        - xcrun stapler staple ${BIN_NAME}.pkg
-
-        # Clean folder
-        - rm -Rf ${BIN_NAME}_pkg
-
-
-.clean_release:
-    script:
-        # Delete release if it already exists
-        - 'curl --request DELETE --header "JOB-TOKEN: $CI_JOB_TOKEN" "${GITLAB_API_PROJECT_URL}/releases/${VERSION}"'
-
-        # Delete tag if it already exists (use private-token because job-token don't have permission to delete tags)
-        - 'curl --request DELETE --header "PRIVATE-TOKEN: $GITLAB_PROJECT_ACCESS_TOKEN" "${GITLAB_API_PROJECT_URL}/repository/tags/${VERSION}"'
-
-
-.clean_packages:
-    script:
-        # Get all packages of the project
-        - 'curl --header "JOB-TOKEN: $CI_JOB_TOKEN" "${GITLAB_API_PROJECT_URL}/packages" > gitlabPackages.json'
-
-        # Filter and select packages to delete (based on version)
-        - packagesToDelete=`jq -r '.[] | select(.version=="'${VERSION}'") | ._links.delete_api_path' gitlabPackages.json`
-
-        # Delete packages by calling Gitlab API
-        - >
-            for deletePath in $packagesToDelete; do
-              echo "Deleting package at path : ${deletePath}"
-              curl --request DELETE --header "JOB-TOKEN: $CI_JOB_TOKEN" "${deletePath}"
-            done
-
-
-stages:
-    - test
-    - build
-    - sign
-    - clean
-    - upload
-    - release
-
-
-test:build:
-    stage: test
-    tags:
-        - build
-    image: node:latest
-    script:
-        - apt update
-        - apt install -y jq
-        - !reference [.get_version, script]
-
-        # Build
-        - !reference [.build_cli, script]
-    rules:
-        - if: '$CI_COMMIT_REF_PROTECTED != "true"'
-
-
-build:version:
-    stage: build
-    tags:
-        - build
-    image: node:latest
-    script:
-        - apt update
-        - apt install -y jq
-        - !reference [.get_version, script]
-        - mkdir -p $ARTIFACTS_FOLDER
-        - echo $VERSION > $VERSION_FILE
-
-        # Build
-        - !reference [.build_cli, script]
-    artifacts:
-        untracked: true
-        paths:
-            - $ARTIFACTS_FOLDER/*
-        expire_in: 1 hour
-    rules:
-        - if: '$CI_COMMIT_REF_PROTECTED == "true"'
-
-
-sign:macos:
-    stage: sign
-    tags:
-        - macos_signing
-    dependencies:
-        - build:version
-    script:
-        - VERSION=$(cat $VERSION_FILE)
-        - security unlock-keychain -p $SIGN_KEYCHAIN_PASSWORD $SIGN_LOGIN_KEYCHAIN_PATH
-
-        # Sign Apple Silicon binary
-        - cd $BIN_FOLDER_MACOS_ARM64
-        - !reference [.sign_macos, script]
-
-        # Sign Intel binary
-        - cd $BIN_FOLDER_MACOS_X64
-        - !reference [.sign_macos, script]
-    artifacts:
-        paths:
-            - $ARTIFACTS_FOLDER/*
-        expire_in: 1 hour
-    rules:
-        - if: '$CI_COMMIT_REF_PROTECTED == "true"'
-
-
-clean:release:
-    stage: clean
-    tags:
-        - gitlab_clean
-    image: registry.gitlab.com/gitlab-ci-utils/curl-jq:latest
-    script:
-        - !reference [.get_version, script]
-        - !reference [.clean_release, script]
-    rules:
-        - if: '$CI_COMMIT_REF_PROTECTED == "true"'
-
-
-clean:packages:
-    stage: clean
-    tags:
-        - gitlab_clean
-    image: registry.gitlab.com/gitlab-ci-utils/curl-jq:latest
-    script:
-        - !reference [.get_version, script]
-        - !reference [.clean_packages, script]
-    rules:
-        - if: '$CI_COMMIT_REF_PROTECTED == "true"'
-
-
-clean:dev:release:
-    stage: clean
-    tags:
-        - gitlab_clean
-    image: registry.gitlab.com/gitlab-ci-utils/curl-jq:latest
-    script:
-        - !reference [.get_version, script]
-        - VERSION="${VERSION}${VERSION_DEV_SUFFIX}"
-        - !reference [.clean_release, script]
-    rules:
-        - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH'
-
-
-clean:dev:packages:
-    stage: clean
-    tags:
-        - gitlab_clean
-    image: registry.gitlab.com/gitlab-ci-utils/curl-jq:latest
-    script:
-        - !reference [.get_version, script]
-        - VERSION="${VERSION}${VERSION_DEV_SUFFIX}"
-        - !reference [.clean_packages, script]
-    rules:
-        - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH'
-
-
-upload:packages:
-    stage: upload
-    tags:
-        - gitlab_package
-    dependencies:
-        - sign:macos
-    image: registry.gitlab.com/gitlab-ci-utils/curl-jq:latest
-    script:
-        - !reference [.get_version, script]
-        - !reference [.get_packages_url, script]
-
-        # macOS
-        - 'curl --header "JOB-TOKEN: $CI_JOB_TOKEN" --upload-file ${BIN_FILE_MACOS_ARM64} "${PACKAGE_URL_MACOS_ARM64_BIN}";'
-        - 'curl --header "JOB-TOKEN: $CI_JOB_TOKEN" --upload-file ${BIN_FILE_MACOS_X64} "${PACKAGE_URL_MACOS_X64_BIN}";'
-        - 'curl --header "JOB-TOKEN: $CI_JOB_TOKEN" --upload-file ${BIN_PKG_FILE_MACOS_ARM64} "${PACKAGE_URL_MACOS_ARM64_PKG}";'
-        - 'curl --header "JOB-TOKEN: $CI_JOB_TOKEN" --upload-file ${BIN_PKG_FILE_MACOS_X64} "${PACKAGE_URL_MACOS_X64_PKG}";'
-
-        # Linux
-        - 'curl --header "JOB-TOKEN: $CI_JOB_TOKEN" --upload-file ${BIN_FILE_LINUX_ARM64} "${PACKAGE_URL_LINUX_ARM64_BIN}";'
-        - 'curl --header "JOB-TOKEN: $CI_JOB_TOKEN" --upload-file ${BIN_FILE_LINUX_X64} "${PACKAGE_URL_LINUX_X64_BIN}";'
-
-        # Windows
-        - 'curl --header "JOB-TOKEN: $CI_JOB_TOKEN" --upload-file ${BIN_FILE_WINDOWS_ARM64} "${PACKAGE_URL_WINDOWS_ARM64_BIN}";'
-        - 'curl --header "JOB-TOKEN: $CI_JOB_TOKEN" --upload-file ${BIN_FILE_WINDOWS_X64} "${PACKAGE_URL_WINDOWS_X64_BIN}";'
-    rules:
-        - if: '$CI_COMMIT_REF_PROTECTED == "true"'
-
-
-upload:packages:wiki:
-    stage: upload
-    tags:
-        - gitlab_package
-    image: registry.gitlab.com/gitlab-ci-utils/curl-jq:latest
-    script:
-        # Install dependencies
-        - apk update
-        - apk add xz
-
-        - !reference [.get_version, script]
-        - !reference [.get_packages_url, script]
-
-        # Create archive
-        - WIKI_ARCHIVE_PATH="${ARTIFACTS_FOLDER}/${WIKI_ARCHIVE_NAME}"
-        - tar -v -c -C "${CI_PROJECT_DIR}/${WIKI_FOLDER}" -J -f "${WIKI_ARCHIVE_PATH}" . # Ubuntu: tar --verbose --create --cd wiki-test-2 --xz --file file.tar.bz2
-
-        # Send package
-        - 'curl --header "JOB-TOKEN: $CI_JOB_TOKEN" --upload-file ${WIKI_ARCHIVE_PATH} "${PACKAGE_URL_WIKI}";'
-    rules:
-        - if: '$CI_COMMIT_REF_PROTECTED == "true"'
-
-
-release:wiki:
-    stage: release
-    tags:
-        - release
-    image: alpine:latest
-    script:
-        - !reference [.get_version, script]
-
-        - apk update
-        - apk add git
-
-        # Define URL for the wiki in terms of project-agnostic predefined variables
-        - WIKI_URL="${CI_SERVER_PROTOCOL}://project_${CI_PROJECT_ID}_bot:${GITLAB_PROJECT_ACCESS_TOKEN}@${CI_SERVER_HOST}:${CI_SERVER_PORT}/${CI_PROJECT_PATH}.wiki.git"
-
-        # Clone this project's wiki under /tmp
-        - rm -rf "/tmp/${CI_PROJECT_NAME}.wiki"
-        - cd /tmp
-        - git clone "${WIKI_URL}"
-
-        # Enter the cloned repo
-        - cd "${CI_PROJECT_NAME}.wiki"
-
-        # Update the file
-        - mv .git/ ../
-        - rm -rf ./*
-        - mv ../.git/ ./
-        - cp "${CI_PROJECT_DIR}/.gitignore" .
-        - cp -R "${CI_PROJECT_DIR}/${WIKI_FOLDER}/." .
-
-        # Set committer info
-        - git config user.name "$GITLAB_USER_NAME"
-        - git config user.email "$GITLAB_USER_EMAIL"
-
-        # Commit the gitignore file
-        - git add ".gitignore"
-        - git commit -m "Add gitignore file" || true
-
-        # Commit the file
-        - git add .
-        - git commit -m "${VERSION}" || true
-
-        # Push the change back to the master branch of the wiki
-        - git push origin "HEAD:main"
-    rules:
-        - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH'
-
-
-release:gitlab:
-    stage: release
-    tags:
-        - release
-    image: registry.gitlab.com/gitlab-ci-utils/curl-jq:latest
-    script:
-        - !reference [.get_version, script]
-        - !reference [.get_packages_url, script]
-
-        # Extract description from CHANGELOG.md
-        - CHANGELOG_LINE_START=`awk '/##\ [0-9]+\.[0-9]+\.[0-9]+/{print NR; exit;}' CHANGELOG.md`
-        - CHANGELOG_LINE_END=`awk '/##\ [0-9]+\.[0-9]+\.[0-9]+/{ count++; if(count>1) {print NR; exit;}}' CHANGELOG.md`
-        - DESCRIPTION=`awk 'NR > '$CHANGELOG_LINE_START' && NR < '$CHANGELOG_LINE_END'' CHANGELOG.md`
-
-        # Create Release (can't be done by release_step of gitlab image because it don't have access to env var defined in script_step)
-        - >
-            RELEASE_DATA=$(jq --null-input --arg version "$VERSION" --arg description "# Changelog (version $VERSION) $DESCRIPTION" --arg tag_name "$VERSION" --arg ref "$CI_COMMIT_SHORT_SHA" '{
-                "name": $version,
-                "description": $description,
-                "tag_name": $tag_name,
-                "ref": $ref,
-                "assets": {
-                    "links": [
-                        {
-                          "name": "Windows (ARM64) binary",
-                          "url": "'${PACKAGE_URL_WINDOWS_ARM64_BIN}'",
-                        },{
-                            "name": "Windows (x64) binary",
-                            "url": "'${PACKAGE_URL_WINDOWS_X64_BIN}'",
-                        },{
-                            "name": "Linux (ARM64) binary",
-                            "url": "'${PACKAGE_URL_LINUX_ARM64_BIN}'",
-                        },{
-                            "name": "Linux (x64) binary",
-                            "url": "'${PACKAGE_URL_LINUX_X64_BIN}'",
-                        },{
-                            "name": "macOS (Intel) binary",
-                            "url": "'${PACKAGE_URL_MACOS_X64_BIN}'",
-                        },{
-                          "name": "macOS (Apple Silicon) binary",
-                          "url": "'${PACKAGE_URL_MACOS_ARM64_BIN}'",
-                        },{
-                            "name": "macOS (Intel) package",
-                            "url": "'${PACKAGE_URL_MACOS_X64_PKG}'",
-                        },{
-                            "name": "macOS (Apple Silicon) package",
-                            "url": "'${PACKAGE_URL_MACOS_ARM64_PKG}'",
-                        },{
-                          "name": "Wiki",
-                          "url": "'${PACKAGE_URL_WIKI}'",
-                        }
-                    ]                       
-                }
-            }')
-        - >
-            curl --data "${RELEASE_DATA}" \
-              --header "Content-Type: application/json" \
-              --header "JOB-TOKEN: $CI_JOB_TOKEN" \
-              --request POST "${GITLAB_API_PROJECT_URL}/releases"
-    rules:
-        - if: '$CI_COMMIT_REF_PROTECTED == "true"'
\ No newline at end of file
+        - echo
diff --git a/NodeApp/.gitlab-ci/00_vars.yml b/NodeApp/.gitlab-ci/00_vars.yml
new file mode 100644
index 0000000000000000000000000000000000000000..b2f058ad22a29824086741b5e0199b107a698ee7
--- /dev/null
+++ b/NodeApp/.gitlab-ci/00_vars.yml
@@ -0,0 +1,54 @@
+variables:
+    GIT_SUBMODULE_STRATEGY: recursive
+    GIT_SUBMODULE_FORCE_HTTPS: "true"
+    SECURE_FILES_DOWNLOAD_PATH: './'
+
+    PROJECT_NAME: DojoCLI
+    PROJECT_FOLDER: NodeApp
+
+    RESOURCES_FOLDER: "${CI_PROJECT_DIR}/Resources"
+
+    BIN_NAME: dojo
+
+    PKG_EXTENSION_DEBIAN: '.deb'
+    PKG_EXTENSION_MACOS: '.pkg'
+
+    PKG_BIN_NAME_DEBIAN: "${BIN_NAME}${PKG_EXTENSION_DEBIAN}"
+    PKG_BIN_NAME_MACOS: "${BIN_NAME}${PKG_EXTENSION_MACOS}"
+
+    BIN_EXTENSION_WINDOWS: '.exe'
+    BIN_NAME_WINDOWS: "${BIN_NAME}${BIN_EXTENSION_WINDOWS}"
+
+    ARTIFACTS_FOLDER: /artifacts
+
+    GITLAB_API_PROJECT_URL: ${CI_API_V4_URL}/projects/${CI_PROJECT_ID}
+
+    BIN_FOLDER_MACOS: $ARTIFACTS_FOLDER/macOS
+    BIN_FOLDER_LINUX: $ARTIFACTS_FOLDER/Linux
+    BIN_FOLDER_WINDOWS: $ARTIFACTS_FOLDER/Windows
+
+    BIN_FOLDER_LINUX_ARM64: $BIN_FOLDER_LINUX/arm64
+    BIN_FOLDER_LINUX_X64: $BIN_FOLDER_LINUX/x64
+    BIN_FOLDER_MACOS_ARM64: $BIN_FOLDER_MACOS/arm64
+    BIN_FOLDER_MACOS_X64: $BIN_FOLDER_MACOS/x64
+    BIN_FOLDER_WINDOWS_ARM64: $BIN_FOLDER_WINDOWS/arm64
+    BIN_FOLDER_WINDOWS_X64: $BIN_FOLDER_WINDOWS/x64
+
+    BIN_FILE_MACOS_ARM64: $BIN_FOLDER_MACOS_ARM64/$BIN_NAME
+    BIN_FILE_MACOS_X64: $BIN_FOLDER_MACOS_X64/$BIN_NAME
+    BIN_FILE_LINUX_ARM64: $BIN_FOLDER_LINUX_ARM64/$BIN_NAME
+    BIN_FILE_LINUX_X64: $BIN_FOLDER_LINUX_X64/$BIN_NAME
+    BIN_FILE_WINDOWS_ARM64: $BIN_FOLDER_WINDOWS_ARM64/$BIN_NAME_WINDOWS
+    BIN_FILE_WINDOWS_X64: $BIN_FOLDER_WINDOWS_X64/$BIN_NAME_WINDOWS
+
+    BIN_PKG_FILE_DEBIAN_ARM64: $BIN_FOLDER_LINUX_ARM64/$PKG_BIN_NAME_DEBIAN
+    BIN_PKG_FILE_DEBIAN_X64: $BIN_FOLDER_LINUX_X64/$PKG_BIN_NAME_DEBIAN
+    BIN_PKG_FILE_MACOS_ARM64: $BIN_FOLDER_MACOS_ARM64/$PKG_BIN_NAME_MACOS
+    BIN_PKG_FILE_MACOS_X64: $BIN_FOLDER_MACOS_X64/$PKG_BIN_NAME_MACOS
+
+    VERSION_FILE: $ARTIFACTS_FOLDER/VERSION
+    VERSION_DEV_SUFFIX: '-dev'
+
+    PACKAGE_REGISTRY_URL: "${GITLAB_API_PROJECT_URL}/packages/generic/${BIN_NAME}"
+
+    WIKI_FOLDER: Wiki
\ No newline at end of file
diff --git a/NodeApp/.gitlab-ci/01_functions.yml b/NodeApp/.gitlab-ci/01_functions.yml
new file mode 100644
index 0000000000000000000000000000000000000000..57b72e642b5194d76bb1a6176bd6a48ec9872b7f
--- /dev/null
+++ b/NodeApp/.gitlab-ci/01_functions.yml
@@ -0,0 +1,108 @@
+.get_version:
+    script:
+        - IS_DEV=$([[ $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH ]] && echo false || echo true)
+        - VERSION=$(jq -r .version $PROJECT_FOLDER/package.json)$([[ $IS_DEV == true ]] && echo $VERSION_DEV_SUFFIX || echo '')
+
+
+.get_last_stable_version:
+    script:
+        # Get all releases of the project
+        - 'curl --header "JOB-TOKEN: $CI_JOB_TOKEN" "${GITLAB_API_PROJECT_URL}/releases" > releases.json'
+
+        # Filter and select last package that don't contains "-dev" in its name
+        - LAST_STABLE_VERSION=`jq -r '[.[] | .name | select (contains("$VERSION_DEV_SUFFIX") | not)][0]' releases.json`
+
+
+.get_packages_url:
+    script:
+        # Binaries
+        - PACKAGE_URL_MACOS_ARM64_BIN="${PACKAGE_REGISTRY_URL}_macOS-arm64/${VERSION}/${BIN_NAME}"
+        - PACKAGE_URL_MACOS_X64_BIN="${PACKAGE_REGISTRY_URL}_macOS-x64/${VERSION}/${BIN_NAME}"
+        - PACKAGE_URL_LINUX_ARM64_BIN="${PACKAGE_REGISTRY_URL}_Linux-arm64/${VERSION}/${BIN_NAME}"
+        - PACKAGE_URL_LINUX_X64_BIN="${PACKAGE_REGISTRY_URL}_Linux-x64/${VERSION}/${BIN_NAME}"
+        - PACKAGE_URL_WINDOWS_ARM64_BIN="${PACKAGE_REGISTRY_URL}_Windows-arm64/${VERSION}/${BIN_NAME_WINDOWS}"
+        - PACKAGE_URL_WINDOWS_X64_BIN="${PACKAGE_REGISTRY_URL}_Windows-x64/${VERSION}/${BIN_NAME_WINDOWS}"
+
+        # Packages
+        - PACKAGE_URL_MACOS_ARM64_PKG="${PACKAGE_REGISTRY_URL}_macOS-pkg-arm64/${VERSION}/${PKG_BIN_NAME_MACOS}"
+        - PACKAGE_URL_MACOS_X64_PKG="${PACKAGE_REGISTRY_URL}_macOS-pkg-x64/${VERSION}/${PKG_BIN_NAME_MACOS}"
+        - PACKAGE_URL_DEBIAN_ARM64_PKG="${PACKAGE_REGISTRY_URL}_debian-pkg-arm64/${VERSION}/${PKG_BIN_NAME_DEBIAN}"
+        - PACKAGE_URL_DEBIAN_X64_PKG="${PACKAGE_REGISTRY_URL}_debian-pkg-x64/${VERSION}/${PKG_BIN_NAME_DEBIAN}"
+
+        # Wiki
+        - WIKI_ARCHIVE_NAME="${PROJECT_NAME}_Wiki_${VERSION}.tar.xz"
+        - PACKAGE_URL_WIKI="${PACKAGE_REGISTRY_URL}_Wiki/${VERSION}/${WIKI_ARCHIVE_NAME}"
+
+
+.build_cli:
+    script:
+        - cd "${PROJECT_FOLDER}"
+
+        # Install dependencies
+        - npm install
+
+        # Set version number shown in CLI
+        - sed -i -r "s/\{\{VERSION\}\}/${VERSION}/g" src/commander/CommanderApp.ts
+
+        # Decrypt env vars for production
+        - |
+            if [ $CI_COMMIT_REF_PROTECTED == "true" ]; then
+                echo "Decrypt production env vars"
+                sed -i -r "s/(DOTENV_KEY[ ]*:[ ]*[\'\"\`])[^'\"\`]*([\'\"\`])([ ]*\,)?//g" src/app.ts
+                sed -i -r "s/,[\ \n]*\}/\}/g" src/app.ts
+                npx dotenv-vault local decrypt "${DOTENV_PROD_KEY}" > .env
+            fi
+
+        # Build
+        - npm run build
+
+        # Build binaries
+        ## macOS
+        - npx pkg . -t node18-macos-arm64 --output $BIN_FILE_MACOS_ARM64 --no-bytecode --compress Brotli --public-packages "*" --public
+        - npx pkg . -t node18-macos-x64 --output $BIN_FILE_MACOS_X64 --no-bytecode --compress Brotli --public-packages "*" --public
+
+        ## Linux
+        - npx pkg . -t node18-linuxstatic-arm64 --output $BIN_FILE_LINUX_ARM64 --no-bytecode --compress Brotli --public-packages "*" --public
+        - npx pkg . -t node18-linuxstatic-x64 --output $BIN_FILE_LINUX_X64 --no-bytecode --compress Brotli --public-packages "*" --public
+
+        ## Windows
+        - npx pkg . -t node18-win-arm64 --output $BIN_FILE_WINDOWS_ARM64 --no-bytecode --compress Brotli --public-packages "*" --public
+        - npx pkg . -t node18-win-x64 --output $BIN_FILE_WINDOWS_X64 --no-bytecode --compress Brotli --public-packages "*" --public
+
+        # Add execution rights to binaries
+        ## macOS
+        - chmod +x $BIN_FILE_MACOS_ARM64
+        - chmod +x $BIN_FILE_MACOS_X64
+
+        ## Linux
+        - chmod +x $BIN_FILE_LINUX_ARM64
+        - chmod +x $BIN_FILE_LINUX_X64
+
+        ## Windows
+        - chmod +x $BIN_FILE_WINDOWS_ARM64
+        - chmod +x $BIN_FILE_WINDOWS_X64
+
+
+.clean_release:
+    script:
+        # Delete release if it already exists
+        - 'curl --request DELETE --header "JOB-TOKEN: $CI_JOB_TOKEN" "${GITLAB_API_PROJECT_URL}/releases/${VERSION}"'
+
+        # Delete tag if it already exists (use private-token because job-token don't have permission to delete tags)
+        - 'curl --request DELETE --header "PRIVATE-TOKEN: $GITLAB_PROJECT_ACCESS_TOKEN" "${GITLAB_API_PROJECT_URL}/repository/tags/${VERSION}"'
+
+
+.clean_packages:
+    script:
+        # Get all packages of the project
+        - 'curl --header "JOB-TOKEN: $CI_JOB_TOKEN" "${GITLAB_API_PROJECT_URL}/packages" > gitlabPackages.json'
+
+        # Filter and select packages to delete (based on version)
+        - packagesToDelete=`jq -r '.[] | select(.version=="'${VERSION}'") | ._links.delete_api_path' gitlabPackages.json`
+
+        # Delete packages by calling Gitlab API
+        - >
+            for deletePath in $packagesToDelete; do
+              echo "Deleting package at path : ${deletePath}"
+              curl --request DELETE --header "JOB-TOKEN: $CI_JOB_TOKEN" "${deletePath}"
+            done
\ No newline at end of file
diff --git a/NodeApp/.gitlab-ci/02_templates.yml b/NodeApp/.gitlab-ci/02_templates.yml
new file mode 100644
index 0000000000000000000000000000000000000000..8bf24a6f5a203cdb1ea621d04d0091a785bbd960
--- /dev/null
+++ b/NodeApp/.gitlab-ci/02_templates.yml
@@ -0,0 +1,90 @@
+.pkg_and_sign:debian:
+    stage: pkg_and_sign
+    image: ubuntu:latest
+    tags:
+        - pkg
+    dependencies:
+        - build:version
+    script:
+        # Install dependencies
+        - apt update
+        - apt install -y dpkg jq curl build-essential
+
+        # Get vars
+        - !reference [ .get_version, script ]
+        - !reference [ .get_last_stable_version, script ]
+
+        - cd $BIN_FOLDER_DEBIAN_PKG_AND_SIGN
+        - PKG_BUILD_FOLDER_NAME="${BIN_NAME}_${VERSION}_${ARCH}"
+
+
+        # Pkg tree creation
+        - mkdir -p "${PKG_BUILD_FOLDER_NAME}/usr/local/bin/"
+        ## Copy binary
+        - cp -R ${BIN_NAME} "${PKG_BUILD_FOLDER_NAME}/usr/local/bin/"
+        ## Copy debian folder with package definition files
+        - cp -R "${RESOURCES_FOLDER}/Debian/pkg/DEBIAN" "${PKG_BUILD_FOLDER_NAME}"
+
+        # Modify files
+        - cd "${PKG_BUILD_FOLDER_NAME}/DEBIAN"
+        ## control file
+        - sed -i -r "s%\{\{VERSION\}\}%${VERSION}%g" control
+        - sed -i -r "s%\{\{ARCH\}\}%${ARCH}%g" control
+        - sed -i -r "s%\{\{BIN_NAME\}\}%${BIN_NAME}%g" control
+        ## changelog file
+        - STABILITY=$([[ $IS_DEV == true ]] && echo 'unstable' || echo 'stable')
+        - PRIORITY=$([[ ${VERSION%.*} == ${LAST_STABLE_VERSION%.*} ]] && echo 'medium' || echo 'high')
+        - sed -i -r "s%\{\{VERSION\}\}%${VERSION}%g" changelog
+        - sed -i -r "s%\{\{BIN_NAME\}\}%${BIN_NAME}%g" changelog
+        - sed -i -r "s%\{\{DATE\}\}%$(date -R)%g" changelog
+        - sed -i -r "s%\{\{URL\}\}%${CI_PROJECT_URL}%g" changelog
+        - sed -i -r "s%\{\{STABILITY\}\}%${STABILITY}%g" changelog
+        - sed -i -r "s%\{\{PRIORITY\}\}%${PRIORITY}%g" changelog
+        ## copyright file
+        - sed -i -r "s%\{\{BIN_NAME\}\}%${BIN_NAME}%g" copyright
+        ## return to bin folder
+        - cd $BIN_FOLDER_DEBIAN_PKG_AND_SIGN
+
+        # Build package
+        - dpkg-deb --build --root-owner-group -Z xz -z 9 ${PKG_BUILD_FOLDER_NAME} ${PKG_BIN_NAME_DEBIAN}
+
+        # Clean folder
+        - rm -Rf ${PKG_BUILD_FOLDER_NAME}
+    artifacts:
+        paths:
+            - $ARTIFACTS_FOLDER/*
+        expire_in: 10 mins
+    rules:
+        -   if: '$CI_COMMIT_REF_PROTECTED == "true"'
+
+
+.pkg_and_sign:macos:
+    stage: pkg_and_sign
+    tags:
+        - macos_signing
+    dependencies:
+        - build:version
+    script:
+        - VERSION=$(cat $VERSION_FILE)
+        - security unlock-keychain -p $SIGN_KEYCHAIN_PASSWORD $SIGN_LOGIN_KEYCHAIN_PATH
+
+        - cd $BIN_FOLDER_MACOS_PKG_AND_SIGN
+
+        # Sign excecutable
+        - codesign --force --options=runtime --entitlements ../../../Resources/macOS/Signing/entitlements.plist --sign $SIGN_DEV_ID_APP --keychain $SIGN_LOGIN_KEYCHAIN_PATH --timestamp ${BIN_NAME}
+
+        # Package and notarize the app
+        - xcrun notarytool store-credentials --apple-id $SIGN_APPLE_ID --team-id $SIGN_TEAM_ID --password $SIGN_APP_PASSWORD --keychain $SIGN_LOGIN_KEYCHAIN_PATH $SIGN_KEYCHAIN_PROFILE
+        - ditto ${BIN_NAME} ${BIN_NAME}_pkg/usr/local/bin/
+        - productbuild --identifier $SIGN_IDENTIFIER --version $VERSION --sign $SIGN_DEV_ID_INST --keychain $SIGN_LOGIN_KEYCHAIN_PATH --timestamp --root ${BIN_NAME}_pkg / ${PKG_BIN_NAME_MACOS}
+        - xcrun notarytool submit ${BIN_NAME}.pkg --keychain $SIGN_LOGIN_KEYCHAIN_PATH --keychain-profile $SIGN_KEYCHAIN_PROFILE --wait
+        - xcrun stapler staple ${BIN_NAME}.pkg
+
+        # Clean folder
+        - rm -Rf ${BIN_NAME}_pkg
+    artifacts:
+        paths:
+            - $ARTIFACTS_FOLDER/*
+        expire_in: 10 mins
+    rules:
+        -   if: '$CI_COMMIT_REF_PROTECTED == "true"'
\ No newline at end of file
diff --git a/NodeApp/.gitlab-ci/03_stages.yml b/NodeApp/.gitlab-ci/03_stages.yml
new file mode 100644
index 0000000000000000000000000000000000000000..c459c1651b62a43f93c894fd8b640bb8df071386
--- /dev/null
+++ b/NodeApp/.gitlab-ci/03_stages.yml
@@ -0,0 +1,7 @@
+stages:
+    - test
+    - build
+    - pkg_and_sign
+    - clean
+    - upload
+    - release
\ No newline at end of file
diff --git a/NodeApp/.gitlab-ci/04_stageTest.yml b/NodeApp/.gitlab-ci/04_stageTest.yml
new file mode 100644
index 0000000000000000000000000000000000000000..6c87377ea87becfa1b5404aae476a1cc981c85a0
--- /dev/null
+++ b/NodeApp/.gitlab-ci/04_stageTest.yml
@@ -0,0 +1,14 @@
+test:build:
+    stage: test
+    tags:
+        - build
+    image: node:latest
+    script:
+        - apt update
+        - apt install -y jq
+        - !reference [ .get_version, script ]
+
+        # Build
+        - !reference [ .build_cli, script ]
+    rules:
+        -   if: '$CI_COMMIT_REF_PROTECTED != "true"'
diff --git a/NodeApp/.gitlab-ci/05_stageBuild.yml b/NodeApp/.gitlab-ci/05_stageBuild.yml
new file mode 100644
index 0000000000000000000000000000000000000000..2771ad328154f051d2b2356ce86715ff6b3e0f05
--- /dev/null
+++ b/NodeApp/.gitlab-ci/05_stageBuild.yml
@@ -0,0 +1,21 @@
+build:version:
+    stage: build
+    tags:
+        - build
+    image: node:latest
+    script:
+        - apt update
+        - apt install -y jq
+        - !reference [ .get_version, script ]
+        - mkdir -p $ARTIFACTS_FOLDER
+        - echo $VERSION > $VERSION_FILE
+
+        # Build
+        - !reference [ .build_cli, script ]
+    artifacts:
+        untracked: true
+        paths:
+            - $ARTIFACTS_FOLDER/*
+        expire_in: 10 mins
+    rules:
+        -   if: '$CI_COMMIT_REF_PROTECTED == "true"'
diff --git a/NodeApp/.gitlab-ci/06_stagePkgAndSign.yml b/NodeApp/.gitlab-ci/06_stagePkgAndSign.yml
new file mode 100644
index 0000000000000000000000000000000000000000..dfdc2bd0004724db8d53b42484432f7d5adadead
--- /dev/null
+++ b/NodeApp/.gitlab-ci/06_stagePkgAndSign.yml
@@ -0,0 +1,14 @@
+pkg_and_sign:debian:
+    parallel:
+        matrix:
+            -   ARCH: [ "arm64", "amd64" ]
+    before_script:
+        - BIN_FOLDER_DEBIAN_PKG_AND_SIGN=$([[ $ARCH == "arm64" ]] && echo ${BIN_FOLDER_LINUX_ARM64} || echo ${BIN_FOLDER_LINUX_X64})
+    extends: .pkg_and_sign:debian
+
+
+pkg_and_sign:macos:
+    parallel:
+        matrix:
+            -   BIN_FOLDER_MACOS_PKG_AND_SIGN: [ "$BIN_FOLDER_MACOS_ARM64", "$BIN_FOLDER_MACOS_X64" ]
+    extends: .pkg_and_sign:macos
\ No newline at end of file
diff --git a/NodeApp/.gitlab-ci/07_stageClean.yml b/NodeApp/.gitlab-ci/07_stageClean.yml
new file mode 100644
index 0000000000000000000000000000000000000000..4eef3851aaa4b5b47ef46f6f3efa81e95216f059
--- /dev/null
+++ b/NodeApp/.gitlab-ci/07_stageClean.yml
@@ -0,0 +1,48 @@
+clean:release:
+    stage: clean
+    tags:
+        - gitlab_clean
+    image: registry.gitlab.com/gitlab-ci-utils/curl-jq:latest
+    script:
+        - !reference [ .get_version, script ]
+        - !reference [ .clean_release, script ]
+    rules:
+        -   if: '$CI_COMMIT_REF_PROTECTED == "true"'
+
+
+clean:packages:
+    stage: clean
+    tags:
+        - gitlab_clean
+    image: registry.gitlab.com/gitlab-ci-utils/curl-jq:latest
+    script:
+        - !reference [ .get_version, script ]
+        - !reference [ .clean_packages, script ]
+    rules:
+        -   if: '$CI_COMMIT_REF_PROTECTED == "true"'
+
+
+clean:dev:release:
+    stage: clean
+    tags:
+        - gitlab_clean
+    image: registry.gitlab.com/gitlab-ci-utils/curl-jq:latest
+    script:
+        - !reference [ .get_version, script ]
+        - VERSION="${VERSION}${VERSION_DEV_SUFFIX}"
+        - !reference [ .clean_release, script ]
+    rules:
+        -   if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH'
+
+
+clean:dev:packages:
+    stage: clean
+    tags:
+        - gitlab_clean
+    image: registry.gitlab.com/gitlab-ci-utils/curl-jq:latest
+    script:
+        - !reference [ .get_version, script ]
+        - VERSION="${VERSION}${VERSION_DEV_SUFFIX}"
+        - !reference [ .clean_packages, script ]
+    rules:
+        -   if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH'
\ No newline at end of file
diff --git a/NodeApp/.gitlab-ci/08_stageUpload.yml b/NodeApp/.gitlab-ci/08_stageUpload.yml
new file mode 100644
index 0000000000000000000000000000000000000000..9ebb3fdf89f0cd171cd0e878e04b9c560c2165ec
--- /dev/null
+++ b/NodeApp/.gitlab-ci/08_stageUpload.yml
@@ -0,0 +1,52 @@
+upload:packages:
+    stage: upload
+    tags:
+        - gitlab_package
+    dependencies:
+        - pkg_and_sign:macos
+        - pkg_and_sign:debian
+    image: registry.gitlab.com/gitlab-ci-utils/curl-jq:latest
+    script:
+        - !reference [ .get_version, script ]
+        - !reference [ .get_packages_url, script ]
+
+        # macOS
+        - 'curl --header "JOB-TOKEN: $CI_JOB_TOKEN" --upload-file ${BIN_FILE_MACOS_ARM64} "${PACKAGE_URL_MACOS_ARM64_BIN}";'
+        - 'curl --header "JOB-TOKEN: $CI_JOB_TOKEN" --upload-file ${BIN_FILE_MACOS_X64} "${PACKAGE_URL_MACOS_X64_BIN}";'
+        - 'curl --header "JOB-TOKEN: $CI_JOB_TOKEN" --upload-file ${BIN_PKG_FILE_MACOS_ARM64} "${PACKAGE_URL_MACOS_ARM64_PKG}";'
+        - 'curl --header "JOB-TOKEN: $CI_JOB_TOKEN" --upload-file ${BIN_PKG_FILE_MACOS_X64} "${PACKAGE_URL_MACOS_X64_PKG}";'
+
+        # Linux
+        - 'curl --header "JOB-TOKEN: $CI_JOB_TOKEN" --upload-file ${BIN_FILE_LINUX_ARM64} "${PACKAGE_URL_LINUX_ARM64_BIN}";'
+        - 'curl --header "JOB-TOKEN: $CI_JOB_TOKEN" --upload-file ${BIN_FILE_LINUX_X64} "${PACKAGE_URL_LINUX_X64_BIN}";'
+        - 'curl --header "JOB-TOKEN: $CI_JOB_TOKEN" --upload-file ${BIN_PKG_FILE_DEBIAN_ARM64} "${PACKAGE_URL_DEBIAN_ARM64_PKG}";'
+        - 'curl --header "JOB-TOKEN: $CI_JOB_TOKEN" --upload-file ${BIN_PKG_FILE_DEBIAN_X64} "${PACKAGE_URL_DEBIAN_X64_PKG}";'
+
+        # Windows
+        - 'curl --header "JOB-TOKEN: $CI_JOB_TOKEN" --upload-file ${BIN_FILE_WINDOWS_ARM64} "${PACKAGE_URL_WINDOWS_ARM64_BIN}";'
+        - 'curl --header "JOB-TOKEN: $CI_JOB_TOKEN" --upload-file ${BIN_FILE_WINDOWS_X64} "${PACKAGE_URL_WINDOWS_X64_BIN}";'
+    rules:
+        -   if: '$CI_COMMIT_REF_PROTECTED == "true"'
+
+
+upload:packages:wiki:
+    stage: upload
+    tags:
+        - gitlab_package
+    image: registry.gitlab.com/gitlab-ci-utils/curl-jq:latest
+    script:
+        # Install dependencies
+        - apk update
+        - apk add xz
+
+        - !reference [ .get_version, script ]
+        - !reference [ .get_packages_url, script ]
+
+        # Create archive
+        - WIKI_ARCHIVE_PATH="${ARTIFACTS_FOLDER}/${WIKI_ARCHIVE_NAME}"
+        - tar -v -c -C "${CI_PROJECT_DIR}/${WIKI_FOLDER}" -J -f "${WIKI_ARCHIVE_PATH}" . # Ubuntu: tar --verbose --create --cd wiki-test-2 --xz --file file.tar.bz2
+
+        # Send package
+        - 'curl --header "JOB-TOKEN: $CI_JOB_TOKEN" --upload-file ${WIKI_ARCHIVE_PATH} "${PACKAGE_URL_WIKI}";'
+    rules:
+        -   if: '$CI_COMMIT_REF_PROTECTED == "true"'
\ No newline at end of file
diff --git a/NodeApp/.gitlab-ci/09_stageRelease.yml b/NodeApp/.gitlab-ci/09_stageRelease.yml
new file mode 100644
index 0000000000000000000000000000000000000000..ef93e4ed4185c81107861e8ca5110368e5c6c434
--- /dev/null
+++ b/NodeApp/.gitlab-ci/09_stageRelease.yml
@@ -0,0 +1,114 @@
+release:wiki:
+    stage: release
+    tags:
+        - release
+    image: alpine:latest
+    script:
+        - !reference [ .get_version, script ]
+
+        - apk update
+        - apk add git
+
+        # Define URL for the wiki in terms of project-agnostic predefined variables
+        - WIKI_URL="${CI_SERVER_PROTOCOL}://project_${CI_PROJECT_ID}_bot:${GITLAB_PROJECT_ACCESS_TOKEN}@${CI_SERVER_HOST}:${CI_SERVER_PORT}/${CI_PROJECT_PATH}.wiki.git"
+
+        # Clone this project's wiki under /tmp
+        - rm -rf "/tmp/${CI_PROJECT_NAME}.wiki"
+        - cd /tmp
+        - git clone "${WIKI_URL}"
+
+        # Enter the cloned repo
+        - cd "${CI_PROJECT_NAME}.wiki"
+
+        # Update the file
+        - mv .git/ ../
+        - rm -rf ./*
+        - mv ../.git/ ./
+        - cp "${CI_PROJECT_DIR}/.gitignore" .
+        - cp -R "${CI_PROJECT_DIR}/${WIKI_FOLDER}/." .
+
+        # Set committer info
+        - git config user.name "$GITLAB_USER_NAME"
+        - git config user.email "$GITLAB_USER_EMAIL"
+
+        # Commit the gitignore file
+        - git add ".gitignore"
+        - git commit -m "Add gitignore file" || true
+
+        # Commit the file
+        - git add .
+        - git commit -m "${VERSION}" || true
+
+        # Push the change back to the master branch of the wiki
+        - git push origin "HEAD:main"
+    rules:
+        -   if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH'
+
+
+release:gitlab:
+    stage: release
+    tags:
+        - release
+    image: registry.gitlab.com/gitlab-ci-utils/curl-jq:latest
+    script:
+        - !reference [ .get_version, script ]
+        - !reference [ .get_packages_url, script ]
+
+        # Extract description from CHANGELOG.md
+        - CHANGELOG_LINE_START=`awk '/##\ [0-9]+\.[0-9]+\.[0-9]+/{print NR; exit;}' CHANGELOG.md`
+        - CHANGELOG_LINE_END=`awk '/##\ [0-9]+\.[0-9]+\.[0-9]+/{ count++; if(count>1) {print NR; exit;}}' CHANGELOG.md`
+        - DESCRIPTION=`awk 'NR > '$CHANGELOG_LINE_START' && NR < '$CHANGELOG_LINE_END'' CHANGELOG.md`
+
+        # Create Release (can't be done by release_step of gitlab image because it don't have access to env var defined in script_step)
+        - >
+            RELEASE_DATA=$(jq --null-input --arg version "$VERSION" --arg description "# Changelog (version $VERSION) $DESCRIPTION" --arg tag_name "$VERSION" --arg ref "$CI_COMMIT_SHORT_SHA" '{
+                "name": $version,
+                "description": $description,
+                "tag_name": $tag_name,
+                "ref": $ref,
+                "assets": {
+                    "links": [
+                        {
+                          "name": "Windows (ARM64) binary",
+                          "url": "'${PACKAGE_URL_WINDOWS_ARM64_BIN}'",
+                        },{
+                            "name": "Windows (x64) binary",
+                            "url": "'${PACKAGE_URL_WINDOWS_X64_BIN}'",
+                        },{
+                            "name": "Linux (ARM64) binary",
+                            "url": "'${PACKAGE_URL_LINUX_ARM64_BIN}'",
+                        },{
+                            "name": "Linux (x64) binary",
+                            "url": "'${PACKAGE_URL_LINUX_X64_BIN}'",
+                        },{
+                            "name": "Debian / Ubuntu (ARM64) package",
+                            "url": "'${PACKAGE_URL_DEBIAN_ARM64_PKG}'",
+                        },{
+                            "name": "Debian / Ubuntu (x64) package",
+                            "url": "'${PACKAGE_URL_DEBIAN_X64_PKG}'",
+                        },{
+                            "name": "macOS (Intel) binary",
+                            "url": "'${PACKAGE_URL_MACOS_X64_BIN}'",
+                        },{
+                          "name": "macOS (Apple Silicon) binary",
+                          "url": "'${PACKAGE_URL_MACOS_ARM64_BIN}'",
+                        },{
+                            "name": "macOS (Intel) package",
+                            "url": "'${PACKAGE_URL_MACOS_X64_PKG}'",
+                        },{
+                            "name": "macOS (Apple Silicon) package",
+                            "url": "'${PACKAGE_URL_MACOS_ARM64_PKG}'",
+                        },{
+                          "name": "Wiki",
+                          "url": "'${PACKAGE_URL_WIKI}'",
+                        }
+                    ]                       
+                }
+            }')
+        - >
+            curl --data "${RELEASE_DATA}" \
+              --header "Content-Type: application/json" \
+              --header "JOB-TOKEN: $CI_JOB_TOKEN" \
+              --request POST "${GITLAB_API_PROJECT_URL}/releases"
+    rules:
+        -   if: '$CI_COMMIT_REF_PROTECTED == "true"'
\ No newline at end of file
diff --git a/NodeApp/.idea/DojoCLI.iml b/NodeApp/.idea/DojoCLI.iml
index 24643cc37449b4bde54411a80b8ed61258225e34..d47865a1c8d932c244bdb1f09d5eb3295d5dc715 100644
--- a/NodeApp/.idea/DojoCLI.iml
+++ b/NodeApp/.idea/DojoCLI.iml
@@ -6,6 +6,9 @@
       <excludeFolder url="file://$MODULE_DIR$/temp" />
       <excludeFolder url="file://$MODULE_DIR$/tmp" />
     </content>
+    <content url="file://$MODULE_DIR$/.gitlab-ci-local">
+      <excludeFolder url="file://$MODULE_DIR$/.gitlab-ci-local" />
+    </content>
     <orderEntry type="inheritedJdk" />
     <orderEntry type="sourceFolder" forTests="false" />
   </component>
diff --git a/Resources/Debian/pkg/DEBIAN/changelog b/Resources/Debian/pkg/DEBIAN/changelog
new file mode 100644
index 0000000000000000000000000000000000000000..1203451e322bd3645b1c54f5481127e52d3375af
--- /dev/null
+++ b/Resources/Debian/pkg/DEBIAN/changelog
@@ -0,0 +1,5 @@
+{{BIN_NAME}} ({{VERSION}}) {{STABILITY}}; urgency={{URGENCY}}
+
+  * See on gitlab: {{URL}}/-/blob/main/CHANGELOG.md
+
+ -- Michaël Minelli <dojo@minelli.me>  {{DATE}}
\ No newline at end of file
diff --git a/Resources/Debian/pkg/DEBIAN/compat b/Resources/Debian/pkg/DEBIAN/compat
new file mode 100644
index 0000000000000000000000000000000000000000..f599e28b8ab0d8c9c57a486c89c4a5132dcbd3b2
--- /dev/null
+++ b/Resources/Debian/pkg/DEBIAN/compat
@@ -0,0 +1 @@
+10
diff --git a/Resources/Debian/pkg/DEBIAN/control b/Resources/Debian/pkg/DEBIAN/control
new file mode 100644
index 0000000000000000000000000000000000000000..8f5ce246d783bcfdd48f6d6db7bb5eda7a886eed
--- /dev/null
+++ b/Resources/Debian/pkg/DEBIAN/control
@@ -0,0 +1,47 @@
+Source: {{BIN_NAME}}
+Version: {{VERSION}}
+Standards-Version: {{VERSION}}
+Section: education
+Priority: optional
+Maintainer: Michaël Minelli <dojo@minelli.me>
+Package: {{BIN_NAME}}
+Architecture: {{ARCH}}
+Description: Dojo: a platform to practice programming
+ The Dojo platform is an online tool built to help practice programming by
+ allowing users to propose assignments and perform them as exercises.
+ .
+ The tool is very flexible and allows for proposing exercises for any language
+ and does not impose any limitation on a framework to be heavily relying
+ on Docker and Gitlab. These tools used in combination allow for automatic
+ correction of assignments in order to give immediate feedback to users
+ performing exercises. Solved exercises can then be shared among the community
+ of users such that they can inspire other users or give hints on ways to solve
+ a given exercise.
+ .
+ The two major concepts of the platform are the **assignments** and the **exercises**.
+ .
+ The principal way to interact with the Dojo platform is currently the `dojo` CLI.
+ .
+ .
+ ## The assignment
+ .
+ An assignment is written by a user that wants to propose an exercise. It is typically 
+ composed of a written description of the work to be performed, and tests that must be 
+ passed once the exercise is successfully performed (and some configuration files for 
+ the infrastructure of the tests such as docker files). At its core, an assignment is
+ nothing else than a git repository that can be forked in the form of an exercise and 
+ modified using standard git commands.
+ .
+ In the future a dependency tree of assignments can be created, as well as tagging for 
+ filtering purposes.
+ .
+ .
+ ## The exercise
+ .
+ An exercise is an instance of an assignment which the learner will modify in order to 
+ make it pass the automatic tests. It can be run locally on any user's machine using the 
+ dojo CLI. When the exercise is completed it is pushed on the dojo where the CI/CD tools 
+ of Gitlab can evaluate it automatically and notify the dojo platform of the result. The 
+ exercises can then be shared with other users in order to propose a wide variety of 
+ solutions and can be a base for discussion among users and with teachers.
+ For a more detailed description please see the CLI documentation: https://gitedu.hesge.ch/dojo_project/projects/ui/dojocli/-/wikis/home
diff --git a/Resources/Debian/pkg/DEBIAN/copyright b/Resources/Debian/pkg/DEBIAN/copyright
new file mode 100644
index 0000000000000000000000000000000000000000..e3a927e86f8a990b5f89b2657cdb2f3cde4aae9c
--- /dev/null
+++ b/Resources/Debian/pkg/DEBIAN/copyright
@@ -0,0 +1,573 @@
+Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
+Upstream-Name: {{BIN_NAME}}
+Upstream-Contact: Michaël Minelli <dojo@minelli.me>
+Source: https://gitedu.hesge.ch/dojo_project/projects/ui/dojocli.git
+
+Files: *
+Copyright: 
+    Development by:
+      * Michaël Minelli <dojo@minelli.me>
+      * Orestis Malaspinas <orestis.malaspinas@hesge.ch>
+License: AGPL-3
+
+License: AGPL-3
+ GNU AFFERO GENERAL PUBLIC LICENSE
+ .
+ Version 3, 19 November 2007
+ .
+ Copyright © 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies of this license
+ document, but changing it is not allowed.
+ Preamble
+ .
+ The GNU Affero General Public License is a free, copyleft license for
+ software and other kinds of works, specifically designed to ensure
+ cooperation with the community in the case of network server software.
+ .
+ The licenses for most software and other practical works are designed to
+ take away your freedom to share and change the works. By contrast, our
+ General Public Licenses are intended to guarantee your freedom to share and
+ change all versions of a program--to make sure it remains free software for
+ all its users.
+ .
+ When we speak of free software, we are referring to freedom, not price. Our
+ General Public Licenses are designed to make sure that you have the freedom
+ to distribute copies of free software (and charge for them if you wish),
+ that you receive source code or can get it if you want it, that you can
+ change the software or use pieces of it in new free programs, and that you
+ know you can do these things.
+ .
+ Developers that use our General Public Licenses protect your rights with two
+ steps: (1) assert copyright on the software, and (2) offer you this License
+ which gives you legal permission to copy, distribute and/or modify the
+ software.
+ .
+ A secondary benefit of defending all users' freedom is that improvements
+ made in alternate versions of the program, if they receive widespread use,
+ become available for other developers to incorporate. Many developers of
+ free software are heartened and encouraged by the resulting cooperation.
+ However, in the case of software used on network servers, this result may
+ fail to come about. The GNU General Public License permits making a modified
+ version and letting the public access it on a server without ever releasing
+ its source code to the public.
+ .
+ The GNU Affero General Public License is designed specifically to ensure
+ that, in such cases, the modified source code becomes available to the
+ community. It requires the operator of a network server to provide the
+ source code of the modified version running there to the users of that
+ server. Therefore, public use of a modified version, on a publicly
+ accessible server, gives the public access to the source code of the
+ modified version.
+ .
+ An older license, called the Affero General Public License and published by
+ Affero, was designed to accomplish similar goals. This is a different
+ license, not a version of the Affero GPL, but Affero has released a new
+ version of the Affero GPL which permits relicensing under this license.
+ .
+ The precise terms and conditions for copying, distribution and modification
+ follow.
+ TERMS AND CONDITIONS
+ 0. Definitions.
+ .
+ "This License" refers to version 3 of the GNU Affero General Public License.
+ .
+ "Copyright" also means copyright-like laws that apply to other kinds of
+ works, such as semiconductor masks.
+ .
+ "The Program" refers to any copyrightable work licensed under this License.
+ Each licensee is addressed as "you". "Licensees" and "recipients" may be
+ individuals or organizations.
+ .
+ To "modify" a work means to copy from or adapt all or part of the work in a
+ fashion requiring copyright permission, other than the making of an exact
+ copy. The resulting work is called a "modified version" of the earlier work
+ or a work "based on" the earlier work.
+ .
+ A "covered work" means either the unmodified Program or a work based on the
+ Program.
+ .
+ To "propagate" a work means to do anything with it that, without permission,
+ would make you directly or secondarily liable for infringement under
+ applicable copyright law, except executing it on a computer or modifying a
+ private copy. Propagation includes copying, distribution (with or without
+ modification), making available to the public, and in some countries other
+ activities as well.
+ .
+ To "convey" a work means any kind of propagation that enables other parties
+ to make or receive copies. Mere interaction with a user through a computer
+ network, with no transfer of a copy, is not conveying.
+ .
+ An interactive user interface displays "Appropriate Legal Notices" to the
+ extent that it includes a convenient and prominently visible feature that
+ (1) displays an appropriate copyright notice, and (2) tells the user that
+ there is no warranty for the work (except to the extent that warranties are
+ provided), that licensees may convey the work under this License, and how to
+ view a copy of this License. If the interface presents a list of user
+ commands or options, such as a menu, a prominent item in the list meets this
+ criterion.
+ 1. Source Code.
+ .
+ The "source code" for a work means the preferred form of the work for making
+ modifications to it. "Object code" means any non-source form of a work.
+ .
+ A "Standard Interface" means an interface that either is an official
+ standard defined by a recognized standards body, or, in the case of
+ interfaces specified for a particular programming language, one that is
+ widely used among developers working in that language.
+ .
+ The "System Libraries" of an executable work include anything, other than
+ the work as a whole, that (a) is included in the normal form of packaging a
+ Major Component, but which is not part of that Major Component, and (b)
+ serves only to enable use of the work with that Major Component, or to
+ implement a Standard Interface for which an implementation is available to
+ the public in source code form. A "Major Component", in this context, means
+ a major essential component (kernel, window system, and so on) of the
+ specific operating system (if any) on which the executable work runs, or a
+ compiler used to produce the work, or an object code interpreter used to run
+ it.
+ .
+ The "Corresponding Source" for a work in object code form means all the
+ source code needed to generate, install, and (for an executable work) run
+ the object code and to modify the work, including scripts to control those
+ activities. However, it does not include the work's System Libraries, or
+ general-purpose tools or generally available free programs which are used
+ unmodified in performing those activities but which are not part of the
+ work. For example, Corresponding Source includes interface definition files
+ associated with source files for the work, and the source code for shared
+ libraries and dynamically linked subprograms that the work is specifically
+ designed to require, such as by intimate data communication or control flow
+ between those subprograms and other parts of the work.
+ .
+ The Corresponding Source need not include anything that users can regenerate
+ automatically from other parts of the Corresponding Source.
+ .
+ The Corresponding Source for a work in source code form is that same work.
+ 2. Basic Permissions.
+ .
+ All rights granted under this License are granted for the term of copyright
+ on the Program, and are irrevocable provided the stated conditions are met.
+ This License explicitly affirms your unlimited permission to run the
+ unmodified Program. The output from running a covered work is covered by
+ this License only if the output, given its content, constitutes a covered
+ work. This License acknowledges your rights of fair use or other equivalent,
+ as provided by copyright law.
+ .
+ You may make, run and propagate covered works that you do not convey,
+ without conditions so long as your license otherwise remains in force. You
+ may convey covered works to others for the sole purpose of having them make
+ modifications exclusively for you, or provide you with facilities for
+ running those works, provided that you comply with the terms of this License
+ in conveying all material for which you do not control copyright. Those thus
+ making or running the covered works for you must do so exclusively on your
+ behalf, under your direction and control, on terms that prohibit them from
+ making any copies of your copyrighted material outside their relationship
+ with you.
+ .
+ Conveying under any other circumstances is permitted solely under the
+ conditions stated below. Sublicensing is not allowed; section 10 makes it
+ unnecessary.
+ 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+ .
+ No covered work shall be deemed part of an effective technological measure
+ under any applicable law fulfilling obligations under article 11 of the WIPO
+ copyright treaty adopted on 20 December 1996, or similar laws prohibiting or
+ restricting circumvention of such measures.
+ .
+ When you convey a covered work, you waive any legal power to forbid
+ circumvention of technological measures to the extent such circumvention is
+ effected by exercising rights under this License with respect to the covered
+ work, and you disclaim any intention to limit operation or modification of
+ the work as a means of enforcing, against the work's users, your or third
+ parties' legal rights to forbid circumvention of technological measures.
+ 4. Conveying Verbatim Copies.
+ .
+ You may convey verbatim copies of the Program's source code as you receive
+ it, in any medium, provided that you conspicuously and appropriately publish
+ on each copy an appropriate copyright notice; keep intact all notices
+ stating that this License and any non-permissive terms added in accord with
+ section 7 apply to the code; keep intact all notices of the absence of any
+ warranty; and give all recipients a copy of this License along with the
+ Program.
+ .
+ You may charge any price or no price for each copy that you convey, and you
+ may offer support or warranty protection for a fee.
+ 5. Conveying Modified Source Versions.
+ .
+ You may convey a work based on the Program, or the modifications to produce
+ it from the Program, in the form of source code under the terms of section
+ 4, provided that you also meet all of these conditions:
+ .
+     a) The work must carry prominent notices stating that you modified it,
+ and giving a relevant date.
+     b) The work must carry prominent notices stating that it is released
+ under this License and any conditions added under section 7. This
+ requirement modifies the requirement in section 4 to "keep intact all
+ notices".
+     c) You must license the entire work, as a whole, under this License to
+ anyone who comes into possession of a copy. This License will therefore
+ apply, along with any applicable section 7 additional terms, to the whole of
+ the work, and all its parts, regardless of how they are packaged. This
+ License gives no permission to license the work in any other way, but it
+ does not invalidate such permission if you have separately received it.
+     d) If the work has interactive user interfaces, each must display
+ Appropriate Legal Notices; however, if the Program has interactive
+ interfaces that do not display Appropriate Legal Notices, your work need not
+ make them do so.
+ .
+ A compilation of a covered work with other separate and independent works,
+ which are not by their nature extensions of the covered work, and which are
+ not combined with it such as to form a larger program, in or on a volume of
+ a storage or distribution medium, is called an "aggregate" if the
+ compilation and its resulting copyright are not used to limit the access or
+ legal rights of the compilation's users beyond what the individual works
+ permit. Inclusion of a covered work in an aggregate does not cause this
+ License to apply to the other parts of the aggregate.
+ 6. Conveying Non-Source Forms.
+ .
+ You may convey a covered work in object code form under the terms of
+ sections 4 and 5, provided that you also convey the machine-readable
+ Corresponding Source under the terms of this License, in one of these ways:
+ .
+     a) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by the Corresponding
+ Source fixed on a durable physical medium customarily used for software
+ interchange.
+     b) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by a written offer,
+ valid for at least three years and valid for as long as you offer spare
+ parts or customer support for that product model, to give anyone who
+ possesses the object code either (1) a copy of the Corresponding Source for
+ all the software in the product that is covered by this License, on a
+ durable physical medium customarily used for software interchange, for a
+ price no more than your reasonable cost of physically performing this
+ conveying of source, or (2) access to copy the Corresponding Source from a
+ network server at no charge.
+     c) Convey individual copies of the object code with a copy of the
+ written offer to provide the Corresponding Source. This alternative is
+ allowed only occasionally and noncommercially, and only if you received the
+ object code with such an offer, in accord with subsection 6b.
+     d) Convey the object code by offering access from a designated place
+ (gratis or for a charge), and offer equivalent access to the Corresponding
+ Source in the same way through the same place at no further charge. You need
+ not require recipients to copy the Corresponding Source along with the
+ object code. If the place to copy the object code is a network server, the
+ Corresponding Source may be on a different server (operated by you or a
+ third party) that supports equivalent copying facilities, provided you
+ maintain clear directions next to the object code saying where to find the
+ Corresponding Source. Regardless of what server hosts the Corresponding
+ Source, you remain obligated to ensure that it is available for as long as
+ needed to satisfy these requirements.
+     e) Convey the object code using peer-to-peer transmission, provided you
+ inform other peers where the object code and Corresponding Source of the
+ work are being offered to the general public at no charge under subsection
+ 6d.
+ .
+ A separable portion of the object code, whose source code is excluded from
+ the Corresponding Source as a System Library, need not be included in
+ conveying the object code work.
+ .
+ A "User Product" is either (1) a "consumer product", which means any
+ tangible personal property which is normally used for personal, family, or
+ household purposes, or (2) anything designed or sold for incorporation into
+ a dwelling. In determining whether a product is a consumer product, doubtful
+ cases shall be resolved in favor of coverage. For a particular product
+ received by a particular user, "normally used" refers to a typical or common
+ use of that class of product, regardless of the status of the particular
+ user or of the way in which the particular user actually uses, or expects or
+ is expected to use, the product. A product is a consumer product regardless
+ of whether the product has substantial commercial, industrial or
+ non-consumer uses, unless such uses represent the only significant mode of
+ use of the product.
+ .
+ "Installation Information" for a User Product means any methods, procedures,
+ authorization keys, or other information required to install and execute
+ modified versions of a covered work in that User Product from a modified
+ version of its Corresponding Source. The information must suffice to ensure
+ that the continued functioning of the modified object code is in no case
+ prevented or interfered with solely because modification has been made.
+ .
+ If you convey an object code work under this section in, or with, or
+ specifically for use in, a User Product, and the conveying occurs as part of
+ a transaction in which the right of possession and use of the User Product
+ is transferred to the recipient in perpetuity or for a fixed term
+ (regardless of how the transaction is characterized), the Corresponding
+ Source conveyed under this section must be accompanied by the Installation
+ Information. But this requirement does not apply if neither you nor any
+ third party retains the ability to install modified object code on the User
+ Product (for example, the work has been installed in ROM).
+ .
+ The requirement to provide Installation Information does not include a
+ requirement to continue to provide support service, warranty, or updates for
+ a work that has been modified or installed by the recipient, or for the User
+ Product in which it has been modified or installed. Access to a network may
+ be denied when the modification itself materially and adversely affects the
+ operation of the network or violates the rules and protocols for
+ communication across the network.
+ .
+ Corresponding Source conveyed, and Installation Information provided, in
+ accord with this section must be in a format that is publicly documented
+ (and with an implementation available to the public in source code form),
+ and must require no special password or key for unpacking, reading or
+ copying.
+ 7. Additional Terms.
+ .
+ "Additional permissions" are terms that supplement the terms of this License
+ by making exceptions from one or more of its conditions. Additional
+ permissions that are applicable to the entire Program shall be treated as
+ though they were included in this License, to the extent that they are valid
+ under applicable law. If additional permissions apply only to part of the
+ Program, that part may be used separately under those permissions, but the
+ entire Program remains governed by this License without regard to the
+ additional permissions.
+ .
+ When you convey a copy of a covered work, you may at your option remove any
+ additional permissions from that copy, or from any part of it. (Additional
+ permissions may be written to require their own removal in certain cases
+ when you modify the work.) You may place additional permissions on material,
+ added by you to a covered work, for which you have or can give appropriate
+ copyright permission.
+ .
+ Notwithstanding any other provision of this License, for material you add to
+ a covered work, you may (if authorized by the copyright holders of that
+ material) supplement the terms of this License with terms:
+ .
+     a) Disclaiming warranty or limiting liability differently from the terms
+ of sections 15 and 16 of this License; or
+     b) Requiring preservation of specified reasonable legal notices or
+ author attributions in that material or in the Appropriate Legal Notices
+ displayed by works containing it; or
+     c) Prohibiting misrepresentation of the origin of that material, or
+ requiring that modified versions of such material be marked in reasonable
+ ways as different from the original version; or
+     d) Limiting the use for publicity purposes of names of licensors or
+ authors of the material; or
+     e) Declining to grant rights under trademark law for use of some trade
+ names, trademarks, or service marks; or
+     f) Requiring indemnification of licensors and authors of that material
+ by anyone who conveys the material (or modified versions of it) with
+ contractual assumptions of liability to the recipient, for any liability
+ that these contractual assumptions directly impose on those licensors and
+ authors.
+ .
+ All other non-permissive additional terms are considered "further
+ restrictions" within the meaning of section 10. If the Program as you
+ received it, or any part of it, contains a notice stating that it is
+ governed by this License along with a term that is a further restriction,
+ you may remove that term. If a license document contains a further
+ restriction but permits relicensing or conveying under this License, you may
+ add to a covered work material governed by the terms of that license
+ document, provided that the further restriction does not survive such
+ relicensing or conveying.
+ .
+ If you add terms to a covered work in accord with this section, you must
+ place, in the relevant source files, a statement of the additional terms
+ that apply to those files, or a notice indicating where to find the
+ applicable terms.
+ .
+ Additional terms, permissive or non-permissive, may be stated in the form of
+ a separately written license, or stated as exceptions; the above
+ requirements apply either way.
+ 8. Termination.
+ .
+ You may not propagate or modify a covered work except as expressly provided
+ under this License. Any attempt otherwise to propagate or modify it is void,
+ and will automatically terminate your rights under this License (including
+ any patent licenses granted under the third paragraph of section 11).
+ .
+ However, if you cease all violation of this License, then your license from
+ a particular copyright holder is reinstated (a) provisionally, unless and
+ until the copyright holder explicitly and finally terminates your license,
+ and (b) permanently, if the copyright holder fails to notify you of the
+ violation by some reasonable means prior to 60 days after the cessation.
+ .
+ Moreover, your license from a particular copyright holder is reinstated
+ permanently if the copyright holder notifies you of the violation by some
+ reasonable means, this is the first time you have received notice of
+ violation of this License (for any work) from that copyright holder, and you
+ cure the violation prior to 30 days after your receipt of the notice.
+ .
+ Termination of your rights under this section does not terminate the
+ licenses of parties who have received copies or rights from you under this
+ License. If your rights have been terminated and not permanently reinstated,
+ you do not qualify to receive new licenses for the same material under
+ section 10.
+ 9. Acceptance Not Required for Having Copies.
+ .
+ You are not required to accept this License in order to receive or run a
+ copy of the Program. Ancillary propagation of a covered work occurring
+ solely as a consequence of using peer-to-peer transmission to receive a copy
+ likewise does not require acceptance. However, nothing other than this
+ License grants you permission to propagate or modify any covered work. These
+ actions infringe copyright if you do not accept this License. Therefore, by
+ modifying or propagating a covered work, you indicate your acceptance of
+ this License to do so.
+ 10. Automatic Licensing of Downstream Recipients.
+ .
+ Each time you convey a covered work, the recipient automatically receives a
+ license from the original licensors, to run, modify and propagate that work,
+ subject to this License. You are not responsible for enforcing compliance by
+ third parties with this License.
+ .
+ An "entity transaction" is a transaction transferring control of an
+ organization, or substantially all assets of one, or subdividing an
+ organization, or merging organizations. If propagation of a covered work
+ results from an entity transaction, each party to that transaction who
+ receives a copy of the work also receives whatever licenses to the work the
+ party's predecessor in interest had or could give under the previous
+ paragraph, plus a right to possession of the Corresponding Source of the
+ work from the predecessor in interest, if the predecessor has it or can get
+ it with reasonable efforts.
+ .
+ You may not impose any further restrictions on the exercise of the rights
+ granted or affirmed under this License. For example, you may not impose a
+ license fee, royalty, or other charge for exercise of rights granted under
+ this License, and you may not initiate litigation (including a cross-claim
+ or counterclaim in a lawsuit) alleging that any patent claim is infringed by
+ making, using, selling, offering for sale, or importing the Program or any
+ portion of it.
+ 11. Patents.
+ .
+ A "contributor" is a copyright holder who authorizes use under this License
+ of the Program or a work on which the Program is based. The work thus
+ licensed is called the contributor's "contributor version".
+ .
+ A contributor's "essential patent claims" are all patent claims owned or
+ controlled by the contributor, whether already acquired or hereafter
+ acquired, that would be infringed by some manner, permitted by this License,
+ of making, using, or selling its contributor version, but do not include
+ claims that would be infringed only as a consequence of further modification
+ of the contributor version. For purposes of this definition, "control"
+ includes the right to grant patent sublicenses in a manner consistent with
+ the requirements of this License.
+ .
+ Each contributor grants you a non-exclusive, worldwide, royalty-free patent
+ license under the contributor's essential patent claims, to make, use, sell,
+ offer for sale, import and otherwise run, modify and propagate the contents
+ of its contributor version.
+ .
+ In the following three paragraphs, a "patent license" is any express
+ agreement or commitment, however denominated, not to enforce a patent (such
+ as an express permission to practice a patent or covenant not to sue for
+ patent infringement). To "grant" such a patent license to a party means to
+ make such an agreement or commitment not to enforce a patent against the
+ party.
+ .
+ If you convey a covered work, knowingly relying on a patent license, and the
+ Corresponding Source of the work is not available for anyone to copy, free
+ of charge and under the terms of this License, through a publicly available
+ network server or other readily accessible means, then you must either (1)
+ cause the Corresponding Source to be so available, or (2) arrange to deprive
+ yourself of the benefit of the patent license for this particular work, or
+ (3) arrange, in a manner consistent with the requirements of this License,
+ to extend the patent license to downstream recipients. "Knowingly relying"
+ means you have actual knowledge that, but for the patent license, your
+ conveying the covered work in a country, or your recipient's use of the
+ covered work in a country, would infringe one or more identifiable patents
+ in that country that you have reason to believe are valid.
+ .
+ If, pursuant to or in connection with a single transaction or arrangement,
+ you convey, or propagate by procuring conveyance of, a covered work, and
+ grant a patent license to some of the parties receiving the covered work
+ authorizing them to use, propagate, modify or convey a specific copy of the
+ covered work, then the patent license you grant is automatically extended to
+ all recipients of the covered work and works based on it.
+ .
+ A patent license is "discriminatory" if it does not include within the scope
+ of its coverage, prohibits the exercise of, or is conditioned on the
+ non-exercise of one or more of the rights that are specifically granted
+ under this License. You may not convey a covered work if you are a party to
+ an arrangement with a third party that is in the business of distributing
+ software, under which you make payment to the third party based on the
+ extent of your activity of conveying the work, and under which the third
+ party grants, to any of the parties who would receive the covered work from
+ you, a discriminatory patent license (a) in connection with copies of the
+ covered work conveyed by you (or copies made from those copies), or (b)
+ primarily for and in connection with specific products or compilations that
+ contain the covered work, unless you entered into that arrangement, or that
+ patent license was granted, prior to 28 March 2007.
+ .
+ Nothing in this License shall be construed as excluding or limiting any
+ implied license or other defenses to infringement that may otherwise be
+ available to you under applicable patent law.
+ 12. No Surrender of Others' Freedom.
+ .
+ If conditions are imposed on you (whether by court order, agreement or
+ otherwise) that contradict the conditions of this License, they do not
+ excuse you from the conditions of this License. If you cannot convey a
+ covered work so as to satisfy simultaneously your obligations under this
+ License and any other pertinent obligations, then as a consequence you may
+ not convey it at all. For example, if you agree to terms that obligate you
+ to collect a royalty for further conveying from those to whom you convey the
+ Program, the only way you could satisfy both those terms and this License
+ would be to refrain entirely from conveying the Program.
+ 13. Remote Network Interaction; Use with the GNU General Public License.
+ .
+ Notwithstanding any other provision of this License, if you modify the
+ Program, your modified version must prominently offer all users interacting
+ with it remotely through a computer network (if your version supports such
+ interaction) an opportunity to receive the Corresponding Source of your
+ version by providing access to the Corresponding Source from a network
+ server at no charge, through some standard or customary means of
+ facilitating copying of software. This Corresponding Source shall include
+ the Corresponding Source for any work covered by version 3 of the GNU
+ General Public License that is incorporated pursuant to the following
+ paragraph.
+ .
+ Notwithstanding any other provision of this License, you have permission to
+ link or combine any covered work with a work licensed under version 3 of the
+ GNU General Public License into a single combined work, and to convey the
+ resulting work. The terms of this License will continue to apply to the part
+ which is the covered work, but the work with which it is combined will
+ remain governed by version 3 of the GNU General Public License.
+ 14. Revised Versions of this License.
+ .
+ The Free Software Foundation may publish revised and/or new versions of the
+ GNU Affero General Public License from time to time. Such new versions will
+ be similar in spirit to the present version, but may differ in detail to
+ address new problems or concerns.
+ .
+ Each version is given a distinguishing version number. If the Program
+ specifies that a certain numbered version of the GNU Affero General Public
+ License "or any later version" applies to it, you have the option of
+ following the terms and conditions either of that numbered version or of any
+ later version published by the Free Software Foundation. If the Program does
+ not specify a version number of the GNU Affero General Public License, you
+ may choose any version ever published by the Free Software Foundation.
+ .
+ If the Program specifies that a proxy can decide which future versions of
+ the GNU Affero General Public License can be used, that proxy's public
+ statement of acceptance of a version permanently authorizes you to choose
+ that version for the Program.
+ .
+ Later license versions may give you additional or different permissions.
+ However, no additional obligations are imposed on any author or copyright
+ holder as a result of your choosing to follow a later version.
+ 15. Disclaimer of Warranty.
+ .
+ THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE
+ LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+ OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND,
+ EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE
+ ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.
+ SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY
+ SERVICING, REPAIR OR CORRECTION.
+ 16. Limitation of Liability.
+ .
+ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL
+ ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE
+ PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+ GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE
+ OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA
+ OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+ PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+ EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGES.
+ 17. Interpretation of Sections 15 and 16.
+ .
+ If the disclaimer of warranty and limitation of liability provided above
+ cannot be given local legal effect according to their terms, reviewing
+ courts shall apply local law that most closely approximates an absolute
+ waiver of all civil liability in connection with the Program, unless a
+ warranty or assumption of liability accompanies a copy of the Program in
+ return for a fee.
\ No newline at end of file
diff --git a/Resources/Debian/pkg/DEBIAN/rules b/Resources/Debian/pkg/DEBIAN/rules
new file mode 100755
index 0000000000000000000000000000000000000000..7903e6f86e772cbcd0b480b198a49be5443852f4
--- /dev/null
+++ b/Resources/Debian/pkg/DEBIAN/rules
@@ -0,0 +1,17 @@
+#!/usr/bin/make -f
+# See debhelper(7) (uncomment to enable)
+# output every command that modifies files on the build system.
+#DH_VERBOSE = 1
+ 
+# see FEATURE AREAS in dpkg-buildflags(1)
+#export DEB_BUILD_MAINT_OPTIONS = hardening=+all
+
+# see ENVIRONMENT in dpkg-buildflags(1)
+# package maintainers to append CFLAGS
+#export DEB_CFLAGS_MAINT_APPEND  = -Wall -pedantic
+# package maintainers to append LDFLAGS
+#export DEB_LDFLAGS_MAINT_APPEND = -Wl,--as-needed
+
+
+%:
+    dh $@
\ No newline at end of file
diff --git a/Resources/Debian/pkg/usr/local/bin/.gitkeep b/Resources/Debian/pkg/usr/local/bin/.gitkeep
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/Resources/macApp/Signing/entitlements.plist b/Resources/macOS/Signing/entitlements.plist
similarity index 100%
rename from Resources/macApp/Signing/entitlements.plist
rename to Resources/macOS/Signing/entitlements.plist