diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index d3f4f3e3f6c8134ff438357d2795b255cad56137..714157b8b851b1552ede9993f4efda7953bb9874 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -5,16 +5,6 @@ stages:
   - build
   - deploy
 
-.build-with-dind:
-  # https://dsi-docs.pasteur.cloud/docs/gitlab/cicd/docker-build/
-  stage: build
-  image: docker:24
-  before_script:
-    - docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" "$CI_REGISTRY"
-  script:
-    - docker build -t "$FQ_IMAGE_NAME" -f "$CONTAINERFILE" "$BUILD_CONTEXT"
-    - docker push "$FQ_IMAGE_NAME"
-
 .build-with-buildah:
   # see https://dsi-docs.pasteur.cloud/docs/gitlab/cicd/buildah/
   stage: build
@@ -23,6 +13,9 @@ stages:
     STORAGE_DRIVER: vfs
     BUILDAH_FORMAT: docker
     BUILDAH_ISOLATION: chroot
+    FQ_IMAGE_NAME: "$CI_REGISTRY_IMAGE/front:$CI_COMMIT_SHORT_SHA"
+    BUILD_CONTEXT: "."
+    CONTAINERFILE: "front/Containerfile"
   before_script:
     - export REGISTRY_AUTH_FILE="$HOME/auth.json"
     - echo "$CI_REGISTRY_PASSWORD" | buildah login -u "$CI_REGISTRY_USER" --password-stdin "$CI_REGISTRY"
@@ -32,17 +25,25 @@ stages:
 
 build on gitlab.pasteur.fr:
   extends: .build-with-buildah
+  variables:
+    PUBLIC_URL: "nyx.pasteur.cloud"
   rules:
-    - if: $CI_PROJECT_ID == $GITLAB_PASTEUR_PROJECT_ID      # gitlab.pasteur.fr only
+    - if: ($CI_COMMIT_BRANCH == "main" &&
+        $CI_PROJECT_ID == $GITLAB_PASTEUR_PROJECT_ID)      # gitlab.pasteur.fr only
+
+build dev on gitlab.pasteur.fr:
+  extends: .build-with-buildah
   variables:
-    FQ_IMAGE_NAME: "$CI_REGISTRY_IMAGE/front:$CI_COMMIT_SHORT_SHA"
-    BUILD_CONTEXT: "."
-    CONTAINERFILE: "front/Containerfile"
+    PUBLIC_URL: "nyx.dev.pasteur.cloud"
+  rules:
+    - if: ($CI_COMMIT_BRANCH == "dev" &&
+        $CI_PROJECT_ID == $GITLAB_PASTEUR_PROJECT_ID)      # gitlab.pasteur.fr only
 
-.deploy-with-enix-toolbox:
+.deploy-with-manifests:
   stage: deploy
   image: docker.io/enix/ci-toolbox:1.21
   variables:
+    APP_NAME: nyxui
     FQ_IMAGE_NAME: "$CI_REGISTRY_IMAGE/front:$CI_COMMIT_SHORT_SHA"
   script:
     - kubectl create secret
@@ -52,17 +53,39 @@ build on gitlab.pasteur.fr:
       --docker-password="$DOCKER_TOKEN"
       --docker-email=kubernetes@pasteur.fr
       -n "$NAMESPACE"
-      --dry-run -o yaml | kubectl apply -f -
-    - envsubst < k8s/nyx-deployment.yaml | kubectl apply -n "$NAMESPACE" -f -
-    - envsubst < k8s/nyx-service.yaml | kubectl apply -n "$NAMESPACE" -f -
-    - envsubst < k8s/nyx-ingress.yaml | kubectl apply -n "$NAMESPACE" -f -
+      --dry-run=client -o yaml | kubectl apply -f -
+    - envsubst < k8s/front-deployment.yaml | kubectl apply -n "$NAMESPACE" -f -
+    - envsubst < k8s/front-service.yaml | kubectl apply -n "$NAMESPACE" -f -
+    - envsubst < k8s/ingress.yaml | kubectl apply -n "$NAMESPACE" -f -
+  rules:
+    - if: $CI_PROJECT_ID == $GITLAB_PASTEUR_PROJECT_ID      # gitlab.pasteur.fr only
+
+.deploy-with-helm:
+  stage: deploy
+  image: docker.io/enix/ci-toolbox:1.21
+  script:
+    - kubectl create secret
+      docker-registry registry-gitlab
+      --docker-server=registry-gitlab.pasteur.fr
+      --docker-username="$DOCKER_USER"
+      --docker-password="$DOCKER_TOKEN"
+      --docker-email=kubernetes@pasteur.fr
+      --dry-run=client
+      -n "$NAMESPACE" -o yaml | kubectl apply -f -
+    - cd $CI_PROJECT_DIR/nyxui
+    - helm upgrade --install --debug nyxui . --namespace="$NAMESPACE"
+      --set front.image.tag=$CI_COMMIT_SHORT_SHA
+      --set ingress.hosts[0].host="$PUBLIC_URL"
+      --set ingress.hosts[0].paths[0].path="/"
+      --set ingress.hosts[0].paths[0].pathType="Prefix"
   rules:
     - if: $CI_PROJECT_ID == $GITLAB_PASTEUR_PROJECT_ID      # gitlab.pasteur.fr only
 
 deploy to pasteur.cloud:
-  extends: .deploy-with-enix-toolbox
+  extends: .deploy-with-manifests
   variables:
     NAMESPACE: "nyx-prod"
+    PUBLIC_URL: "nyx.pasteur.cloud"
   environment:
     name: k8sprod-02/nyx-prod
     url: https://nyx.pasteur.cloud
@@ -71,13 +94,13 @@ deploy to pasteur.cloud:
       when: manual
 
 deploy to dev.pasteur.cloud:
-  extends: .deploy-with-enix-toolbox
+  extends: .deploy-with-manifests
   variables:
     NAMESPACE: "nyx-dev"
+    PUBLIC_URL: "nyx.dev.pasteur.cloud"
   environment:
     name: k8sdev-01/nyx-dev
     url: https://nyx.dev.pasteur.cloud
   rules:
     - if: $CI_COMMIT_BRANCH == "dev"
-      when: manual
 
diff --git a/front/Containerfile b/front/Containerfile
index 488b269c65d062485e664895a78d4eaf3e0dbf7b..662262b35b6df9b4739083ca259bd3ebf8b50171 100644
--- a/front/Containerfile
+++ b/front/Containerfile
@@ -13,7 +13,7 @@ ENV JULIA_PROJECT /app
 ENV JULIA_DEPOT_PATH /app/julia
 ENV JULIAUP_DEPOT_PATH /app/juliaup
 
-ARG JULIA_VERSION=1.10.5
+ARG JULIA_VERSION=1.10.7
 
 # UID/GID should match with same arguments defined in:
 # https://github.com/nginxinc/docker-nginx-unprivileged/blob/main/mainline/debian/Dockerfile
@@ -38,12 +38,15 @@ ARG PUBLIC_URL
 
 ARG NGINX_CONFIG=/etc/nginx/conf.d/default.conf
 
+ARG NGINX_WORKERS=2
+
 COPY front/proxy.conf "$NGINX_CONFIG"
 
 RUN if [ -n "$PUBLIC_URL" ]; then \
     sed -i "s/localhost/$PUBLIC_URL/" "$NGINX_CONFIG"; \
     fi \
- && sed -i "s/80;/8080;/" "$NGINX_CONFIG"
+ && sed -i "s/80;/8080;/" "$NGINX_CONFIG" \
+ && sed -i -E "s/worker_processes .*;/worker_processes $NGINX_WORKERS;/" /etc/nginx/nginx.conf
 
 ENTRYPOINT ["/app/front/entrypoint.sh"]
 CMD []
diff --git a/front/Containerfile.local b/front/Containerfile.local
index ab09c3c7ce9dff6fdd15b032c7ea646aebfa41fb..fe9d00be6787f412c9d4d895313223a840769cb6 100644
--- a/front/Containerfile.local
+++ b/front/Containerfile.local
@@ -6,7 +6,7 @@ COPY ./NyxUI.jl/front/proxy.conf /etc/nginx/conf.d/default.conf
 
 ENV JULIAUP_DEPOT_PATH /juliaup
 ENV JULIA_DEPOT_PATH /julia
-ARG JULIA_VERSION=1.10.5
+ARG JULIA_VERSION=1.10.7
 
 RUN curl -fsSL https://install.julialang.org \
   | sh -s -- --yes --default-channel $JULIA_VERSION
@@ -20,9 +20,10 @@ COPY ./NyxUI.jl /app/NyxUI.jl
 ENV JULIA_PROJECT /app/NyxUI.jl
 
 RUN cd /app/NyxUI.jl \
- && julia -e 'using Pkg; Pkg.add(path="../NyxWidgets.jl"); Pkg.add(path="../NyxPlots.jl"); Pkg.instantiate();' \
+ && julia -e 'using Pkg; Pkg.add([PackageSpec(path="../NyxWidgets.jl"), PackageSpec(path="../NyxPlots.jl")]); Pkg.instantiate();' \
  && mkdir -p public \
- && chmod a+x front/entrypoint.sh
+ && chmod a+x front/entrypoint.sh \
+ && sed -i -E 's/worker_processes .*;/worker_processes 2;/' /etc/nginx/nginx.conf
 
 ENTRYPOINT ["/app/NyxUI.jl/front/entrypoint.sh"]
 CMD []
diff --git a/front/Manifest.toml b/front/Manifest.toml
index bb7f14771020bcaa002752f4435a92a481dd129a..b3905b653b271c55d45778b1a7bea5c5af5c39eb 100644
--- a/front/Manifest.toml
+++ b/front/Manifest.toml
@@ -1,6 +1,6 @@
 # This file is machine-generated - editing it directly is not advised
 
-julia_version = "1.10.5"
+julia_version = "1.10.7"
 manifest_format = "2.0"
 project_hash = "7b4a57cbc9fc956109742c120d30a1b52ed917fd"
 
@@ -27,9 +27,9 @@ version = "0.1.9"
 
 [[deps.Bonito]]
 deps = ["Base64", "CodecZlib", "Colors", "Dates", "Deno_jll", "HTTP", "Hyperscript", "LinearAlgebra", "Markdown", "MsgPack", "Observables", "RelocatableFolders", "SHA", "Sockets", "Tables", "ThreadPools", "URIs", "UUIDs", "WidgetsBase"]
-git-tree-sha1 = "ace84e10effc316fe2195f1b133db776eeb69cc0"
+git-tree-sha1 = "262f58917d5d9644d16ec6f53480e11a6e128db2"
 uuid = "824d6782-a2ef-11e9-3a09-e5662e0c26f8"
-version = "3.1.2"
+version = "4.0.0"
 
 [[deps.CSTParser]]
 deps = ["Tokenize"]
@@ -45,27 +45,33 @@ version = "1.3.6"
 
 [[deps.CodecZlib]]
 deps = ["TranscodingStreams", "Zlib_jll"]
-git-tree-sha1 = "b8fe8546d52ca154ac556809e10c75e6e7430ac8"
+git-tree-sha1 = "bce6804e5e6044c6daab27bb533d1295e4a2e759"
 uuid = "944b1d66-785c-5afd-91f1-9de20f533193"
-version = "0.7.5"
+version = "0.7.6"
 
 [[deps.ColorSchemes]]
 deps = ["ColorTypes", "ColorVectorSpace", "Colors", "FixedPointNumbers", "PrecompileTools", "Random"]
-git-tree-sha1 = "b5278586822443594ff615963b0c09755771b3e0"
+git-tree-sha1 = "c785dfb1b3bfddd1da557e861b919819b82bbe5b"
 uuid = "35d6a980-a343-548e-a6ea-1d62b119f2f4"
-version = "3.26.0"
+version = "3.27.1"
 
 [[deps.ColorTypes]]
 deps = ["FixedPointNumbers", "Random"]
-git-tree-sha1 = "b10d0b65641d57b8b4d5e234446582de5047050d"
+git-tree-sha1 = "c7acce7a7e1078a20a285211dd73cd3941a871d6"
 uuid = "3da002f7-5984-5a60-b8a6-cbb66c0b333f"
-version = "0.11.5"
+version = "0.12.0"
+
+    [deps.ColorTypes.extensions]
+    StyledStringsExt = "StyledStrings"
+
+    [deps.ColorTypes.weakdeps]
+    StyledStrings = "f489334b-da3d-4c2e-b8f0-e476e12c162b"
 
 [[deps.ColorVectorSpace]]
 deps = ["ColorTypes", "FixedPointNumbers", "LinearAlgebra", "Requires", "Statistics", "TensorCore"]
-git-tree-sha1 = "a1f44953f2382ebb937d60dafbe2deea4bd23249"
+git-tree-sha1 = "8b3b6f87ce8f65a2b4f857528fd8d70086cd72b1"
 uuid = "c3611d14-8923-5661-9e6a-0046d554d3a4"
-version = "0.10.0"
+version = "0.11.0"
 
     [deps.ColorVectorSpace.extensions]
     SpecialFunctionsExt = "SpecialFunctions"
@@ -75,15 +81,15 @@ version = "0.10.0"
 
 [[deps.Colors]]
 deps = ["ColorTypes", "FixedPointNumbers", "Reexport"]
-git-tree-sha1 = "362a287c3aa50601b0bc359053d5c2468f0e7ce0"
+git-tree-sha1 = "64e15186f0aa277e174aa81798f7eb8598e0157e"
 uuid = "5ae59095-9a9b-59fe-a467-6f913c188581"
-version = "0.12.11"
+version = "0.13.0"
 
 [[deps.CommonMark]]
-deps = ["Crayons", "JSON", "PrecompileTools", "URIs"]
-git-tree-sha1 = "532c4185d3c9037c0237546d817858b23cf9e071"
+deps = ["Crayons", "PrecompileTools"]
+git-tree-sha1 = "3faae67b8899797592335832fccf4b3c80bb04fa"
 uuid = "a80b9123-70ca-4bc0-993e-6e3bcb318db6"
-version = "0.8.12"
+version = "0.8.15"
 
 [[deps.Compat]]
 deps = ["TOML", "UUIDs"]
@@ -166,9 +172,9 @@ version = "1.6.0"
 
 [[deps.ExceptionUnwrapping]]
 deps = ["Test"]
-git-tree-sha1 = "dcb08a0d93ec0b1cdc4af184b26b591e9695423a"
+git-tree-sha1 = "d36f682e590a83d63d1c7dbd287573764682d12a"
 uuid = "460bff9d-24e4-43bc-9d9f-a8973cb893f4"
-version = "0.1.10"
+version = "0.1.11"
 
 [[deps.EzXML]]
 deps = ["Printf", "XML2_jll"]
@@ -177,10 +183,15 @@ uuid = "8f5d6c58-4d21-5cfd-889c-e3ad7ee6a615"
 version = "1.2.0"
 
 [[deps.FilePathsBase]]
-deps = ["Compat", "Dates", "Mmap", "Printf", "Test", "UUIDs"]
-git-tree-sha1 = "9f00e42f8d99fdde64d40c8ea5d14269a2e2c1aa"
+deps = ["Compat", "Dates"]
+git-tree-sha1 = "7878ff7172a8e6beedd1dea14bd27c3c6340d361"
 uuid = "48062228-2e41-5def-b9a4-89aafe57970f"
-version = "0.9.21"
+version = "0.9.22"
+weakdeps = ["Mmap", "Test"]
+
+    [deps.FilePathsBase.extensions]
+    FilePathsBaseMmapExt = "Mmap"
+    FilePathsBaseTestExt = "Test"
 
 [[deps.FileWatching]]
 uuid = "7b1f6079-737a-58dc-b8bc-7a2ca5c1b5ee"
@@ -203,9 +214,9 @@ version = "6.2.1+6"
 
 [[deps.Genie]]
 deps = ["ArgParse", "Base64", "Dates", "Distributed", "DotEnv", "EzXML", "FilePathsBase", "HTTP", "HttpCommon", "Inflector", "JSON3", "JuliaFormatter", "Logging", "LoggingExtras", "LoweredCodeUtils", "MIMEs", "Markdown", "Millboard", "Nettle", "OrderedCollections", "Pkg", "REPL", "Random", "Reexport", "Revise", "SHA", "Serialization", "Sockets", "UUIDs", "Unicode", "XML2_jll", "YAML"]
-git-tree-sha1 = "da0dbb3ff3be5a554d1756270be7fd343ea708e0"
+git-tree-sha1 = "6b1283b541f467ae6830d6066535bd6f73a3e808"
 uuid = "c43c736e-a2d1-11e8-161f-af95117fbd1e"
-version = "5.30.4"
+version = "5.31.1"
 
 [[deps.GenieSession]]
 deps = ["Dates", "Genie", "HTTP", "Logging", "Random", "SHA"]
@@ -225,10 +236,10 @@ uuid = "c27321d9-0574-5035-807b-f59d2c89b15c"
 version = "1.3.1"
 
 [[deps.HTTP]]
-deps = ["Base64", "CodecZlib", "ConcurrentUtilities", "Dates", "ExceptionUnwrapping", "Logging", "LoggingExtras", "MbedTLS", "NetworkOptions", "OpenSSL", "Random", "SimpleBufferStream", "Sockets", "URIs", "UUIDs"]
-git-tree-sha1 = "d1d712be3164d61d1fb98e7ce9bcbc6cc06b45ed"
+deps = ["Base64", "CodecZlib", "ConcurrentUtilities", "Dates", "ExceptionUnwrapping", "Logging", "LoggingExtras", "MbedTLS", "NetworkOptions", "OpenSSL", "PrecompileTools", "Random", "SimpleBufferStream", "Sockets", "URIs", "UUIDs"]
+git-tree-sha1 = "ae350b8225575cc3ea385d4131c81594f86dfe4f"
 uuid = "cd3eb016-35fb-5094-929b-558a96fad6f3"
-version = "1.10.8"
+version = "1.10.12"
 
 [[deps.HttpCommon]]
 deps = ["Dates", "Nullables", "Test", "URIParser"]
@@ -259,9 +270,9 @@ version = "1.0.0"
 
 [[deps.JLLWrappers]]
 deps = ["Artifacts", "Preferences"]
-git-tree-sha1 = "7e5d6779a1e09a36db2a7b6cff50942a0a7d0fca"
+git-tree-sha1 = "be3dc50a92e5a386872a493a10050136d4703f9b"
 uuid = "692b3bcd-3c85-4b1f-b108-f13ce0eb3210"
-version = "1.5.0"
+version = "1.6.1"
 
 [[deps.JSON]]
 deps = ["Dates", "Mmap", "Parsers", "Unicode"]
@@ -271,9 +282,9 @@ version = "0.21.4"
 
 [[deps.JSON3]]
 deps = ["Dates", "Mmap", "Parsers", "PrecompileTools", "StructTypes", "UUIDs"]
-git-tree-sha1 = "eb3edce0ed4fa32f75a0a11217433c31d56bd48b"
+git-tree-sha1 = "1d322381ef7b087548321d3f878cb4c9bd8f8f9b"
 uuid = "0f8b85d8-7281-11e9-16c2-39a750bddbf1"
-version = "1.14.0"
+version = "1.14.1"
 
     [deps.JSON3.extensions]
     JSON3ArrowExt = ["ArrowTypes"]
@@ -282,21 +293,21 @@ version = "1.14.0"
     ArrowTypes = "31f734f8-188a-4ce0-8406-c8a06bd891cd"
 
 [[deps.JuliaFormatter]]
-deps = ["CSTParser", "CommonMark", "DataStructures", "Glob", "Pkg", "PrecompileTools", "Tokenize"]
-git-tree-sha1 = "4b0b04fe63e02eed776181e14ebc1f48d787ceec"
+deps = ["CSTParser", "CommonMark", "DataStructures", "Glob", "PrecompileTools", "TOML", "Tokenize"]
+git-tree-sha1 = "59cf7ad64f1b0708a4fa4369879d33bad3239b56"
 uuid = "98e50ef6-434e-11e9-1051-2b60c6c9e899"
