diff --git a/lib/reducers/message-reducer.test.js b/lib/reducers/message-reducer.test.js
--- a/lib/reducers/message-reducer.test.js
+++ b/lib/reducers/message-reducer.test.js
@@ -288,6 +288,7 @@
         threadStore: {
           threadInfos: {},
         },
+        messageStoreThreads: [],
         messages: clientDBMessages,
       },
     },
diff --git a/lib/types/redux-types.js b/lib/types/redux-types.js
--- a/lib/types/redux-types.js
+++ b/lib/types/redux-types.js
@@ -48,6 +48,7 @@
   LocallyComposedMessageInfo,
   ClientDBMessageInfo,
   SimpleMessagesPayload,
+  ClientDBThreadMessageInfo,
 } from './message-types.js';
 import type { RawReactionMessageInfo } from './messages/reaction.js';
 import type { RawTextMessageInfo } from './messages/text.js';
@@ -595,6 +596,7 @@
         +drafts: $ReadOnlyArray<ClientDBDraftInfo>,
         +messages: $ReadOnlyArray<ClientDBMessageInfo>,
         +threadStore: ThreadStore,
+        +messageStoreThreads: $ReadOnlyArray<ClientDBThreadMessageInfo>,
       },
     }
   | {
diff --git a/lib/types/store-ops-types.js b/lib/types/store-ops-types.js
--- a/lib/types/store-ops-types.js
+++ b/lib/types/store-ops-types.js
@@ -9,6 +9,7 @@
   ClientDBMessageInfo,
   ClientDBMessageStoreOperation,
   MessageStoreOperation,
+  ClientDBThreadMessageInfo,
 } from './message-types.js';
 import type {
   ClientDBThreadInfo,
@@ -32,4 +33,5 @@
   +messages: $ReadOnlyArray<ClientDBMessageInfo>,
   +drafts: $ReadOnlyArray<ClientDBDraftInfo>,
   +threads: $ReadOnlyArray<ClientDBThreadInfo>,
+  +messageStoreThreads: $ReadOnlyArray<ClientDBThreadMessageInfo>,
 };
diff --git a/native/cpp/CommonCpp/DatabaseManagers/DatabaseQueryExecutor.h b/native/cpp/CommonCpp/DatabaseManagers/DatabaseQueryExecutor.h
--- a/native/cpp/CommonCpp/DatabaseManagers/DatabaseQueryExecutor.h
+++ b/native/cpp/CommonCpp/DatabaseManagers/DatabaseQueryExecutor.h
@@ -49,6 +49,7 @@
   virtual void
   removeMessageStoreThreads(const std::vector<std::string> &ids) const = 0;
   virtual void removeAllMessageStoreThreads() const = 0;
+  virtual std::vector<MessageStoreThread> getAllMessageStoreThreads() const = 0;
   virtual void
   removeMediaForMessages(const std::vector<std::string> &msg_ids) const = 0;
   virtual void removeMediaForMessage(std::string msg_id) const = 0;
diff --git a/native/cpp/CommonCpp/DatabaseManagers/SQLiteQueryExecutor.h b/native/cpp/CommonCpp/DatabaseManagers/SQLiteQueryExecutor.h
--- a/native/cpp/CommonCpp/DatabaseManagers/SQLiteQueryExecutor.h
+++ b/native/cpp/CommonCpp/DatabaseManagers/SQLiteQueryExecutor.h
@@ -46,6 +46,7 @@
   void
   removeMessageStoreThreads(const std::vector<std::string> &ids) const override;
   void removeAllMessageStoreThreads() const override;
+  std::vector<MessageStoreThread> getAllMessageStoreThreads() const override;
   void removeAllMedia() const override;
   void removeMediaForMessages(
       const std::vector<std::string> &msg_ids) const override;
diff --git a/native/cpp/CommonCpp/DatabaseManagers/SQLiteQueryExecutor.cpp b/native/cpp/CommonCpp/DatabaseManagers/SQLiteQueryExecutor.cpp
--- a/native/cpp/CommonCpp/DatabaseManagers/SQLiteQueryExecutor.cpp
+++ b/native/cpp/CommonCpp/DatabaseManagers/SQLiteQueryExecutor.cpp
@@ -1100,6 +1100,11 @@
       where(in(&MessageStoreThread::id, ids)));
 }
 
+std::vector<MessageStoreThread>
+SQLiteQueryExecutor::getAllMessageStoreThreads() const {
+  return SQLiteQueryExecutor::getStorage().get_all<MessageStoreThread>();
+}
+
 std::vector<Thread> SQLiteQueryExecutor::getAllThreads() const {
   return SQLiteQueryExecutor::getStorage().get_all<Thread>();
 };
