build!: declarative builds
diff --git a/.github/workflows/patch.yml b/.github/workflows/patch.yml
index 2cf4444..4d8c51d 100644
--- a/.github/workflows/patch.yml
+++ b/.github/workflows/patch.yml
@@ -52,7 +52,7 @@
         uses: actions/cache@v2
         with:
           path: ~/.cache/pip
-          key: ${{ runner.os }}-pip-${{ hashFiles('**/requirements.txt') }}
+          key: ${{ runner.os }}-pip-${{ hashFiles('**/*requirements.txt', '**/pyproject.toml') }}
           restore-keys: |
             ${{ runner.os }}-pip-
             ${{ runner.os }}-
diff --git a/.github/workflows/server-tests-mariadb.yml b/.github/workflows/server-tests-mariadb.yml
index 91a0114..9dcc656 100644
--- a/.github/workflows/server-tests-mariadb.yml
+++ b/.github/workflows/server-tests-mariadb.yml
@@ -74,7 +74,7 @@
         uses: actions/cache@v2
         with:
           path: ~/.cache/pip
-          key: ${{ runner.os }}-pip-${{ hashFiles('**/requirements.txt') }}
+          key: ${{ runner.os }}-pip-${{ hashFiles('**/*requirements.txt', '**/pyproject.toml') }}
           restore-keys: |
             ${{ runner.os }}-pip-
             ${{ runner.os }}-
diff --git a/.github/workflows/server-tests-postgres.yml b/.github/workflows/server-tests-postgres.yml
index d3268e2..f62c22b 100644
--- a/.github/workflows/server-tests-postgres.yml
+++ b/.github/workflows/server-tests-postgres.yml
@@ -61,7 +61,7 @@
         uses: actions/cache@v2
         with:
           path: ~/.cache/pip
-          key: ${{ runner.os }}-pip-${{ hashFiles('**/requirements.txt') }}
+          key: ${{ runner.os }}-pip-${{ hashFiles('**/*requirements.txt', '**/pyproject.toml') }}
           restore-keys: |
             ${{ runner.os }}-pip-
             ${{ runner.os }}-
diff --git a/CODEOWNERS b/CODEOWNERS
index bfc2601..f0cb379 100644
--- a/CODEOWNERS
+++ b/CODEOWNERS
@@ -32,4 +32,4 @@
 erpnext/public/                 @nextchamp-saqib @marination
 
 .github/                        @ankush
-requirements.txt                @gavindsouza
+pyproject.toml                  @gavindsouza @ankush
diff --git a/pyproject.toml b/pyproject.toml
index 8043dd9..b39c4f0 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -1,3 +1,32 @@
+[project]
+name = "erpnext"
+authors = [
+    { name = "Frappe Technologies Pvt Ltd", email = "developers@frappe.io"}
+]
+description = "Open Source ERP"
+requires-python = ">=3.8"
+readme = "README.md"
+dynamic = ["version"]
+dependencies = [
+    # Core dependencies
+    "pycountry~=20.7.3",
+    "python-stdnum~=1.16",
+    "Unidecode~=1.2.0",
+    "redisearch~=2.1.0",
+
+    # integration dependencies
+    "gocardless-pro~=1.22.0",
+    "googlemaps",
+    "plaid-python~=7.2.1",
+    "python-youtube~=0.8.0",
+    "taxjar~=1.9.2",
+    "tweepy~=3.10.0",
+]
+
+[build-system]
+requires = ["flit_core >=3.4,<4"]
+build-backend = "flit_core.buildapi"
+
 [tool.black]
 line-length = 99
 
diff --git a/requirements.txt b/requirements.txt
deleted file mode 100644
index 83e5375..0000000
--- a/requirements.txt
+++ /dev/null
@@ -1,11 +0,0 @@
-# frappe   # https://github.com/frappe/frappe is installed during bench-init
-gocardless-pro~=1.22.0
-googlemaps
-plaid-python~=7.2.1
-pycountry~=20.7.3
-python-stdnum~=1.16
-python-youtube~=0.8.0
-taxjar~=1.9.2
-tweepy~=3.10.0
-Unidecode~=1.2.0
-redisearch~=2.1.0
diff --git a/setup.py b/setup.py
index 1faff04..0ea4d07 100644
--- a/setup.py
+++ b/setup.py
@@ -1,23 +1,6 @@
-from setuptools import setup, find_packages
-import re, ast
+# TODO: Remove this file when  v15.0.0 is released
+from setuptools import setup
 
-# get version from __version__ variable in erpnext/__init__.py
-_version_re = re.compile(r"__version__\s+=\s+(.*)")
+name = "frappe"
 
-with open("requirements.txt") as f:
-	install_requires = f.read().strip().split("\n")
-
-with open("erpnext/__init__.py", "rb") as f:
-	version = str(ast.literal_eval(_version_re.search(f.read().decode("utf-8")).group(1)))
-
-setup(
-	name="erpnext",
-	version=version,
-	description="Open Source ERP",
-	author="Frappe Technologies",
-	author_email="info@erpnext.com",
-	packages=find_packages(),
-	zip_safe=False,
-	include_package_data=True,
-	install_requires=install_requires,
-)
+setup()