diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index bfe91205debf2bfc0e4c1c563faaaa5b87e69ab8..adc6833cc5a4c2898b26ce5b3ce776b93c7f7ad4 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -149,6 +149,25 @@ docs-stop-surge:
   script:
     - surge teardown ${CI_ENVIRONMENT_URL}
 
+deploy-pypi:
+  stage: deploy
+  image: python:3.10
+
+  only:
+    - tags
+
+  variables:
+    TWINE_USERNAME: gitlab-ci-token
+    TWINE_PASSWORD: ${CI_JOB_TOKEN}
+    TWINE_REPOSITORY_URL: ${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/pypi
+
+  before_script:
+    - pip install twine
+
+  script:
+    - python setup.py sdist bdist_wheel
+    - twine upload --repository-url ${TWINE_REPOSITORY_URL} dist/*
+
 bump-python-deps:
   stage: deploy
   image: registry.gitlab.teklia.com/infra/devops:latest