Reposts
NIP-18 defines how to repost content on Nostr, similar to retweets on Twitter. It supports both simple reposts and quote posts with added commentary.
NIP-18: Reposts
Status: Final Author: jb55 Category: Social
Overview
NIP-18 defines how to repost content on Nostr - equivalent to retweeting on Twitter or boosting on Mastodon.
Two types of reposts:
- Simple repost - Share someone’s post as-is
- Quote post - Share with your own commentary
Reposts help content spread across the network and give credit to original authors.
Why Reposts Matter
For Content Distribution
- Amplify good content to your followers
- Credit original authors with proper attribution
- Enable discovery across different relay sets
For Social Dynamics
- Endorsement - Reposting implies you value the content
- Commentary - Quote posts add your perspective
- Metrics - Repost counts indicate content reach
Simple Repost (Kind 6)
A simple repost shares content without additional commentary.
Event Structure
{
"kind": 6,
"pubkey": "your_pubkey",
"created_at": 1234567890,
"tags": [
["e", "original_event_id", "relay_url"],
["p", "original_author_pubkey"]
],
"content": "",
"sig": "..."
}
Tag Requirements
| Tag | Purpose |
|---|---|
e | Reference to original event (required) |
p | Original author’s pubkey (required) |
Content Field
For simple reposts, the content field should be empty or contain the stringified JSON of the original event (for relay redundancy).
Quote Post (Kind 1)
A quote post is a regular text note (kind 1) that references another post.
Event Structure
{
"kind": 1,
"pubkey": "your_pubkey",
"created_at": 1234567890,
"tags": [
["q", "quoted_event_id", "relay_url"],
["p", "quoted_author_pubkey"]
],
"content": "Great point! I'd add that...\n\nnostr:nevent1...",
"sig": "..."
}
Quote Tag (q)
The q tag specifically indicates a quoted event:
["q", "event_id", "relay_url"]
Content with Reference
Include the quoted event reference in the content:
My commentary here...
nostr:nevent1...
Clients render this with an embedded preview of the quoted post.
Implementation
Creating a Repost
// Simple repost
const repost = {
kind: 6,
created_at: Math.floor(Date.now() / 1000),
tags: [
["e", originalEvent.id, "wss://relay.example.com"],
["p", originalEvent.pubkey]
],
content: JSON.stringify(originalEvent) // optional
};
// Sign and publish
signedEvent = await signEvent(repost);
publish(signedEvent);
Creating a Quote Post
import { nip19 } from 'nostr-tools';
// Encode event reference
const nevent = nip19.neventEncode({
id: originalEvent.id,
relays: ["wss://relay.example.com"]
});
// Quote post
const quotePost = {
kind: 1,
created_at: Math.floor(Date.now() / 1000),
tags: [
["q", originalEvent.id, "wss://relay.example.com"],
["p", originalEvent.pubkey]
],
content: `I love this take!\n\nnostr:${nevent}`
};
Client Display
Simple Repost
Clients typically show:
🔄 @username reposted
[Original post content]
Quote Post
Clients show:
@username
My commentary here...
╭──────────────────╮
│ 🔗 @original_author │
│ Original post content... │
╰──────────────────╯
Counting Reposts
To count reposts of an event:
// Query for kind 6 events referencing your event
const filter = {
kinds: [6],
"#e": [yourEventId]
};
// Subscribe and count
const reposts = await queryRelays(filter);
console.log(`Repost count: ${reposts.length}`);
Best Practices
For Users
- Repost quality content you genuinely endorse
- Use quote posts when adding meaningful commentary
- Credit the original author appropriately
- Consider context - reposts reach your audience
For Developers
- Display attribution clearly
- Handle missing originals gracefully
- Deduplicate reposts in feeds
- Support both types (kind 6 and quoted kind 1)
Generic Repost (Kind 16)
NIP-18 also defines kind 16 for reposting any event type (not just kind 1):
{
"kind": 16,
"tags": [
["e", "original_event_id", "relay"],
["k", "original_event_kind"]
],
"content": ""
}
The k tag specifies the kind of the original event.
Client Support
All major clients support reposts:
| Client | Simple Repost | Quote Post |
|---|---|---|
| Damus | Yes | Yes |
| Primal | Yes | Yes |
| Amethyst | Yes | Yes |
| Snort | Yes | Yes |
| Coracle | Yes | Yes |
| noStrudel | Yes | Yes |
Relation to Other NIPs
- NIP-01 - Base event structure
- NIP-10 - Reply threading (different from quoting)
- NIP-25 - Reactions (likes, not reposts)
Common Questions
Repost vs Reply?
- Repost shares content to your followers
- Reply responds in the conversation thread
Can I un-repost?
Yes, publish a deletion request (NIP-09) for your kind 6 event. However, some relays may not honor deletions.
Are reposts counted in metrics?
Yes, most clients display repost counts alongside reactions and replies.
What about reposting DMs?
DMs (kind 4) shouldn’t be reposted as they’re encrypted. Clients should prevent reposting private content.
Summary
NIP-18 enables content sharing on Nostr:
- Kind 6 for simple reposts (boosting)
- Kind 1 with q tag for quote posts
- Kind 16 for generic reposts
Reposts help good content spread while properly attributing original creators.
Last updated: January 2026 Official specification: GitHub
Client Support
This NIP is supported by the following clients: