diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
new file mode 100644
index 0000000000000000000000000000000000000000..3b33cb20a590e0f7278c8fe7dc3a1dd3a7a75076
--- /dev/null
+++ b/.gitlab-ci.yml
@@ -0,0 +1,43 @@
+---
+image: node:lts-slim
+
+stages:
+  - test
+  - build
+  - deploy
+
+variables:
+  NPM_ORGANIZATION: lydra
+
+cache:
+    key: ${CI_COMMIT_REF_SLUG}
+    paths:
+        - node_modules/
+
+before_script:
+  - npm ci
+
+pages:
+  stage: build
+  script:
+    - npm run build
+    - mv public public.dist
+    - mv dist public
+  artifacts:
+    paths:
+      - public
+
+publish_gitlab_registry:
+  stage: deploy
+  needs:
+    - job: pages
+      artifacts: true
+  dependencies:
+    - pages
+  script:
+    - npm config set ${NPM_ORGANIZATION}:registry //lab.frogg.it/api/v4/projects/${CI_PROJECT_ID}/packages/npm/
+    - npm config set -- '//lab.frogg.it/api/v4/projects/${CI_PROJECT_ID}/packages/npm/:_authToken=${CI_JOB_TOKEN}'
+    - npm config set -- '//lab.frogg.it/api/v4/packages/npm/:_authToken={CI_JOB_TOKEN}'
+    - npm publish
+  # rules:
+  #   - if: $CI_COMMIT_TAG
diff --git a/.nvmrc b/.nvmrc
new file mode 100644
index 0000000000000000000000000000000000000000..e44a38e0803edbf4823dcabc9ee9623b03771e60
--- /dev/null
+++ b/.nvmrc
@@ -0,0 +1 @@
+v18.12.1
diff --git a/vercel.json b/vercel.json
new file mode 100644
index 0000000000000000000000000000000000000000..9276941fa83c6e4f70e65cd2738e5c1ab3a52bfa
--- /dev/null
+++ b/vercel.json
@@ -0,0 +1,7 @@
+{
+  "rewrites": [
+    { "source": "/(.*)", "destination": "/index.html" }
+  ],
+  "buildCommand": "npm run build",
+  "outputDirectory": "dist"
+}
diff --git a/vite.config.js b/vite.config.js
new file mode 100644
index 0000000000000000000000000000000000000000..c83c3dfd0343dff16809b4e8b2ab6fa2cbffadac
--- /dev/null
+++ b/vite.config.js
@@ -0,0 +1,8 @@
+// vite.config.js
+// https://vitejs.dev/guide/static-deploy.html#gitlab-pages-and-gitlab-ci
+
+const URL = process.env.BASE_URL || '/';
+
+export default {
+  base: `${URL}`
+}