diff --git a/src/jamidht/conversationrepository.cpp b/src/jamidht/conversationrepository.cpp
index 741fe093eddfefe5f0d594af344fab56b01df75c..e74e43764613b14cdfb683f130961d7d7ff3e4e4 100644
--- a/src/jamidht/conversationrepository.cpp
+++ b/src/jamidht/conversationrepository.cpp
@@ -2424,7 +2424,7 @@ ConversationRepository::Impl::resolveConflicts(git_index* index, const std::stri
     while (git_index_conflict_next(&ancestor_out, &our_out, &their_out, ci.get()) != GIT_ITEROVER) {
         if (ancestor_out && ancestor_out->path && our_out && our_out->path && their_out
             && their_out->path) {
-            if (std::string(ancestor_out->path) == "profile.vcf") {
+            if (std::string_view(ancestor_out->path) == "profile.vcf"sv) {
                 // Checkout wanted version. copy the index_entry
                 git_index_entry resolution = useRemote ? *their_out : *our_out;
                 resolution.flags &= GIT_INDEX_STAGE_NORMAL;
@@ -2467,6 +2467,7 @@ ConversationRepository::Impl::resolveConflicts(git_index* index, const std::stri
 void
 ConversationRepository::Impl::initMembers()
 {
+    using std::filesystem::path;
     auto repo = repository();
     if (!repo)
         throw std::logic_error("Invalid git repository");
@@ -2474,38 +2475,30 @@ ConversationRepository::Impl::initMembers()
     std::vector<std::string> uris;
     std::lock_guard lk(membersMtx_);
     members_.clear();
-    std::filesystem::path repoPath = git_repository_workdir(repo.get());
-    std::vector<std::filesystem::path> paths = {repoPath / "admins",
-                                                repoPath / "members",
-                                                repoPath / "invited",
-                                                repoPath / "banned" / "members",
-                                                repoPath / "banned" / "invited"};
-    std::vector<MemberRole> roles = {
-        MemberRole::ADMIN,
-        MemberRole::MEMBER,
-        MemberRole::INVITED,
-        MemberRole::BANNED,
-        MemberRole::BANNED,
+    path repoPath = git_repository_workdir(repo.get());
+
+    static const std::vector<std::pair<MemberRole, path>> paths = {
+        {MemberRole::ADMIN, "admins"},
+        {MemberRole::MEMBER, "members"},
+        {MemberRole::INVITED, "invited"},
+        {MemberRole::BANNED, path("banned") / "members"},
+        {MemberRole::BANNED, path("banned") / "invited"}
     };
 
-    auto i = 0;
-    for (const auto& p : paths) {
-        for (const auto& f : dhtnet::fileutils::readDirectory(p)) {
-            auto pos = f.find(".crt");
-            auto uri = f.substr(0, pos);
-            auto it = std::find(uris.begin(), uris.end(), uri);
-            if (it == uris.end()) {
-                members_.emplace_back(ConversationMember {uri, roles[i]});
+    std::error_code ec;
+    for (const auto& [role, p] : paths) {
+        for (const auto& f : std::filesystem::directory_iterator(repoPath / p, ec)) {
+            auto uri = f.path().stem().string();
+            if (std::find(uris.begin(), uris.end(), uri) == uris.end()) {
+                members_.emplace_back(ConversationMember {uri, role});
                 uris.emplace_back(uri);
             }
         }
-        ++i;
     }
 
     if (mode() == ConversationMode::ONE_TO_ONE) {
         for (const auto& member : getInitialMembers()) {
-            auto it = std::find(uris.begin(), uris.end(), member);
-            if (it == uris.end()) {
+            if (std::find(uris.begin(), uris.end(), member) == uris.end()) {
                 // If member is in initial commit, but not in invited, this means that user left.
                 members_.emplace_back(ConversationMember {member, MemberRole::LEFT});
             }