Dockerize and rename to conllu-cmc
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 63792b4..e59adec 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -2,22 +2,109 @@
 
 stages:
   - test
-  - package
+  - build
+  - deploy
 
 cache:
   paths:
     - node_modules/
 
-before_script:
-  - npm install
-
+# Run npm tests
 test:
   stage: test
+  before_script:
+    - npm install
   script:
     - npm test
 
+# Test Docker image build
+test-docker-image:
+  image: docker:latest
+  stage: test
+  variables:
+    FF_NETWORK_PER_BUILD: "true"
+  services:
+    - name: docker:dind
+      alias: docker
+      command: ["--dns=127.0.0.11", "--dns=8.8.8.8"]
+  before_script:
+    - apk update
+    - apk add --no-cache bash
+  script:
+    - docker build -t korap/conllu-cmc:test .
+    - echo "Testing help display..."
+    - docker run --rm korap/conllu-cmc:test --help
+    - echo "Testing basic annotation..."
+    - echo -e "1\tšŸ˜€\t_\t_\t_\t_\t_\t_\t_\t_" | docker run --rm -i korap/conllu-cmc:test
+
+# Build Docker image
+build-docker-image:
+  image: docker:latest
+  stage: build
+  variables:
+    FF_NETWORK_PER_BUILD: "true"
+  services:
+    - name: docker:dind
+      alias: docker
+      command: ["--dns=127.0.0.11", "--dns=8.8.8.8"]
+  rules:
+    - if: $CI_COMMIT_TAG =~ /.+/
+      variables:
+        VID: $CI_COMMIT_TAG
+    - when: manual
+      variables:
+        VID_ALT: $CI_COMMIT_BRANCH-$CI_COMMIT_SHORT_SHA
+        VID: snapshot
+  cache:
+    key: conllu-cmc
+    paths:
+      - cache/
+  before_script:
+    - mkdir -p cache
+    - apk update
+    - apk add --no-cache bash xz
+  script:
+    - docker build -t korap/conllu-cmc:latest .
+    - docker tag korap/conllu-cmc:latest korap/conllu-cmc:$VID
+    - |
+      if [ -n "$VID_ALT" ]; then
+        docker tag korap/conllu-cmc:latest korap/conllu-cmc:$VID_ALT
+      fi
+    - docker save korap/conllu-cmc | xz -T0 > conllu-cmc.xz
+  artifacts:
+    paths:
+      - conllu-cmc.xz
+
+# Deploy to Docker Hub
+deploy-to-docker-hub:
+  image: docker:latest
+  stage: deploy
+  variables:
+    FF_NETWORK_PER_BUILD: "true"
+  services:
+    - name: docker:dind
+      alias: docker
+      command: ["--dns=127.0.0.11", "--dns=8.8.8.8"]
+  rules:
+    - if: $CI_COMMIT_TAG =~ /.+/
+    - when: manual
+  dependencies:
+    - build-docker-image
+  before_script:
+    - echo "Checking Docker Hub credentials..."
+    - test -n "$DOCKER_HUB_USER" || (echo "ERROR: DOCKER_HUB_USER is not set" && exit 1)
+    - test -n "$DOCKER_HUB_PASSWORD" || (echo "ERROR: DOCKER_HUB_PASSWORD is not set" && exit 1)
+    - echo "Logging in as user: $DOCKER_HUB_USER"
+    - echo "$DOCKER_HUB_PASSWORD" | docker login -u "$DOCKER_HUB_USER" --password-stdin
+  script:
+    - xz -d -c conllu-cmc.xz | docker load
+    - docker push --all-tags korap/conllu-cmc
+
+# Build standalone binaries
 package:
-  stage: package
+  stage: build
+  before_script:
+    - npm install
   script:
     - npm run pkg-linux
     - npm run pkg-macos