diff --git a/.github/workflows/conda-package.yml b/.github/workflows/conda-package.yml
index 3683807525..17676beab5 100644
--- a/.github/workflows/conda-package.yml
+++ b/.github/workflows/conda-package.yml
@@ -51,23 +51,24 @@ jobs:
             ${{ runner.os }}-conda-${{ env.CACHE_NUMBER }}-
       - name: Add conda to system path
         run: echo $CONDA/bin >> $GITHUB_PATH
-      - name: Install conda-build
-        run: conda install conda-build -c conda-forge --override-channels
+      - name: Install rattler-build
+        run: conda install conda-build rattler-build -c conda-forge --override-channels
       - name: Store conda paths as envs
         shell: bash -l {0}
         run: |
           echo "WHEELS_OUTPUT_FOLDER=$GITHUB_WORKSPACE${{ runner.os == 'Linux' && '/' || '\\' }}" >> $GITHUB_ENV
+      - name: Create variant config
+        run: |
+          echo "python:\n- ${{ matrix.python }}\n\nnumpy:\n - 2.0" > $GITHUB_WORKSPACE/conda-recipe/variant-config.yaml
       - name: Build conda package
         run: |
-          # use bootstrap channel to pull NumPy linked with OpenBLAS
-          CHANNELS="-c conda-forge --override-channels"
-          VERSIONS="--python ${{ matrix.python }} --numpy 2.0"
-          TEST="--no-test"
-          conda build \
-            $TEST \
-            $VERSIONS \
-            $CHANNELS \
-            conda-recipe
+          rattler-build build \
+            -r $GITHUB_WORKSPACE/conda-recipe/recipe.yaml \
+            -m $GITHUB_WORKSPACE/conda-recipe/variant-config.yaml \
+            --test skip \
+            --experimental \
+            --channel-priority strict \
+            -c conda-forge
       - name: Upload artifact
         uses: actions/upload-artifact@v4.6.2
         with:
@@ -105,10 +106,10 @@ jobs:
           conda-remove-defaults: true
           python-version: ${{ matrix.python }}
 
-      - name: Install conda build
+      - name: Install rattler-build
         run: |
           conda activate
-          conda install -y conda-build
+          conda install -y conda-build rattler-build
           conda list -n base
 
       - name: Cache conda packages
@@ -129,13 +130,18 @@ jobs:
           echo "CONDA_BLD=$CONDA/conda-bld/win-64/" | tr "\\\\" '/' >> $GITHUB_ENV
           echo "WHEELS_OUTPUT_FOLDER=$GITHUB_WORKSPACE${{ runner.os == 'Linux' && '/' || '\\' }}" >> $GITHUB_ENV
 
+      - name: Create variant config
+        shell: bash -l {0}
+        run: |
+          echo "python:\n- ${{ matrix.python }}\n\nnumpy:\n - 2.0" > $GITHUB_WORKSPACE/conda-recipe/variant-config.yaml
+
       - name: Build conda package
         env:
           OVERRIDE_INTEL_IPO: 1   # IPO requires more resources that GH actions VM provides
         run: |
           conda activate
           # TODO: roll back use of Intel channel when 2025.1 is available on conda-forge
-          conda build --no-test --python ${{ matrix.python }} --numpy 2.0 -c ${{ env.INTEL_CHANNEL }} -c conda-forge --override-channels conda-recipe
+          rattler-build build -r %GITHUB_WORKSPACE%\conda-recipe\recipe.yaml -m %GITHUB_WORKSPACE%\conda-recipe\variant-config.yaml --test skip --experimental --channel-priority strict -c ${{ env.INTEL_CHANNEL }} -c conda-forge
 
       - name: Upload artifact
         uses: actions/upload-artifact@v4.6.2
