diff --git a/setup.py b/setup.py
new file mode 100644
index 0000000000000000000000000000000000000000..6bb61b1f350078877c3163caf6472943e896f548
--- /dev/null
+++ b/setup.py
@@ -0,0 +1,50 @@
+from setuptools import setup
+import codecs
+import os.path
+
+
+def read(rel_path):
+    here = os.path.abspath(os.path.dirname(__file__))
+    with codecs.open(os.path.join(here, rel_path), 'r') as fp:
+        return fp.read()
+
+def get_metadata(rel_path, field):
+    for line in read(rel_path).splitlines():
+        if line.startswith(f'__{field}__'):
+            delim = '"' if '"' in line else "'"
+            return line.split(delim)[1]
+    else:
+        raise RuntimeError(f"Unable to find {field} string.")
+
+setup(
+    name='rocolib',
+    description="Robot Compiler",
+    url="https://git.uclalemur.com/roco/rocolib",
+    version=get_metadata("rocolib/__init__.py", "version"),
+    author=get_metadata("rocolib/__init__.py", "author"),
+    license='LGPLv3',
+    packages=['rocolib'],
+    install_requires=[
+        'dxfwrite',
+        'numpy',
+        'pydot',
+        'pytest',
+        'PyYAML',
+        'svgwrite',
+        'sympy',
+        'triangle',
+        'networkx',
+        'numpy-stl',
+        'plotly',
+        'kaleido',
+    ],
+    classifiers=[
+        'Development Status :: 4 - Beta',
+        'Framework :: Robot Framework'
+        'Intended Audience :: Developers',
+        'Intended Audience :: Education',
+        'Intended Audience :: Science/Research',
+        'License :: OSI Approved :: GNU Lesser General Public License v3 (LGPLv3)',
+        'Programming Language :: Python :: 3',
+    ],
+)