diff --git a/images/code-install-hvplot.png b/images/code-install-hvplot.png
new file mode 100644
index 0000000000000000000000000000000000000000..b11ab6ad73ce221fe590b0d202d1ea936520485e
Binary files /dev/null and b/images/code-install-hvplot.png differ
diff --git a/images/code-interactive.png b/images/code-interactive.png
new file mode 100644
index 0000000000000000000000000000000000000000..949e741b3a6724b06b7e490181969ff091a7e69b
Binary files /dev/null and b/images/code-interactive.png differ
diff --git a/images/code-mpl-widget.png b/images/code-mpl-widget.png
new file mode 100644
index 0000000000000000000000000000000000000000..ed285da2df97bb898b8e723ee1fd85bb6c5f064a
Binary files /dev/null and b/images/code-mpl-widget.png differ
diff --git a/images/code-r.png b/images/code-r.png
new file mode 100644
index 0000000000000000000000000000000000000000..c9ed51c630e910564a90219da87498b7cd542162
Binary files /dev/null and b/images/code-r.png differ
diff --git a/images/code-terminal.png b/images/code-terminal.png
new file mode 100644
index 0000000000000000000000000000000000000000..d120a91e9d2ead3a4292950384ce151afbea2e25
Binary files /dev/null and b/images/code-terminal.png differ
diff --git a/images/code-upload.png b/images/code-upload.png
new file mode 100644
index 0000000000000000000000000000000000000000..ff52901839c7c62083153cfce2e958a06e568575
Binary files /dev/null and b/images/code-upload.png differ
diff --git a/images/jupyter-lab.png b/images/jupyter-lab.png
new file mode 100644
index 0000000000000000000000000000000000000000..6cac936bc316f64b5ba4cbb2b6fd7b9f964aca61
Binary files /dev/null and b/images/jupyter-lab.png differ
diff --git a/images/login-screen.png b/images/login-screen.png
new file mode 100644
index 0000000000000000000000000000000000000000..58785de2297ff3d78f7cccc8f66d2d3806398ec3
Binary files /dev/null and b/images/login-screen.png differ
diff --git a/images/menu-file-hub_control_panel.png b/images/menu-file-hub_control_panel.png
new file mode 100644
index 0000000000000000000000000000000000000000..04163c9642425eb35d458063e23796ef21074991
Binary files /dev/null and b/images/menu-file-hub_control_panel.png differ
diff --git a/images/server-starting.png b/images/server-starting.png
new file mode 100644
index 0000000000000000000000000000000000000000..3e9ace1cfaf2c665d32af141224c9986f2099421
Binary files /dev/null and b/images/server-starting.png differ
diff --git a/images/stop-my-server.png b/images/stop-my-server.png
new file mode 100644
index 0000000000000000000000000000000000000000..7cf8303854d2dfdf69ee5fbb15ba031888fb77f1
Binary files /dev/null and b/images/stop-my-server.png differ
diff --git a/jupyterhub.md b/jupyterhub.md
new file mode 100644
index 0000000000000000000000000000000000000000..a004b0c8402ef4d59455277e7abb85ed44713fd1
--- /dev/null
+++ b/jupyterhub.md
@@ -0,0 +1,53 @@
+# JupyterHub
+
+Der JupyterHub stellt eine Python- und R-Umgebung für Sie bereit, damit Sie direkt loslegen können.
+
+## Server starten und stoppen
+
+1. Loggen Sie sich bei https://jupyter.hs-bochum.de mit Ihrer normalen BO-Kennung und Passwort ein.<br>
+   ![](images/login-screen.png)
+
+2. Ggf. erhalten Sie eine Auswahl, ansonsten startet der Server direkt für Sie.<br>
+   ![](images/server-starting.png)
+
+3. Sie werden zum JupyterLab weitergeleitet. Von dort können Sie [VS Code](vs-code) starten um in Python oder R zu entwickeln.<br>
+   ![](images/jupyter-lab.png)
+
+4. Wenn Sie fertig sind, stoppen Sie bitte den Server um Ressourcen für andere freizugeben! Dazu klicken Sie im Menü auf *File* → *Hub Control Panel* oder auf https://jupyter.hs-bochum.de/hub/home<br>
+   ![](images/menu-file-hub_control_panel.png)
+
+5. Anschließend klicken Sie auf *Stop My Server*! Damit werden evtl. laufende Programme geschlossen und der Zustand des Dateisystems mit der Ausnahme ihrer eigenen Dateien in `/home/jovyan/` wieder zurück gesetzt.<br>
+   ![](images/stop-my-server.png)
+
+## VS Code für Python
+
+1. In VS Code (genauer: code-server) können Sie Python-Skripte oder Jupyter-Notebooks über *File* → *New File...* erstellen bzw. per Drag'n'Drop hochladen. Für große Dateien eigenen sich CLI Tools wie `wget` oder `curl` besser. Dateien können mit Rechtsklick → *Download* vom JupyterHub heruntergeladen werden. *Beachten Sie: Dateien in Ihrem Home-Verzeichnis `/home/jovyan/` bleiben bei einem Server-Stop erhalten.<br>
+   ![](images/code-upload.png)
+2. Zum Entwickeln ist der interaktive Modus komfortabler. Den erreichen Sie neben dem Play-Button mit *Run Current File in Interactive Window* oder einfach, indem Sie Sections `# %%` erstellen und diese z.B. mit `Shift`+`Enter` oder `Ctrl`+`Enter` ausführen.<br>
+   ![](images/code-interactive.png)
+3. Für sehr lang laufende Skripte ist die Konsole besser. Wenn Sie den Browser-Tab schließen, sollte sich die Konsole wieder verbinden und Sie können die Ausgaben des Skriptes sehen oder es mit `Ctrl`+`C` abbrechen.<br>
+   ![](images/code-terminal.png)
+
+*Beachten Sie: Wenn Sie vier Tage nicht über den Browser mit VS Code interagiert haben, wird der Server automatisch gestoppt.*
+
+## Pakete nachinstallieren
+
+Pakete lassen sich einfach mit `mamba install PAKET` oder `pip install PAKET` nach `/opt/conda` nachinstallieren. Bei einem Server-Stop sind sie allerdings wieder weg. Daher macht es vielleicht Sinn die Installation ins Skript mit einem `!` davor hinzuzufügen.
+
+![](images/code-install-hvplot.png)
+
+## Interaktive Plots
+
+Wenn Sie mit JavaScript-basierten Paketen wie Plotly Express oder Bokeh plotten, sind die Plots im interaktiven Fenster automatisch interaktiv.
+
+Damit Matplotlib-Plots interaktiv sind, führen Sie vor dem Plotten `%matplotlib widget` einmalig aus.
+
+![](images/code-mpl-widget.png)
+
+## VS Code für R
+
+1. Erstellen Sie eine neue Textdatei und speichern Sie sie mit der Endung `.r`.
+2. Erstellen Sie Sections `# %%` mit Code.
+3. Führen Sie die Sections mit `Shift`+`Enter` oder `Ctrl`+`Enter` aus. Plots öffnen sich automatisch und Ausgaben werden im Terminal gezeigt.
+
+![](images/code-r.png)