diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..f4e6946f553a3c9eccf1f651929a2bd7fa096a41
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,106 @@
+.idea
+
+# Byte-compiled / optimized / DLL files
+__pycache__/
+*.py[cod]
+*$py.class
+
+# C extensions
+*.so
+
+# Distribution / packaging
+.Python
+build/
+develop-eggs/
+dist/
+downloads/
+eggs/
+.eggs/
+lib/
+lib64/
+parts/
+sdist/
+var/
+wheels/
+*.egg-info/
+.installed.cfg
+*.egg
+MANIFEST
+
+# PyInstaller
+#  Usually these files are written by a python script from a template
+#  before PyInstaller builds the exe, so as to inject date/other infos into it.
+*.manifest
+*.spec
+
+# Installer logs
+pip-log.txt
+pip-delete-this-directory.txt
+
+# Unit test / coverage reports
+htmlcov/
+.tox/
+.coverage
+.coverage.*
+.cache
+nosetests.xml
+coverage.xml
+*.cover
+.hypothesis/
+.pytest_cache/
+
+# Translations
+*.mo
+*.pot
+
+# Django stuff:
+*.log
+local_settings.py
+db.sqlite3
+
+# Flask stuff:
+instance/
+.webassets-cache
+
+# Scrapy stuff:
+.scrapy
+
+# Sphinx documentation
+docs/_build/
+
+# PyBuilder
+target/
+
+# Jupyter Notebook
+.ipynb_checkpoints
+
+# pyenv
+.python-version
+
+# celery beat schedule file
+celerybeat-schedule
+
+# SageMath parsed files
+*.sage.py
+
+# Environments
+.env
+.venv
+env/
+venv/
+ENV/
+env.bak/
+venv.bak/
+
+# Spyder project settings
+.spyderproject
+.spyproject
+
+# Rope project settings
+.ropeproject
+
+# mkdocs documentation
+/site
+
+# mypy
+.mypy_cache/
diff --git a/metainfo.json b/metainfo.json
new file mode 100644
index 0000000000000000000000000000000000000000..a2a273c7f1bee039f0e7dba849c1dc1bf5dd0562
--- /dev/null
+++ b/metainfo.json
@@ -0,0 +1,41 @@
+{
+  "authors": [
+    "Cs\u00e1nyi, G\u00e1bor",
+    "Kermode, James R."
+  ],
+  "email": "gc121@cam.ac.uk",
+  "title": "Learning atomic charges",
+  "description": "In this tutorial, we will use Gaussian process regression, GPR (or equivalently, Kernel Ridge Regression, KRR) to train and predict charges of atoms in small organic molecules.",
+  "url": "https://gitlab.mpcdf.mpg.de/nomad-lab/analytics-soap-atomic-charges",
+  "link": "/jupyterhub/hub/user-redirect/notebooks/tutorials/soap-atomic-charges/soap-atomic-charges.ipynb",
+  "created": "",
+  "updated": "2017-09-29",
+  "flags": {
+    "featured": true,
+    "isPublic": true,
+    "top_of_list": false
+  },
+  "labels": {
+    "application_keyword": [
+      "GDB molecular database"
+    ],
+    "application_section": [
+      "Organic molecules"
+    ],
+    "application_system": [
+      "GDB7"
+    ],
+    "category": [
+      "Tutorial"
+    ],
+    "data_analytics_method": [
+      "Gaussian-Process Regression",
+      "GPR",
+      "Kernel Ridge Regression",
+      "KRR"
+    ],
+    "platform": [
+      "jupyter"
+    ]
+  }
+}
\ No newline at end of file
diff --git a/scripts/__init__.py b/scripts/__init__.py
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..75e3515fec884e438cbcec192fced3c463bade97 100644
--- a/scripts/__init__.py
+++ b/scripts/__init__.py
@@ -0,0 +1,3 @@
+from .Visualise import ViewStructure
+
+__all__ = [ViewStructure]
diff --git a/setup.py b/setup.py
new file mode 100644
index 0000000000000000000000000000000000000000..03a7d793d0b7a9dca776b87719cd7a61e0290721
--- /dev/null
+++ b/setup.py
@@ -0,0 +1,20 @@
+import json
+from setuptools import setup, find_packages
+
+# https://docs.python.org/3.7/distutils/setupscript.html
+# https://docs.python.org/3.7/distutils/apiref.html#distutils.core.setup
+
+with open('metainfo.json') as file:
+    metainfo = json.load(file)
+
+setup(
+    name='soap_atomic_charges',
+    version='0.9',
+    author=', '.join(metainfo['authors']),
+    author_email=metainfo['email'],
+    url=metainfo['url'],
+    description=metainfo['title'],
+    long_description=metainfo['description'],
+    packages=find_packages(),
+    install_requires=['quippy', 'numpy', 'scipy', 'matplotlib'],
+)