The vision of community-curated Nostr Implementation Possibilities (NIPs) has long inspired the Nostr ecosystem. With Alex Gleason' s “NIP NIP ” — a meta-spec enabling anyone to publish custom NIPs outside the official repository — and its live implementation on NostrHub.io, that vision took a major step forward.
But while anyone can now author and archive a custom NIP, truly decentralized curation remains elusive. How do we remove the burden of NIP curation from any single individual or group? How do we surface proposals with genuine community support while filtering out spam?
This article proposes a minimal, decentralized, and trust-aware voting system for custom NIPs — one that builds on existing NIPs, requires no new backend infrastructure, and leverages personalized reputation.
The Two Core Needs
-
Remove obvious spam
-
Highlight proposals with meaningful community approval
The Solution: Three NIPs, One System
We rely upon 3 existing NIPs:
-
NIPs on Nostr – for publishing to NostrHub, outside the official repo
-
NIP-25: Reactions – for + and - votes
-
NIP-85: Trusted Assertions – the repository of personalized GrapeRank metrics (and other metrics, once NIP-85 enabled Service Providers other than Brainstorm become available)
Step 1: Enable Upvote & Downvote Buttons
Add thumbs-up and thumbs-down buttons in two places:
-
On each individual custom NIP page
-
On each NIP card in the main listing
Clicking either button publishes a Kind 7 reaction event:
{
"kind": 7,
"content": "+", // or "-"
"tags": [
["a", "30817:<pubkey>:<d-tag>"] // the custom NIP
]
}
These events are broadcast to the same relays used by NostrHub for comments (Kind 1111), ensuring consistency and discoverability.
Step 2: Display Raw Vote Counts
Next to the buttons, show total vote counts:
👍 42 👎 8
These numbers come from a simple filter:
{
kinds: [7],
"#a": ["30817:<pubkey>:<d-tag>"]
}
Step 3: Filter Votes by Trust (NIP-85)
Raw counts are vulnerable to spam. A single user with 100 keys can flood a NIP with fake upvotes.
Enter NIP-85: Trusted Assertions — Vitor Pamplona' s framework for decentralized reputation.
Using the rank metric from NIP-85:
-
Each voter’s pubkey is assigned a trust score based on your personal web of trust (if available)
-
For users whose Trusted Assertions have not been published, use metrics personalized to a suitable default npub such as Soapbox
-
Only reactions from users above a minimum rank threshold are counted
-
Reactions from spam accounts with no trusted connections are automatically ignored
This is personalized filtering: your view reflects your trust graph.
Step 4: Calculate Approval Rating
Approval Score = (Trusted Upvotes) − (Trusted Downvotes)
Or, for more nuance (future versions):
Approval % = Trusted Upvotes / (Trusted Upvotes + Trusted Downvotes)
Result: Fully Decentralized NIP Curation
| NIP | + | - | Approval Score | Status | | ------------------- | -- | -- | -------------- | -------- | | Decentralized Lists | 38 | 3 | +35 | Promoted | | Spammy Spam | 0 | 15 | -15 | Hidden | | Nippy NIP | 0 | 0 | 0 | Neutral |
Future Enhancements (Post-MVP)
Once the core system is live, consider:
-
Curation by specific populations e.g., “Nostr Devs” (which can be curated using the Decentralized Lists custom NIP)
-
Decentralized Lists (Custom NIP) to sort NIPs into categories, e.g. "core nostr NIPs" or "e-commerce NIPs"
-
Implementation tracking: scrape nostr data to measure which clients utilize which NIPs and kinds
But keep v1 simple. Ship fast. Iterate.
Conclusion
Custom NIPs exist at the cutting edge of Nostr innovation. With Kind 7 reactions, personalized GrapeRank trust metrics, and Trusted Assertions, we can achieve what many will say is impossible: truly decentralized curation of the entire nostr protocol.