diff --git a/.github/workflows/wheels.yml b/.github/workflows/wheels.yml
index f993a5d2..ee276443 100644
--- a/.github/workflows/wheels.yml
+++ b/.github/workflows/wheels.yml
@@ -4,6 +4,7 @@ on:
   push:
     branches:
     - master
+    - free-threaded-wheel
     tags:
     - 'v*'
 
@@ -32,7 +33,7 @@ jobs:
           platforms: all
 
       - name: Install cibuildwheel
-        run: python -m pip install cibuildwheel==2.21.3
+        run: python -m pip install cibuildwheel==2.22.0
 
       - name: Build wheels
         run: python -m cibuildwheel --output-dir wheelhouse
diff --git a/build.sh b/build.sh
index 646e46a1..8a67bd9b 100644
--- a/build.sh
+++ b/build.sh
@@ -63,8 +63,10 @@ if [ "$CIBUILDWHEEL" = "1" ]; then
         if [ -z "$OPENSSL_VERSION" ]; then
             apt-get install libssl-dev -y
         fi
+        apt-get install libffi-dev -y
     elif [ -f /usr/bin/yum ]; then
         yum install wget zlib-devel -y
+        yum install libffi-devel -y
         if [ -z "$OPENSSL_VERSION" ]; then
             yum install openssl-devel -y
         else
diff --git a/pyproject.toml b/pyproject.toml
index 20a14e65..7ed5a2f6 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -7,6 +7,7 @@ skip = "*musllinux_aarch64 *musllinux_ppc64le"
 archs = ["auto"]
 build-frontend = "default"
 dependency-versions = "pinned"
+free-threaded-support = true
 environment = {LIBGIT2_VERSION="1.9.0", LIBSSH2_VERSION="1.11.1", OPENSSL_VERSION="3.2.3", LIBGIT2="/project/ci"}
 
 before-all = "sh build.sh"