diff --git a/conda-recipe/bld.bat b/conda-recipe/build.bat
similarity index 94%
rename from conda-recipe/bld.bat
rename to conda-recipe/build.bat
index 69ce621862..6fb374fc0f 100644
--- a/conda-recipe/bld.bat
+++ b/conda-recipe/build.bat
@@ -7,7 +7,9 @@ set "INCLUDE=%BUILD_PREFIX%\include;%INCLUDE%"
 
 REM Overriding IPO is useful for building in resources constrained VMs (public CI)
 if DEFINED OVERRIDE_INTEL_IPO (
-  set "CMAKE_ARGS=%CMAKE_ARGS% -DCMAKE_INTERPROCEDURAL_OPTIMIZATION:BOOL=FALSE"
+  if NOT "%OVERRIDE_INTEL_IPO%"=="" (
+    set "CMAKE_ARGS=%CMAKE_ARGS% -DCMAKE_INTERPROCEDURAL_OPTIMIZATION:BOOL=FALSE"
+  )
 )
 
 FOR %%V IN (17.0.0 17 18.0.0 18 19.0.0 19 20.0.0 20) DO @(
diff --git a/conda-recipe/meta.yaml b/conda-recipe/meta.yaml
deleted file mode 100644
index 812362a627..0000000000
--- a/conda-recipe/meta.yaml
+++ /dev/null
@@ -1,92 +0,0 @@
-{% set required_compiler_version = "2024.2.0" %}
-
-{% set pyproject = load_file_data('pyproject.toml') %}
-{% set py_build_deps = pyproject.get('build-system', {}).get('requires', []) %}
-
-package:
-    name: dpctl
-    version: {{ GIT_DESCRIBE_TAG }}
-
-source:
-    path: ..
-
-build:
-    number: {{ GIT_DESCRIBE_NUMBER }}
-    script_env:
-        - WHEELS_OUTPUT_FOLDER
-        - OVERRIDE_INTEL_IPO  # [win]
-    ignore_run_exports:
-        - level-zero
-
-requirements:
-    # TODO: keep in sync with /pyproject.toml
-    build:
-        - {{ compiler('cxx') }}
-        - {{ stdlib('c') }}
-        - {{ compiler('dpcpp') }} >={{ required_compiler_version }}
-    host:
-        - python
-        - pip >=24.0
-        - level-zero-devel >=1.16
-        - pybind11 >=2.12
-        - {{ pin_compatible('intel-sycl-rt', min_pin='x.x', max_pin='x') }}
-        - {{ pin_compatible('intel-cmplr-lib-rt', min_pin='x.x', max_pin='x') }}
-        # Ensure we are using latest version of setuptools, since we don't need
-        # editable environments for release.
-        - setuptools >=69
-        {% for dep in py_build_deps %}
-        {% if dep.startswith('ninja') %}
-        - {{ dep.split(';')[0] }} # [not win]
-        {% elif dep.startswith('cmake') %}
-        - {{ dep }}
-        {% elif dep.startswith('build>=') %}
-        - {{ 'python-' ~ dep }}
-        {% elif dep.startswith('cython') %}
-        {% if dep.split(';')[1] == "python_version<'3.13'" %}
-        - {{ dep.split(';')[0] }} # [py<313]
-        {% else %}
-        - {{ dep.split(';')[0] }} # [py>=313]
-        {% endif %}
-        {% else %}
-        - {{ dep|replace('_','-') }}
-        {% endif %}
-        {% endfor %}
-        # versioneer dependency
-        - tomli # [py<311]
-    run:
-        - python
-        - {{ pin_compatible('intel-sycl-rt', min_pin='x.x', max_pin='x') }}
-        - {{ pin_compatible('intel-cmplr-lib-rt', min_pin='x.x', max_pin='x') }}
-        - numpy
-
-test:
-    requires:
-        - {{ compiler('c') }}
-        - {{ compiler('cxx') }}
-        - {{ stdlib('c') }}
-        - cython
-        - setuptools
-        - pytest
-        - pytest-cov
-
-about:
-    home: https://github.com/IntelPython/dpctl.git
-    license: Apache-2.0
-    license_file: LICENSE
-    summary: 'A lightweight Python wrapper for a subset of SYCL API.'
-    description: |
-        LEGAL NOTICE: Use of this software package is subject to the
-        software license agreement (as set forth above, in the license section of
-        the installed Conda package and/or the README file) and all notices,
-        disclaimers or license terms for third party or open source software
-        included in or with the software.
-        
-        EULA: Apache-2.0
-        
-
-extra:
-    recipe-maintainers:
-        - ndgrigorian
-        - antonwolfy
-        - vtavana
-        - vlad-perevezentsev
diff --git a/conda-recipe/recipe.yaml b/conda-recipe/recipe.yaml
new file mode 100644
index 0000000000..955c7e9415
--- /dev/null
+++ b/conda-recipe/recipe.yaml
@@ -0,0 +1,113 @@
+schema_version: 1
+
+context:
+  name: dpctl
+  git_repo_url: "https://github.com/IntelPython/dpctl.git"
+  latest_tag: ${{ git.latest_tag( git_repo_url ) }}
+  version: ${{ latest_tag }}
+  buildnumber: ${{ GIT_DESCRIBE_NUMBER }}
+  required_compiler_version: "2024.2.0"
+
+package:
+  name: ${{ name }}
+  version: ${{ version }}
+
+source:
+  path: ..
+  use_gitignore: false
+
+build:
+  number: ${{buildnumber}}
+  script:
+    env:
+      WHEELS_OUTPUT_FOLDER: ${{ env.get("WHEELS_OUTPUT_FOLDER", default="") }}
+      OVERRIDE_INTEL_IPO: ${{ env.get("OVERRIDE_INTEL_IPO", default="") }}
+  
+requirements:
+    ignore_run_exports:
+      by_name:
+        - level-zero
+    # TODO: keep in sync with /pyproject.toml
+    build:
+      - ${{ compiler('cxx') }}
+      - ${{ stdlib('c') }}
+      - ${{ compiler('dpcpp') }} >= ${{ required_compiler_version }}
+    host:
+      - python
+      - pip >=24.0
+      - level-zero-devel >=1.16
+      - pybind11 >=2.12
+      - ${{ pin_compatible('intel-sycl-rt', lower_bound='x.x', upper_bound='x') }}
+      - ${{ pin_compatible('intel-cmplr-lib-rt', lower_bound='x.x', upper_bound='x') }}
+      # Ensure we are using latest version of setuptools, since we don't need
+      # editable environments for release.
+      - setuptools >=63.0
+      - wheel>=0.43
+      - python-build>=1.1
+      - scikit-build>=0.17.0
+      - if: linux
+        then:
+          - ninja>=1.11.1
+      - cmake>=3.29.0
+      - if: match(python, ">=3.13")
+        then:
+          - cython>=3.0.10,<3.1.0
+      - if: match(python, "<3.13")
+        then:
+          - cython>=3.0.10
+      - numpy>=1.23
+      # WARNING: check with doc how to upgrade
+      - versioneer==0.29
+      # versioneer dependency
+      - if: python < "3.11"
+        then:
+          - tomli
+    run:
+      - python
+      - ${{ pin_compatible('intel-sycl-rt', lower_bound='x.x', upper_bound='x') }}
+      - ${{ pin_compatible('intel-cmplr-lib-rt', lower_bound='x.x', upper_bound='x') }}
+      - numpy
+
+tests:
+  - script:
+      interpreter: bash
+      content: |
+        python -c "import dpctl; print(dpctl.__version__)"
+        python -m dpctl -f
+        python -m pytest -q -ra --disable-warnings --cov dpctl --cov-report term-missing --pyargs dpctl -vv
+    requirements:
+      run:
+        - ${{ compiler('c') }}
+        - ${{ compiler('cxx') }}
+        - ${{ stdlib('c') }}
+        - if: match(python, ">=3.13")
+          then:
+            - cython>=3.0.10,<3.1.0
+        - if: match(python, "<3.13")
+          then:
+            - cython>=3.0.10
+        - setuptools
+        - pytest
+        - pytest-cov
+
+about:
+    homepage: https://github.com/IntelPython/dpctl.git
+    license: Apache-2.0
+    license_file: LICENSE
+    summary: 'A lightweight Python wrapper for a subset of SYCL API.'
+    description: |
+        LEGAL NOTICE: Use of this software package is subject to the
+        software license agreement (as set forth above, in the license section of
+        the installed Conda package and/or the README file) and all notices,
+        disclaimers or license terms for third party or open source software
+        included in or with the software.
+        
+        EULA: Apache-2.0
+        
+
+extra:
+    recipe-maintainers:
+        - ndgrigorian
+        - antonwolfy
+        - vtavana
+        - vlad-perevezentsev
diff --git a/conda-recipe/run_test.bat b/conda-recipe/run_test.bat
deleted file mode 100644
index 85cac031e7..0000000000
--- a/conda-recipe/run_test.bat
+++ /dev/null
@@ -1,10 +0,0 @@
-@echo on
-
-"%PYTHON%" -c "import dpctl; print(dpctl.__version__)"
-if errorlevel 1 exit 1
-
-"%PYTHON%" -m dpctl -f
-if errorlevel 1 exit 1
-
-python -m pytest -q -ra --disable-warnings --pyargs dpctl -vv
-if errorlevel 1 exit 1
diff --git a/conda-recipe/run_test.sh b/conda-recipe/run_test.sh
deleted file mode 100644
index 63ae7996cc..0000000000
--- a/conda-recipe/run_test.sh
+++ /dev/null
@@ -1,7 +0,0 @@
-#!/bin/bash
-
-set -e
-
-${PYTHON} -c "import dpctl; print(dpctl.__version__)"
-${PYTHON} -m dpctl -f
-${PYTHON} -m pytest -q -ra --disable-warnings --cov dpctl --cov-report term-missing --pyargs dpctl -vv