diff --git a/README.md b/README.md
index fb174c30f7fe7428f13ad2ee7bdb3f973caad5e2..3f6b03cbf75a6fbc3ccdd2d7aec4de791e71a1dc 100644
--- a/README.md
+++ b/README.md
@@ -42,5 +42,4 @@ npx tsx src/indexer/start.ts
 
 ## TODO
 
-When using Kubo node, libp2p is not needed at all.
 Insert pubkey instead of ss58 address if we want data to be compatible across networks
diff --git a/package.json b/package.json
index cb83a93a3a85945ebc3e6cf8d189469d81d1bedd..7c9684fdb7b494db735514e29bece049cb7732fe 100644
--- a/package.json
+++ b/package.json
@@ -13,19 +13,11 @@
     "format": "prettier --write src/"
   },
   "dependencies": {
-    "@chainsafe/libp2p-gossipsub": "^13.0.0",
-    "@chainsafe/libp2p-noise": "^15.0.0",
-    "@libp2p/bootstrap": "^10.0.16",
-    "@libp2p/mplex": "^10.0.18",
-    "@libp2p/ping": "^1.0.14",
-    "@libp2p/tcp": "^9.0.18",
-    "@libp2p/webtransport": "^4.0.21",
     "@multiformats/multiaddr": "^12.2.1",
     "@polkadot/util": "^12.6.2",
     "@polkadot/util-crypto": "^12.6.2",
     "buffer": "^6.0.3",
     "kubo-rpc-client": "^3.0.4",
-    "libp2p": "^1.3.0",
     "multiformats": "^13.1.0",
     "pg": "^8.11.5",
     "pretty-bytes": "^6.1.1",
@@ -33,8 +25,6 @@
     "vue-router": "^4.3.0"
   },
   "devDependencies": {
-    "@libp2p/interface": "^1.1.4",
-    "@libp2p/interface-pubsub": "^4.0.1",
     "@rushstack/eslint-patch": "^1.3.3",
     "@tsconfig/node20": "^20.1.2",
     "@types/node": "^20.11.28",
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index f7035552d741ff1b8a8d81f943ea487e66bd6973..41e30724bdcb170b6b8b20549baef63cfa88ad05 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -5,27 +5,6 @@ settings:
   excludeLinksFromLockfile: false
 
 dependencies:
-  '@chainsafe/libp2p-gossipsub':
-    specifier: ^13.0.0
-    version: 13.0.0
-  '@chainsafe/libp2p-noise':
-    specifier: ^15.0.0
-    version: 15.0.0
-  '@libp2p/bootstrap':
-    specifier: ^10.0.16
-    version: 10.0.18
-  '@libp2p/mplex':
-    specifier: ^10.0.18
-    version: 10.0.18
-  '@libp2p/ping':
-    specifier: ^1.0.14
-    version: 1.0.14
-  '@libp2p/tcp':
-    specifier: ^9.0.18
-    version: 9.0.18
-  '@libp2p/webtransport':
-    specifier: ^4.0.21
-    version: 4.0.23
   '@multiformats/multiaddr':
     specifier: ^12.2.1
     version: 12.2.1
@@ -41,9 +20,6 @@ dependencies:
   kubo-rpc-client:
     specifier: ^3.0.4
     version: 3.0.4
-  libp2p:
-    specifier: ^1.3.0
-    version: 1.3.2
   multiformats:
     specifier: ^13.1.0
     version: 13.1.0
@@ -61,12 +37,6 @@ dependencies:
     version: 4.3.0(vue@3.4.21)
 
 devDependencies:
-  '@libp2p/interface':
-    specifier: ^1.1.4
-    version: 1.1.6
-  '@libp2p/interface-pubsub':
-    specifier: ^4.0.1
-    version: 4.0.1
   '@rushstack/eslint-patch':
     specifier: ^1.3.3
     version: 1.10.1
@@ -152,62 +122,9 @@ packages:
       '@babel/helper-validator-identifier': 7.22.20
       to-fast-properties: 2.0.0
 
-  /@chainsafe/as-chacha20poly1305@0.1.0:
-    resolution: {integrity: sha512-BpNcL8/lji/GM3+vZ/bgRWqJ1q5kwvTFmGPk7pxm/QQZDbaMI98waOHjEymTjq2JmdD/INdNBFOVSyJofXg7ew==}
-    dev: false
-
-  /@chainsafe/as-sha256@0.4.1:
-    resolution: {integrity: sha512-IqeeGwQihK6Y2EYLFofqs2eY2ep1I2MvQXHzOAI+5iQN51OZlUkrLgyAugu2x86xZewDk5xas7lNczkzFzF62w==}
-    dev: false
-
   /@chainsafe/is-ip@2.0.2:
     resolution: {integrity: sha512-ndGqEMG1W5WkGagaqOZHpPU172AGdxr+LD15sv3WIUvT5oCFUrG1Y0CW/v2Egwj4JXEvSibaIIIqImsm98y1nA==}
 
-  /@chainsafe/libp2p-gossipsub@13.0.0:
-    resolution: {integrity: sha512-2q+v429uZjMl6N3d+j9QCMj8YO0aiYvLSN1t0aTdpMXQHCHLJaaT9PtNn845B1Li7/uZjYESmikgVt8r7keH0w==}
-    engines: {npm: '>=8.7.0'}
-    dependencies:
-      '@libp2p/crypto': 4.0.5
-      '@libp2p/interface': 1.1.6
-      '@libp2p/interface-internal': 1.0.11
-      '@libp2p/peer-id': 4.0.9
-      '@libp2p/pubsub': 9.0.13
-      '@multiformats/multiaddr': 12.2.1
-      denque: 2.1.0
-      it-length-prefixed: 9.0.4
-      it-pipe: 3.0.1
-      it-pushable: 3.2.3
-      multiformats: 13.1.0
-      protons-runtime: 5.4.0
-      uint8arraylist: 2.4.8
-      uint8arrays: 5.0.3
-    transitivePeerDependencies:
-      - supports-color
-    dev: false
-
-  /@chainsafe/libp2p-noise@15.0.0:
-    resolution: {integrity: sha512-O8Y/WVU4J/qrnG72jwVhbmdXiBzv1dT9B3PMClCRmZ9z/5vVPEGRVXE/SVYeGF3bNuBTLoh+F+GaKG/9UHlMhg==}
-    engines: {node: '>=16.0.0', npm: '>=7.0.0'}
-    dependencies:
-      '@chainsafe/as-chacha20poly1305': 0.1.0
-      '@chainsafe/as-sha256': 0.4.1
-      '@libp2p/crypto': 4.0.5
-      '@libp2p/interface': 1.1.6
-      '@libp2p/peer-id': 4.0.9
-      '@noble/ciphers': 0.4.1
-      '@noble/curves': 1.4.0
-      '@noble/hashes': 1.4.0
-      it-length-prefixed: 9.0.4
-      it-length-prefixed-stream: 1.1.6
-      it-pair: 2.0.6
-      it-pipe: 3.0.1
-      it-stream-types: 2.0.1
-      protons-runtime: 5.4.0
-      uint8arraylist: 2.4.8
-      uint8arrays: 5.0.3
-      wherearewe: 2.0.1
-    dev: false
-
   /@chainsafe/netmask@2.0.0:
     resolution: {integrity: sha512-I3Z+6SWUoaljh3TBzCnCxjlUyN8tA+NAk5L6m9IxvCf1BENQTePzPMis97CoN/iMW1St3WN+AWCCRp+TTBRiDg==}
     dependencies:
@@ -716,15 +633,6 @@ packages:
   /@leichtgewicht/ip-codec@2.0.5:
     resolution: {integrity: sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==}
 
-  /@libp2p/bootstrap@10.0.18:
-    resolution: {integrity: sha512-9kyp4TeANlgm8TSMPyKOhF6298PjkSRb1glbVJj+mb8Cpyb0QOuiGUiUK5+cQMDKFRNpTpeVe42k9dNb3hlAtA==}
-    dependencies:
-      '@libp2p/interface': 1.1.6
-      '@libp2p/peer-id': 4.0.9
-      '@multiformats/mafmt': 12.1.6
-      '@multiformats/multiaddr': 12.2.1
-    dev: false
-
   /@libp2p/crypto@1.0.17:
     resolution: {integrity: sha512-Oeg0Eb/EvAho0gVkOgemXEgrVxWaT3x/DpFgkBdZ9qGxwq75w/E/oPc7souqBz+l1swfz37GWnwV7bIb4Xv5Ag==}
     engines: {node: '>=16.0.0', npm: '>=7.0.0'}
@@ -740,19 +648,6 @@ packages:
       uint8arrays: 4.0.10
     dev: false
 
-  /@libp2p/crypto@4.0.5:
-    resolution: {integrity: sha512-gV5Lu+BP08wp0UkUTffJgy/M/Q0Q8cqjAYnapk/scZXYgN3M5cMRooX2b7FLkjR/aieAeMtf5YLoKJNyU27qSQ==}
-    dependencies:
-      '@libp2p/interface': 1.1.6
-      '@noble/curves': 1.4.0
-      '@noble/hashes': 1.4.0
-      asn1js: 3.0.5
-      multiformats: 13.1.0
-      protons-runtime: 5.4.0
-      uint8arraylist: 2.4.8
-      uint8arrays: 5.0.3
-    dev: false
-
   /@libp2p/interface-connection@4.0.0:
     resolution: {integrity: sha512-6xx/NmEc84HX7QmsjSC3hHredQYjHv4Dkf4G27adAPf+qN+vnPxmQ7gaTnk243a0++DOFTbZ2gKX/15G2B6SRg==}
     engines: {node: '>=16.0.0', npm: '>=7.0.0'}
@@ -763,26 +658,6 @@ packages:
       it-stream-types: 1.0.5
       uint8arraylist: 2.4.8
 
-  /@libp2p/interface-connection@5.1.1:
-    resolution: {integrity: sha512-ytknMbuuNW72LYMmTP7wFGP5ZTaUSGBCmV9f+uQ55XPcFHtKXLtKWVU/HE8IqPmwtyU8AO7veGoJ/qStMHNRVA==}
-    engines: {node: '>=16.0.0', npm: '>=7.0.0'}
-    dependencies:
-      '@libp2p/interface-peer-id': 2.0.2
-      '@libp2p/interfaces': 3.3.2
-      '@multiformats/multiaddr': 12.2.1
-      it-stream-types: 2.0.1
-      uint8arraylist: 2.4.8
-    dev: true
-
-  /@libp2p/interface-internal@1.0.11:
-    resolution: {integrity: sha512-9AMgDKl3vodiCaJ3ffrVbIJml5LpVhNhiABRrvBar8cCDnQXyV7Tn2vKNyyIGIBoMOi6gMV4iyELofsP0HkkRg==}
-    dependencies:
-      '@libp2p/interface': 1.1.6
-      '@libp2p/peer-collections': 5.1.9
-      '@multiformats/multiaddr': 12.2.1
-      uint8arraylist: 2.4.8
-    dev: false
-
   /@libp2p/interface-keychain@2.0.5:
     resolution: {integrity: sha512-mb7QNgn9fIvC7CaJCi06GJ+a6DN6RVT9TmEi0NmedZGATeCArPeWWG7r7IfxNVXb9cVOOE1RzV1swK0ZxEJF9Q==}
     engines: {node: '>=16.0.0', npm: '>=7.0.0'}
@@ -818,17 +693,6 @@ packages:
       it-pushable: 3.2.3
       uint8arraylist: 2.4.8
 
-  /@libp2p/interface-pubsub@4.0.1:
-    resolution: {integrity: sha512-PIc5V/J98Yr1ZTHh8lQshP7GdVUh+pKNIqj6wGaDmXs8oQLB40qKCjcpHQNlAnv2e1Bh9mEH2GXv5sGZOA651A==}
-    engines: {node: '>=16.0.0', npm: '>=7.0.0'}
-    dependencies:
-      '@libp2p/interface-connection': 5.1.1
-      '@libp2p/interface-peer-id': 2.0.2
-      '@libp2p/interfaces': 3.3.2
-      it-pushable: 3.2.3
-      uint8arraylist: 2.4.8
-    dev: true
-
   /@libp2p/interface@1.1.6:
     resolution: {integrity: sha512-CLz6TAZf+Mw1PCIU8pjMIct1uh3A1fIene2/t+E57Tw4uJLCBJE9CLed/Opxliy5RH0e32Aa6bi4QSXtkJTK7A==}
     dependencies:
@@ -856,65 +720,6 @@ packages:
       - supports-color
     dev: false
 
-  /@libp2p/logger@4.0.9:
-    resolution: {integrity: sha512-eGjFvMGA2FtNrnQuI6YwYY5jviA00lTMAKi8pF3eH0TCnEokSYJ9LxBLwZNgIzrWuwZwO+sf4SsY1YBEisFf5Q==}
-    dependencies:
-      '@libp2p/interface': 1.1.6
-      '@multiformats/multiaddr': 12.2.1
-      debug: 4.3.4
-      interface-datastore: 8.2.11
-      multiformats: 13.1.0
-    transitivePeerDependencies:
-      - supports-color
-    dev: false
-
-  /@libp2p/mplex@10.0.18:
-    resolution: {integrity: sha512-KoMFye2ameya9GNXWjY07eM5AQg0a2iTB3muCb29Z8GhtFME41awOHlYMjMdwEaShkxwnXRjDRyIGc6BS2z0wA==}
-    dependencies:
-      '@libp2p/interface': 1.1.6
-      '@libp2p/utils': 5.2.8
-      it-pipe: 3.0.1
-      it-pushable: 3.2.3
-      it-stream-types: 2.0.1
-      uint8-varint: 2.0.4
-      uint8arraylist: 2.4.8
-      uint8arrays: 5.0.3
-    transitivePeerDependencies:
-      - supports-color
-    dev: false
-
-  /@libp2p/multistream-select@5.1.6:
-    resolution: {integrity: sha512-IlGnEs5/xkk5+zMWRaI+gF7XzzyJqiNQIzSqBiE/Q+zq1VrhdqRyRYriBgwxd6eJHq3+9byUCllfMN2E4bzlSw==}
-    dependencies:
-      '@libp2p/interface': 1.1.6
-      it-length-prefixed: 9.0.4
-      it-length-prefixed-stream: 1.1.6
-      it-stream-types: 2.0.1
-      p-defer: 4.0.1
-      race-signal: 1.0.2
-      uint8-varint: 2.0.4
-      uint8arraylist: 2.4.8
-      uint8arrays: 5.0.3
-    dev: false
-
-  /@libp2p/peer-collections@5.1.9:
-    resolution: {integrity: sha512-xaNV+YXPaYN9Woyd/5c//ppTCi3KnseZRRxAMT1pXYUB3uL8cfMZSWnQbE8h8Q0kZw5BXrO13xPPVU7OtAr67w==}
-    dependencies:
-      '@libp2p/interface': 1.1.6
-      '@libp2p/peer-id': 4.0.9
-    dev: false
-
-  /@libp2p/peer-id-factory@4.0.9:
-    resolution: {integrity: sha512-GdMhdUxbVHZgNWn7nOh/Knc4gwxwraJvUqPBn4sxEBInAO+nQY0mtIbOr7sk1c/9rlkV5REDJMDIPVDXC+cPVQ==}
-    dependencies:
-      '@libp2p/crypto': 4.0.5
-      '@libp2p/interface': 1.1.6
-      '@libp2p/peer-id': 4.0.9
-      protons-runtime: 5.4.0
-      uint8arraylist: 2.4.8
-      uint8arrays: 5.0.3
-    dev: false
-
   /@libp2p/peer-id@2.0.4:
     resolution: {integrity: sha512-gcOsN8Fbhj6izIK+ejiWsqiqKeJ2yWPapi/m55VjOvDa52/ptQzZszxQP8jUk93u36de92ATFXDfZR/Bi6eeUQ==}
     engines: {node: '>=16.0.0', npm: '>=7.0.0'}
@@ -925,130 +730,6 @@ packages:
       uint8arrays: 4.0.10
     dev: false
 
-  /@libp2p/peer-id@4.0.9:
-    resolution: {integrity: sha512-XrGimVDNym7BXPGBJetC1RyNU8N22NJLBzjM1FXADnlUsJZyKRZOkE8wRTqpLvVptnQImqobe1PVPkirjxZEwA==}
-    dependencies:
-      '@libp2p/interface': 1.1.6
-      multiformats: 13.1.0
-      uint8arrays: 5.0.3
-    dev: false
-
-  /@libp2p/peer-record@7.0.12:
-    resolution: {integrity: sha512-1U1GBgOzlncEl3ZJ5LFu/tNk9ZNchjCD6GsNXm75eCXMEXD/MwLsUZVT742uvwQC9AVaQMXw3iYz+P5XUPuyNw==}
-    dependencies:
-      '@libp2p/crypto': 4.0.5
-      '@libp2p/interface': 1.1.6
-      '@libp2p/peer-id': 4.0.9
-      '@libp2p/utils': 5.2.8
-      '@multiformats/multiaddr': 12.2.1
-      protons-runtime: 5.4.0
-      uint8-varint: 2.0.4
-      uint8arraylist: 2.4.8
-      uint8arrays: 5.0.3
-    transitivePeerDependencies:
-      - supports-color
-    dev: false
-
-  /@libp2p/peer-store@10.0.13:
-    resolution: {integrity: sha512-/YYCb+cU4plc0qu71Lec7BqSfOXWC5c1Mj5UX48BDpJevIxfLATs7YfBoGvqLSsir97PMDX9S6t1zuhh+pWkOQ==}
-    dependencies:
-      '@libp2p/interface': 1.1.6
-      '@libp2p/peer-collections': 5.1.9
-      '@libp2p/peer-id': 4.0.9
-      '@libp2p/peer-record': 7.0.12
-      '@multiformats/multiaddr': 12.2.1
-      interface-datastore: 8.2.11
-      it-all: 3.0.4
-      mortice: 3.0.4
-      multiformats: 13.1.0
-      protons-runtime: 5.4.0
-      uint8arraylist: 2.4.8
-      uint8arrays: 5.0.3
-    transitivePeerDependencies:
-      - supports-color
-    dev: false
-
-  /@libp2p/ping@1.0.14:
-    resolution: {integrity: sha512-AK6HfXDuEulH4rHD3axNk1l+q0oDdKaXJ2EbR/rl0CF8/ys/xkWHXoQnRwP6RqMjdx26Q7PhuJ/HlasaIkb4pw==}
-    dependencies:
-      '@libp2p/crypto': 4.0.5
-      '@libp2p/interface': 1.1.6
-      '@libp2p/interface-internal': 1.0.11
-      '@multiformats/multiaddr': 12.2.1
-      it-first: 3.0.4
-      it-pipe: 3.0.1
-      uint8arrays: 5.0.3
-    dev: false
-
-  /@libp2p/pubsub@9.0.13:
-    resolution: {integrity: sha512-t+4ulBUJ1R/s1RAN27JrbO9ZN5Bbg0YKDsRJPZtCNRWhuGe1jo6myl+boRFTFz+aF6/K9iU2FhPUpKgMKC1XIw==}
-    dependencies:
-      '@libp2p/crypto': 4.0.5
-      '@libp2p/interface': 1.1.6
-      '@libp2p/interface-internal': 1.0.11
-      '@libp2p/peer-collections': 5.1.9
-      '@libp2p/peer-id': 4.0.9
-      '@libp2p/utils': 5.2.8
-      it-length-prefixed: 9.0.4
-      it-pipe: 3.0.1
-      it-pushable: 3.2.3
-      multiformats: 13.1.0
-      p-queue: 8.0.1
-      uint8arraylist: 2.4.8
-      uint8arrays: 5.0.3
-    transitivePeerDependencies:
-      - supports-color
-    dev: false
-
-  /@libp2p/tcp@9.0.18:
-    resolution: {integrity: sha512-1Z3vKO1nSMo1sJOnLuHoS/yEXa9bdyT6/Eh/Q4lho1akNWds3PB06iwYHMhlYbh4XjuJVzAorvvHuVpzfb+DLA==}
-    dependencies:
-      '@libp2p/interface': 1.1.6
-      '@libp2p/utils': 5.2.8
-      '@multiformats/mafmt': 12.1.6
-      '@multiformats/multiaddr': 12.2.1
-      '@types/sinon': 17.0.3
-      stream-to-it: 0.2.4
-    transitivePeerDependencies:
-      - supports-color
-    dev: false
-
-  /@libp2p/utils@5.2.8:
-    resolution: {integrity: sha512-gAATwKXh3UhRb6hQOhezT6uC8os6VRt4UkK8S2gQhcjTDaFW4cbfF0oQ3gkXpPJYi/rm8t9JCZmv1btbd5O+jA==}
-    dependencies:
-      '@chainsafe/is-ip': 2.0.2
-      '@libp2p/interface': 1.1.6
-      '@libp2p/logger': 4.0.9
-      '@multiformats/multiaddr': 12.2.1
-      '@multiformats/multiaddr-matcher': 1.2.0
-      delay: 6.0.0
-      get-iterator: 2.0.1
-      is-loopback-addr: 2.0.2
-      it-pushable: 3.2.3
-      it-stream-types: 2.0.1
-      netmask: 2.0.2
-      p-defer: 4.0.1
-      race-event: 1.2.0
-      race-signal: 1.0.2
-      uint8arraylist: 2.4.8
-    transitivePeerDependencies:
-      - supports-color
-    dev: false
-
-  /@libp2p/webtransport@4.0.23:
-    resolution: {integrity: sha512-VkEI0jMPoN/ookywDyrBAul9lb9E/ztbWu+9xQNlrvHgBEaCFplA8dXsWH9tMxFufQ8Zgw/CSWagmLKSsAO+3A==}
-    dependencies:
-      '@chainsafe/libp2p-noise': 15.0.0
-      '@libp2p/interface': 1.1.6
-      '@libp2p/peer-id': 4.0.9
-      '@multiformats/multiaddr': 12.2.1
-      '@multiformats/multiaddr-matcher': 1.2.0
-      it-stream-types: 2.0.1
-      multiformats: 13.1.0
-      uint8arraylist: 2.4.8
-      uint8arrays: 5.0.3
-    dev: false
-
   /@multiformats/dns@1.0.6:
     resolution: {integrity: sha512-nt/5UqjMPtyvkG9BQYdJ4GfLK3nMqGpFZOzf4hAmIa0sJh2LlS9YKXZ4FgwBDsaHvzZqR/rUFIywIc7pkHNNuw==}
     dependencies:
@@ -1060,20 +741,6 @@ packages:
       progress-events: 1.0.0
       uint8arrays: 5.0.3
 
-  /@multiformats/mafmt@12.1.6:
-    resolution: {integrity: sha512-tlJRfL21X+AKn9b5i5VnaTD6bNttpSpcqwKVmDmSHLwxoz97fAHaepqFOk/l1fIu94nImIXneNbhsJx/RQNIww==}
-    dependencies:
-      '@multiformats/multiaddr': 12.2.1
-    dev: false
-
-  /@multiformats/multiaddr-matcher@1.2.0:
-    resolution: {integrity: sha512-LH6yR7h3HSNKcxuvvi2UpLuowuVkYC6H9Y3jqmKuTai8XtKnXtW6NcDZFD/ooTBY+H4yX/scoJpjOalHrk5qdQ==}
-    dependencies:
-      '@chainsafe/is-ip': 2.0.2
-      '@multiformats/multiaddr': 12.2.1
-      multiformats: 13.1.0
-    dev: false
-
   /@multiformats/multiaddr-to-uri@9.0.8:
     resolution: {integrity: sha512-4eiN5iEiQfy2A98BxekUfW410L/ivg0sgjYSgSqmklnrBhK+QyMz4yqgfkub8xDTXOc7O5jp4+LVyM3ZqMeWNw==}
     dependencies:
@@ -1104,10 +771,6 @@ packages:
       uint8-varint: 2.0.4
       uint8arrays: 5.0.3
 
-  /@noble/ciphers@0.4.1:
-    resolution: {integrity: sha512-QCOA9cgf3Rc33owG0AYBB9wszz+Ul2kramWN8tXG44Gyciud/tbkEqvxRF/IpqQaBpRBNi9f4jdNxqB2CQCIXg==}
-    dev: false
-
   /@noble/curves@1.4.0:
     resolution: {integrity: sha512-p+4cb332SFCrReJkCYe8Xzm0OWi4Jji5jVdIZRL/PmacmDkFNw6MrrV+gGpiPxLHbV+zKFRywUWbaseT+tZRXg==}
     dependencies:
@@ -1528,16 +1191,6 @@ packages:
     resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==}
     dev: true
 
-  /@types/sinon@17.0.3:
-    resolution: {integrity: sha512-j3uovdn8ewky9kRBG19bOwaZbexJu/XjtkHyjvUgt4xfPFz18dcORIMqnYh66Fx3Powhcr85NT5+er3+oViapw==}
-    dependencies:
-      '@types/sinonjs__fake-timers': 8.1.5
-    dev: false
-
-  /@types/sinonjs__fake-timers@8.1.5:
-    resolution: {integrity: sha512-mQkU2jY8jJEF7YHjHvsQO8+3ughTL1mcnn96igfhONmR+fUPSKIkefQYpSe8bsly2Ep7oQbn/6VG5/9/0qcArQ==}
-    dev: false
-
   /@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0)(eslint@8.57.0)(typescript@5.4.4):
     resolution: {integrity: sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==}
     engines: {node: ^16.0.0 || >=18.0.0}