-version = "1.0.59"
+version = "1.0.62"
 
 [[deps.JuliaInterpreter]]
 deps = ["CodeTracking", "InteractiveUtils", "Random", "UUIDs"]
-git-tree-sha1 = "7ae67d8567853d367e3463719356b8989e236069"
+git-tree-sha1 = "10da5154188682e5c0726823c2b5125957ec3778"
 uuid = "aa1ae85d-cabe-5617-a682-6adf51b2e16a"
-version = "0.9.34"
+version = "0.9.38"
 
 [[deps.LaTeXStrings]]
-git-tree-sha1 = "50901ebc375ed41dbf8058da26f9de442febbbec"
+git-tree-sha1 = "dda21b8cbd6a6c40d9d02a73230f9d70fed6918c"
 uuid = "b964fa9f-0449-5b57-a5c2-d3ea65f4040f"
-version = "1.3.1"
+version = "1.4.0"
 
 [[deps.LazyArtifacts]]
 deps = ["Artifacts", "Pkg"]
@@ -331,9 +342,9 @@ uuid = "8f399da3-3557-5675-b5ff-fb832c97cbdb"
 
 [[deps.Libiconv_jll]]
 deps = ["Artifacts", "JLLWrappers", "Libdl"]
-git-tree-sha1 = "f9557a255370125b405568f9767d6d195822a175"
+git-tree-sha1 = "61dfdba58e585066d8bce214c5a51eaa0539f269"
 uuid = "94ce4f54-9a6c-5748-9c1c-f9c7231a4531"
-version = "1.17.0+0"
+version = "1.17.0+1"
 
 [[deps.LinearAlgebra]]
 deps = ["Libdl", "OpenBLAS_jll", "libblastrampoline_jll"]
@@ -344,15 +355,15 @@ uuid = "56ddb016-857b-54e1-b83d-db4d58db5568"
 
 [[deps.LoggingExtras]]
 deps = ["Dates", "Logging"]
-git-tree-sha1 = "c1dd6d7978c12545b4179fb6153b9250c96b0075"
+git-tree-sha1 = "f02b56007b064fbfddb4c9cd60161b6dd0f40df3"
 uuid = "e6f89c97-d47a-5376-807f-9c37f3926c36"
-version = "1.0.3"
+version = "1.1.0"
 
 [[deps.LoweredCodeUtils]]
 deps = ["JuliaInterpreter"]
-git-tree-sha1 = "eeaedcf337f33c039f9f3a209a8db992deefd7e9"
+git-tree-sha1 = "688d6d9e098109051ae33d126fcfc88c4ce4a021"
 uuid = "6f1432cf-f94c-5a45-995e-cdbf5db27b0b"
-version = "2.4.8"
+version = "3.1.0"
 
 [[deps.MIMEs]]
 git-tree-sha1 = "65f28ad4b594aebe22157d6fac869786a255b7eb"
@@ -412,9 +423,9 @@ version = "1.0.0"
 
 [[deps.Nettle_jll]]
 deps = ["Artifacts", "GMP_jll", "JLLWrappers", "Libdl"]
-git-tree-sha1 = "d67b4fddbd1b07888ed2680646a44740f492f1ca"
+git-tree-sha1 = "19961ade0a39b98575505bed6f842e8a0ec35af9"
 uuid = "4c82536e-c426-54e4-b420-14f461c4ed8b"
-version = "3.9.1+0"
+version = "3.10.0+0"
 
 [[deps.NetworkOptions]]
 uuid = "ca575930-c2e3-43a9-ace4-1e988b2c1908"
@@ -435,11 +446,11 @@ version = "0.1.0"
 
 [[deps.NyxWidgets]]
 deps = ["Bonito", "Colors", "Format", "LazyArtifacts", "Observables"]
-git-tree-sha1 = "da1ed93c75e1cca717bbfd9ef24ef14bea595d97"
+git-tree-sha1 = "936f80aa61413c47da00f96abbc0186078698bca"
 repo-rev = "main"
 repo-url = "https://gitlab.com/dbc-nyx/NyxWidgets.jl"
 uuid = "c288fd06-43d3-4b04-8307-797133353e2e"
-version = "0.1.0"
+version = "0.1.1"
 
 [[deps.Observables]]
 git-tree-sha1 = "7438a59546cf62428fc9d1bc94729146d37a7225"
@@ -459,14 +470,14 @@ version = "1.4.3"
 
 [[deps.OpenSSL_jll]]
 deps = ["Artifacts", "JLLWrappers", "Libdl"]
-git-tree-sha1 = "a12e56c72edee3ce6b96667745e6cbbe5498f200"
+git-tree-sha1 = "7493f61f55a6cce7325f197443aa80d32554ba10"
 uuid = "458c3c95-2e84-50aa-8efc-19380b2a3a95"
-version = "1.1.23+0"
+version = "3.0.15+1"
 
 [[deps.OrderedCollections]]
-git-tree-sha1 = "dfdf5519f235516220579f949664f1bf44e741c5"
+git-tree-sha1 = "12f1439c4f986bb868acda6ea33ebc78e19b95ad"
 uuid = "bac558e1-5e72-5ebc-8fee-abe8a469f55d"
-version = "1.6.3"
+version = "1.7.0"
 
 [[deps.Parameters]]
 deps = ["OrderedCollections", "UnPack"]
@@ -539,10 +550,10 @@ uuid = "ae029012-a4dd-5104-9daa-d747884805df"
 version = "1.3.0"
 
 [[deps.Revise]]
-deps = ["CodeTracking", "Distributed", "FileWatching", "JuliaInterpreter", "LibGit2", "LoweredCodeUtils", "OrderedCollections", "Pkg", "REPL", "Requires", "UUIDs", "Unicode"]
-git-tree-sha1 = "85ddd93ea15dcd8493400600e09104a9e94bb18d"
+deps = ["CodeTracking", "Distributed", "FileWatching", "JuliaInterpreter", "LibGit2", "LoweredCodeUtils", "OrderedCollections", "REPL", "Requires", "UUIDs", "Unicode"]
+git-tree-sha1 = "470f48c9c4ea2170fd4d0f8eb5118327aada22f5"
 uuid = "295af30f-e4ad-537b-8983-00126c2a3abe"
-version = "3.5.15"
+version = "3.6.4"
 
 [[deps.SHA]]
 uuid = "ea8e919c-243c-51af-8825-aaa63cd721ce"
@@ -558,9 +569,9 @@ version = "1.2.1"
 uuid = "9e88b42a-f829-5b0c-bbe9-9e923198166b"
 
 [[deps.SimpleBufferStream]]
-git-tree-sha1 = "874e8867b33a00e784c8a7e4b60afe9e037b74e1"
+git-tree-sha1 = "f305871d2f381d21527c770d4788c06c097c9bc1"
 uuid = "777ac1f9-54b0-4bf8-805c-2214025038e7"
