Self-hosted Nostr indexer for NIP-35 torrent events with federated curation
Understanding and configuring Lighthouse’s trust system.
Lighthouse uses a Web of Trust model to filter content. Instead of relying on a central authority to moderate content, trust flows through cryptographic relationships.
Traditional torrent indexers are:
Lighthouse distributes trust through three actors:
| Actor | Role |
|---|---|
| Emitter | Creates and signs torrent metadata |
| Curator | Validates emitters, maintains trust lists |
| User | Chooses which curators to trust |
The trust.depth setting controls how far trust extends:
| Depth | What You See |
|---|---|
| 0 | Only whitelisted publishers |
| 1 | Whitelist + people you follow on Nostr |
| 2 | Above + friends of friends |
Most restrictive. Only content from manually added npubs appears.
trust:
depth: 0
Use when:
Content from your Nostr contact list plus whitelist.
trust:
depth: 1
Use when:
Content from follows of follows. Use carefully - can be noisy.
trust:
depth: 2
Use when:
Manually trusted publishers. Always visible regardless of depth.
Add via UI:
Add via API:
curl -X POST http://localhost:9999/api/trust/whitelist \
-H "X-API-Key: your-key" \
-H "Content-Type: application/json" \
-d '{"npub": "npub1...", "note": "Trusted uploader"}'
Blocked publishers. Content never appears, regardless of trust.
Add via UI:
Blacklisting:
Add via API:
curl -X POST http://localhost:9999/api/trust/blacklist \
-H "X-API-Key: your-key" \
-H "Content-Type: application/json" \
-d '{"npub": "npub1...", "reason": "Spam"}'
Import your Nostr contact list:
For more sophisticated trust, use Curators.
A curator is a trusted entity that:
| Approach | Pros | Cons |
|---|---|---|
| Simple WoT | Easy, automatic | Limited moderation |
| Curators | Active moderation, rulesets | More setup |
When multiple curators exist, decisions are aggregated:
| Mode | Behavior |
|---|---|
any |
Any accept = content appears |
all |
All must accept |
quorum |
N of M must agree |
weighted |
Weight-based voting |
Configure in UI:
Configure via API:
curl -X PUT http://localhost:9999/api/trust/aggregation \
-H "X-API-Key: your-key" \
-H "Content-Type: application/json" \
-d '{"mode": "quorum", "quorum_required": 2}'
You → follow → Alice → uploads content → You see it
You → follow → Bob → follows → Carol → uploads → You DON'T see it (depth 1)
Curator → accepts → Torrent
You → trust → Curator
Result: You see the torrent
Curator A → accepts
Curator B → accepts
Curator C → rejects
Policy: quorum=2
Result: Content appears (2/3 accept)
Curators create signed decisions:
{
"decision": "accept",
"reason_codes": [],
"ruleset_type": "semantic",
"ruleset_version": "1.0.0",
"ruleset_hash": "sha256...",
"target_infohash": "aabbccdd...",
"curator_pubkey": "npub1...",
"signature": "sig..."
}
Certain rejection codes always take priority:
| Code | Description | Behavior |
|---|---|---|
LEGAL_DMCA |
DMCA takedown | Always reject |
LEGAL_ILLEGAL |
Illegal content | Always reject |
ABUSE_SPAM |
Spam | Always reject |
ABUSE_MALWARE |
Malware | Always reject |
These override aggregation policy - one rejection with these codes means content is rejected.
Your Nostr identity is:
Protect your nsec:
Before trusting a curator:
If a curator goes rogue: