diff --git a/.gitignore b/.gitignore
index 4d166949895ac11201822ff6621f5fd3954934fb..4b535611b8dc9d7736f9c69ddc023f61e1cfb7c1 100644
--- a/.gitignore
+++ b/.gitignore
@@ -5,3 +5,4 @@ __pycache__/
 *.pyc
 *.egg-info/
 .env
+.tox
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 2b3ae2b76e931aeaa3083c7bec65ae0bf75e764e..0a273d77d547ef38b0a6cef4529ecbe26622d598 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -9,7 +9,7 @@ test:
       - docker
    image: python:3.8
    script:
-      - pip install --user pytest
+      - pip install --user tox
       - pip install --user .
       - python -m pytest
 
diff --git a/MANIFEST.in b/MANIFEST.in
new file mode 100644
index 0000000000000000000000000000000000000000..ad7985fecd1b4b9090c012bd31c98c0e83c4e5d4
--- /dev/null
+++ b/MANIFEST.in
@@ -0,0 +1 @@
+include plotting/roofline_data.json
diff --git a/pyproject.toml b/pyproject.toml
new file mode 100644
index 0000000000000000000000000000000000000000..3f1c32f27a53932edaea72fd6d5f674dea0a09af
--- /dev/null
+++ b/pyproject.toml
@@ -0,0 +1,35 @@
+[project]
+name="cb-util"
+version="0.1"
+description="Collection of scripts and wrapper of contious benchmarking"
+readme = "README.md"
+requires-python = ">=3.8"
+authors = [
+    { name = "Christoph Alt", email="christoph.alt@fau.de" }
+]
+license = { file = "LICENSE" }
+
+dependencies = [
+    "python-dotenv",
+    "influxdb",
+    "gitpython",
+    "requests",
+    "kadi-apy",
+    "importlib_resources ; python_version<'3.7'",
+]
+
+[project.optional-dependencies]
+plotting = [
+    "plotly",
+    "kaleido",
+]
+dashboard = [
+    "grafanalib",
+]
+test = ["pytest"]
+
+[project.scripts]
+get_frequency = "cbutil.cpu_frequency:main"
+
+[tools.setuptools]
+packages = ["cbutil", "cbutil.postprocessing", "dashboards", "plotting"]
diff --git a/tox.ini b/tox.ini
new file mode 100644
index 0000000000000000000000000000000000000000..1ff1af01b935b05d559ea7e23d4c33548286bcb0
--- /dev/null
+++ b/tox.ini
@@ -0,0 +1,6 @@
+[tox]
+envlist = py38
+
+[testenv]
+extras = dashboard, plotting, test
+commands = pytest --junitxml=report.xml