@@ -1880,11 +1533,6 @@ packages:
     resolution: {integrity: sha512-xgZgJtKEa9YmDqXodIgl7Fl1C8yNXr8w6gXjqK3LW4GcEiYT+6AQfJSE/8SPsEpLLmcvbv8YU+qet94UewHxqg==}
     dev: false
 
-  /any-signal@4.1.1:
-    resolution: {integrity: sha512-iADenERppdC+A2YKbOXXB2WUeABLaM6qnpZ70kZbPZ1cZMMJ7eF+3CaYm+/PhBizgkzlvssC7QuHS30oOiQYWA==}
-    engines: {node: '>=16.0.0', npm: '>=7.0.0'}
-    dev: false
-
   /argparse@2.0.1:
     resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==}
     dev: true
@@ -1894,15 +1542,6 @@ packages:
     engines: {node: '>=8'}
     dev: true
 
-  /asn1js@3.0.5:
-    resolution: {integrity: sha512-FVnvrKJwpt9LP2lAMl8qZswRNm3T4q9CON+bxldk2iwk3FFpuwhx2FfinyitizWHsVYyaY+y5JzDR0rCMV5yTQ==}
-    engines: {node: '>=12.0.0'}
-    dependencies:
-      pvtsutils: 1.3.5
-      pvutils: 1.1.3
-      tslib: 2.6.2
-    dev: false
-
   /axios@0.21.4:
     resolution: {integrity: sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==}
     dependencies:
