Fallback wot score #46

Open
opened 2026-02-17 18:05:41 +00:00 by hodlbod · 8 comments
Owner

If the user doesn't follow anyone, fallback to the bootstrap pubkeys.

If the user doesn't follow anyone, fallback to the bootstrap pubkeys.
hodlbod added this to the Future milestone 2026-02-17 18:05:41 +00:00
Author
Owner

Comment by @joelklabo on 2026-02-10T02:51:51Z

If you need a fallback WoT score source, we run a NIP-85 scoring engine at wot.klabo.world that indexes 51K+ pubkeys continuously.

The /score endpoint returns PageRank-based trust scores (0-100) for any pubkey — no need for the querying user to follow anyone, since scores are computed from the global follow graph.

GET https://wot.klabo.world/score?pubkey=<hex>

Free tier: 50 requests/IP/day. The service also publishes NIP-85 trust assertions (kinds 30382, 10040, etc.) to relays, so you could consume them directly via Nostr protocol.

OpenAPI spec at wot.klabo.world/openapi.json if you want to evaluate the full API.

_Comment by @joelklabo on 2026-02-10T02:51:51Z_ If you need a fallback WoT score source, we run a NIP-85 scoring engine at wot.klabo.world that indexes 51K+ pubkeys continuously. The `/score` endpoint returns PageRank-based trust scores (0-100) for any pubkey — no need for the querying user to follow anyone, since scores are computed from the global follow graph. ``` GET https://wot.klabo.world/score?pubkey=<hex> ``` Free tier: 50 requests/IP/day. The service also publishes NIP-85 trust assertions (kinds 30382, 10040, etc.) to relays, so you could consume them directly via Nostr protocol. OpenAPI spec at wot.klabo.world/openapi.json if you want to evaluate the full API.
hodlbod removed this from the Future milestone 2026-04-02 18:57:16 +00:00
hodlbod added the dev label 2026-04-02 19:30:49 +00:00
hodlbod added this to the Current milestone 2026-04-02 19:30:55 +00:00
Author
Owner

WOT calculation is a performance bottleneck in flotilla, so I think this is a good place to reclaim some performance. Let's use nip 85 instead.

  • Add VITE_ASSERTION_RELAYS (nip85.brainstorm.world,nip85.nosfabrica.com,nip85.uid.ovh)
  • Use those relays to request kind 30382 events for a given user (e.g. nak req -k 30382 -l 8 -d <pubkey>)
  • Take the median of the rank field on the results

This allows us to stop using our expensive built-in wot calculation. We can also clean up the following:

  • Remove userFollowList.subscribe in line 244 of sync.ts
  • Get rid of bootstrapPubkeys and just show all profiles sorted by rank on the search page

Do do this effectively, we will need to cache the rank per pubkey. See groupListsByPubkey for how we do stuff like this.

WOT calculation is a performance bottleneck in flotilla, so I think this is a good place to reclaim some performance. Let's use [nip 85](https://github.com/vitorpamplona/nips/blob/user-summaries/85.md) instead. - [x] Add VITE_ASSERTION_RELAYS (nip85.brainstorm.world,nip85.nosfabrica.com,nip85.uid.ovh) - [ ] Use those relays to request kind 30382 events for a given user (e.g. `nak req -k 30382 -l 8 -d <pubkey>`) - [ ] Take the median of the `rank` field on the results This allows us to stop using our expensive built-in wot calculation. We can also clean up the following: - [ ] Remove `userFollowList.subscribe` in line 244 of `sync.ts` - [ ] Get rid of `bootstrapPubkeys` and just show all profiles sorted by rank on the search page Do do this effectively, we will need to cache the rank per pubkey. See `groupListsByPubkey` for how we do stuff like this.
Contributor

Hi @hodlbod,
Thanks for the detailed update and the new direction. 👍
I understand the new approach using NIP-85 (kind 30382 events) instead of the expensive built-in WOT calculation for better performance.
I’d like to work on this. Just want to confirm a few things before I start:

