Chapter 12
Trade-offs
Spam, discovery, relay economics and key loss: an honest look at what Nostr is bad at, what it's great at, and how it compares to X, Mastodon and Bluesky.
Every design pays for its strengths somewhere. Here's where Nostr pays.
You made it to the last chapter. For eleven chapters we’ve been showing off Nostr’s tricks:
keys you own, events anyone can verify,
Think of Nostr like owning a house instead of renting an apartment. Nobody can kick you out, and you can paint the walls any color you like. But when the boiler breaks at 3 a.m., there’s no landlord to call. Every “pro” in this chapter comes with a matching “con”, and that’s not a bug: it’s the price of having no one in charge.
Spam: nobody’s guarding the door
On a big platform, a whole team (plus a lot of software) fights bots for you. On Nostr there’s no
“the company”, so there’s no spam team. Creating a new identity costs nothing: generate a
So Nostr fights
- Make posting cost something. A relay can ask for
(a little math puzzle per note) or money: aproof-of-work Proof of work: Grinding a nonce until the event id starts with enough zero bits, so each event costs some computation, as a spam deterrent. only accepts notes from people who paid a small fee.paid relay Paid relay: A relay that charges a fee, usually in sats, to publish or read, which funds the operator and keeps spam out. - Know who’s talking. Relays can require a login handshake (NIP-42) before accepting notes.
- Trust your friends’ friends. A
filter only lets through people your follows (or their follows) follow. Bots rarely get followed by real people, so they bounce off.web of trust Web of trust: Using the follow graph to decide whom to trust: people followed by people you follow are probably not spammers.
Let’s try the first one. Proof-of-work asks your device to find a note whose
Mine a note, stop a spammer
Proof-of-work makes every note cost a little computing effort. Pick a difficulty and let your browser hunt for an id that starts with enough zero bits.
Current id ································································
Best id so far · Nonce – ································································
Zero bits are highlighted. Each hex 0 is worth 4 bits.
Ready. Press “Start mining” to begin.
Notice the trade-off in the last box? A note that costs you a blink costs a spammer sending ten thousand of them hours. But a spam farm with fast computers pays far less than your phone does, so proof-of-work is a speed bump, not a wall.
Under the hood: NIP-13 proof of work Show details
NIP-13 in one tag. The miner adds a nonce tag: ["nonce", "<counter>", "<target difficulty>"]
and bumps the counter until the event id (the SHA-256 of the serialized event, see chapter 3) has
at least target leading zero bits. The third entry commits to the target, so a lucky
low-effort hit can’t pretend it aimed higher. Here’s the example from
NIP-13, which has 21 leading zero bits
(00000 = 20 bits, then 6 = 0110 adds one more):
{
"id": "000006d8c378af1779d2feebc7603a125d99eca0ccf1085959b307f64e5dd358",
"pubkey": "a48380f4cfcc1ad5378294fcac36439770f9c878dd880ffa94bb74ea54a6f243",
"created_at": 1651794653,
"kind": 1,
"tags": [["nonce", "776797", "20"]],
"content": "It's just me mining my own business",
"sig": "284622fc0a3f4f1303455d5175f7ba962a3300d136085b9566801bc2e0699de0c7e31e44c81fb40ad9049173742e904713c3594a1da0fc5d2382a25c11aba977"
}Because the id doesn’t cover the signature, PoW can even be delegated: a phone can pay a service to mine the nonce, then sign the result itself. With nostr-tools:
import { finalizeEvent, generateSecretKey, getPublicKey } from "nostr-tools/pure";
import { getPow, minePow } from "nostr-tools/nip13";
const sk = generateSecretKey();
const unsigned = {
kind: 1,
created_at: Math.floor(Date.now() / 1000),
tags: [],
content: "gm",
pubkey: getPublicKey(sk),
};
// Synchronous and CPU-heavy: run it in a Web Worker in real apps.
const mined = minePow(unsigned, 16);
console.log(getPow(mined.id)); // ≥ 16
const event = finalizeEvent(mined, sk); // id is unchanged by signingRelays advertise what they demand in their
NIP-11 information document, under
limitation: min_pow_difficulty, auth_required
(NIP-42), payment_required and
restricted_writes.
Discovery: there’s no front page
Twitter-style apps have one giant database and an algorithm that decides what you see. Nostr has
hundreds of relays, and none of them sees everything. That’s great for
- Search only covers the relays you ask, and only relays that support it.
- Finding people often happens by word of mouth, shared follow lists or a NIP-05 name.
- Counting likes or followers is a best guess: you can only count what your relays have.
The ecosystem patches this with search relays, aggregator relays that crawl many others, and custom feeds. They work, but they quietly re-introduce a few big players. Keep an eye on that.
Relay economics: someone pays for the servers
Relays are computers with electricity bills, bandwidth and disks that fill up with every note, image link and reaction. Running one costs real money, and on Nostr there are no ads to pay for it. So relays end up in a few buckets:
- Free relays run by enthusiasts or companies. Lovely, but they can rate-limit you, drop old notes to save space, or simply shut down when the volunteer moves on.
- Paid relays charge a one-time or monthly fee. Less spam, more stability, but now posting has a price tag.
- Your own relay, run at home or on a cheap server, so your notes have at least one home you control.
This is why the
Under the hood: paid relays and NIP-11 fees Show details
How a relay says “this costs money”. The NIP-11 document (fetched over HTTP with
Accept: application/nostr+json) can include payments_url and a fees object:
{
"name": "relay.alpha.example",
"limitation": {
"payment_required": true,
"auth_required": true,
"min_pow_difficulty": 0,
"restricted_writes": true
},
"payments_url": "https://relay.alpha.example/pay",
"fees": {
"admission": [{ "amount": 21000000, "unit": "msats" }],
"subscription": [{ "amount": 5000000, "unit": "msats", "period": 2592000 }],
"publication": [{ "kinds": [4], "amount": 100, "unit": "msats" }]
}
}import { fetchRelayInformation } from "nostr-tools/nip11";
const info = await fetchRelayInformation("wss://relay.alpha.example");
if (info.limitation?.payment_required) console.log("Pay here:", info.payments_url);Paid relays usually combine this with NIP-42
AUTH, so they know which pubkey is connecting and whether it has paid. Writers keep themselves
findable with a kind 10002 relay list
(NIP-65).
Moderation is a client choice
On X, one rulebook applies to everyone. On Mastodon, your server’s admin writes the rulebook. On Nostr, there’s no rulebook at all, just choices:
- A relay decides what it stores. It can refuse notes, ban pubkeys, or only serve paying members.
- Your client decides what it shows. It can hide words, apply your mute list, or respect reports from people you trust.
- You decide which relays and which client to use, and you can switch any time.
The good news: nobody can silence you everywhere. The less-good news: nobody will clean up your feed for you either, and a relay you’d never use can still host things you’d hate. “Free speech” on Nostr means “free to speak”, not “guaranteed an audience”.
Under the hood: mute lists, reports and deletions Show details
The building blocks are ordinary events, so any client can use them:
- Mute list, kind 10000 (NIP-51):
a replaceable list of
p(people),t(hashtags),wordande(threads) to hide. Entries can also be encrypted intocontentso nobody sees whom you muted. - Reports, kind 1984 (NIP-56): a
ptag (and optionallye) with a report type such asspam,impersonationorillegal. Clients decide whose reports to trust, typically only from people you follow. - Deletion requests, kind 5 (NIP-09) and request to vanish, kind 62 (NIP-62): polite asks. Honest relays comply, but a copy someone already downloaded can’t be un-downloaded.
{
"kind": 10000,
"tags": [
["p", "<spammer pubkey hex>"],
["t", "crypto-giveaway"],
["word", "airdrop"]
],
"content": ""
}Data availability: who keeps your notes?
Your notes live wherever relays decided to keep them. If you posted to one free relay and it wiped its database, those notes are gone. Nobody promised to keep them, and there’s no “Nostr archive” in the sky. The flip side: if you publish to several relays (or run your own), your notes are about as durable as it gets, because no single company can delete all the copies.
Write to at least two or three relays you trust, and keep one of them under your control if you care about your history. Exporting your own notes now and then is cheap insurance.
Key loss: no “forgot password” button
This is the big one. Your identity is your private key (your
- Lose it and your account is gone. No email reset, no support ticket, no admin who can help. You make a new key and ask everyone to follow you again.
- Leak it and it’s even worse. The thief can post as you, forever, and relays can’t tell you apart: both of you make perfectly valid signatures. There’s still no standard way to rotate a key (swap it for a new one while keeping your followers); proposals exist, but none has been widely adopted.
So Nostr’s answer is: don’t lose it, and don’t let it leak. Back it up (on paper, or as an
encrypted ncryptsec), and keep it inside a
Under the hood: key backups and remote signers Show details
Backups: NIP-49 encrypts your secret
key with a password (scrypt + XChaCha20-Poly1305) into an ncryptsec1… string you can store more
safely than a raw nsec. NIP-06 derives
keys from a BIP-39 seed phrase, but the NIPs index now marks it unrecommended in favor of a single
nsec: back that nsec up as an ncryptsec instead.
import { generateSecretKey } from "nostr-tools/pure";
import { decrypt, encrypt } from "nostr-tools/nip49";
const sk = generateSecretKey();
const backup = encrypt(sk, "correct horse battery staple"); // "ncryptsec1…"
const restored = decrypt(backup, "correct horse battery staple"); // same bytes as skContainment: NIP-46 remote signers (bunkers) and NIP-07 extensions keep the key out of apps. Rotation: an early attempt at sub-keys, NIP-26 delegation, is now marked unrecommended, and key-migration proposals are still debated. If your key leaks today, the practical answer is a new key plus a signed note from the old one telling followers where you went (which the thief could also fake).
What could possibly go wrong?
Enough theory. Flip on a few bad days and see how each network copes. Then turn on some Nostr precautions and watch the red turn green (well, most of it).
What could possibly go wrong?
Flip on some bad days and see how each network copes. Then flip on Nostr precautions and see what changes.
Eek! Nostr has no undo button for that!
- Nostr Disaster
- Disaster: Your identity is gone for good. Make a new key and ask everyone to follow it.
- X Annoying
- Annoying: Reset by email or phone. The company lets you back in.
- Mastodon Annoying
- Annoying: Your instance admin resets your password by email.
- Bluesky Annoying
- Annoying: Reset your password by email; your hosting server manages the keys.
Nostr: Disaster. X: Annoying. Mastodon: Annoying. Bluesky: Annoying.
See the pattern? Big platforms are great at recovering you (they hold the keys) and terrible at not banning you (they hold the keys). Nostr is the exact mirror image. Which one you want depends on which bad day scares you more.
The big comparison
Nostr isn’t the only project trying to fix social media. Mastodon (part of the
There’s no winner, only trade-offs. Tick the things you care about and watch the ranking change:
The no-spin comparison matrix
Tick what matters to you and watch the ranking reshuffle. Tap any cell to read why it got that rating.
Your ranking
With your priorities, Bluesky comes out on top. Nostr isn't for everyone, and that's fine!
Notice how the winner changes with your priorities? That's the honest answer: there is no best network, only trade-offs.
| What you care about | Nostr | X | Mastodon | Bluesky |
|---|---|---|---|---|
| You own your identity | ||||
| Hard to silence | ||||
| Take your followers anywhere | ||||
| Spam defense | ||||
| Finding people & posts | ||||
| You choose your moderation | ||||
| Your posts stay online | ||||
| Account recovery | ||||
| Anyone can build an app |
Pick a cell in the table to see the reasoning.
The scores are our honest, simplified judgement as of 2026, and every network is still changing fast. Tap a cell to see the reasoning, and feel free to disagree!
Quick check
You did it!
From “why bother?” all the way to “what’s the catch?”. You can now explain keys, events, relays, filters, kinds, the social graph, private messages, zaps, signers, the ecosystem and its trade-offs. That’s a lot of nostrich knowledge.
Congratulations, fellow nostrich. You finished the course.
You graduated from Nostr School!
Twelve chapters, from “why?” to “what's the catch?”. You now know more about Nostr than most of the people using it.
You've marked 0 of 12 chapters complete.
Where to next?
Keep practicing
Go deeper
- The NIPs repository (opens a new tab) The protocol specs, straight from the source.
- nostr-tools (opens a new tab) The JavaScript library this course uses.
- nostr.com (opens a new tab) A friendly overview with links to clients.
- nostr.how (opens a new tab) Step-by-step guides for getting started.
- awesome-nostr (opens a new tab) A huge community list of projects.
Takeaways
- Nostr trades convenience for control: nobody can take your identity away, but nobody can give it back either.
- There's no central spam team. Relays and clients fight spam with proof-of-work (NIP-13), paid relays, authentication and web-of-trust filters.
- Relays are run by people who pay real bills. Free relays may delete old data; publishing to several relays (NIP-65) keeps your notes findable.
- Moderation is a choice your client and relays make for you, not one global rulebook.
- Losing or leaking your private key is Nostr's hardest problem: there's no password reset and no standard key rotation yet.