diff --git a/README.rst b/README.rst
index ef2218f97..d9a50656e 100644
--- a/README.rst
+++ b/README.rst
@@ -1,7 +1,7 @@
.. raw:: html
-
+.. cut after this
Elasticsearch Python Client
===========================
@@ -81,10 +81,10 @@ Quick Start
# Import the client from the 'elasticsearch' module
>>> from elasticsearch import Elasticsearch
-
+
# Instantiate a client instance
>>> client = Elasticsearch("http://localhost:9200")
-
+
# Call an API, in this example `info()`
>>> resp = client.info()
diff --git a/pyproject.toml b/pyproject.toml
new file mode 100644
index 000000000..b0c66d92b
--- /dev/null
+++ b/pyproject.toml
@@ -0,0 +1,77 @@
+[build-system]
+requires = ["hatchling", "hatch-fancy-pypi-readme"]
+build-backend = "hatchling.build"
+
+[project]
+name = "elasticsearch"
+dynamic = ["version", "readme"]
+description = "Python client for Elasticsearch"
+license = "Apache-2.0"
+requires-python = ">=3.6, <4"
+authors = [
+ { name = "Honza Král", email = "honza.kral@gmail.com" },
+ { name = "Nick Lang", email = "nick@nicklang.com" },
+]
+maintainers = [
+ { name = "Seth Michael Larson", email = "seth.larson@elastic.co" },
+]
+classifiers = [
+ "Development Status :: 5 - Production/Stable",
+ "Intended Audience :: Developers",
+ "License :: OSI Approved :: Apache Software License",
+ "Operating System :: OS Independent",
+ "Programming Language :: Python",
+ "Programming Language :: Python :: 3",
+ "Programming Language :: Python :: 3.6",
+ "Programming Language :: Python :: 3.7",
+ "Programming Language :: Python :: 3.8",
+ "Programming Language :: Python :: 3.9",
+ "Programming Language :: Python :: 3.10",
+ "Programming Language :: Python :: Implementation :: CPython",
+ "Programming Language :: Python :: Implementation :: PyPy",
+]
+dependencies = [
+ "elastic-transport>=8,<9",
+]
+
+[project.optional-dependencies]
+async = [
+ "aiohttp>=3,<4",
+]
+requests = [
+ "requests>=2.4.0, <3.0.0",
+]
+
+[project.urls]
+Documentation = "https://elasticsearch-py.readthedocs.io"
+Homepage = "https://github.com/elastic/elasticsearch-py"
+"Issue Tracker" = "https://github.com/elastic/elasticsearch-py/issues"
+"Source Code" = "https://github.com/elastic/elasticsearch-py"
+
+[tool.hatch.version]
+path = "elasticsearch/_version.py"
+pattern = '__versionstr__ = "(?P.+)"'
+
+[tool.hatch.metadata.hooks.fancy-pypi-readme]
+content-type = "text/x-rst"
+
+[[tool.hatch.metadata.hooks.fancy-pypi-readme.fragments]]
+path = "README.rst"
+start-after = ".. cut after this\n\n"
+
+[tool.hatch.build.targets.sdist]
+exclude = ["/test_elasticsearch"]
+
+[tool.isort]
+profile = "black"
+
+[tool.pytest]
+junit_family = "legacy"
+addopts = "-vvv -p no:logging --cov-report=term-missing --cov=elasticsearch --cov-config=.coveragerc"
+
+[tool.coverage.report]
+exclude_lines = [
+ "raise NotImplementedError*",
+]
+[tool.mypy]
+ignore_missing_imports = true
diff --git a/setup.cfg b/setup.cfg
index a527b5b93..403f26a50 100644
--- a/setup.cfg
+++ b/setup.cfg
@@ -1,16 +1,2 @@
[flake8]
ignore = E203, E266, E501, W503
-
-[tool:pytest]
-junit_family=legacy
-addopts = -vvv -p no:logging --cov-report=term-missing --cov=elasticsearch --cov-config=.coveragerc
-
-[tool:isort]
-profile=black
-
-[report]
-exclude_lines=
- raise NotImplementedError*
-
-[mypy]
-ignore_missing_imports = True
diff --git a/setup.py b/setup.py
deleted file mode 100644
index 4273b73ff..000000000
--- a/setup.py
+++ /dev/null
@@ -1,99 +0,0 @@
-# -*- coding: utf-8 -*-
-# Licensed to Elasticsearch B.V. under one or more contributor
-# license agreements. See the NOTICE file distributed with
-# this work for additional information regarding copyright
-# ownership. Elasticsearch B.V. licenses this file to you under
-# the Apache License, Version 2.0 (the "License"); you may
-# not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-
-import re
-from os.path import abspath, dirname, join
-
-from setuptools import find_packages, setup
-
-package_name = "elasticsearch"
-base_dir = abspath(dirname(__file__))
-
-with open(join(base_dir, package_name, "_version.py")) as f:
- package_version = re.search(
- r"__versionstr__\s+=\s+[\"\']([^\"\']+)[\"\']", f.read()
- ).group(1)
-
-with open(join(base_dir, "README.rst")) as f:
- # Remove reST raw directive from README as they're not allowed on PyPI
- # Those blocks start with a newline and continue until the next newline
- mode = None
- lines = []
- for line in f:
- if line.startswith(".. raw::"):
- mode = "ignore_nl"
- elif line == "\n":
- mode = "wait_nl" if mode == "ignore_nl" else None
- if mode is None:
- lines.append(line)
-
- long_description = "".join(lines)
-
-
-packages = [
- package
- for package in find_packages(where=".", exclude=("test_elasticsearch*",))
- if package == package_name or package.startswith(package_name + ".")
-]
-
-install_requires = ["elastic-transport>=8,<9"]
-async_requires = ["aiohttp>=3,<4"]
-
-setup(
- name=package_name,
- description="Python client for Elasticsearch",
- license="Apache-2.0",
- url="https://github.com/elastic/elasticsearch-py",
- long_description=long_description,
- long_description_content_type="text/x-rst",
- version=package_version,
- author="Honza Král, Nick Lang",
- author_email="honza.kral@gmail.com, nick@nicklang.com",
- maintainer="Seth Michael Larson",
- maintainer_email="seth.larson@elastic.co",
- project_urls={
- "Documentation": "https://elasticsearch-py.readthedocs.io",
- "Source Code": "https://github.com/elastic/elasticsearch-py",
- "Issue Tracker": "https://github.com/elastic/elasticsearch-py/issues",
- },
- packages=packages,
- package_data={"elasticsearch": ["py.typed", "*.pyi"]},
- include_package_data=True,
- zip_safe=False,
- classifiers=[
- "Development Status :: 5 - Production/Stable",
- "License :: OSI Approved :: Apache Software License",
- "Intended Audience :: Developers",
- "Operating System :: OS Independent",
- "Programming Language :: Python",
- "Programming Language :: Python :: 3",
- "Programming Language :: Python :: 3.6",
- "Programming Language :: Python :: 3.7",
- "Programming Language :: Python :: 3.8",
- "Programming Language :: Python :: 3.9",
- "Programming Language :: Python :: 3.10",
- "Programming Language :: Python :: Implementation :: CPython",
- "Programming Language :: Python :: Implementation :: PyPy",
- ],
- python_requires=">=3.6, <4",
- install_requires=install_requires,
- extras_require={
- "requests": ["requests>=2.4.0, <3.0.0"],
- "async": async_requires,
- },
-)