Thread

🛡️
Article header

Community Curation of Custom NIPs

This article outlines a simple system to delegate curation of nostr NIPs to your personalized web of trust. Custom NIPs (kind 30817) at NostrHub.io will be enhanced using kind 7 reactions (+/−) for up/downvotes. Reactions will be filtered using personalized GrapeRank metrics communicated via Trusted Assertions. Additional features can be added in the future to ensure a rich, robust and truly decentralized system of NIP management.

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

  1. Remove obvious spam

  2. Highlight proposals with meaningful community approval

The Solution: Three NIPs, One System

We rely upon 3 existing NIPs:

Step 1: Enable Upvote & Downvote Buttons

Add thumbs-up and thumbs-down buttons in two places:

  1. On each individual custom NIP page

  2. 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.

Replies (0)

No replies yet. Be the first to leave a comment!