diff --git a/pyproject.toml b/pyproject.toml
new file mode 100644
index 0000000000000000000000000000000000000000..4fca2d11216d16b4460489a28695a4e01cb04816
--- /dev/null
+++ b/pyproject.toml
@@ -0,0 +1,53 @@
+[project]
+name = "pretix-public-registrations"
+dynamic = ["version"]
+description = """
+This plugin will give the option to attendees of an event to mark their
+registration as public. Public registrations will be shown along their answers
+to questions marked as public by the organizers on a world-readable page.
+"""
+readme = "README.rst"
+license = {text = "MIT License"}
+keywords = ["pretix", "public registrations"]
+authors = [
+    { name = "Felix Schäfer", email = "admin@kif.rocks"},
+    { name = "Dominik Weitz"},
+]
+maintainers = [
+    { name = "Felix Schäfer", email = "admin@kif.rocks"},
+]
+classifiers = [
+    "Development Status :: 5 - Production/Stable",
+    "Environment :: Plugins",
+    "Framework :: Django",
+    "License :: OSI Approved :: MIT License",
+    "Programming Language :: Python :: 3",
+]
+
+[project.entry-points."pretix.plugin"]
+pretix_public_registrations = "pretix_public_registrations:PretixPluginMeta"
+
+[project.entry-points."distutils.commands"]
+build = "pretix_plugin_build.build:CustomBuild"
+
+[build-system]
+requires = [
+    "setuptools",
+    "pretix-plugin-build",
+]
+
+[project.urls]
+Homepage = "https://gitlab.fachschaften.org/kif/pretix-public-registrations"
+Repository = "https://gitlab.fachschaften.org/kif/pretix-public-registrations"
+Tracker = "https://gitlab.fachschaften.org/kif/pretix-public-registrations/-/issues"
+"pretix Marketplace" = "https://marketplace.pretix.eu/products/public-registrations/"
+
+[tool.setuptools]
+include-package-data = true
+
+[tool.setuptools.dynamic]
+version = {attr = "pretix_public_registrations.__version__"}
+
+[tool.setuptools.packages.find]
+include = ["pretix*"]
+namespaces = false
diff --git a/setup.py b/setup.py
index 0bc4e2c2ef77289b2039a7a13b08bfa898dc8d1d..606849326a4002007fd42060b51e69a19c18675c 100644
--- a/setup.py
+++ b/setup.py
@@ -1,58 +1,3 @@
-import os
-from distutils.command.build import build
+from setuptools import setup
 
-from django.core import management
-from setuptools import find_packages, setup
-
-from pretix_public_registrations import __version__
-
-
-try:
-    with open(
-        os.path.join(os.path.dirname(__file__), "README.rst"), encoding="utf-8"
-    ) as f:
-        long_description = f.read()
-except Exception:
-    long_description = ""
-
-
-class CustomBuild(build):
-    def run(self):
-        management.call_command("compilemessages", verbosity=1)
-        build.run(self)
-
-
-cmdclass = {"build": CustomBuild}
-
-
-setup(
-    name="pretix-public-registrations",
-    version=__version__,
-    description="This plugin will give the option to attendees of an event to mark their registration as public. "
-    "Public registrations will be shown along their answers to questions marked as public by the organizers on a world-readable page.",
-    long_description=long_description,
-    keywords="pretix public registrations",
-    url="https://gitlab.fachschaften.org/kif/pretix-public-registrations",
-    project_urls={
-        "Bug Tracker": "https://gitlab.fachschaften.org/kif/pretix-public-registrations/issues",
-        "Source Code": "https://gitlab.fachschaften.org/kif/pretix-public-registrations/tree/master",
-    },
-    author="Felix Schäfer, Dominik Weitz",
-    author_email="admin@kif.rocks",
-    license="MIT",
-    classifiers=[
-        "Development Status :: 5 - Production/Stable",
-        "Environment :: Plugins",
-        "Framework :: Django",
-        "License :: OSI Approved :: MIT License",
-        "Programming Language :: Python :: 3",
-    ],
-    install_requires=[],
-    packages=find_packages(exclude=["tests", "tests.*"]),
-    include_package_data=True,
-    cmdclass=cmdclass,
-    entry_points="""
-[pretix.plugin]
-pretix_public_registrations=pretix_public_registrations:PretixPluginMeta
-""",
-)
+setup()