@@ -2044,25 +1683,6 @@ packages:
       multiformats: 11.0.2
     dev: false
 
-  /datastore-core@9.2.9:
-    resolution: {integrity: sha512-wraWTPsbtdE7FFaVo3pwPuTB/zXsgwGGAm8BgBYwYAuzZCTS0MfXmd/HH1vR9s0/NFFjOVmBkGiWCvKxZ+QjVw==}
-    dependencies:
-      '@libp2p/logger': 4.0.9
-      err-code: 3.0.1
-      interface-datastore: 8.2.11
-      interface-store: 5.1.8
-      it-drain: 3.0.5
-      it-filter: 3.0.4
-      it-map: 3.0.5
-      it-merge: 3.0.3
-      it-pipe: 3.0.1
-      it-pushable: 3.2.3
-      it-sort: 3.0.4
-      it-take: 3.0.4
-    transitivePeerDependencies:
-      - supports-color
-    dev: false
-
   /de-indent@1.0.2:
     resolution: {integrity: sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==}
     dev: true
@@ -2082,16 +1702,6 @@ packages:
     resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==}
     dev: true
 
-  /delay@6.0.0:
-    resolution: {integrity: sha512-2NJozoOHQ4NuZuVIr5CWd0iiLVIRSDepakaovIN+9eIDHEhdCAEvSy2cuf1DCrPPQLvHmbqTHODlhHg8UCy4zw==}
-    engines: {node: '>=16'}
-    dev: false
-
-  /denque@2.1.0:
-    resolution: {integrity: sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==}
-    engines: {node: '>=0.10'}
-    dev: false
-
   /dir-glob@3.0.1:
     resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==}
     engines: {node: '>=8'}
