diff --git a/CMakeLists.txt b/CMakeLists.txt
index bbabe272..78085652 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -10,7 +10,7 @@ if(NOT CMAKE_VERSION VERSION_LESS 3.30 AND NOT POLICY CMP0167)
endif()
set (opendht_VERSION_MAJOR 3)
-set (opendht_VERSION_MINOR 5.1)
+set (opendht_VERSION_MINOR 5.2)
set (opendht_VERSION ${opendht_VERSION_MAJOR}.${opendht_VERSION_MINOR})
set (PACKAGE_VERSION ${opendht_VERSION})
set (VERSION "${opendht_VERSION}")
diff --git a/python/README.md b/python/README.md
new file mode 100644
index 00000000..7669abd1
--- /dev/null
+++ b/python/README.md
@@ -0,0 +1,44 @@
+# OpenDHT
+
+OpenDHT is a lightweight C++17 Distributed Hash Table implementation providing an easy to use distributed in-memory data store.
+
+## Key Features
+
+* Lightweight and scalable, designed for large networks and small devices
+* High resilience to network disruption
+* Public key cryptography layer providing optional data signature and encryption
+* IPv4 and IPv6 support
+* Clean and powerful C++17 map API with Python 3 bindings
+* REST API with optional HTTP client+server with push notification support
+
+Every node in the network can read and write values to the store. Values are distributed over the network with redundancy.
+
+## Quick Example
+
+```python
+import opendht as dht
+
+node = dht.DhtRunner()
+node.run()
+
+# Join the network through any running node,
+# here using a known bootstrap node.
+node.bootstrap("bootstrap.jami.net", "4222")
+
+# blocking call (provide callback arguments to make the call non-blocking)
+node.put(dht.InfoHash.get("unique_key"), dht.Value(b'some binary data'))
+
+results = node.get(dht.InfoHash.get("unique_key"))
+for r in results:
+ print(r)
+```
+
+## Documentation
+
+For more information, examples, and documentation, visit: https://opendht.net
+
+## License
+
+Copyright (C) 2014-2025 Savoir-faire Linux Inc.
+
+OpenDHT is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version.
diff --git a/python/setup.py.in b/python/setup.py.in
index a9537fba..e2b2ed0e 100644
--- a/python/setup.py.in
+++ b/python/setup.py.in
@@ -14,13 +14,19 @@
# along with this program. If not, see .
from setuptools import setup, Extension
-from Cython.Distutils import build_ext
+import os
+
+with open(os.path.join(os.path.dirname(os.path.abspath(__file__)), 'README.md'), 'r', encoding='utf-8') as f:
+ long_description = f.read()
setup(name="opendht",
version="@PACKAGE_VERSION@",
- description="Python wrapper for OpenDHT",
+ description="OpenDHT: A lightweight Distributed Hash Table",
+ long_description=long_description,
+ long_description_content_type="text/markdown",
+ icon="opendht_icon.png",
url='https://github.com/savoirfairelinux/opendht',
- author="Adrien Béraud, Guillaume Roguez, Simon Désaulniers",
+ author="Adrien Beraud ",
license="GPL-3.0-or-later",
classifiers=[
'Development Status :: 5 - Production/Stable',
@@ -29,7 +35,7 @@ setup(name="opendht",
'Topic :: System :: Distributed Computing',
'Topic :: System :: Networking',
'Programming Language :: Python :: 3',
- 'Programming Language :: Python :: 3.7',
+ 'Programming Language :: Python :: 3.9',
],
ext_modules = [Extension(
"opendht",