← All Posts

Web of Trust Scoring with PageRank on the Nostr Follow Graph

2026-02-01 — nostr, pagerank, wot

The Problem

Nostr has no central authority. No verified badges. No algorithm deciding who's important. That's the whole point. But it also means there's no built-in way to answer a basic question: should I trust this account?

I wanted a quantitative answer. So I crawled the follow graph and ran PageRank on it.

Crawling the Follow Graph

On Nostr, when you follow someone, your client publishes a kind:3 event containing your full contact list. Every follow relationship is public data sitting on relays.

I wrote a crawler that pulls kind:3 events from three major relays:

Each kind:3 event contains a list of pubkeys that the author follows. I parsed every event, deduplicated by author (keeping the most recent), and built a directed graph: an edge from A to B means "A follows B."

The result: 51,363 nodes and 621,084 edges. That's the active social graph of Nostr as seen from those three relays.

Running PageRank

PageRank is the algorithm Google originally used to rank web pages. The core idea: a page is important if important pages link to it. Replace "page" with "Nostr account" and "link" with "follow," and you get a Web of Trust score.

The algorithm works iteratively. Every node starts with equal rank. On each iteration, each node distributes its rank equally among the nodes it follows. After enough iterations (I used 50 with a damping factor of 0.85), the scores converge.

What makes PageRank better than raw follower count: it's resistant to sybil attacks. If 10,000 bot accounts follow you, your score barely moves — because those bots have no inbound follows themselves. But if one well-connected account follows you, that matters.

What I Found

The top-ranked accounts are exactly who you'd expect: core Nostr developers, prominent Bitcoin figures, and relay operators. These are accounts followed by many people who are themselves widely followed.

The rank distribution follows a power law. The top account scores 21, while the 100th account scores 6. Most of the 51,363 nodes score below 1. This is typical for social networks — a small number of accounts are disproportionately central.

Some interesting patterns:

The API

I exposed the scores as free API endpoints on this site:

# Get top 100 WoT scores
curl https://maximumsats.com/wot

# Look up a specific pubkey
curl "https://maximumsats.com/wot/score?pubkey=<64-char-hex>"

The response includes the rank score, position in the top 100, and a link to the source code.

For a deeper analysis, there's a paid endpoint:

# Get AI-generated WoT report (100 sats via L402)
curl -X POST https://maximumsats.com/api/wot-report \
  -H "Content-Type: application/json" \
  -d '{"pubkey": "<64-char-hex>"}'

The report includes a trust level assessment, comparison to top accounts, and recommendations for improving the score. It costs 100 sats paid via Lightning (L402 protocol).

Code

The crawler and PageRank implementation are open source: github.com/joelklabo/wot-scoring. It's written in Go, reads from relays using the nak CLI tool, and outputs a sorted JSON file of scores.

What's Next

If you're building on Nostr and need trust signals, try the API. If you find bugs or want to contribute, PRs are open.

Found this useful?

Send a tip via Lightning. One click, no account needed.

Tip 100 sats ⚡