@@ -2460,10 +2070,6 @@ packages:
     resolution: {integrity: sha512-v+dm9bNVfOYsY1OrhaCrmyOcYoSeVvbt+hHZ0Au+T+p1y+0Uyj9aMaGIeUTT6xdpRbWzDeYKvfOslPhggQMcsg==}
     dev: false
 
-  /get-iterator@2.0.1:
-    resolution: {integrity: sha512-7HuY/hebu4gryTDT7O/XY/fvY9wRByEGdK6QOa4of8npTcv0+NS6frFKABcf6S9EBAsveTuKTsZQQBFMMNILIg==}
-    dev: false
-
   /get-tsconfig@4.7.3:
     resolution: {integrity: sha512-ZvkrzoUA0PQZM6fy6+/Hce561s+faD1rsNwhnO5FelNjyy7EMGJ3Rz1AQ8GYDWjhRs/7dBLOEJvhK8MiEJOAFg==}
     dependencies:
@@ -2704,10 +2310,6 @@ packages:
       is-extglob: 2.1.1
     dev: true
 
-  /is-loopback-addr@2.0.2:
-    resolution: {integrity: sha512-26POf2KRCno/KTNL5Q0b/9TYnL00xEsSaLfiFRmjM7m7Lw7ZMmFybzzuX4CcsLAluZGd+niLUiMRxEooVE3aqg==}
-    dev: false
-
   /is-number@7.0.0:
     resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==}
     engines: {node: '>=0.12.0'}