-version = "1.1.0"
+version = "1.2.0"
 
 [[deps.Sockets]]
 uuid = "6462fe0b-24de-5631-8697-dd941f90decc"
@@ -577,9 +588,9 @@ version = "1.10.0"
 
 [[deps.Stipple]]
 deps = ["Dates", "FilePathsBase", "Genie", "GenieSession", "GenieSessionFileSession", "JSON3", "Logging", "MacroTools", "Mixers", "Observables", "OrderedCollections", "Parameters", "Pkg", "PrecompileTools", "Random", "Reexport", "Requires", "StructTypes", "Tables"]
-git-tree-sha1 = "da8a53e2600a09431539687c35ab6947af0c31de"
+git-tree-sha1 = "e9cd1008e2b93dca71e90554c013233dd688e08e"
 uuid = "4acbeb90-81a0-11ea-1966-bdaff8155998"
-version = "0.30.7"
+version = "0.30.13"
 
     [deps.Stipple.extensions]
     StippleDataFramesExt = "DataFrames"
@@ -593,9 +604,9 @@ version = "0.30.7"
 
 [[deps.StippleUI]]
 deps = ["Colors", "Dates", "Genie", "OrderedCollections", "PrecompileTools", "Stipple", "Tables"]
-git-tree-sha1 = "83e336d4f20316f965ee47250df802e8e844d34d"
+git-tree-sha1 = "09e711f1d0b85092973ad4bc0d70ea40d0a59b38"
 uuid = "a3c5d34a-b254-4859-a8fa-b86abb7e84a3"
-version = "0.24.2"
+version = "0.24.4"
 
     [deps.StippleUI.extensions]
     StippleUIDataFramesExt = "DataFrames"
@@ -669,13 +680,9 @@ uuid = "0796e94c-ce3b-5d07-9a54-7f471281c624"
 version = "0.5.29"
 
 [[deps.TranscodingStreams]]
-git-tree-sha1 = "96612ac5365777520c3c5396314c8cf7408f436a"
+git-tree-sha1 = "0c45878dcfdcfa8480052b6ab162cdd138781742"
 uuid = "3bb67fe8-82b1-5028-8e26-92a6c54297fa"
-version = "0.11.1"
-weakdeps = ["Random", "Test"]
-
-    [deps.TranscodingStreams.extensions]
-    TestExt = ["Test", "Random"]
+version = "0.11.3"
 
 [[deps.URIParser]]
 deps = ["Unicode"]
diff --git a/front/entrypoint.sh b/front/entrypoint.sh
index 33fda00e28064a0d96dca7de3402029f69719ea6..44cf7549089f588a81a3ee33ef6c780b9627e5e0 100644
--- a/front/entrypoint.sh
+++ b/front/entrypoint.sh
@@ -1,11 +1,20 @@
 #!/usr/bin/env bash
 
+set -m
+
+
+/docker-entrypoint.sh nginx -g "daemon off;" &
+NGINX_PID=$!
+
+
 echo "JULIA_PROJECT=$JULIA_PROJECT"
 
 #export GENIE_ENV=prod
 #export GENIE_BASE_PATH=/g
 export BONITO_BASE_PATH=/bonito
 
-(cd "$JULIA_PROJECT" && julia --project=. routes.jl &)
+cd "$JULIA_PROJECT"
+julia --project=. routes.jl
 