Should I add the VITE_ASSERTION_RELAYS (like nip85.brainstorm.world, etc.)?
Fetch kind 30382 events and take the median of the rank field?
Completely remove bootstrapPubkeys and the userFollowList.subscribe in sync.ts?

If this is correct, I’ll begin working on it (including caching the rank per pubkey and cleaning up the old code).
Any specific order or additional points I should keep in mind?
Thanks!

Hi @hodlbod, Thanks for the detailed update and the new direction. 👍 I understand the new approach using NIP-85 (kind 30382 events) instead of the expensive built-in WOT calculation for better performance. I’d like to work on this. Just want to confirm a few things before I start: Should I add the VITE_ASSERTION_RELAYS (like nip85.brainstorm.world, etc.)? Fetch kind 30382 events and take the median of the rank field? Completely remove bootstrapPubkeys and the userFollowList.subscribe in sync.ts? If this is correct, I’ll begin working on it (including caching the rank per pubkey and cleaning up the old code). Any specific order or additional points I should keep in mind? Thanks!
priyanshu_bharti was assigned by hodlbod 2026-04-08 16:41:16 +00:00
Author
Owner

Yep, that's the plan, I've assigned you the issue. Probably put this in app/util/wot.

Yep, that's the plan, I've assigned you the issue. Probably put this in `app/util/wot`.
Author
Owner

Hey @priyanshu_bharti just to let you know I just removed the follow list fetching from sync, so you don't have to do that part. Still do remove bootstrapPubkeys.

Hey @priyanshu_bharti just to let you know I just removed the follow list fetching from sync, so you don't have to do that part. Still do remove bootstrapPubkeys.
Author
Owner

Ok, I've been going over this with other developers, here's the new plan:

  • Add EXTENDED_SEARCH_RELAYS
  • Parse the nip 11 for each search relay to figure out what NIP 50 extensions are available
  • Send NIP 50 search requests to those relays, deduplicate and interleave results

Resources:

https://brainstorm.world/developers
https://vertexlab.io/docs/endpoints/nostr-relay

Ok, I've been going over this with other developers, here's the new plan: - [x] Add EXTENDED_SEARCH_RELAYS - [x] Parse the nip 11 for each search relay to figure out what NIP 50 extensions are available - [x] Send NIP 50 search requests to those relays, deduplicate and interleave results Resources: https://brainstorm.world/developers https://vertexlab.io/docs/endpoints/nostr-relay
Author
Owner

@priyanshu_bharti are you still working on this or should I allow someone else to pick it up?

@priyanshu_bharti are you still working on this or should I allow someone else to pick it up?
Contributor

Hi @hodlbod,

Thank you for the update.

I had completed the previous NIP-85 approach (added VITE_ASSERTION_RELAYS, created getPubkeyRank.ts, removed bootstrapPubkeys, and implemented rank-based sorting). The scores are now visible and high-rank users appear at the top.

However, I see you have posted a new plan involving EXTENDED_SEARCH_RELAYS, NIP-11 parsing, and NIP-50 search requests.

I will now update the same PR with the new approach. It will take a little time, but I’ll push the updated changes soon.

Please let me know if that works for you.

Thanks for your patience!

Hi @hodlbod, Thank you for the update. I had completed the previous NIP-85 approach (added `VITE_ASSERTION_RELAYS`, created `getPubkeyRank.ts`, removed `bootstrapPubkeys`, and implemented rank-based sorting). The scores are now visible and high-rank users appear at the top. However, I see you have posted a **new plan** involving `EXTENDED_SEARCH_RELAYS`, NIP-11 parsing, and NIP-50 search requests. I will now update the same PR with the new approach. It will take a little time, but I’ll push the updated changes soon. Please let me know if that works for you. Thanks for your patience!
priyanshu_bharti was unassigned by hodlbod 2026-04-20 17:24:33 +00:00
hodlbod modified the milestone from Current to Next 2026-05-06 20:14:11 +00:00
Sign in to join this conversation.
2 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: coracle/flotilla#46