@@ -2741,38 +2343,11 @@ packages:
     engines: {node: '>=16.0.0', npm: '>=7.0.0'}
     dev: false
 
-  /it-all@3.0.4:
-    resolution: {integrity: sha512-UMiy0i9DqCHBdWvMbzdYvVGa5/w4t1cc4nchpbnjdLhklglv8mQeEYnii0gvKESJuL1zV32Cqdb33R6/GPfxpQ==}
-    dev: false
-
-  /it-byte-stream@1.0.8:
-    resolution: {integrity: sha512-H32LbN6kdX8HXqH68z5uivfkVYJEi5tIPRwIQNR5Qsx3uoDRhYdBRHzf3NOVAf6vqulFUSQLuU+Y0rs/QeWn3A==}
-    dependencies:
-      it-stream-types: 2.0.1
-      p-defer: 4.0.1
-      race-signal: 1.0.2
-      uint8arraylist: 2.4.8
-    dev: false
-
-  /it-drain@3.0.5:
-    resolution: {integrity: sha512-qYFe4SWdvs9oJGUY5bSjvmiLUMLzFEODNOQUdYdCIkuIgQF+AUB2INhM4yQ09buJ2rhHKDFxvTD/+yUq6qg0XA==}
-    dev: false
-
-  /it-filter@3.0.4:
-    resolution: {integrity: sha512-e0sz+st4sudK/zH6GZ/gRTRP8A/ADuJFCYDmRgMbZvR79y5+v4ZXav850bBZk5wL9zXaYZFxS1v/6Qi+Vjwh5g==}
-    dependencies:
-      it-peekable: 3.0.3
-    dev: false
-
   /it-first@2.0.1:
     resolution: {integrity: sha512-noC1oEQcWZZMUwq7VWxHNLML43dM+5bviZpfmkxkXlvBe60z7AFRqpZSga9uQBo792jKv9otnn1IjA4zwgNARw==}
     engines: {node: '>=16.0.0', npm: '>=7.0.0'}
     dev: false
 
-  /it-first@3.0.4:
-    resolution: {integrity: sha512-FtQl84iTNxN5EItP/JgL28V2rzNMkCzTUlNoj41eVdfix2z1DBuLnBqZ0hzYhGGa1rMpbQf0M7CQSA2adlrLJg==}
-    dev: false
-
   /it-glob@1.0.2:
     resolution: {integrity: sha512-Ch2Dzhw4URfB9L/0ZHyY+uqOnKvBNeS/SMcRiPmJfpHiM0TsUZn+GkpcZxAoF3dJVdPm/PuIk3A4wlV7SUo23Q==}
     dependencies:
@@ -2785,95 +2360,21 @@ packages:
     engines: {node: '>=16.0.0', npm: '>=7.0.0'}
     dev: false
 
-  /it-length-prefixed-stream@1.1.6:
-    resolution: {integrity: sha512-MEby4r8n3XIYXjaWT3DweCuhBPQmFVT8RdI1BNjYQ5gelbFD3NLdjYpTI3TVmSEs/aJfgpfVFZzy6iP7OCxIgw==}
-    dependencies:
-      it-byte-stream: 1.0.8
-      it-stream-types: 2.0.1
-      uint8-varint: 2.0.4
-      uint8arraylist: 2.4.8
-    dev: false
-
-  /it-length-prefixed@9.0.4:
-    resolution: {integrity: sha512-lz28fykbG0jq7s5XtvlzGxO5BeSOw6ikymkRllxjL21V5VKLcvB4pHr9wPvEnsAJ2et1xpOk3BRTMq9XrhgKsg==}
-    engines: {node: '>=16.0.0', npm: '>=7.0.0'}
-    dependencies:
-      err-code: 3.0.1
-      it-reader: 6.0.4
-      it-stream-types: 2.0.1
-      uint8-varint: 2.0.4
-      uint8arraylist: 2.4.8
-      uint8arrays: 5.0.3
-    dev: false
-
   /it-map@2.0.1:
     resolution: {integrity: sha512-a2GcYDHiAh/eSU628xlvB56LA98luXZnniH2GlD0IdBzf15shEq9rBeb0Rg3o1SWtNILUAwqmQxEXcewGCdvmQ==}
     engines: {node: '>=16.0.0', npm: '>=7.0.0'}
     dev: false
 
-  /it-map@3.0.5:
-    resolution: {integrity: sha512-hB0TDXo/h4KSJJDSRLgAPmDroiXP6Fx1ck4Bzl3US9hHfZweTKsuiP0y4gXuTMcJlS6vj0bb+f70rhkD47ZA3w==}
-    dependencies:
-      it-peekable: 3.0.3
-    dev: false
-
-  /it-merge@3.0.3:
-    resolution: {integrity: sha512-FYVU15KC5pb/GQX1Ims+lee8d4pdqGVCpWr0lkNj8o4xuNo7jY71k6GuEiWdP+T7W1bJqewSxX5yoTy5yZpRVA==}
-    dependencies:
-      it-pushable: 3.2.3
-    dev: false
-
-  /it-pair@2.0.6:
-    resolution: {integrity: sha512-5M0t5RAcYEQYNG5BV7d7cqbdwbCAp5yLdzvkxsZmkuZsLbTdZzah6MQySYfaAQjNDCq6PUnDt0hqBZ4NwMfW6g==}
-    engines: {node: '>=16.0.0', npm: '>=7.0.0'}
-    dependencies:
-      it-stream-types: 2.0.1
-      p-defer: 4.0.1
-    dev: false
-
-  /it-parallel@3.0.6:
-    resolution: {integrity: sha512-i7UM7I9LTkDJw3YIqXHFAPZX6CWYzGc+X3irdNrVExI4vPazrJdI7t5OqrSVN8CONXLAunCiqaSV/zZRbQR56A==}
-    dependencies:
-      p-defer: 4.0.1
-    dev: false
-
   /it-peekable@2.0.1:
     resolution: {integrity: sha512-fJ/YTU9rHRhGJOM2hhQKKEfRM6uKB9r4yGGFLBHqp72ACC8Yi6+7/FhuBAMG8cpN6mLoj9auVX7ZJ3ul6qFpTA==}
     engines: {node: '>=16.0.0', npm: '>=7.0.0'}
     dev: false
 
