diff --git a/.gitignore b/.gitignore
index 0d3c2041e104db9dfa67f20f0c440f7205b4c836..b2c500d1109f9aef2f53e6242ab2f2b9c3afc3a3 100644
--- a/.gitignore
+++ b/.gitignore
@@ -3,3 +3,6 @@
 *~
 .coverage
 __pycache__
+dist
+*.egg-info
+version.txt
diff --git a/MANIFEST.in b/MANIFEST.in
new file mode 100644
index 0000000000000000000000000000000000000000..e11ad0d67363c25f125368ca5bdd266174dc983f
--- /dev/null
+++ b/MANIFEST.in
@@ -0,0 +1,6 @@
+include Makefile
+include Makefile.local
+include README.db_testing
+include requirements.txt
+include version.txt
+recursive-include sql *
diff --git a/setup.py b/setup.py
new file mode 100644
index 0000000000000000000000000000000000000000..5846920f86cfa0d2d83b4b178172b476f844657a
--- /dev/null
+++ b/setup.py
@@ -0,0 +1,34 @@
+#!/usr/bin/env python3
+
+from setuptools import setup
+
+
+def parse_requirements():
+    requirements = []
+    with open('requirements.txt') as f:
+        for line in f.readlines():
+            line = line.strip()
+            if not line or line.startswith('#'):
+                continue
+            requirements.append(line)
+
+    return requirements
+
+
+setup(
+    name='swh.storage',
+    description='Software Heritage storage manager',
+    author='Software Heritage developers',
+    author_email='swh-devel@inria.fr',
+    url='https://forge.softwareheritage.org/diffusion/DSTO/',
+    packages=['swh.storage', 'swh.storage.tests'],
+    scripts=[
+        'bin/swh-objstorage-add-dir',
+        'bin/swh-objstorage-fsck',
+        'bin/swh-storage-add-dir',
+    ],
+    install_requires=parse_requirements(),
+    setup_requires=['vcversioner'],
+    vcversioner={},
+    include_package_data=True,
+)