diff --git a/.hgignore b/.hgignore
index 5d9aa769c0d9051092712f6e602fcfee46c495e0_LmhnaWdub3Jl..ead57151cf2f96bb35732841178a2908ecefbabe_LmhnaWdub3Jl 100644
--- a/.hgignore
+++ b/.hgignore
@@ -25,3 +25,5 @@
 .vscode/
 supervisord.conf$
 supervisord.com$
+^build/
+^supervisorvms.egg-info/
diff --git a/build_whl.com b/build_whl.com
new file mode 100644
index 0000000000000000000000000000000000000000..ead57151cf2f96bb35732841178a2908ecefbabe_YnVpbGRfd2hsLmNvbQ==
--- /dev/null
+++ b/build_whl.com
@@ -0,0 +1,3 @@
+$ python -m build -w -n -x -o ./ ./
+$
+$ exit
diff --git a/pyproject.toml b/pyproject.toml
new file mode 100644
index 0000000000000000000000000000000000000000..ead57151cf2f96bb35732841178a2908ecefbabe_cHlwcm9qZWN0LnRvbWw=
--- /dev/null
+++ b/pyproject.toml
@@ -0,0 +1,39 @@
+[build-system]
+requires = [
+    "setuptools>=42",
+    "wheel"
+]
+build-backend = "setuptools.build_meta"
+
+[project]
+name = "supervisorvms"
+version = "0.1.0"
+description = "supervisor for VSI Python 3"
+readme = "README.md"
+requires-python = ">= 3.10"
+license.file = "LICENSE"
+authors = [
+  { name = "Jean-François Piéronne", email = "jf.pieronne@laposte.net" },
+]
+classifiers = [
+  "License :: OSI Approved ::  GNU LGPL v3 License",
+  "Programming Language :: Python :: 3",
+  "Programming Language :: Python :: 3 :: Only",
+  "Programming Language :: Python :: 3.10",
+  "Programming Language :: Python :: Implementation :: CPython",
+]
+urls.homepage = "https://foss.vmsgenerations.org/openvms/tools/supervisor-vms/"
+urls.changelog = "https://foss.vmsgenerations.org/openvms/tools/supervisor-vms/"
+
+dependencies = [
+]
+
+[project.optional-dependencies]
+docs = [
+]
+test = [
+]
+typing = [
+]
+virtualenv = [
+]
diff --git a/setup.py b/setup.py
new file mode 100644
index 0000000000000000000000000000000000000000..ead57151cf2f96bb35732841178a2908ecefbabe_c2V0dXAucHk=
--- /dev/null
+++ b/setup.py
@@ -0,0 +1,35 @@
+from setuptools import setup, find_packages, Distribution
+
+class PureDistribution(Distribution):
+    def is_pure(self):
+        return True
+
+    def has_ext_modules(self):
+        return False
+
+setup(
+    # this will be the package name you will see
+    name = 'supervisorvms',
+    # some version number you may wish to add - increment this after every update
+    version='0.1',
+    package_data={'': ['*.exe', '*.pyi']},
+    distclass=PureDistribution,
+
+    # Use one of the below approach to define package and/or module names:
+
+    # if there are only handful of modules placed in root directory, 
+    # and no packages/directories exist then can use below syntax
+    # packages=[''],
+    # have to import modules directly in code after installing this wheel, 
+    # like import mod2 (respective file name in this case is mod2.py) - 
+    # no direct use of distribution name while importing
+
+    # can list down each package names - no need to keep __init__.py under packages / directories
+    # packages=['ovms',], #importing is like: from package1 import mod2, 
+    # or import package1.mod2 as m2
+
+    # this approach automatically finds out all directories (packages) - 
+    # those must contain a file named __init__.py (can be empty)
+    packages=find_packages(), #include/exclude arguments take * as wildcard, . for any sub-package names
+)
+