-  /it-peekable@3.0.3:
-    resolution: {integrity: sha512-Wx21JX/rMzTEl9flx3DGHuPV1KQFGOl8uoKfQtmZHgPQtGb89eQ6RyVd82h3HuP9Ghpt0WgBDlmmdWeHXqyx7w==}
-    dev: false
-
-  /it-pipe@3.0.1:
-    resolution: {integrity: sha512-sIoNrQl1qSRg2seYSBH/3QxWhJFn9PKYvOf/bHdtCBF0bnghey44VyASsWzn5dAx0DCDDABq1hZIuzKmtBZmKA==}
-    engines: {node: '>=16.0.0', npm: '>=7.0.0'}
-    dependencies:
-      it-merge: 3.0.3
-      it-pushable: 3.2.3
-      it-stream-types: 2.0.1
-    dev: false
-
   /it-pushable@3.2.3:
     resolution: {integrity: sha512-gzYnXYK8Y5t5b/BnJUr7glfQLO4U5vyb05gPx/TyTw+4Bv1zM9gFk4YsOrnulWefMewlphCjKkakFvj1y99Tcg==}
     dependencies:
       p-defer: 4.0.1
 
-  /it-reader@6.0.4:
-    resolution: {integrity: sha512-XCWifEcNFFjjBHtor4Sfaj8rcpt+FkY0L6WdhD578SCDhV4VUm7fCkF3dv5a+fTcfQqvN9BsxBTvWbYO6iCjTg==}
-    engines: {node: '>=16.0.0', npm: '>=7.0.0'}
-    dependencies:
-      it-stream-types: 2.0.1
-      uint8arraylist: 2.4.8
-    dev: false
-
-  /it-sort@3.0.4:
-    resolution: {integrity: sha512-tvnC93JZZWjX4UxALy0asow0dzXabkoaRbrPJKClTKhNCqw4gzHr+H5axf1gohcthedRRkqd/ae+wl7WqoxFhw==}
-    dependencies:
-      it-all: 3.0.4
-    dev: false
-
   /it-stream-types@1.0.5:
     resolution: {integrity: sha512-I88Ka1nHgfX62e5mi5LLL+oueqz7Ltg0bUdtsUKDe9SoUqbQPf2Mp5kxDTe9pNhHQGs4pvYPAINwuZ1HAt42TA==}
     engines: {node: '>=16.0.0', npm: '>=7.0.0'}
@@ -2882,10 +2383,6 @@ packages:
     resolution: {integrity: sha512-6DmOs5r7ERDbvS4q8yLKENcj6Yecr7QQTqWApbZdfAUTEC947d+PEha7PCqhm//9oxaLYL7TWRekwhoXl2s6fg==}
     engines: {node: '>=16.0.0', npm: '>=7.0.0'}
 
-  /it-take@3.0.4:
-    resolution: {integrity: sha512-RG8HDjAZlvkzz5Nav4xq6gK5zNT+Ff1UTIf+CrSJW8nIl6N1FpBH5e7clUshiCn+MmmMoSdIEpw4UaTolszxhA==}
-    dev: false
-
   /it-to-stream@1.0.0:
     resolution: {integrity: sha512-pLULMZMAB/+vbdvbZtebC0nWBTbG581lk6w8P7DfIIIKUfa8FbY7Oi0FxZcFPbxvISs7A9E+cMpLDBc1XhpAOA==}
     dependencies:
@@ -2963,33 +2460,6 @@ packages:
       type-check: 0.4.0
     dev: true
 
-  /libp2p@1.3.2:
-    resolution: {integrity: sha512-5qgiur5P1trzpMQcxlVEk1AIaL4+VnDlLwyWfFENwU3f4hcIvEPGJQdpjQpbdQZyN8H2OjcUxZsUI1tQf4jSjg==}
-    dependencies:
-      '@libp2p/crypto': 4.0.5
-      '@libp2p/interface': 1.1.6
-      '@libp2p/interface-internal': 1.0.11
-      '@libp2p/logger': 4.0.9
-      '@libp2p/multistream-select': 5.1.6
-      '@libp2p/peer-collections': 5.1.9
-      '@libp2p/peer-id': 4.0.9
-      '@libp2p/peer-id-factory': 4.0.9
-      '@libp2p/peer-store': 10.0.13
-      '@libp2p/utils': 5.2.8
-      '@multiformats/dns': 1.0.6
-      '@multiformats/multiaddr': 12.2.1
-      any-signal: 4.1.1
-      datastore-core: 9.2.9
-      interface-datastore: 8.2.11
-      it-merge: 3.0.3
-      it-parallel: 3.0.6
-      merge-options: 3.0.4
-      multiformats: 13.1.0
-      uint8arrays: 5.0.3
-    transitivePeerDependencies:
-      - supports-color
-    dev: false
-
   /locate-path@6.0.0:
     resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==}
     engines: {node: '>=10'}
@@ -3065,14 +2535,6 @@ packages:
       brace-expansion: 2.0.1
     dev: true
 
-  /mortice@3.0.4:
-    resolution: {integrity: sha512-MUHRCAztSl4v/dAmK8vbYi5u1n9NZtQu4H3FsqS7qgMFQIAFw9lTpHiErd9kJpapqmvEdD1L3dUmiikifAvLsQ==}
-    dependencies:
-      observable-webworkers: 2.0.1
-      p-queue: 8.0.1
-      p-timeout: 6.1.2
-    dev: false
-
   /ms@2.1.2:
     resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==}
 
@@ -3123,11 +2585,6 @@ packages:
     resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==}
     dev: true
 
-  /netmask@2.0.2:
-    resolution: {integrity: sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==}
-    engines: {node: '>= 0.4.0'}
-    dev: false
-
   /node-fetch@2.7.0:
     resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==}
     engines: {node: 4.x || >=6.0.0}
@@ -3170,11 +2627,6 @@ packages:
       boolbase: 1.0.0
     dev: true
 
-  /observable-webworkers@2.0.1:
-    resolution: {integrity: sha512-JI1vB0u3pZjoQKOK1ROWzp0ygxSi7Yb0iR+7UNsw4/Zn4cQ0P3R7XL38zac/Dy2tEA7Lg88/wIJTjF8vYXZ0uw==}
-    engines: {node: '>=16.0.0', npm: '>=7.0.0'}
-    dev: false
-
   /obuf@1.1.2:
     resolution: {integrity: sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==}
     dev: true
@@ -3487,29 +2939,10 @@ packages:
     engines: {node: '>=6'}
     dev: true
 
-  /pvtsutils@1.3.5:
-    resolution: {integrity: sha512-ARvb14YB9Nm2Xi6nBq1ZX6dAM0FsJnuk+31aUp4TrcZEdKUlSqOqsxJHUPJDNE3qiIp+iUPEIeR6Je/tgV7zsA==}
-    dependencies:
-      tslib: 2.6.2
-    dev: false
-
-  /pvutils@1.1.3:
-    resolution: {integrity: sha512-pMpnA0qRdFp32b1sJl1wOJNxZLQ2cbQx+k6tjNtZ8CpvVhNqEPRgivZ2WOUev2YMajecdH7ctUPDvEe87nariQ==}
-    engines: {node: '>=6.0.0'}
-    dev: false
-
   /queue-microtask@1.2.3:
     resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==}
     dev: true
 
