diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index e56ce318741c724fbd6c16ae4163eef29e7cb420..02d075adccf5744bc24451e75fea532866950816 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -134,6 +134,22 @@ build_python312:
   image: python:3.12
 
 
+
+build_python3_sdist:
+  extends: .build_python
+  image: python:3.9
+  artifacts:
+    paths:
+      - "*.whl"
+  script:
+    - pip install --break-system-packages --upgrade Cython setuptools pip
+    - pip install --break-system-packages -r requirements.txt
+    - python setup.py sdist
+  after_script:
+    - pip install twine
+    - TWINE_PASSWORD=${CI_JOB_TOKEN} TWINE_USERNAME=gitlab-ci-token python3 -m twine upload --repository-url ${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/pypi *.whl
+
+
 build_python311_armv7l:
   extends: .build_python
   image: zoo.smok.co/build/build:armv7l-python3.11
diff --git a/CHANGELOG.md b/CHANGELOG.md
index e905dcfdb263674f24a73b9d9f859c0a25e6c1fa..d141d40844fa67bc10b59cbbacad112d315f3452 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -4,7 +4,7 @@ Changelog
 v3.1.1
 ------
 
-* TBA
+* added source wheels to emitted packages so that they can be built on Windows as well
 
 v3.1.0
 ------
diff --git a/setup.cfg b/setup.cfg
index ca2d9fb92d05248e5dad5ffe6c9f191a56f988c0..7b1f8ab4985747d0b258b4eb4091798b8051b43a 100644
--- a/setup.cfg
+++ b/setup.cfg
@@ -1,6 +1,6 @@
 # coding: utf-8
 [metadata]
-version = 3.1.1a1
+version = 3.1.1
 name = minijson
 long_description = file: README.md
 long_description_content_type = text/markdown; charset=UTF-8