diff --git a/src/jamidht/namedirectory.cpp b/src/jamidht/namedirectory.cpp
index edf0938199745f6de76a18b9d85d3081e4e74584..ffb384f3221e532a82deb8afbefe427e66b42ea5 100644
--- a/src/jamidht/namedirectory.cpp
+++ b/src/jamidht/namedirectory.cpp
@@ -146,7 +146,8 @@ NameDirectory::instance(const std::string& serverUrl, std::shared_ptr<dht::Logge
 void
 NameDirectory::setHeaderFields(Request& request)
 {
-    request.set_header_field(restinio::http_field_t::user_agent, "JamiDHT");
+    request.set_header_field(restinio::http_field_t::user_agent, fmt::format("Jami ({}/{})",
+        jami::platform(), jami::arch()));
     request.set_header_field(restinio::http_field_t::accept, "*/*");
     request.set_header_field(restinio::http_field_t::content_type, "application/json");
 }
diff --git a/src/string_utils.h b/src/string_utils.h
index 9ca821728df529ca2ac7fd19a12cef5f4a4a04d7..ab73d3aad54953473f5df2f53432f5d0322bf9f7 100644
--- a/src/string_utils.h
+++ b/src/string_utils.h
@@ -45,6 +45,42 @@ bool_to_str(bool b) noexcept
     return b ? TRUE_STR : FALSE_STR;
 }
 
+constexpr inline std::string_view
+platform() {
+    using namespace std::literals;
+#if defined(__ANDROID__)
+    return "android"sv;
+#elif defined(__linux__)
+    return "linux"sv;
+#elif defined(__APPLE__)
+#    if TARGET_OS_IPHONE
+    return "ios"sv;
+#    else
+    return "macos"sv;
+#    endif
+#elif defined(_WIN32)
+    return "windows"sv;
+#else
+    return "unknown"sv;
+#endif
+}
+
+constexpr inline std::string_view
+arch() {
+    using namespace std::literals;
+#if defined(__x86_64__) || defined(_M_X64)
+    return "x86_64"sv;
+#elif defined(__i386__) || defined(_M_IX86)
+    return "x86"sv;
+#elif defined(__aarch64__)
+    return "arm64"sv;
+#elif defined(__arm__)
+    return "arm"sv;
+#else
+    return "unknown"sv;
+#endif
+}
+
 std::string to_string(double value);
 
 #ifdef _WIN32