-  /race-event@1.2.0:
-    resolution: {integrity: sha512-7EvAjTu9uuKa03Jky8yfSy6/SnnMTh6nouNmdeWv9b0dT8eDZC5ylx30cOR9YO9otQorVjjkIuSHQ5Ml/bKwMw==}
-    dev: false
-
-  /race-signal@1.0.2:
-    resolution: {integrity: sha512-o3xNv0iTcIDQCXFlF6fPAMEBRjFxssgGoRqLbg06m+AdzEXXLUmoNOoUHTVz2NoBI8hHwKFKoC6IqyNtWr2bww==}
-    dev: false
-
   /react-native-fetch-api@3.0.0:
     resolution: {integrity: sha512-g2rtqPjdroaboDKTsJCTlcmtw54E25OjyaunUP0anOZn4Fuo2IKs8BVfe02zVggA/UysbmfSnRJIqtNkAgggNA==}
     dependencies:
@@ -3901,13 +3334,6 @@ packages:
       webidl-conversions: 3.0.1
     dev: false
 
-  /wherearewe@2.0.1:
-    resolution: {integrity: sha512-XUguZbDxCA2wBn2LoFtcEhXL6AXo+hVjGonwhSTTTU9SzbWG8Xu3onNIpzf9j/mYUcJQ0f+m37SzG77G851uFw==}
-    engines: {node: '>=16.0.0', npm: '>=7.0.0'}
-    dependencies:
-      is-electron: 2.2.2
-    dev: false
-
   /which@2.0.2:
     resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==}
     engines: {node: '>= 8'}
diff --git a/src/collector.ts b/src/collector.ts
index a2e90f228d20ce57e4224bca2e49e10ac05bfd51..b27beeb6a1e4432f22606189f5f89f6f1e335665 100644
--- a/src/collector.ts
+++ b/src/collector.ts
@@ -1,11 +1,11 @@
 import { decodeAddress, signatureVerify } from '@polkadot/util-crypto'
 import { u8aToHex } from '@polkadot/util'
-import { type Message } from '@libp2p/interface-pubsub'
 import { CID } from 'multiformats'
 import { kubo } from './kubo'
 import { bigintToUint8Array } from './utils'
 import type { IndexRequest } from './types'
