diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index 8d394373..f647b2fc 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -54,7 +54,8 @@ jobs:
               ("x86_64", "ubuntu-24.04", ("manylinux2014", "manylinux_2_28", "manylinux_2_34", "musllinux_1_2")),
               ("aarch64", "ubuntu-24.04-arm", ("manylinux2014", "manylinux_2_28", "manylinux_2_34", "musllinux_1_2")),
               ("i686", "ubuntu-24.04", ("manylinux2014", "musllinux_1_2")),
-              ("armv7l", "ubuntu-24.04-arm", ("manylinux_2_31", "musllinux_1_2")),
+              ("armv7l", "ubuntu-24.04-arm", ("manylinux_2_35", "manylinux_2_31", "musllinux_1_2")),
+              ("riscv64", "ubuntu-24.04", ("manylinux_2_35", "manylinux_2_31", "musllinux_1_2")),
               ("s390x", "ubuntu-24.04", ("musllinux_1_2",)),
           ]
           expanded = [{"policy": policy, "platform": platform, "runner": runner} for platform, runner, policies in reduced for policy in policies]
@@ -84,7 +85,7 @@ jobs:
           fetch-depth: 50
 
       - name: Set up QEMU
-        if: matrix.platform == 's390x'
+        if: matrix.platform == 's390x' || matrix.platform == 'riscv64'
         uses: docker/setup-qemu-action@v3
 
       - name: Set up Docker Buildx
diff --git a/deploy_multiarch.sh b/deploy_multiarch.sh
index 36889f09..d67346e8 100755
--- a/deploy_multiarch.sh
+++ b/deploy_multiarch.sh
@@ -2,7 +2,7 @@
 
 set -euo pipefail
 
-IMAGES=(manylinux2014 manylinux_2_28 manylinux_2_31 manylinux_2_34 musllinux_1_2)
+IMAGES=(manylinux2014 manylinux_2_28 manylinux_2_31 manylinux_2_34 manylinux_2_35 musllinux_1_2)
 
 podman login -u "${QUAY_USERNAME}" -p "${QUAY_PASSWORD}" quay.io
 
@@ -29,9 +29,10 @@ for IMAGE in "${IMAGES[@]}"; do
 
 	echo "${IMAGE}: adding tags ${TAGS_TO_PUSH[*]}"
 	case ${IMAGE} in
-		manylinux_2_31) ARCHS=("armv7l");;
+		manylinux_2_31) ARCHS=("armv7l" "riscv64");;
+		manylinux_2_35) ARCHS=("armv7l" "riscv64");;
 		manylinux2014) ARCHS=("x86_64" "i686" "aarch64" "ppc64le" "s390x");;
-		musllinux_1_2) ARCHS=("x86_64" "i686" "aarch64" "armv7l" "ppc64le" "s390x");;
+		musllinux_1_2) ARCHS=("x86_64" "i686" "aarch64" "armv7l" "ppc64le" "s390x" "riscv64");;
 		*) ARCHS=("x86_64" "aarch64" "ppc64le" "s390x");;
 	esac
 
diff --git a/docker/build_scripts/finalize.sh b/docker/build_scripts/finalize.sh
index cc4acbdb..ba07ab30 100755
--- a/docker/build_scripts/finalize.sh
+++ b/docker/build_scripts/finalize.sh
@@ -86,6 +86,12 @@ for TOOL_PATH in "${MY_DIR}/requirements-tools/"*; do
 	case ${AUDITWHEEL_PLAT}-${TOOL} in
 		musllinux*_ppc64le-uv) continue;;  # uv doesn't provide musl ppc64le wheels due to Rust issues
 		musllinux*_s390x-uv) continue;;  # uv doesn't provide musl s390x wheels due to Rust issues
+		*_riscv64-uv) continue;;  # no uv for riscv64
+		*_riscv64-cmake|*_riscv64-swig) manylinux_pkg_install "${TOOL}";;
+		*_riscv64-patchelf)
+			manylinux_pkg_install cmake
+			pipx install patchelf==0.17.2.1
+			;;
 		*) pipx install --pip-args="--require-hashes -r ${TOOL_PATH} --only-binary" "${TOOL}";;
 	esac
 done