diff --git a/AKPlanning/settings.py b/AKPlanning/settings.py
index c697b2e41bc98d2621edd8173b7ceb7155fbb438..3dc46aa57266a36bcdef18393ef3fd6571d3727b 100644
--- a/AKPlanning/settings.py
+++ b/AKPlanning/settings.py
@@ -55,6 +55,7 @@ INSTALLED_APPS = [
     'bootstrap_datepicker_plus',
     'django_tex',
     'compressor',
+    'docs',
 ]
 
 MIDDLEWARE = [
@@ -234,4 +235,9 @@ CSP_FONT_SRC = ("'self'", "data:", "fonts.gstatic.com")
 SEND_MAILS = True
 EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'
 
+# Documentation
+
+DOCS_ROOT = os.path.join(BASE_DIR, 'docs/_build/html')
+DOCS_ACCESS = 'public'
+
 include(optional("settings/*.py"))
diff --git a/AKPlanning/urls.py b/AKPlanning/urls.py
index cdbbea559617339113a51427b7b138417680b582..c97f013422b9f23edb436c1bf44db327924cd48e 100644
--- a/AKPlanning/urls.py
+++ b/AKPlanning/urls.py
@@ -1,4 +1,5 @@
-"""AKPlanning URL Configuration
+"""
+AKPlanning URL Configuration
 
 The `urlpatterns` list routes URLs to views. For more information please see:
     https://docs.djangoproject.com/en/2.2/topics/http/urls/
@@ -13,13 +14,15 @@ Including another URLconf
     1. Import the include() function: from django.urls import include, path
     2. Add a URL to urlpatterns:  path('blog/', include('blog.urls'))
 """
+
 import debug_toolbar
 from django.apps import apps
 from django.contrib import admin
-from django.urls import path, include
+from django.urls import path, include, re_path
 
 urlpatterns = [
     path('admin/', admin.site.urls),
+    re_path(r'^docs/', include('docs.urls')),
     path('accounts/', include('django.contrib.auth.urls')),
     path('accounts/', include('registration.backends.simple.urls')),
     path('', include('AKModel.urls', namespace='model')),
diff --git a/Utils/setup.sh b/Utils/setup.sh
index 7993082cbff409f7bbae515b6e8d3b18edef09fd..fafa334a57ad728e4c37fb3b7661f2b9e5c165b7 100755
--- a/Utils/setup.sh
+++ b/Utils/setup.sh
@@ -26,4 +26,9 @@ python manage.py compilemessages -l de_DE
 # Credentials are entered interactively on CLI
 python manage.py createsuperuser
 
+# Generate documentation
+cd docs
+make html
+cd ..
+
 deactivate
diff --git a/Utils/update.sh b/Utils/update.sh
index 780baef2ff52ef2a8d96ffb291f900900acdb048..a711b73b912fcd07e8543b6b49d4eb8950ff0d79 100755
--- a/Utils/update.sh
+++ b/Utils/update.sh
@@ -27,4 +27,10 @@ pip install --upgrade -r requirements.txt
 ./manage.py collectstatic --noinput
 ./manage.py compilemessages -l de_DE
 
+
+# Update documentation
+cd docs
+make html
+cd ..
+
 touch AKPlanning/wsgi.py
diff --git a/docs/.gitignore b/docs/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..6c87b539c1a92836fcc92060af8b8fe4ce6192ed
--- /dev/null
+++ b/docs/.gitignore
@@ -0,0 +1,2 @@
+_build/
+code/
diff --git a/docs/Makefile b/docs/Makefile
new file mode 100644
index 0000000000000000000000000000000000000000..d4bb2cbb9eddb1bb1b4f366623044af8e4830919
--- /dev/null
+++ b/docs/Makefile
@@ -0,0 +1,20 @@
+# Minimal makefile for Sphinx documentation
+#
+
+# You can set these variables from the command line, and also
+# from the environment for the first two.
+SPHINXOPTS    ?=
+SPHINXBUILD   ?= sphinx-build
+SOURCEDIR     = .
+BUILDDIR      = _build
+
+# Put it first so that "make" without argument is like "make help".
+help:
+	@$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
+
+.PHONY: help Makefile
+
+# Catch-all target: route all unknown targets to Sphinx using the new
+# "make mode" option.  $(O) is meant as a shortcut for $(SPHINXOPTS).
+%: Makefile
+	@$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
diff --git a/docs/code.rst b/docs/code.rst
new file mode 100644
index 0000000000000000000000000000000000000000..690352ce8aa1a395632029f1369e373be4a7b8f9
--- /dev/null
+++ b/docs/code.rst
@@ -0,0 +1,10 @@
+Code
+=====
+
+.. toctree::
+    code/AKDashboard
+    code/AKModel
+    code/AKOnline
+    code/AKPlan
+    code/AKScheduling
+    code/AKSubmission
diff --git a/docs/conf.py b/docs/conf.py
new file mode 100644
index 0000000000000000000000000000000000000000..473f1b4f0da723370054887e389bd6ca4938f4d9
--- /dev/null
+++ b/docs/conf.py
@@ -0,0 +1,82 @@
+# Configuration file for the Sphinx documentation builder.
+#
+# For the full list of built-in configuration values, see the documentation:
+# https://www.sphinx-doc.org/en/master/usage/configuration.html
+import os
+import sys
+from recommonmark.parser import CommonMarkParser
+import django
+
+# -- Project information -----------------------------------------------------
+# https://www.sphinx-doc.org/en/master/usage/configuration.html#project-information
+
+project = 'AK Planning'
+copyright = '2023, N. Geisler, B. Hättasch & more'
+author = 'N. Geisler, B. Hättasch & more'
+
+# -- General configuration ---------------------------------------------------
+# https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration
+
+extensions = [
+    'sphinxcontrib.apidoc',   # runs sphinx-apidoc automatically as part of sphinx-build
+    'sphinx.ext.autodoc',     # the autodoc extensions uses files generated by apidoc
+    "sphinx.ext.autosummary",
+    "sphinxcontrib_django",
+    'sphinx.ext.viewcode',    # enable viewing autodoc'd code
+]
+
+templates_path = ['_templates']
+exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store']
+
+# -- Django specific settings ------------------------------------------------
+
+# Add source directory to sys.path
+sys.path.insert(0, os.path.abspath(".."))
+
+# Configure the path to the Django settings module
+django_settings = "AKPlanning.settings"
+os.environ['DJANGO_SETTINGS_MODULE'] = django_settings
+
+django.setup()
+
+# Auto-generate API documentation.
+os.environ['SPHINX_APIDOC_OPTIONS'] = "members,show-inheritance"
+
+# -- Input ----
+
+source_parsers = {
+    '.md': CommonMarkParser,
+}
+
+source_suffix = ['.rst', '.md']
+
+# -- Extension Conf ----
+
+autodoc_member_order = 'bysource'
+autodoc_inherit_docstrings = False
+
+apidoc_module_dir = '../'
+apidoc_output_dir = 'code'
+apidoc_excluded_paths = ['AKDashboard/migrations',
+                         'AKModel/migrations',
+                         'AKOnline/migrations',
+                         'AKPlan/migrations',
+                         'AKScheduling/migrations',
+                         'AKSubmission/migrations',
+                         'AKPlanning/',
+                         'manage.py',
+                         'docs',
+                         'locale',
+                         'Utils'
+                         ]
+apidoc_separate_modules = True
+apidoc_toc_file = False
+apidoc_module_first = True
+apidoc_extra_args = ['-f']
+apidoc_project = project
+
+# -- Options for HTML output -------------------------------------------------
+# https://www.sphinx-doc.org/en/master/usage/configuration.html#options-for-html-output
+
+html_static_path = ['_static']
+html_theme = 'sphinx_rtd_theme'
diff --git a/docs/index.rst b/docs/index.rst
new file mode 100644
index 0000000000000000000000000000000000000000..50fb2772421632f7195696de5f37f7810b75a11f
--- /dev/null
+++ b/docs/index.rst
@@ -0,0 +1,22 @@
+.. AK Planning documentation master file, created by
+   sphinx-quickstart on Wed Jun 21 09:54:11 2023.
+   You can adapt this file completely to your liking, but it should at least
+   contain the root `toctree` directive.
+
+Start
+=======================================
+
+.. toctree::
+   :maxdepth: 2
+   :caption: Contents:
+
+   usage/usage
+   code
+
+
+Indices and tables
+==================
+
+* :ref:`genindex`
+* :ref:`modindex`
+* :ref:`search`
diff --git a/docs/make.bat b/docs/make.bat
new file mode 100644
index 0000000000000000000000000000000000000000..954237b9b9f2b248bb1397a15c055c0af1cad03e
--- /dev/null
+++ b/docs/make.bat
@@ -0,0 +1,35 @@
+@ECHO OFF
+
+pushd %~dp0
+
+REM Command file for Sphinx documentation
+
+if "%SPHINXBUILD%" == "" (
+	set SPHINXBUILD=sphinx-build
+)
+set SOURCEDIR=.
+set BUILDDIR=_build
+
+%SPHINXBUILD% >NUL 2>NUL
+if errorlevel 9009 (
+	echo.
+	echo.The 'sphinx-build' command was not found. Make sure you have Sphinx
+	echo.installed, then set the SPHINXBUILD environment variable to point
+	echo.to the full path of the 'sphinx-build' executable. Alternatively you
+	echo.may add the Sphinx directory to PATH.
+	echo.
+	echo.If you don't have Sphinx installed, grab it from
+	echo.https://www.sphinx-doc.org/
+	exit /b 1
+)
+
+if "%1" == "" goto help
+
+%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O%
+goto end
+
+:help
+%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O%
+
+:end
+popd
diff --git a/docs/usage/usage.rst b/docs/usage/usage.rst
new file mode 100644
index 0000000000000000000000000000000000000000..e29d849e91999e2c3dea1a9ba8f8aa080b5f7ba5
--- /dev/null
+++ b/docs/usage/usage.rst
@@ -0,0 +1,5 @@
+Usage
+=====
+
+.. toctree::
+
diff --git a/requirements.txt b/requirements.txt
index 8a886c58b920b5d8746a0e9228981006fcc456ac..c537d2312e8d1fd5e83ca6c978f2eb00a48568d8 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -16,3 +16,11 @@ django-libsass==0.9
 django-betterforms==2.0.0
 mysqlclient==2.2.0  # for production deployment
 tzdata==2023.3
+
+# Documentation
+sphinxcontrib-django==2.3
+sphinxcontrib-apidoc==0.3.0
+recommonmark==0.7.1
+django-docs==0.3.3
+sphinx-rtd-theme==1.2.2
+sphinx==6.2.1
\ No newline at end of file