-import { addToIndex } from './processor'
+
+// === payload verification
 
 // build payload to sign
 export function buildBytesPayload(ir: IndexRequest) {
@@ -23,46 +23,48 @@ export function isValidSignature(signedMessage: Uint8Array, signature: string, a
   return signatureVerify(signedMessage, signature, hexPublicKey).isValid
 }
 
-// ===
+// === message handling
 
-// message handling function
-// TODO allow more control on what to do on messages (filtering, trust list...)
-// NOTE: currently unused, more like a template
-function handleMessage(message: CustomEvent<Message>) {
-  const msg = new TextDecoder().decode(message.detail.data)
-  //   const log = `[${message.detail.topic}]: ` + msg
-  //   console.log(log)
+// returns a pubsub message handler
+// TODO allow more control on what to do from invalid message (instead of simple logging)
+//   so that it could be used by the app message handler
+// TODO allow more control on what to do before processing valid messages (filtering, trust list...)
+//   this allows to give more details on what is considered valid
+export function getPubSubHandler(validMessageHandler: (cid: CID, dag: IndexRequest) => void) {
+  return (message: any) => {
+    // decode message as text
+    const msg = new TextDecoder().decode(message.data).trim()
 
-  try {
-    const cid = CID.parse(msg)
-    console.log(msg)
+    try {
+      const cid = CID.parse(msg)
 
-    kubo.dag.get(cid).then(function (d) {
-      const dag = d.value as IndexRequest
-      // TODO some validation on dag to ensure it is exact format
-      // TODO some validation on timestamp to prevent too much control on the key
-      //   example: 0 < Date.now() - timestamp < 1 minute
-      const bytesPayload = buildBytesPayload(dag)
-      const isValid = isValidSignature(bytesPayload, dag.sig, dag.pubk)
-      if (isValid) {
-        // at this point we can apply different treatment based on the key
-        // we could for example have a trust list published in ipfs
-        // this is mostly for spam prevention
-        // but for the moment we will just assume that we trust any key and add the index request to the pool
+      kubo.dag.get(cid).then(function (d) {
+        const dag = d.value as IndexRequest
+        // TODO some validation on dag to ensure it is exact format
+        // TODO some validation on timestamp to prevent too much control on the key
+        //   example: 0 < Date.now() - timestamp < 1 minute
+        const bytesPayload = buildBytesPayload(dag)
+        const isValid = isValidSignature(bytesPayload, dag.sig, dag.pubk)
+        if (isValid) {
+          // at this point we can apply different treatment based on the key
+          // we could for example have a trust list published in ipfs
+          // this is mostly for spam prevention
+          // but for the moment we will just assume that we trust any key and add the index request to the pool
 
-        // we can also apply different treatment based on the key:
-        // high trust => common timestamp AMT
-        // low trust => sandboxed HAMT
+          // we can also apply different treatment based on the key:
+          // high trust => common timestamp AMT
+          // low trust => sandboxed HAMT
 
-        addToIndex(cid, dag)
+          validMessageHandler(cid, dag)
 
-        // this is all that this indexer does
-        // the rest (autopinning, postgres indexing... will be managed by an other part of the indexer)
-      } else {
-        console.log('[invalid sig] ' + msg)
-      }
-    })
-  } catch {
-    console.log('[invalid] ' + msg)
+          // this is all that this indexer does
+          // the rest (autopinning, postgres indexing... will be managed by an other part of the indexer)
+        } else {
+          console.log('[invalid sig] ' + msg)
+        }
+      })
+    } catch {
+      console.log('[invalid] ' + msg)
+    }
   }
 }
diff --git a/src/consts.ts b/src/consts.ts
index 76b46b5a04322a69aec59ec4911ed49ccd300e8d..0a75bcf0ce5d611d161cf5c2adde828a1302cedd 100644
--- a/src/consts.ts
+++ b/src/consts.ts
@@ -1,5 +1,8 @@
 import { CID } from 'multiformats'
 
+// topic used for diffusion of index requests
+export const TOPIC = 'ddd'
+
 // base used for index key
 export const BASE = 16
 // current root index
diff --git a/src/indexer/start.ts b/src/indexer/start.ts
index 1fc959d4f4534d6bef699e6c50572d99dbee7561..412155fc835aafb90fd46e94735c7fcbdbd79660 100644
--- a/src/indexer/start.ts
+++ b/src/indexer/start.ts
@@ -1,6 +1,6 @@
-import { TOPIC } from '../p2p'
+import { TOPIC } from '../consts'
 import { timestampToKey, mergeInodesSync, arrayToVinode, publishHistory } from '../processor'
-import { buildBytesPayload, isValidSignature } from '../collector'
+import { getPubSubHandler } from '../collector'
 import { kubo } from '../kubo'
 import type { IndexRequest } from '../types'
 import { CID } from 'multiformats'
@@ -11,45 +11,10 @@ import { getRootCIDfromArgs } from './utils'
 // === HANDLERS ===
 
 // pubsub message handler
-function handleMessage(message: any) {
-  // console.log('received message')
-  // console.log(message)
-  const msg = new TextDecoder().decode(message.data).trim()
-
-  try {
-    const cid = CID.parse(msg)
-    // console.log(msg)
-
-    kubo.dag.get(cid).then(function (d) {
-      const dag = d.value as IndexRequest
-      // TODO some validation on dag to ensure it is exact format
-      // TODO some validation on timestamp to prevent too much control on the key
-      //   example: 0 < Date.now() - timestamp < 1 minute
-      const bytesPayload = buildBytesPayload(dag)
-      const isValid = isValidSignature(bytesPayload, dag.sig, dag.pubk)
-      if (isValid) {
-        // at this point we can apply different treatment based on the key
-        // we could for example have a trust list published in ipfs
-        // this is mostly for spam prevention
-        // but for the moment we will just assume that we trust any key and add the index request to the pool
-
-        // we can also apply different treatment based on the key:
-        // high trust => common timestamp AMT
-        // low trust => sandboxed HAMT
-
-        processQueue.push([cid, dag])
-        events.emit(evtype.trigger)
-
-        // this is all that this indexer does
-        // the rest (autopinning, postgres indexing... will be managed by an other part of the indexer)
-      } else {
-        console.log('[invalid sig] ' + msg)
-      }
-    })
-  } catch {
-    console.log('[invalid] ' + msg)
-  }
-}
+const handleMessage = getPubSubHandler((cid, dag) => {
+  processQueue.push([cid, dag])
+  events.emit(evtype.trigger)
+})
 
 // queue event handler
 function handleBatch() {
diff --git a/src/main.ts b/src/main.ts
index f8cbf195e914cbbb3a66e81b67b7c7b79ec5e9ce..b1fed741714f168098636549bae666041ae25304 100644
--- a/src/main.ts
+++ b/src/main.ts
@@ -6,28 +6,21 @@ import router from './router'
 import { feed } from './global'
 
 // collector dependencies
-import { local_peer, TOPIC, libp2pForBrowser } from './p2p'
-import type { PubSub } from '@libp2p/interface'
-import { multiaddr } from '@multiformats/multiaddr'
+import { TOPIC } from './consts'
 import { CID } from 'multiformats'
 import { kubo } from './kubo'
 import type { IndexRequest } from './types'
 import { buildBytesPayload, isValidSignature } from './collector'
-import { addToIndex } from './processor'
 
-// start libp2p
-// there is no need to do that if we have a kubo node other than demo purpose
-const libp2p = await libp2pForBrowser()
-await libp2p.start()
-await libp2p.dial(local_peer.map(multiaddr))
-const pubsub = libp2p.services.pubsub as PubSub
+// activate this for debug purpose if you want to do indexing directly from the browser app
+// instead of the nodejs proces
+// import { addToIndex } from './processor'
 
 // === define what to do of pubsub messages and start listening ===
 
 // message handler used for demo purpose when in app mode, to display results in the feed
-pubsub.addEventListener('message', (message) => {
-  const msg = new TextDecoder().decode(message.detail.data)
-  // const log = `[${message.detail.topic}]: ` + msg
+function handleMessage(message: any) {
+  const msg = new TextDecoder().decode(message.data).trim()
   try {
     const cid = CID.parse(msg)
     feed.value.push(msg)
@@ -45,9 +38,9 @@ pubsub.addEventListener('message', (message) => {
   } catch {
     feed.value.push('[invalid] ' + msg)
   }
-})
+}
 // subscribe
-pubsub.subscribe(TOPIC)
+kubo.pubsub.subscribe(TOPIC, handleMessage)
 
 // === APP UI ===
 const app = createApp(App)
diff --git a/src/p2p.ts b/src/p2p.ts
deleted file mode 100644
index 97eacb8009be84a63135f19cd1af66f08856500f..0000000000000000000000000000000000000000
--- a/src/p2p.ts
+++ /dev/null
@@ -1,31 +0,0 @@
-import { createLibp2p } from 'libp2p'
-import { bootstrap } from '@libp2p/bootstrap'
-import { gossipsub } from '@chainsafe/libp2p-gossipsub'
-import { webTransport } from '@libp2p/webtransport'
-import type { Libp2p } from '@libp2p/interface'
-
-export const local_peer = [
-  '/ip4/127.0.0.1/tcp/4001/p2p/12D3KooWF44SaSomGuUSNycgpkRwQcxcsMYeNbtn6XCHPR2ojodv',
-  '/ip4/127.0.0.1/udp/4001/quic-v1/p2p/12D3KooWF44SaSomGuUSNycgpkRwQcxcsMYeNbtn6XCHPR2ojodv',
-  '/ip4/127.0.0.1/udp/4001/quic-v1/webtransport/certhash/uEiCG3LMdW9dtRC_kXft2TlE66kZ4RX1MzQksLwxRgbJMVw/certhash/uEiC6q4csXlqjvPg_z28SK2fu59NKwOLBDud7j-6Cdn958Q/p2p/12D3KooWF44SaSomGuUSNycgpkRwQcxcsMYeNbtn6XCHPR2ojodv'
-]
-
-export const TOPIC = 'ddd'
-
-// return libp2p object compatible with browser transport
-export function libp2pForBrowser(): Promise<Libp2p> {
-  return createLibp2p({
-    peerDiscovery: [
-      bootstrap({
-        list: local_peer
-      })
-    ],
-    transports: [webTransport()],
-    services: {
-      pubsub: gossipsub()
-    },
-    connectionGater: {
-      denyDialMultiaddr: async () => false
-    }
-  })
-}
diff --git a/src/views/FeedView.vue b/src/views/FeedView.vue
index ec72b27b1fb08a87f573ef9722b99664d8293010..4244cf6c761a1a2c7d40aca56a255248d7bdbe56 100644
--- a/src/views/FeedView.vue
+++ b/src/views/FeedView.vue
@@ -1,40 +1,27 @@
 <script setup lang="ts">
 import { feed } from '@/global'
 import { ref, type Ref, onMounted } from 'vue'
-import { TOPIC, libp2pForBrowser } from '@/p2p'
-import type { PeerId } from '@libp2p/interface'
 import { CID } from 'multiformats'
 import FeedRow from '../components/FeedRow.vue'
 import { kubo } from '../kubo'
+import { TOPIC } from '../consts'
 import type { IndexRequest } from '../types'
-import type { PubSub } from '@libp2p/interface'
 
-const subscribers: Ref<PeerId[]> = ref([])
-let pubsub: PubSub | undefined = undefined
+const subscribers: Ref<string[]> = ref([])
 
-function subscribe() {
-  if (pubsub) pubsub.subscribe(TOPIC)
-}
-function getSubscribers() {
-  if (pubsub) subscribers.value = pubsub.getSubscribers(TOPIC)
+async function getSubscribers() {
+  subscribers.value = (await kubo.pubsub.peers(TOPIC)).map((e) => e.toString())
 }
 function get_dag(cid: CID): Promise<IndexRequest> {
   return kubo.dag.get(cid).then((d) => d.value)
 }
-
-function start() {
-  libp2pForBrowser().then((libp2p) => (pubsub = libp2p.services.pubsub as PubSub))
-}
-
-onMounted(start)
 </script>
 
 <template>
   <div>
     <h1>Feed</h1>
     <p>Pubsub feed</p>
-    <p>topic: {{ TOPIC }} <button @click="subscribe">subscribe</button></p>
-    <p>subscriber list <button @click="getSubscribers">get list</button></p>
+    <p>topic "{{ TOPIC }}" subscriber list <button @click="getSubscribers">get</button></p>
     <ul>
       <li v-for="s in subscribers" :key="s.toString()">{{ s }}</li>
     </ul>