diff --git a/pyproject.toml b/pyproject.toml
index f00e77850c68796aadd5f1c8450816553222feea..3ae146d6de1acc11f05a6077e70a9c3735bea05a 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -1,4 +1,74 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2024 TU Wien.
+#
+# Invenio-Utilities-TUW is free software; you can redistribute it and/or
+# modify it under the terms of the MIT License; see LICENSE file for more
+# details.
+
 [build-system]
-requires = ["setuptools", "wheel", "babel>2.8"]
-build-backend = "setuptools.build_meta"
+requires = ["hatchling"]
+build-backend = "hatchling.build"
+
+[tool.hatch.version]
+path = "invenio_utilities_tuw/__init__.py"
+
+[project]
+name = "invenio-utilities-tuw"
+dynamic = ["version"]
+description = "Some utilities for InvenioRDM."
+keywords = ["invenio", "cli", "utilities", "tu wien"]
+requires-python = ">=3.9"
+readme = "README.rst"
+license = "MIT"
+authors = [
+    {name = "Team of the Center for Research Data Management (TU Wien)", email = "tudata@tuwien.ac.at"},
+]
+classifiers = [
+    "Environment :: Web Environment",
+    "License :: OSI Approved :: MIT License",
+    "Operating System :: OS Independent",
+    "Topic :: Internet :: WWW/HTTP :: Dynamic Content",
+    "Topic :: Software Development :: Libraries :: Python Modules",
+    "Programming Language :: Python",
+    "Programming Language :: Python :: 3.9",
+    "Programming Language :: Python :: 3.10",
+    "Programming Language :: Python :: 3.11",
+    "Programming Language :: Python :: 3.12",
+    "Development Status :: 5 - Production/Stable",
+]
+dependencies = [
+    "invenio-app-rdm>=12.0.0,<13.0.0"
+]
+
+[project.optional-dependencies]
+tests = [
+    "invenio-search[opensearch2]>=2.0.0",
+    "pytest-black>=0.3.0,<0.3.10",
+    "pytest-invenio>=1.4.0",
+    "sphinx>=4.5",
+]
+
+[project.urls]
+Repository = "https://gitlab.tuwien.ac.at/fairdata/invenio-utilities-tuw"
+
+# entrypoints
+[project.entry-points."flask.commands"]
+tuw = "invenio_utilities_tuw.cli:utilities"
+
+[project.entry-points."invenio_base.apps"]
+invenio_utilities_tuw = "invenio_utilities_tuw:InvenioUtilitiesTUW"
+
+[project.entry-points."invenio_i18n.translations"]
+messages = "invenio_utilities_tuw"
+
+# configuration for tools
+[tool.isort]
+profile = "black"
+
+[tool.pytest.ini_optiions]
+addopts = '--black --isort --pydocstyle --doctest-glob="*.rst" --doctest-modules --cov=invenio_utilities_tuw --cov-report=term-missing'
+testpaths = "docs tests invenio_utilities_tuw"
 
+[tool.pydocstyle]
+add_ignore = "D401"
diff --git a/setup.cfg b/setup.cfg
deleted file mode 100644
index e1f9390698542b7d0f69e4ff6fc5597090841ee7..0000000000000000000000000000000000000000
--- a/setup.cfg
+++ /dev/null
@@ -1,102 +0,0 @@
-# -*- coding: utf-8 -*-
-#
-# Copyright (C) 2020-2022 TU Wien.
-#
-# Invenio-Utilities-TUW is free software; you can redistribute it and/or
-# modify it under the terms of the MIT License; see LICENSE file for more
-# details.
-
-[metadata]
-name = invenio-utilities-tuw
-version = attr: invenio_utilities_tuw.__version__
-description = "Some utilities for InvenioRDM."
-long_description = file: README.rst, CHANGES.rst
-keywords = invenio utilities tu wien
-license = MIT
-author = TU Wien
-author_email = tudata@tuwien.ac.at
-platforms = any
-url = https://gitlab.tuwien.ac.at/fairdata/invenio-utilities-tuw
-classifiers =
-    Environment :: Web Environment
-    License :: OSI Approved :: MIT License
-    Operating System :: OS Independent
-    Topic :: Internet :: WWW/HTTP :: Dynamic Content
-    Topic :: Software Development :: Libraries :: Python Modules
-    Programming Language :: Python
-    Programming Language :: Python :: 3.7
-    Programming Language :: Python :: 3.8
-    Programming Language :: Python :: 3.9
-    Development Status :: 5 - Production/Stable
-
-[options]
-include_package_data = True
-packages = find:
-python_requires = >=3.7
-zip_safe = False
-install_requires =
-    invenio-app-rdm>=12.0.0rc2,<13.0.0
-
-[options.extras_require]
-tests =
-    pytest-black>=0.3.0,<0.3.10
-    pytest-invenio>=1.4.0
-    sphinx>=4.5
-# Kept for backwards compatibility
-docs =
-
-[options.entry_points]
-flask.commands =
-    tuw = invenio_utilities_tuw.cli:utilities
-invenio_base.apps =
-    invenio_utilities_tuw = invenio_utilities_tuw:InvenioUtilitiesTUW
-invenio_i18n.translations =
-    messages = invenio_utilities_tuw
-
-[build_sphinx]
-source-dir = docs/
-build-dir = docs/_build
-all_files = 1
-
-[bdist_wheel]
-universal = 1
-
-[pydocstyle]
-add_ignore = D401
-
-[pycodestyle]
-exclude = docs/conf.py
-ignore = E203,E501,W503
-
-[compile_catalog]
-directory = invenio_utilities_tuw/translations/
-
-[extract_messages]
-copyright_holder = TU Wien
-msgid_bugs_address = tudata@tuwien.ac.at
-mapping-file = babel.ini
-output-file = invenio_utilities_tuw/translations/messages.pot
-add-comments = NOTE
-
-[init_catalog]
-input-file = invenio_utilities_tuw/translations/messages.pot
-output-dir = invenio_utilities_tuw/translations/
-
-[update_catalog]
-input-file = invenio_utilities_tuw/translations/messages.pot
-output-dir = invenio_utilities_tuw/translations/
-
-[flake8]
-max-line-length = 88
-extend-ignore = E203,E731
-
-[isort]
-profile=black
-
-[check-manifest]
-ignore =
-    *-requirements.txt
-
-[tool:pytest]
-addopts = --black --isort --pydocstyle --doctest-glob="*.rst" --doctest-modules --cov=invenio_utilities_tuw --cov-report=term-missing
-testpaths = docs tests invenio_utilities_tuw
diff --git a/setup.py b/setup.py
deleted file mode 100644
index cc2a7c68650d4fff3786c420c7a628640e430cb4..0000000000000000000000000000000000000000
--- a/setup.py
+++ /dev/null
@@ -1,13 +0,0 @@
-# -*- coding: utf-8 -*-
-#
-# Copyright (C) 2020-2022 TU Wien.
-#
-# Invenio-Utilities-TUW is free software; you can redistribute it and/or
-# modify it under the terms of the MIT License; see LICENSE file for more
-# details.
-
-"""Some utilities for InvenioRDM."""
-
-from setuptools import setup
-
-setup()