diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 15bf41f57efbb1c755592a63a37b58d3cbc296dd..4d2c4aad2e7d00aad56a2d3528686bcca5ee823a 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -1,19 +1,250 @@
+#
+# dtk group slaves:
+#
+# - osx      : dtk-macos-catalina.ci / sRZVDkCbN
+# - osx-arm64: catalysis-zie         / j5KdEV2ss
+# - linux    : dtk-centos-7.ci       / 3q8t4dgGP
+# - windows  : dtk-win10.ci          / eNDyiy5uY
+#
+#
+
+#
+# global variables
+#variables:
+
 build-osx:
   stage: build
-  tags: 
+  needs: []
+  tags:
     - osx
   only:
-    -  qt6
+    - feature/gitlab-runners
+    - merge_requests
   script:
     - source /Users/ci/Miniconda3/etc/profile.d/conda.sh
+    - conda env remove -n $CI_PROJECT_NAME
+    - conda env update -f pkg/env/$CI_PROJECT_NAME.yaml
+    - conda activate $CI_PROJECT_NAME
+    - conda install -c conda-forge cmake
+    - rm -fr build
+    - mkdir build
+    - cd build
+    - cmake ..
+    - make
+    - make install
+  artifacts:
+    paths:
+      - build/
+
+build-osx-arm64:
+  stage: build
+  needs: []
+  tags:
+    - osx-arm64
+  only:
+    - feature/gitlab-runners
+    - merge_requests
+    - manuel_trigger_arm
+  script:
+    - source $HOME/miniconda3/etc/profile.d/conda.sh
     - conda activate base
-    - conda mambabuild --no-force-upload --python=3.7 --python=3.9 --python=3.10 --user dtk-forge6 -c dtk-forge6 -c conda-forge pkg/recipe
- 
+    - conda env remove -n $CI_PROJECT_NAME
+    - conda env update -f pkg/env/$CI_PROJECT_NAME.yaml
+    - conda activate $CI_PROJECT_NAME
+    - conda install -c conda-forge cmake
+    - rm -fr build
+    - mkdir build
+    - cd build
+    - cmake ..
+    - make
+    - make install
+  artifacts:
+    paths:
+      - build/
+
+build-windows:
+  stage: build
+  needs: []
+  tags:
+    - windows
+  only:
+    - feature/gitlab-runners
+    - merge_requests
+  script:
+    - . C:\Users\ci\Miniconda3\shell\condabin\conda-hook.ps1
+    - conda env remove -n $CI_PROJECT_NAME
+    - (Remove-Item "C:\Users\ci\Miniconda3\envs\$CI_PROJECT_NAME" -ErrorAction Ignore -Recurse)
+    - conda env update -f pkg/env/$CI_PROJECT_NAME.yaml
+    - conda activate $CI_PROJECT_NAME
+    - conda install -c conda-forge cmake
+    - (Remove-Item  "build" -ErrorAction Ignore -Recurse)
+    - mkdir build
+    - cd build
+    - cmake ..
+    - cmake --build . --config Release --target install
+  artifacts:
+    paths:
+      - build/
+
 build-linux:
+  stage: build
+  needs: []
   tags:
     - linux
-  stage: build
   only:
-    -  qt6
+    - feature/gitlab-runners
+    - merge_requests
   script:
-    - mamba build --no-force-upload --python=3.7 --python=3.9 --python=3.10 --user dtk-forge6 -c dtk-forge6 -c conda-forge pkg/recipe
+    - source /builds/miniconda3/etc/profile.d/conda.sh
+    - conda env remove -n $CI_PROJECT_NAME
+    - mamba env update -f pkg/env/$CI_PROJECT_NAME.yaml
+    - conda activate gcc-dtk
+    - conda activate --stack $CI_PROJECT_NAME
+    - rm -fr build
+    - mkdir build
+    - cd build
+    - cmake ..
+    - make
+    - make install
+  artifacts:
+    paths:
+      - build/
+
+ctest-linux:
+  stage: test
+  needs: ["build-linux"]
+  tags:
+    - linux
+  only:
+    - feature/gitlab-runners
+    - merge_requests
+  script:
+    - source /builds/miniconda3/etc/profile.d/conda.sh
+    - conda activate gcc-dtk
+    - conda activate --stack $CI_PROJECT_NAME
+    - cd build
+    - ctest -T test --timeout 120 --output-junit ../ctest-junit.xml || true
+  artifacts:
+    when: always
+    reports:
+      junit: ./ctest-junit.xml
+  # dependencies:
+  #   - build-linux
+
+ctest-osx-arm64:
+  stage: test
+  needs: ["build-osx-arm64"]
+  tags:
+    - osx-arm64
+  only:
+    - feature/gitlab-runners
+    - merge_requests
+  script:
+    - conda activate $CI_PROJECT_NAME
+    - cd build
+    - ctest -T test --timeout 120 --output-junit ../ctest-junit.xml || true
+  artifacts:
+    when: always
+    reports:
+      junit: ./ctest-junit.xml
+  # dependencies:
+  #   - build-osx-arm64
+
+ctest-osx:
+  stage: test
+  needs: ["build-osx"]
+  tags:
+    - osx
+  only:
+    - feature/gitlab-runners
+    - merge_requests
+  script:
+    - source /Users/ci/Miniconda3/etc/profile.d/conda.sh
+    - conda activate $CI_PROJECT_NAME
+    - cd build
+    - ctest -T test --timeout 120 --output-junit ../ctest-junit.xml || true
+  artifacts:
+    when: always
+    reports:
+      junit: ./ctest-junit.xml
+  # dependencies:
+  #   - build-osx
+
+ctest-windows:
+  stage: test
+  needs: ["build-windows"]
+  tags:
+    - windows
+  only:
+    - feature/gitlab-runners
+    - merge_requests
+  script:
+    - . C:\Users\ci\Miniconda3\shell\condabin\conda-hook.ps1
+    - conda activate $CI_PROJECT_NAME
+    - cd build
+    - ctest -T test --timeout 120 --output-junit ..\ctest-junit.xml
+  artifacts:
+    when: always
+    reports:
+      junit: ./ctest-junit.xml
+  # dependencies:
+  #   - build-windows
+
+build-conda-osx:
+  stage: deploy
+  needs: ["ctest-osx"]
+  tags:
+    - osx
+  only:
+#    - master
+    - feature/gitlab-runners
+  script:
+    - source /Users/ci/Miniconda3/etc/profile.d/conda.sh
+    - conda activate base
+    - conda mambabuild --token $ANACONDA_TOKEN --user dtk-forge6 -c dtk-forge6 -c conda-forge pkg/recipe/.
+  # dependencies:
+  #   - ctest-osx
+
+build-conda-osx-arm64:
+  stage: deploy
+  needs: ["ctest-osx-arm64"]
+  tags:
+    - osx-arm64
+  only:
+#    - master
+    - feature/gitlab-runners
+  script:
+    - conda activate base
+    - conda mambabuild --token $ANACONDA_TOKEN --user dtk-forge6 -c dtk-forge6 -c conda-forge pkg/recipe/.
+  # dependencies:
+  #   - ctest-osx-arm64
+
+build-conda-windows:
+  stage: deploy
+  needs: ["ctest-windows"]
+  tags:
+    - windows
+  only:
+#    - master
+    - feature/gitlab-runners
+  script:
+    - . C:\Users\ci\Miniconda3\shell\condabin\conda-hook.ps1
+    - conda activate base
+    - conda mambabuild --token $ANACONDA_TOKEN --user dtk-forge6 -c dtk-forge6 -c conda-forge pkg/recipe/.
+  # dependencies:
+  #   - ctest-windows
+
+build-conda-linux:
+  stage: deploy
+  needs: ["ctest-linux"]
+  tags:
+    - linux
+  only:
+#    - master
+    - feature/gitlab-runners
+  script:
+    - source /builds/miniconda3/etc/profile.d/conda.sh
+    - conda activate base
+    - conda mambabuild --token $ANACONDA_TOKEN --user dtk-forge6 -c dtk-forge6 -c conda-forge pkg/recipe/.
+  # dependencies:
+  #   - ctest-linux
diff --git a/pkg/env/dtk-imaging-python.yaml b/pkg/env/dtk-imaging-python.yaml
index 3e406509f96a74876e0f2f14c1bafe9993d8227b..4ccb7fe7e96e04d8fa77ad13c2614a595451bebd 100644
--- a/pkg/env/dtk-imaging-python.yaml
+++ b/pkg/env/dtk-imaging-python.yaml
@@ -1,14 +1,14 @@
-name:         dtk-imaging-python
+name: dtk-imaging-python
 channels:
-  - dtk-forge
+  - dtk-forge6
   - conda-forge
 dependencies:
-    - cmake >=3.14.0
-    - qt >=5.9.0
-    - python=3.7.*
-    - dtk-core >=2.5.3
-    - dtk-core-python >=2.5.3
-    - dtk-imaging >=2.0.0
-    - dtk-script >=2.3.0
-    - swig >=4.0.1
-    - numpy >=1.18.1
+    - cmake >=3.21.0
+    - qt6-main >=6.5
+    - python=3.9
+    - dtk-core >=2.13
+    - dtk-core-python >=2.8
+    - dtk-imaging >=2.0.4
+    - dtk-script >=2.5
+    - swig >=4.1
+    - numpy >=1.22
diff --git a/pkg/recipe/conda_build_config.yaml b/pkg/recipe/conda_build_config.yaml
index 859c10bcef705804ad837651ff5777da11bb4616..04f8f8a9891402aff342588e3f73ee5a7ce0a31d 100644
--- a/pkg/recipe/conda_build_config.yaml
+++ b/pkg/recipe/conda_build_config.yaml
@@ -2,7 +2,10 @@ numpy:
   - 1.22
 cdt_name: cos7             # [linux]
 MACOSX_DEPLOYMENT_TARGET:  # [osx]
-  - '10.14'                # [osx]
+  - '10.15'                # [osx]
 MACOSX_SDK_VERSION:        # [osx and x86_64]
-  - '10.14'                # [osx and x86_64]
-
+  - '10.15'                # [osx and x86_64]
+python:
+  - 3.9
+  - 3.10
+  - 3.11
diff --git a/pkg/recipe/meta.yaml b/pkg/recipe/meta.yaml
index 6ce77767f8bb09f76c6b84362a3faeb00597dde9..5c95b08e749011cb56b503535e0ee16108899882 100644
--- a/pkg/recipe/meta.yaml
+++ b/pkg/recipe/meta.yaml
@@ -10,7 +10,7 @@ build:
 
 requirements:
   build:
-    - cmake >=3.14.0
+    - cmake >=3.21.0
     - numpy {{numpy}}                    # [osx]
     - python                             # [osx]
     - {{ compiler('cxx') }}
@@ -42,20 +42,20 @@ requirements:
     - {{ cdt('libxfixes-devel') }}       # [linux]
     - {{ cdt('libxxf86vm') }}            # [linux]
   host:
-    - qt >=5.9.0
-    - dtk-core >=2.5.3
-    - dtk-core-python >=2.5.3
-    - dtk-imaging >=2.0.1
-    - dtk-script >=2.3.1
-    - swig >=4.0.1
+    - qt6-main >=6.5
+    - dtk-core >=2.13
+    - dtk-core-python >=2.8
+    - dtk-imaging >=2.0.4
+    - dtk-script >=2.5
+    - swig >=4.1
     - numpy {{numpy}}
     - python
   run:
-    - qt >=5.9.0
-    - dtk-core >=2.5.3
-    - dtk-core-python >=2.5.3
-    - dtk-imaging >=2.0.1
-    - dtk-script >=2.3.1
+    - qt6-main >=6.5
+    - dtk-core >=2.13
+    - dtk-core-python >=2.8
+    - dtk-imaging >=2.0.4
+    - dtk-script >=2.5
     - numpy {{numpy}}
     - python