diff --git a/.gitignore b/.gitignore
index 88b0b9f8f39ab230aca8209000aeba1f2d01e36c..486844185f91624b2c3825dcac25757751517832 100644
--- a/.gitignore
+++ b/.gitignore
@@ -64,7 +64,7 @@ yarn.lock
 .next
 
 # webpack output
-dist/
+server/static/
 
 # IPython temporary files
 .ipynb_checkpoints/
diff --git a/setup.py b/setup.py
new file mode 100644
index 0000000000000000000000000000000000000000..7b7f1b053f2fbaaa99706445902c6956fcca1359
--- /dev/null
+++ b/setup.py
@@ -0,0 +1,37 @@
+from setuptools import setup, find_packages
+from distutils.command.build import build
+from setuptools.command.sdist import sdist
+
+
+def webpack():
+    import subprocess
+    subprocess.check_call(['npm', 'install'])
+    subprocess.check_call(['./node_modules/.bin/webpack'])
+
+
+class Build(build):
+    def run(self):
+        webpack()
+        super().run()
+
+
+class Sdist(sdist):
+    def run(self):
+        webpack()
+        super().run()
+
+
+setup(
+    name="zesje",
+    version="0.1",
+    url="http://gitlab.kwant-project,org/zesje/zesje",
+    description="",
+    author="Zesje authors",
+    author_email="anton.akhmerov@tudelft.nl",
+    packages=find_packages('.'),
+    cmdclass={'build': Build,
+              'sdist': Sdist,
+             },
+    package_data={'zesje': ['static/*']},
+    include_package_data=True,
+)
diff --git a/webpack.config.js b/webpack.config.js
index c55990bb48c6cc81a1abb6db8b9ba04fb3cea8fc..44f730044941c8dd99e2b031babb7214876272a2 100644
--- a/webpack.config.js
+++ b/webpack.config.js
@@ -13,7 +13,7 @@ const HtmlWebpackPluginConfig = new HtmlWebpackPlugin({
 module.exports = {
   entry: './client/index.js',
   output: {
-    path: path.resolve('dist'),
+    path: path.resolve('zesje/static'),
     filename: 'index_bundle.js'
   },
   module: {
diff --git a/server/__init__.py b/zesje/__init__.py
similarity index 59%
rename from server/__init__.py
rename to zesje/__init__.py
index 9c85b604e81c7c55907730871240562f9a0d8f3e..ee839b034dd98baeb536cb42c1c29ebcd25651ec 100644
--- a/server/__init__.py
+++ b/zesje/__init__.py
@@ -1,8 +1,11 @@
+from os import path
+from os.path import abspath, dirname
 from flask import Flask
 
 from . import db, api
 
-app = Flask('zesje', static_folder='dist')
+app = Flask(__name__,
+            static_folder=path.join(abspath(dirname(__file__)), 'static'))
 db.use_db()
 
 app.register_blueprint(api.app, url_prefix='/api')
diff --git a/server/__main__.py b/zesje/__main__.py
similarity index 75%
rename from server/__main__.py
rename to zesje/__main__.py
index f43d14dc842370aaecd52c06ae8ea2346b7f22b9..232d4dc7d97f99a7bf7704505d1c1f215c76368b 100644
--- a/server/__main__.py
+++ b/zesje/__main__.py
@@ -2,5 +2,5 @@ import sys
 import os
 sys.path.append(os.getcwd())
 
-from server import app
+from zesje import app
 app.run(debug=True)
diff --git a/server/api.py b/zesje/api.py
similarity index 100%
rename from server/api.py
rename to zesje/api.py
diff --git a/server/db.py b/zesje/db.py
similarity index 100%
rename from server/db.py
rename to zesje/db.py