diff --git a/native/cpp/CommonCpp/NativeModules/CommCoreModule.cpp b/native/cpp/CommonCpp/NativeModules/CommCoreModule.cpp
--- a/native/cpp/CommonCpp/NativeModules/CommCoreModule.cpp
+++ b/native/cpp/CommonCpp/NativeModules/CommCoreModule.cpp
@@ -267,6 +267,28 @@
   return jsiThreads;
 }
 
+jsi::Array parseDBMessageStoreThreads(
+    jsi::Runtime &rt,
+    std::shared_ptr<std::vector<MessageStoreThread>> threadsVectorPtr) {
+  size_t numThreads = threadsVectorPtr->size();
+  jsi::Array jsiThreads = jsi::Array(rt, numThreads);
+  size_t writeIdx = 0;
+
+  for (const MessageStoreThread &thread : *threadsVectorPtr) {
+    jsi::Object jsiThread = jsi::Object(rt);
+    jsiThread.setProperty(rt, "id", thread.id);
+    jsiThread.setProperty(
+        rt, "start_reached", std::to_string(thread.start_reached));
+    jsiThread.setProperty(
+        rt, "last_navigated_to", std::to_string(thread.last_navigated_to));
+    jsiThread.setProperty(
+        rt, "last_pruned", std::to_string(thread.last_pruned));
+
+    jsiThreads.setValueAtIndex(rt, writeIdx++, jsiThread);
+  }
+  return jsiThreads;
+}
+
 jsi::Value CommCoreModule::getClientDBStore(jsi::Runtime &rt) {
   return createPromiseAsJSIValue(
       rt, [=](jsi::Runtime &innerRt, std::shared_ptr<Promise> promise) {
@@ -275,11 +297,14 @@
           std::vector<Draft> draftsVector;
           std::vector<Thread> threadsVector;
           std::vector<std::pair<Message, std::vector<Media>>> messagesVector;
+          std::vector<MessageStoreThread> messageStoreThreadsVector;
           try {
             draftsVector = DatabaseManager::getQueryExecutor().getAllDrafts();
             messagesVector =
                 DatabaseManager::getQueryExecutor().getAllMessages();
             threadsVector = DatabaseManager::getQueryExecutor().getAllThreads();
+            messageStoreThreadsVector =
+                DatabaseManager::getQueryExecutor().getAllMessageStoreThreads();
           } catch (std::system_error &e) {
             error = e.what();
           }
@@ -290,10 +315,14 @@
               std::move(messagesVector));
           auto threadsVectorPtr =
               std::make_shared<std::vector<Thread>>(std::move(threadsVector));
+          auto messageStoreThreadsVectorPtr =
+              std::make_shared<std::vector<MessageStoreThread>>(
+                  std::move(messageStoreThreadsVector));
           this->jsInvoker_->invokeAsync([&innerRt,
                                          draftsVectorPtr,
                                          messagesVectorPtr,
                                          threadsVectorPtr,
+                                         messageStoreThreadsVectorPtr,
                                          error,
                                          promise]() {
             if (error.size()) {
@@ -304,11 +333,15 @@
             jsi::Array jsiMessages =
                 parseDBMessages(innerRt, messagesVectorPtr);
             jsi::Array jsiThreads = parseDBThreads(innerRt, threadsVectorPtr);
+            jsi::Array jsiMessageStoreThreads = parseDBMessageStoreThreads(
+                innerRt, messageStoreThreadsVectorPtr);
 
             auto jsiClientDBStore = jsi::Object(innerRt);
             jsiClientDBStore.setProperty(innerRt, "messages", jsiMessages);
             jsiClientDBStore.setProperty(innerRt, "threads", jsiThreads);
             jsiClientDBStore.setProperty(innerRt, "drafts", jsiDrafts);
+            jsiClientDBStore.setProperty(
+                innerRt, "messageStoreThreads", jsiMessageStoreThreads);
 
             promise->resolve(std::move(jsiClientDBStore));
           });
diff --git a/web/database/worker/db-worker.js b/web/database/worker/db-worker.js
--- a/web/database/worker/db-worker.js
+++ b/web/database/worker/db-worker.js
@@ -129,6 +129,7 @@
     drafts: getAllDrafts(sqliteDb),
     messages: [],
     threads: [],
+    messageStoreThreads: [],
   };
 }