Compare commits

..

10 Commits

Author SHA1 Message Date
fiatjaf
53aac046c5 nip46: remove mysterious <required-secret-value> 2025-07-17 12:18:03 -03:00
benthecarman
1afb6da049 NIP-87: Ecash Mint Discoverability (#1110)
Co-authored-by: Pablo Fernandez <pfer@me.com>
2025-07-16 12:13:09 +01:00
Giovanni
d306f6b3f8 add peach bitcoin nip-69 implementation (#1961) 2025-07-12 18:04:35 +01:00
Alex Gleason
82fffa0580 NIP-72: use kind 1111 events for text notes (#1953) 2025-07-11 00:58:51 -04:00
fiatjaf_
477e3dfd4d add "mute" OK=false status for no-op ephemeral events (#1965) 2025-07-07 10:50:54 -03:00
fiatjaf
9afca6c4dc nip51: clarify kind:10012 description. 2025-07-03 19:45:38 -03:00
Gamma Markets
4eed6e8368 nip99 e-commerce use case extension (#1784) 2025-07-02 10:47:46 -07:00
Awiteb
db3e3bddbe nip34: change 'defaults' to 'is' in patch revision status description (#1964) 2025-07-02 08:15:12 -03:00
Awiteb
6f3926c5b2 nip-34: Improve readability (#1954)
Signed-off-by: Awiteb <a@4rs.nl>
2025-06-18 08:53:58 -07:00
Bitkarrot
223bbdc152 [NIP 53 Addendum] - Add Interactive Rooms, Meetings, and Live Presence. (#1789) 2025-06-11 11:22:18 -04:00
11 changed files with 352 additions and 98 deletions

3
01.md
View File

@@ -170,8 +170,9 @@ This NIP defines no rules for how `NOTICE` messages should be sent or treated.
* `["OK", "b1a649ebe8...", false, "pow: difficulty 26 is less than 30"]`
* `["OK", "b1a649ebe8...", false, "restricted: not allowed to write."]`
* `["OK", "b1a649ebe8...", false, "error: could not connect to the database"]`
* `["OK", "b1a649ebe8...", false, "mute: no one was listening to your ephemeral event and it wasn't handled in any way, it was ignored"]`
- `CLOSED` messages MUST be sent in response to a `REQ` when the relay refuses to fulfill it. It can also be sent when a relay decides to kill a subscription on its side before a client has disconnected or sent a `CLOSE`. This message uses the same pattern of `OK` messages with the machine-readable prefix and human-readable message. Some examples:
* `["CLOSED", "sub1", "unsupported: filter contains unknown elements"]`
* `["CLOSED", "sub1", "error: could not connect to the database"]`
* `["CLOSED", "sub1", "error: shutting down idle subscription"]`
- The standardized machine-readable prefixes for `OK` and `CLOSED` are: `duplicate`, `pow`, `blocked`, `rate-limited`, `invalid`, `restricted`, and `error` for when none of that fits.
- The standardized machine-readable prefixes for `OK` and `CLOSED` are: `duplicate`, `pow`, `blocked`, `rate-limited`, `invalid`, `restricted`, `mute` and `error` for when none of that fits.

10
34.md
View File

@@ -70,9 +70,9 @@ The `refs` tag can be optionally extended to enable clients to identify how many
Patches can be sent by anyone to any repository. Patches to a specific repository SHOULD be sent to the relays specified in that repository's announcement event's `"relays"` tag. Patch events SHOULD include an `a` tag pointing to that repository's announcement address.
Patches in a patch set SHOULD include a NIP-10 `e` `reply` tag pointing to the previous patch.
Patches in a patch set SHOULD include a [NIP-10](10.md) `e` `reply` tag pointing to the previous patch.
The first patch revision in a patch revision SHOULD include a NIP-10 `e` `reply` to the original root patch.
The first patch revision in a patch revision SHOULD include a [NIP-10](10.md) `e` `reply` to the original root patch.
```jsonc
{
@@ -125,7 +125,7 @@ Issues may have a `subject` tag, which clients can utilize to display a header.
## Replies
Replies to either a `kind:1621` _issue_ or a `kind:1617` _patch_ event should follow [NIP-22 comment](22.md).
Replies to either a `kind:1621` (_issue_) or a `kind:1617` (_patch_) event should follow [NIP-22 comment](22.md).
## Status
@@ -161,9 +161,9 @@ Root Patches and Issues have a Status that defaults to 'Open' and can be set by
}
```
The Status event with the largest created_at date is valid.
The most recent Status event (by `created_at` date) from either the issue/patch author or a maintainer is considered valid.
The Status of a patch-revision defaults to either that of the root-patch, or `1632` (Closed) if the root-patch's Status is `1631` and the patch-revision isn't tagged in the `1631` event.
The Status of a patch-revision is to either that of the root-patch, or `1632` (_Closed_) if the root-patch's Status is `1631` (_Applied/Merged_) and the patch-revision isn't tagged in the `1631` (_Applied/Merged_) event.
## Possible things to be added later

20
46.md
View File

@@ -95,16 +95,16 @@ The `content` field is a JSON-RPC-like message that is [NIP-44](44.md) encrypted
Each of the following are methods that the _client_ sends to the _remote-signer_.
| Command | Params | Result |
| ------------------------ | ------------------------------------------------- | ---------------------------------------------------------------------- |
| `connect` | `[<remote-signer-pubkey>, <optional_secret>, <optional_requested_permissions>]` | "ack" OR `<required-secret-value>` |
| `sign_event` | `[<{kind, content, tags, created_at}>]` | `json_stringified(<signed_event>)` |
| `ping` | `[]` | "pong" |
| `get_public_key` | `[]` | `<user-pubkey>` |
| `nip04_encrypt` | `[<third_party_pubkey>, <plaintext_to_encrypt>]` | `<nip04_ciphertext>` |
| `nip04_decrypt` | `[<third_party_pubkey>, <nip04_ciphertext_to_decrypt>]` | `<plaintext>` |
| `nip44_encrypt` | `[<third_party_pubkey>, <plaintext_to_encrypt>]` | `<nip44_ciphertext>` |
| `nip44_decrypt` | `[<third_party_pubkey>, <nip44_ciphertext_to_decrypt>]` | `<plaintext>` |
| Command | Params | Result |
| ------------------------ | ------------------------------------------------- | ---------------------------------------------------------------------- |
| `connect` | `[<remote-signer-pubkey>, <optional_secret>, <optional_requested_permissions>]` | "ack" |
| `sign_event` | `[<{kind, content, tags, created_at}>]` | `json_stringified(<signed_event>)` |
| `ping` | `[]` | "pong" |
| `get_public_key` | `[]` | `<user-pubkey>` |
| `nip04_encrypt` | `[<third_party_pubkey>, <plaintext_to_encrypt>]` | `<nip04_ciphertext>` |
| `nip04_decrypt` | `[<third_party_pubkey>, <nip04_ciphertext_to_decrypt>]` | `<plaintext>` |
| `nip44_encrypt` | `[<third_party_pubkey>, <plaintext_to_encrypt>]` | `<nip44_ciphertext>` |
| `nip44_decrypt` | `[<third_party_pubkey>, <nip44_ciphertext_to_decrypt>]` | `<plaintext>` |
### Requested permissions

2
51.md
View File

@@ -32,7 +32,7 @@ For example, _mute list_ can contain the public keys of spammers and bad actors
| Blocked relays | 10006 | relays clients should never connect to | `"relay"` (relay URLs) |
| Search relays | 10007 | relays clients should use when performing search queries | `"relay"` (relay URLs) |
| Simple groups | 10009 | [NIP-29](29.md) groups the user is in | `"group"` ([NIP-29](29.md) group id + relay URL + optional group name), `"r"` for each relay in use |
| Favorite relays | 10012 | user favorite relays and pointers to relay sets | `"relay"` (relay URLs) and `"a"` (kind:30002 relay set) |
| Relay feeds | 10012 | user favorite browsable relays (and relay sets) | `"relay"` (relay URLs) and `"a"` (kind:30002 relay set) |
| Interests | 10015 | topics a user may be interested in and pointers | `"t"` (hashtags) and `"a"` (kind:30015 interest set) |
| Media follows | 10020 | multimedia (photos, short video) follow list | `"p"` (pubkeys -- with optional relay hint and petname) |
| Emojis | 10030 | user preferred emojis and pointers to emoji sets | `"emoji"` (see [NIP-30](30.md)) and `"a"` (kind:30030 emoji set) |

143
53.md
View File

@@ -129,3 +129,146 @@ Common use cases include meeting rooms/workshops, watch-together activities, or
"sig": "997f62ddfc0827c121043074d50cfce7a528e978c575722748629a4137c45b75bdbc84170bedc723ef0a5a4c3daebf1fef2e93f5e2ddb98e5d685d022c30b622"
}
```
## Interactive Rooms and Meetings
-----
`draft` `optional`
Service providers want to offer Interactive Rooms to the Nostr network in such a way that participants can easily log and query by clients. This NIP describes a general framework to advertise rooms and their associated events.
## Concepts
### Interactive Room (kind:30312)
A special event with `kind:30312` "Interactive Room" defines the configuration and properties of a virtual interactive space. Each room has a unique identifier and can host multiple events/meetings.
```jsonc
{
"kind": 30312,
"tags": [
["d", "<unique identifier>"], // Required: Room identifier
["room", "<name of the room>"], // Required: Display name
["summary", "<description>"], // Optional: Room description
["image", "<preview image url>"], // Optional: Room image
["status", "<open, private, closed>"], // Required: Room accessibility
["service", "<url>"], // Required: URL to access the room
["endpoint", "<url>"], // Optional: API endpoint for status/info
["t", "<hashtag>"], // Optional: Multiple hashtags allowed
["p", "<pubkey>", "<url>", "<role>", "<proof>"], // Required: At least one provider
["relays", "<url>", "<url>", /*...*/] // Optional: Preferred relays
],
"content": "" // Usually empty, may contain additional metadata
}
```
Room properties:
* MUST be either open, private or closed. Closed means the room is not in operation.
* MAY specify access control policy for private rooms (e.g. invite-only, payment required)
* MAY persist when not in use
* MUST have at least one provider with "Host" role
* MAY have multiple providers with different roles
Provider roles (p tags):
* Host: Full room management capabilities
* Moderator: Room moderation capabilities
* Speaker: Allowed to present/speak
* Optional proof field for role verification
### Room Meeting (kind:30313)
A special event with kind:30313 represents a scheduled or ongoing meeting within a room. It MUST reference its parent room using the d tag.
```jsonc
{
"kind": 30313,
"tags": [
["d", "<event-unique-identifier>"], // Required: Event identifier
["a", "30312:<pubkey>:<room-id>", "wss://nostr.example.com"], // Required: Reference to parent room, 'd' from 30312
["title", "<meeting-title>"], // Required: Meeting title
["summary", "<description>"], // Optional: Meeting description
["image", "<preview image url>"], // Optional: Meeting image
["starts", "<unix timestamp>"], // Required: Start time
["ends", "<unix timestamp>"], // Optional: End time
["status", "<planned, live, ended>"], // Required: Meeting status
["total_participants", "<number>"], // Optional: Total registered
["current_participants", "<number>"], // Optional: Currently active
["p", "<pubkey>", "<url>", "<role>"], // Optional: Participant with role
],
"content": "" // Usually empty, may contain additional metadata
}
```
Event properties:
* MUST reference parent room via d tag
* MUST have a status (planned/live/ended)
* MUST have a start time
* MAY track participant counts
* MAY include participant roles specific to the event
Event management:
* Clients SHOULD update event status regularly when live
* Events without updates for 1 hour MAY be considered ended
* starts and ends timestamps SHOULD be updated when status changes
Examples
Interactive Room (kind:30312)
```jsonc
{
"kind": 30312,
"tags": [
["d", "main-conference-room"],
["room", "Main Conference Hall"],
["summary", "Our primary conference space"],
["image", "https://example.com/room.jpg"],
["status", "open"],
["service", "https://meet.example.com/room"],
["endpoint", "https://api.example.com/room"],
["t", "conference"],
["p", "f7234bd4c1394dda46d09f35bd384dd30cc552ad5541990f98844fb06676e9ca", "wss://nostr.example.com/", "Owner"],
["p", "14aeb..8dad4", "wss://provider2.com/", "Moderator"],
["relays", "wss://relay1.com", "wss://relay2.com"]
],
"content": ""
}
```
Conference Event (kind:30313)
```jsonc
{
"kind": 30313,
"tags": [
["d", "annual-meeting-2025"],
["a", "30312:f7234bd4c1394dda46d09f35bd384dd30cc552ad5541990f98844fb06676e9ca:main-conference-room", "wss://nostr.example.com"]
["title", "Annual Company Meeting 2025"],
["summary", "Yearly company-wide meeting"],
["image", "https://example.com/meeting.jpg"],
["starts", "1676262123"],
["ends", "1676269323"],
["status", "live"],
["total_participants", "180"],
["current_participants", "175"],
["p", "91cf9..4e5ca", "wss://provider1.com/", "Speaker"],
],
"content": ""
}
```
## Room Presence
New `kind: 10312` provides an event which signals presence of a listener.
The presence event SHOULD be updated at regular intervals and clients SHOULD filter presence events older than
a given time window.
**This kind `10312` is a regular replaceable event, as such presence can only be indicated in one room at a time.**
```json
{
"kind": 10312,
"tags": [
["a" , "<room-a-tag>", "<relay-hint>", "root"],
["hand", "1"] // hand raised flag
]
}
```

1
69.md
View File

@@ -80,6 +80,7 @@ Currently implemented on the following platforms:
- [Mostro](https://github.com/MostroP2P/mostro)
- [@lnp2pBot](https://github.com/lnp2pBot/bot)
- [Robosats](https://github.com/RoboSats/robosats/pull/1362)
- [Peach Bitcoin](https://github.com/Peach2Peach/peach-nostr-announcer-bot)
## References

44
72.md
View File

@@ -41,19 +41,55 @@ The goal of this NIP is to enable public communities. It defines the replaceable
# Posting to a community
Any Nostr event can be posted to a community. Clients MUST add one or more community `a` tags, each with a recommended relay.
[NIP-22](NIP-22) kind 1111 events SHOULD be used for text notes posted to a community, with the `A` tag always scoped to the community definition.
## Top-level posts
For top-level posts, the uppercase and lowercase NIP-22 tags should both refer to the community definition itself.
```jsonc
{
"kind": 1,
"kind": 1111,
"tags": [
["a", "34550:<community event author pubkey>:<community-d-identifier>", "<optional-relay-url>"],
["A", "34550:<community-author-pubkey>:<community-d-identifier>", "<optional-relay-url>"],
["a", "34550:<community-author-pubkey>:<community-d-identifier>", "<optional-relay-url>"],
["P", "<community-author-pubkey>", "<optional-relay-url>"],
["p", "<community-author-pubkey>", "<optional-relay-url>"],
["K", "34550"],
["k", "34550"],
],
"content": "hello world",
"content": "Hi everyone. It's great to be here!",
// other fields...
}
```
## Nested replies
For nested replies, the uppercase tags should still refer to the community definition, while the lowercase tags should refer to the parent post or reply.
```jsonc
{
"kind": 1111,
"tags": [
// community definition itself
["A", "34550:<community-author-pubkey>:<community-d-identifier>", "<optional-relay-url>"],
["P", "<community-author-pubkey>", "<optional-relay-url>"],
["K", "34550"],
// parent post or reply
["e", "<parent-event-id>", "<optional-relay-url>"],
["p", "<parent-event-author-pubkey>", "<optional-relay-url>"],
["k", "<parent-event-kind>"] // most likely "1111"
],
"content": "Agreed! Welcome everyone!",
// other fields...
}
```
## Backwards compatibility note
Previously kind 1 events were used for posts in communities, with an "a" tag pointing to the community. For backwards compatibility, clients MAY still query for kind 1 events, but SHOULD NOT use them for new posts. Instead, clients SHOULD use kind 1111 events with the `A` and `a` tags as described above.
# Moderation
Anyone may issue an approval event to express their opinion that a post is appropriate for a community. Clients MAY choose which approval events to honor, but SHOULD at least use ones published by the group's defined moderators.

142
87.md Normal file
View File

@@ -0,0 +1,142 @@
NIP-87
======
Ecash Mint Discoverability
--------------------------------
`draft` `optional`
This NIP describes `kind:38173`, `kind:38172` and `kind:38000`: a way to discover ecash mints, their capabilities, and people who recommend them.
## Rationale
Nostr's discoverability and transparent event interaction is one of its most interesting/novel mechanics.
This NIP provides a simple way for users to discover ecash mints recommended by other users and to interact with them.
### Parties involved
There are three actors to this workflow:
* An ecash mint operator, announces their mint and its capabilities.
* Publishes `kind:38173` or `kind:38172`, detailing how to connect to it and its capabilities.
* user A, who recommends an ecash mint
* Publishes `kind:38000`
* user B, who seeks a recommendation for an ecash mint
* Queries for `kind:38000` and, based on results, queries for `kind:38173`/`kind:38172`
## Events
### Recommendation event
```json
{
"kind": 38000,
"pubkey": <recommender-user-pubkey>,
"tags": [
["k", "38173"],
["d", "<d-identifier>"],
["u", <recommended-fedimint-invite-code>],
["a", "38173:fedimint-pubkey:<d-identifier>", "wss://relay1"]
],
"content": "I trust this mint with my life"
}
```
The recommendation event is a parameterized-replacable event so that a user can change edit their recommendation without creating a new event.
The `d` tag in `kind:38000` is the `kind:38173`/`kind:38172` event identifier this event is recommending, if no event exists, the `d` tag can still be calculated from the mint's pubkey/id.
The `k` tag is the kind number that corresponds to the event kind that the user is recommending, in this case `kind:38173` for fedimints and `kind:38172` for cashu mints.
Optional `u` tags can be added to give a recommend way to connect to the mint.
The value of the tag is the URL or invite code of the ecash mint.
Multiple `u` tags can appear on the same `kind:38000`.
`a` tags are used to point to the `kind:38173`/`kind:38172` event of the ecash mint.
The first value of the tag is the `kind:38173`/`kind:38172` event identifier, the second value of the tag is a relay hint.
This is used to correctly point to the mint's `kind:38173`/`kind:38172` event in case there are duplicates claiming to be the same mint.
The content can be used to give a review.
## Ecash Mint Information
Cashu mints SHOULD publish `kind:38172` events to announce their capabilities and how to connect to them.
For cashu mints, the `u` tag SHOULD be the URL to the cashu mint and it should list the nuts that the cashu mint supports.
The `d` tag SHOULD be the mint's pubkey (found when querying `/v1/info`), this way users can query by pubkey and find the mint announcement.
An `n` tag SHOULD be added to signify the network the cashu mint is on (either `mainnet`, `testnet`, `signet`, or `regtest`)
```json
{
"kind": 38172,
"pubkey": "<application-pubkey>",
"content": "<optional-kind:0-style-metadata>",
"tags": [
["d", <cashu mint pubkey>],
["u", "https://cashu.example.com"],
["nuts", "1,2,3,4,5,6,7"],
["n", "mainnet"]
]
}
```
Fedimints SHOULD publish `kind:38173` events to announce their capabilities and how to connect to them.
For fedimints, it should list all known fedimint invite codes in `u` tags and it should list the modules it supports.
The `d` tag SHOULD be the federation id, this way users can query by federation id and find the fedimint announcement.
An `n` tag SHOULD be added to signify the network the fedimint is on (either `mainnet`, `testnet`, `signet`, or `regtest`)
```json
{
"kind": 38173,
"pubkey": "<application-pubkey>",
"content": "<optional-kind:0-style-metadata>",
"tags": [
["d", <federation-id>],
["u", "fed11abc.."],
["u", "fed11xyz.."],
["modules", "lightning,wallet,mint"],
["n", "signet"]
]
}
```
* `content` is an optional `metadata`-like stringified JSON object, as described in NIP-01. This content is useful when the pubkey creating the `kind:38173` is not a normal user. If `content` is empty, the `kind:0` of the pubkey should be used to display mint information (e.g. name, picture, web, LUD16, etc.)
## Example
### User A recommends some mints
User A might be a user of a cashu mint. Using a client, user A publishes an event recommending the cashu mint they use.
```json
{
"kind": 38000,
"tags": [
["u", "fed11abc..", "fedimint"],
["u", "https://cashu.example.com", "cashu"],
["a", "38173:fedimint-pubkey:<d-identifier>", "wss://relay1", "fedimint"],
["a", "38172:cashu-mint-pubkey:<d-identifier>", "wss://relay2", "cashu"]
],
...
}
```
### User B finds a mint
User B wants to use an ecash wallet, they need to find a mint.
User B's wallet client queries for `kind:38000` events, looking for recommendations for ecash mints.
```json
["REQ", <id>, [{ "kinds": [38000], "authors": [<user>, <users-contact-list>], "#k": ["38173"] }]]
```
User B, who follows User A, sees that `kind:38000` event and tries to connect to the corresponding mints.
### Alternative query bypassing `kind:38000`
Alternatively, users might choose to query directly for `kind:38173` for an event kind. Clients SHOULD be careful doing this and use spam-prevention mechanisms or querying high-quality restricted relays to avoid directing users to malicious handlers.
```json
["REQ", <id>, [{ "kinds": [38173], "authors": [...] }]]
```

2
99.md
View File

@@ -8,7 +8,7 @@ Classified Listings
This NIP defines `kind:30402`: an addressable event to describe classified listings that list any arbitrary product, service, or other thing for sale or offer and includes enough structured metadata to make them useful.
The category of classifieds includes a very broad range of physical goods, services, work opportunities, rentals, free giveaways, personals, etc. and is distinct from the more strictly structured marketplaces defined in [NIP-15](15.md) that often sell many units of specific products through very specific channels.
The specification supports a broad range of use cases physical goods, services, work opportunities, rentals, free giveaways, personals, etc. To promote interoperability between clients implementing NIP-99 for e-commerce, you can find the extension proposal [here](https://github.com/GammaMarkets/market-spec/blob/main/spec.md) which standardizes the e-commerce use case while maintaining the specification's lightweight and flexible nature. While [NIP-15](15.md) provides a strictly structured marketplace specification, NIP-99 has emerged as a simpler and more flexible alternative.
The structure of these events is very similar to [NIP-23](23.md) long-form content events.

View File

@@ -93,6 +93,7 @@ They exist to document what may be implemented by [Nostr](https://github.com/nos
- [NIP-7D: Threads](7D.md)
- [NIP-84: Highlights](84.md)
- [NIP-86: Relay Management API](86.md)
- [NIP-87: Ecash Mint Discoverability](87.md)
- [NIP-88: Polls](88.md)
- [NIP-89: Recommended Application Handlers](89.md)
- [NIP-90: Data Vending Machines](90.md)
@@ -107,7 +108,6 @@ They exist to document what may be implemented by [Nostr](https://github.com/nos
- [NIP-C7: Chats](C7.md)
## Event Kinds
| kind | description | NIP |
| ------------- | ------------------------------- | -------------------------------------- |
| `0` | User Metadata | [01](01.md) |
@@ -200,6 +200,7 @@ They exist to document what may be implemented by [Nostr](https://github.com/nos
| `10166` | Relay Monitor Announcement | [66](66.md) |
| `13194` | Wallet Info | [47](47.md) |
| `17375` | Cashu Wallet Event | [60](60.md) |
| `17375` | Ecash Mint Recommendation | [87](87.md) |
| `21000` | Lightning Pub RPC | [Lightning.Pub][lnpub] |
| `22242` | Client Authentication | [42](42.md) |
| `23194` | Wallet Request | [47](47.md) |
@@ -247,9 +248,11 @@ They exist to document what may be implemented by [Nostr](https://github.com/nos
| `31924` | Calendar | [52](52.md) |
| `31925` | Calendar Event RSVP | [52](52.md) |
| `31989` | Handler recommendation | [89](89.md) |
| `31990` | Handler information | [89](89.md) | |
| `32267` | Software Application | | |
| `31990` | Handler information | [89](89.md) |
| `32267` | Software Application | |
| `34550` | Community Definition | [72](72.md) |
| `38172` | Cashu Mint Announcement | [87](87.md) |
| `38173` | Fedimint Announcement | [87](87.md) |
| `38383` | Peer-to-peer Order events | [69](69.md) |
| `39000-9` | Group metadata events | [29](29.md) |
| `39089` | Starter packs | [51](51.md) |

72
xx.md
View File

@@ -1,72 +0,0 @@
NIP-XX
======
LLM Stuff
---------
`draft` `optional`
This NIP defines kinds related to LLM stuff.
# Prompt diffs
a way to publish LLM prompts that describe modifications to software projects. Where code diffs usually expire in a couple of releases and require constant upkeep,tThese "prompt diffs" enable way longer-lasting, shareable software modifications.
## Abstract
A prompt diff is a Nostr event that contains instructions for an LLM to modify a codebase. Prompt diffs describe the intent and let LLMs handle the implementation details.
## Event Structure
```json
{
"kind": 496,
"content": "<human-readable-description>",
"tags": [
["title", "<modification-title>"],
["description", "<prompt>"],
["r", "<git-repository-url>"],
["t", "<tag>"],
["model", "<suggested-llm-model>"],
]
}
Required Tags
title - Short title describing the modification
r - Git repository URL this applies to
prompt - The actual prompt containing modification instructions
## Optional Tags
t - Hashtags for categorization (#security, #performance, #feature-removal, etc.)
model - Suggested LLM model that successfully applies this modification
Example: Remove Edit Functionality from Amethyst
json{
"kind": 496,
"pubkey": "...",
"created_at": 1234567890,
"content": "Removes the ability to edit kind:1 text notes in Amethyst",
"tags": [
["title", "Remove Kind:1 Edit Functionality"],
["description", "Remove all edit functionality for kind:1 events from the Amethyst Android app. This includes:\n\n1. Find and remove the edit button/icon from the note options menu (three dots menu) for kind:1 events\n2. Remove any edit action handlers, click listeners, or menu item cases related to editing kind:1 notes\n3. Remove or disable any UI components like EditPostView or EditPostDialog that are used for editing existing posts\n4. Keep the edit functionality for other event kinds if they exist (like kind:30023 long-form content)\n5. Remove any edit-related permissions checks or business logic specific to kind:1 events\n6. Clean up any unused imports or resources that were only used for kind:1 editing\n7. Do not remove the ability to create new kind:1 posts, only the ability to edit existing ones\n8. Look for edit functionality in:\n - Note composition screens\n - Note option menus \n - ViewModels handling note actions\n - Any files with names containing 'Edit' and 'Note' or 'Post'\n\nMake sure the app still compiles and runs after these changes. The diff should be clean with no leftover dead code."],
["r", "https://github.com/vitorpamplona/amethyst"],
["t", "noedits"],
["t", "amethyst"],
["model", "claude-3.5-sonnet"],
],
"sig": "..."
}
# Implementation Guidelines
### For Prompt Authors
Write clear, specific prompts that describe intent rather than implementation
Include context about why changes should be made in certain locations
Specify what should NOT be changed to prevent over-modification
Add test commands to verify the modification works
Test prompts against the current main branch of the repository
# Security Considerations
* Always review LLM-generated changes before applying
* Prompt Injection Protection: Clients MUST sanitize repository file contents before passing to LLMs to prevent malicious code comments or documentation from hijacking the modification intent