-/docker-entrypoint.sh nginx -g "daemon off;"
+kill $NGINX_PID
+wait $NGINX_PID
diff --git a/front/proxy.conf b/front/proxy.conf
index 67e46538906b245ba741e69e126b485cb139dd3e..368ce185f7b65ce6a111cb772d9331c7bd4b58bb 100644
--- a/front/proxy.conf
+++ b/front/proxy.conf
@@ -1,7 +1,7 @@
 server {
   listen 80;
-  listen [::]:80;
   server_name localhost;
+  proxy_buffers 16 4k;
 
   root /app/NyxUI.jl/public;
 
diff --git a/k8s/front-deployment.yaml b/k8s/front-deployment.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..732a71f8c25d341ca2980bd0a6d0b75b7209433a
--- /dev/null
+++ b/k8s/front-deployment.yaml
@@ -0,0 +1,29 @@
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+  name: ${APP_NAME}-front
+  labels:
+    app: $APP_NAME
+spec:
+  replicas: 1
+  selector:
+    matchLabels:
+      app: $APP_NAME
+  template:
+    metadata:
+      labels:
+        app: $APP_NAME
+        nyxui/component: front
+    spec:
+      containers:
+        - name: $APP_NAME
+          image: $FQ_IMAGE_NAME
+          ports:
+            - name: http
+              containerPort: 8080
+              protocol: TCP
+          securityContext:
+            allowPrivilegeEscalation: false
+            capabilities:
+              drop:
+                - ALL
diff --git a/k8s/front-service.yaml b/k8s/front-service.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..64f770f72932c56f81bed168bf45da31af8a6c3d
--- /dev/null
+++ b/k8s/front-service.yaml
@@ -0,0 +1,13 @@
+apiVersion: v1
+kind: Service
+metadata:
+  name: ${APP_NAME}-front
+spec:
+  selector:
+    app: $APP_NAME
+    nyxui/component: front
+  ports:
+    - protocol: TCP
+      port: 80
+      targetPort: http
+      name: http
diff --git a/k8s/ingress.yaml b/k8s/ingress.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..cbaeb77f35b7d87eb9c0558c74e54e514c918842
--- /dev/null
+++ b/k8s/ingress.yaml
@@ -0,0 +1,19 @@
+apiVersion: networking.k8s.io/v1
+kind: Ingress
+metadata:
+  name: $APP_NAME
+  labels:
+    app: $APP_NAME
+spec:
+  ingressClassName: internal
+  rules:
+    - host: $PUBLIC_URL
+      http:
+        paths:
+          - path: /
+            pathType: Prefix
+            backend:
+              service:
+                name: ${APP_NAME}-front
+                port:
+                  number: 80
diff --git a/k8s/nyx-deployment.yaml b/k8s/nyx-deployment.yaml
deleted file mode 100644
index 6d016a0509c20c1d81c011d82b03047529075e04..0000000000000000000000000000000000000000
--- a/k8s/nyx-deployment.yaml
+++ /dev/null
@@ -1,21 +0,0 @@
-apiVersion: apps/v1
-kind: Deployment
-metadata:
-  name: ${NAMESPACE}-depl
-  labels:
-    app: nyxui
-spec:
-  replicas: 1
-  selector:
-    matchLabels:
-      app: nyxui
-  template:
-    metadata:
-      labels:
-        app: nyxui
-    spec:
-      containers:
-      - name: nyxui
-        image: $FQ_IMAGE_NAME
-        ports:
-        - containerPort: 8080
diff --git a/k8s/nyx-ingress.yaml b/k8s/nyx-ingress.yaml
deleted file mode 100644
index d959e16936ef3d6df88b65613467418b61d1bd55..0000000000000000000000000000000000000000
--- a/k8s/nyx-ingress.yaml
+++ /dev/null
@@ -1,14 +0,0 @@
-apiVersion: v1
-kind: Ingress
-metadata:
-  name: ${NAMESPACE}-ingress
-spec:
-  ingressClassName: external
-  rules:
-  - host: $PUBLIC_URL
-    http:
-      paths:
-      - backend:
-          serviceName: ${NAMESPACE}-service
-          servicePort: 80
-        path: /
diff --git a/k8s/nyx-service.yaml b/k8s/nyx-service.yaml
deleted file mode 100644
index cded451fd059955ce7e234aa3298de996cf67b2e..0000000000000000000000000000000000000000
--- a/k8s/nyx-service.yaml
+++ /dev/null
@@ -1,11 +0,0 @@
-apiVersion: v1
-kind: Service
-metadata:
-  name: ${NAMESPACE}-service
-spec:
-  selector:
-    app: nyxui
-  ports:
-    - protocol: TCP
-      port: 80
-      targetPort: 8080
diff --git a/nyxui/.helmignore b/nyxui/.helmignore
new file mode 100644
index 0000000000000000000000000000000000000000..0e8a0eb36f4ca2c939201c0d54b5d82a1ea34778
--- /dev/null
+++ b/nyxui/.helmignore
@@ -0,0 +1,23 @@
+# Patterns to ignore when building packages.
+# This supports shell glob matching, relative path matching, and
+# negation (prefixed with !). Only one pattern per line.
+.DS_Store
+# Common VCS dirs
+.git/
+.gitignore
+.bzr/
+.bzrignore
+.hg/
+.hgignore
+.svn/
+# Common backup files
+*.swp
+*.bak
+*.tmp
+*.orig
+*~
+# Various IDEs
+.project
+.idea/
+*.tmproj
+.vscode/
diff --git a/nyxui/Chart.yaml b/nyxui/Chart.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..94afc3b14e04b5366844eab130c7c49b0e5bffc5
--- /dev/null
+++ b/nyxui/Chart.yaml
@@ -0,0 +1,24 @@
+apiVersion: v2
+name: nyxui
+description: A Helm chart for Kubernetes
+
+# A chart can be either an 'application' or a 'library' chart.
+#
+# Application charts are a collection of templates that can be packaged into versioned archives
+# to be deployed.
+#
+# Library charts provide useful utilities or functions for the chart developer. They're included as
+# a dependency of application charts to inject those utilities and functions into the rendering
+# pipeline. Library charts do not define any templates and therefore cannot be deployed.
+type: application
+
+# This is the chart version. This version number should be incremented each time you make changes
+# to the chart and its templates, including the app version.
+# Versions are expected to follow Semantic Versioning (https://semver.org/)
+version: 0.1.0
+
+# This is the version number of the application being deployed. This version number should be
+# incremented each time you make changes to the application. Versions are not expected to
+# follow Semantic Versioning. They should reflect the version the application is using.
+# It is recommended to use it with quotes.
+appVersion: "0.1"
diff --git a/nyxui/templates/NOTES.txt b/nyxui/templates/NOTES.txt
new file mode 100644
index 0000000000000000000000000000000000000000..7e8806e4d3f8dd910660f5351f79d13341ac9c90
--- /dev/null
+++ b/nyxui/templates/NOTES.txt
@@ -0,0 +1,22 @@
+1. Get the application URL by running these commands:
+{{- if .Values.ingress.enabled }}
+{{- range $host := .Values.ingress.hosts }}
+  {{- range .paths }}
+  http{{ if $.Values.ingress.tls }}s{{ end }}://{{ $host.host }}{{ .path }}
+  {{- end }}
+{{- end }}
+{{- else if contains "NodePort" .Values.service.type }}
+  export NODE_PORT=$(kubectl get --namespace {{ .Release.Namespace }} -o jsonpath="{.spec.ports[0].nodePort}" services {{ include "nyxui.fullname" . }})
+  export NODE_IP=$(kubectl get nodes --namespace {{ .Release.Namespace }} -o jsonpath="{.items[0].status.addresses[0].address}")
+  echo http://$NODE_IP:$NODE_PORT
+{{- else if contains "LoadBalancer" .Values.service.type }}
+     NOTE: It may take a few minutes for the LoadBalancer IP to be available.
+           You can watch its status by running 'kubectl get --namespace {{ .Release.Namespace }} svc -w {{ include "nyxui.fullname" . }}'
+  export SERVICE_IP=$(kubectl get svc --namespace {{ .Release.Namespace }} {{ include "nyxui.fullname" . }} --template "{{"{{ range (index .status.loadBalancer.ingress 0) }}{{.}}{{ end }}"}}")
+  echo http://$SERVICE_IP:{{ .Values.service.port }}
+{{- else if contains "ClusterIP" .Values.service.type }}
+  export POD_NAME=$(kubectl get pods --namespace {{ .Release.Namespace }} -l "app.kubernetes.io/name={{ include "nyxui.name" . }},app.kubernetes.io/instance={{ .Release.Name }}" -o jsonpath="{.items[0].metadata.name}")
+  export CONTAINER_PORT=$(kubectl get pod --namespace {{ .Release.Namespace }} $POD_NAME -o jsonpath="{.spec.containers[0].ports[0].containerPort}")
+  echo "Visit http://127.0.0.1:8080 to use your application"
+  kubectl --namespace {{ .Release.Namespace }} port-forward $POD_NAME 8080:$CONTAINER_PORT
+{{- end }}
diff --git a/nyxui/templates/_helpers.tpl b/nyxui/templates/_helpers.tpl
new file mode 100644
index 0000000000000000000000000000000000000000..125531c06952395d6ab6f6de924551ec54a8e226
--- /dev/null
+++ b/nyxui/templates/_helpers.tpl
@@ -0,0 +1,62 @@
+{{/*
+Expand the name of the chart.
+*/}}
+{{- define "nyxui.name" -}}
+{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }}
+{{- end }}
+
+{{/*
+Create a default fully qualified app name.
+We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec).
+If release name contains chart name it will be used as a full name.
+*/}}
+{{- define "nyxui.fullname" -}}
+{{- if .Values.fullnameOverride }}
+{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }}
+{{- else }}
+{{- $name := default .Chart.Name .Values.nameOverride }}
+{{- if contains $name .Release.Name }}
+{{- .Release.Name | trunc 63 | trimSuffix "-" }}
+{{- else }}
+{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }}
+{{- end }}
+{{- end }}
+{{- end }}
+
+{{/*
+Create chart name and version as used by the chart label.
+*/}}
+{{- define "nyxui.chart" -}}
+{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }}
+{{- end }}
+
+{{/*
+Common labels
+*/}}
+{{- define "nyxui.labels" -}}
+helm.sh/chart: {{ include "nyxui.chart" . }}
+{{ include "nyxui.selectorLabels" . }}
+{{- if .Chart.AppVersion }}
+app.kubernetes.io/version: {{ .Chart.AppVersion | quote }}
+{{- end }}
+app.kubernetes.io/managed-by: {{ .Release.Service }}
+{{- end }}
+
+{{/*
+Selector labels
+*/}}
+{{- define "nyxui.selectorLabels" -}}
+app.kubernetes.io/name: {{ include "nyxui.name" . }}
+app.kubernetes.io/instance: {{ .Release.Name }}
+{{- end }}
+
+{{/*
+Create the name of the service account to use
+*/}}
+{{- define "nyxui.serviceAccountName" -}}
+{{- if .Values.serviceAccount.create }}
+{{- default (include "nyxui.fullname" .) .Values.serviceAccount.name }}
+{{- else }}
+{{- default "default" .Values.serviceAccount.name }}
+{{- end }}
+{{- end }}
diff --git a/nyxui/templates/deployment-front.yaml b/nyxui/templates/deployment-front.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..7c126b79d441b5df3844bf0446912f85500e0bf0
--- /dev/null
+++ b/nyxui/templates/deployment-front.yaml
@@ -0,0 +1,68 @@
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+  name: {{ include "nyxui.fullname" . }}
+  labels:
+    {{- include "nyxui.labels" . | nindent 4 }}
+spec:
+  {{- if not .Values.autoscaling.enabled }}
+  replicas: {{ .Values.replicaCount }}
+  {{- end }}
+  selector:
+    matchLabels:
+      {{- include "nyxui.selectorLabels" . | nindent 6 }}
+  template:
+    metadata:
+      {{- with .Values.podAnnotations }}
+      annotations:
+        {{- toYaml . | nindent 8 }}
+      {{- end }}
+      labels:
+        {{- include "nyxui.labels" . | nindent 8 }}
+        {{- with .Values.podLabels }}
+        {{- toYaml . | nindent 8 }}
+        {{- end }}
+    spec:
+      {{- with .Values.imagePullSecrets }}
+      imagePullSecrets:
+        {{- toYaml . | nindent 8 }}
+      {{- end }}
+      serviceAccountName: {{ include "nyxui.serviceAccountName" . }}
+      securityContext:
+        {{- toYaml .Values.podSecurityContext | nindent 8 }}
+      containers:
+        - name: {{ .Chart.Name }}
+          securityContext:
+            {{- toYaml .Values.securityContext | nindent 12 }}
+          image: "{{ .Values.front.image.repository }}:{{ .Values.front.image.tag | default .Chart.AppVersion }}"
+          imagePullPolicy: {{ .Values.front.image.pullPolicy }}
+          ports:
+            - name: http
+              containerPort: {{ .Values.front.service.targetPort }}
+              protocol: TCP
+          livenessProbe:
+            {{- toYaml .Values.livenessProbe | nindent 12 }}
+          readinessProbe:
+            {{- toYaml .Values.readinessProbe | nindent 12 }}
+          resources:
+            {{- toYaml .Values.resources | nindent 12 }}
+          {{- with .Values.volumeMounts }}
+          volumeMounts:
+            {{- toYaml . | nindent 12 }}
+          {{- end }}
+      {{- with .Values.volumes }}
+      volumes:
+        {{- toYaml . | nindent 8 }}
+      {{- end }}
+      {{- with .Values.nodeSelector }}
+      nodeSelector:
+        {{- toYaml . | nindent 8 }}
+      {{- end }}
+      {{- with .Values.affinity }}
+      affinity:
+        {{- toYaml . | nindent 8 }}
+      {{- end }}
+      {{- with .Values.tolerations }}
+      tolerations:
+        {{- toYaml . | nindent 8 }}
+      {{- end }}
diff --git a/nyxui/templates/hpa.yaml b/nyxui/templates/hpa.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..0b7c7d49f87fe8fd7016978b77e9c127014479f6
--- /dev/null
+++ b/nyxui/templates/hpa.yaml
@@ -0,0 +1,32 @@
+{{- if .Values.autoscaling.enabled }}
+apiVersion: autoscaling/v2
+kind: HorizontalPodAutoscaler
+metadata:
+  name: {{ include "nyxui.fullname" . }}
+  labels:
+    {{- include "nyxui.labels" . | nindent 4 }}
+spec:
+  scaleTargetRef:
+    apiVersion: apps/v1
+    kind: Deployment
+    name: {{ include "nyxui.fullname" . }}
+  minReplicas: {{ .Values.autoscaling.minReplicas }}
+  maxReplicas: {{ .Values.autoscaling.maxReplicas }}
+  metrics:
+    {{- if .Values.autoscaling.targetCPUUtilizationPercentage }}
+    - type: Resource
+      resource:
+        name: cpu
+        target:
+          type: Utilization
+          averageUtilization: {{ .Values.autoscaling.targetCPUUtilizationPercentage }}
+    {{- end }}
+    {{- if .Values.autoscaling.targetMemoryUtilizationPercentage }}
+    - type: Resource
+      resource:
+        name: memory
+        target:
+          type: Utilization
+          averageUtilization: {{ .Values.autoscaling.targetMemoryUtilizationPercentage }}
+    {{- end }}
+{{- end }}
diff --git a/nyxui/templates/ingress.yaml b/nyxui/templates/ingress.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..1e8b4d4a3bc20a71199d72e290a8e9f860e5891a
--- /dev/null
+++ b/nyxui/templates/ingress.yaml
@@ -0,0 +1,61 @@
+{{- if .Values.ingress.enabled -}}
+{{- $fullName := include "nyxui.fullname" . -}}
+{{- $svcPort := .Values.service.port -}}
+{{- if and .Values.ingress.className (not (semverCompare ">=1.18-0" .Capabilities.KubeVersion.GitVersion)) }}
+  {{- if not (hasKey .Values.ingress.annotations "kubernetes.io/ingress.class") }}
+  {{- $_ := set .Values.ingress.annotations "kubernetes.io/ingress.class" .Values.ingress.className}}
+  {{- end }}
+{{- end }}
+{{- if semverCompare ">=1.19-0" .Capabilities.KubeVersion.GitVersion -}}
+apiVersion: networking.k8s.io/v1
+{{- else if semverCompare ">=1.14-0" .Capabilities.KubeVersion.GitVersion -}}
+apiVersion: networking.k8s.io/v1beta1
+{{- else -}}
+apiVersion: extensions/v1beta1
+{{- end }}
+kind: Ingress
+metadata:
+  name: {{ $fullName }}
+  labels:
+    {{- include "nyxui.labels" . | nindent 4 }}
+  {{- with .Values.ingress.annotations }}
+  annotations:
+    {{- toYaml . | nindent 4 }}
+  {{- end }}
+spec:
+  {{- if and .Values.ingress.className (semverCompare ">=1.18-0" .Capabilities.KubeVersion.GitVersion) }}
+  ingressClassName: {{ .Values.ingress.className }}
+  {{- end }}
+  {{- if .Values.ingress.tls }}
+  tls:
+    {{- range .Values.ingress.tls }}
+    - hosts:
+        {{- range .hosts }}
+        - {{ . | quote }}
+        {{- end }}
+      secretName: {{ .secretName }}
+    {{- end }}
+  {{- end }}
+  rules:
+    {{- range .Values.ingress.hosts }}
+    - host: {{ .host | quote }}
+      http:
+        paths:
+          {{- range .paths }}
+          - path: {{ .path }}
+            {{- if and .pathType (semverCompare ">=1.18-0" $.Capabilities.KubeVersion.GitVersion) }}
+            pathType: {{ .pathType }}
+            {{- end }}
+            backend:
+              {{- if semverCompare ">=1.19-0" $.Capabilities.KubeVersion.GitVersion }}
+              service:
+                name: {{ $fullName }}
+                port:
+                  number: {{ $svcPort }}
+              {{- else }}
+              serviceName: {{ $fullName }}
+              servicePort: {{ $svcPort }}
+              {{- end }}
+          {{- end }}
+    {{- end }}
+{{- end }}
diff --git a/nyxui/templates/service.yaml b/nyxui/templates/service.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..f27ec2454928759ba141fe06387524388aa2d759
--- /dev/null
+++ b/nyxui/templates/service.yaml
@@ -0,0 +1,15 @@
+apiVersion: v1
+kind: Service
+metadata:
+  name: {{ include "nyxui.fullname" . }}
+  labels:
+    {{- include "nyxui.labels" . | nindent 4 }}
+spec:
+  type: {{ .Values.service.type }}
+  ports:
+    - port: {{ .Values.service.port }}
+      targetPort: http
+      protocol: TCP
+      name: http
+  selector:
+    {{- include "nyxui.selectorLabels" . | nindent 4 }}
diff --git a/nyxui/templates/serviceaccount.yaml b/nyxui/templates/serviceaccount.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..2631fa0284870b52e33201a9794afc26b770837b
--- /dev/null
+++ b/nyxui/templates/serviceaccount.yaml
@@ -0,0 +1,13 @@
+{{- if .Values.serviceAccount.create -}}
+apiVersion: v1
+kind: ServiceAccount
+metadata:
+  name: {{ include "nyxui.serviceAccountName" . }}
+  labels:
+    {{- include "nyxui.labels" . | nindent 4 }}
+  {{- with .Values.serviceAccount.annotations }}
+  annotations:
+    {{- toYaml . | nindent 4 }}
+  {{- end }}
+automountServiceAccountToken: {{ .Values.serviceAccount.automount }}
+{{- end }}
diff --git a/nyxui/templates/tests/test-connection.yaml b/nyxui/templates/tests/test-connection.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..94ce042f9f0e6e3dcdd04a233f37ad3c3bc89e07
--- /dev/null
+++ b/nyxui/templates/tests/test-connection.yaml
@@ -0,0 +1,15 @@
+apiVersion: v1
+kind: Pod
+metadata:
+  name: "{{ include "nyxui.fullname" . }}-test-connection"
+  labels:
+    {{- include "nyxui.labels" . | nindent 4 }}
+  annotations:
+    "helm.sh/hook": test
+spec:
+  containers:
+    - name: wget
+      image: busybox
+      command: ['wget']
+      args: ['{{ include "nyxui.fullname" . }}:{{ .Values.service.port }}']
+  restartPolicy: Never
diff --git a/nyxui/values.yaml b/nyxui/values.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..0a56e70df5fd29d2617cff6b1e0a7316cef3fbaf
--- /dev/null
+++ b/nyxui/values.yaml
@@ -0,0 +1,102 @@
+# Default values for nyxui.
+# This is a YAML-formatted file.
+# Declare variables to be passed into your templates.
+
+replicaCount: 1
+
+front:
+  image:
+    repository: registry-gitlab.pasteur.fr/nyx/nyxui.jl/front
+    pullPolicy: IfNotPresent
+    # Overrides the image tag whose default is the chart appVersion.
+    tag: ""
+  service:
+    targetPort: 8080
+
+imagePullSecrets:
+  - name: registry-gitlab
+nameOverride: ""
+fullnameOverride: ""
+
+serviceAccount:
+  # Specifies whether a service account should be created
+  create: true
+  # Automatically mount a ServiceAccount's API credentials?
+  automount: true
+  # Annotations to add to the service account
+  annotations: {}
+  # The name of the service account to use.
+  # If not set and create is true, a name is generated using the fullname template
+  name: ""
+
+podAnnotations: {}
+podLabels: {}
+
+podSecurityContext: {}
+  # fsGroup: 2000
+
+securityContext: {}
+  # capabilities:
+  #   drop:
+  #   - ALL
+  # readOnlyRootFilesystem: true
+  # runAsNonRoot: true
+  # runAsUser: 1000
+
+service:
+  type: ClusterIP
+  port: 80
+
+ingress:
+  enabled: true
+  className: ""
+  annotations:
+    kubernetes.io/ingress.class: internal
+    # kubernetes.io/tls-acme: "true"
+  hosts:
+    - host: nyx.pasteur.cloud
+      paths:
+        - path: /
+          pathType: Prefix
+  tls: []
+  #  - secretName: chart-example-tls
+  #    hosts:
+  #      - chart-example.local
+
+resources: {}
+  # We usually recommend not to specify default resources and to leave this as a conscious
+  # choice for the user. This also increases chances charts run on environments with little
+  # resources, such as Minikube. If you do want to specify resources, uncomment the following
+  # lines, adjust them as necessary, and remove the curly braces after 'resources:'.
+  # limits:
+  #   cpu: 100m
+  #   memory: 128Mi
+  # requests:
+  #   cpu: 100m
+  #   memory: 128Mi
+
+autoscaling:
+  enabled: false
+  minReplicas: 1
+  maxReplicas: 1
+  targetCPUUtilizationPercentage: 80
+  # targetMemoryUtilizationPercentage: 80
+
+# Additional volumes on the output Deployment definition.
+volumes: []
+# - name: foo
+#   secret:
+#     secretName: mysecret
+#     optional: false
+
+# Additional volumeMounts on the output Deployment definition.
+volumeMounts: []
+# - name: foo
+#   mountPath: "/etc/foo"
+#   readOnly: true
+
+nodeSelector: {}
+
+tolerations: []
+
+affinity: {}