๐ŸŽจ Manifest Creator

Visual tool for creating and testing nostr-post manifests

Manifest Editor

Load Example:

Inherit fields from parent manifest(s). One entry per line โ€” full NIP-78 a-tag or bare manifest ID. Multiple parents are merged left-to-right (last wins on conflict).

When enabled, published events include an โ€˜aโ€™ tag so any client can auto-fetch this manifest to render posts correctly. Disable for manifests that only provide a predefined editing experience.
Available Kinds:
1 (Note)30023 (Article)30078 (NIP-78)30079 (Structured JSON)30818 (Wiki Entity)

Supported kinds are always available in the editor. Imported manifests can still show additional kinds already present in their mappings or publish formats.

Publish Formats:

Optional event-selection choices shown in the composer UI.

Use Cmd/Ctrl-click to select multiple kinds. Each format must include at least one kind.

Fields

Post
Additional Event Mappings
Add extra targets when this field should publish to both Kind 1 and NIP-78.
Only the primary mapping is configured.
Media
Additional Event Mappings
Add extra targets when this field should publish to both Kind 1 and NIP-78.
Only the primary mapping is configured.
Links
Additional Event Mappings
Add extra targets when this field should publish to both Kind 1 and NIP-78.
Only the primary mapping is configured.
Mentions
Additional Event Mappings
Add extra targets when this field should publish to both Kind 1 and NIP-78.
Only the primary mapping is configured.
Tags
Additional Event Mappings
Add extra targets when this field should publish to both Kind 1 and NIP-78.
Only the primary mapping is configured.
Manifest JSON
{
  "id": "kind1-simple-post",
  "version": "1.0.0",
  "publishFormats": [
    {
      "id": "kind1",
      "label": "Kind 1",
      "kinds": [
        1
      ],
      "default": true,
      "userSelectable": true
    }
  ],
  "linkManifest": false,
  "fields": [
    {
      "id": "content",
      "type": "string",
      "uiPlugin": "textarea",
      "mapTo": {
        "kind": 1,
        "target": "content"
      },
      "required": true,
      "metadata": {
        "label": "Post",
        "placeholder": "Write something..."
      }
    },
    {
      "id": "media",
      "type": "string",
      "uiPlugin": "media",
      "attachTo": "content",
      "mapTo": {
        "kind": 1,
        "target": "tag",
        "tagName": "r"
      },
      "metadata": {
        "label": "Media",
        "accept": [
          "image/*",
          "video/*"
        ],
        "maxFiles": 4,
        "expandable": true
      }
    },
    {
      "id": "refs",
      "type": "string",
      "uiPlugin": "reference",
      "attachTo": "content",
      "mapTo": {
        "kind": 1,
        "target": "tag",
        "tagName": "r"
      },
      "visibility": {
        "view": "hidden"
      },
      "metadata": {
        "label": "Links",
        "expandable": true
      }
    },
    {
      "id": "mentions",
      "type": "profile",
      "uiPlugin": "profile",
      "attachTo": "content",
      "mapTo": {
        "kind": 1,
        "target": "tag",
        "tagName": "p"
      },
      "visibility": {
        "view": "hidden"
      },
      "metadata": {
        "label": "Mentions"
      }
    },
    {
      "id": "tags",
      "type": "string",
      "uiPlugin": "hashtag",
      "attachTo": "content",
      "mapTo": {
        "kind": 1,
        "target": "tag",
        "tagName": "t"
      },
      "metadata": {
        "label": "Tags",
        "expandable": true
      },
      "defaultValue": [
        "test",
        "nostr-post"
      ]
    }
  ],
  "metadata": {
    "name": "Standard Kind 1 Post",
    "description": "Standard kind 1 post/comment with text, media attachments, @mentions and hashtags.",
    "tags": [
      "kind1",
      "standard",
      "comment",
      "reply"
    ]
  }
}

๐ŸŒ Nostr Manifests (NIP-78)

Publish the current manifest to Nostr relays as a kind 30078 event. Anyone can discover and use it.

Preview NIP-78 Event
{
  "kind": 30078,
  "created_at": "<publish time>",
  "tags": [
    [
      "d",
      "nostr-post:kind1-simple-post"
    ],
    [
      "a",
      "30078:<pubkey>:nostr-post:kind1-simple-post"
    ],
    [
      "name",
      "Standard Kind 1 Post"
    ],
    [
      "t",
      "kind1"
    ],
    [
      "t",
      "standard"
    ],
    [
      "t",
      "comment"
    ],
    [
      "t",
      "reply"
    ],
    [
      "t",
      "nostr-post"
    ]
  ],
  "content": "{\"id\":\"kind1-simple-post\",\"version\":\"1.0.0\",\"publishFormats\":[{\"id\":\"kind1\",\"label\":\"Kind 1\",\"kinds\":[1],\"default\":true,\"userSelectable\":true}],\"linkManifest\":false,\"fields\":[{\"id\":\"content\",\"type\":\"string\",\"uiPlugin\":\"textarea\",\"mapTo\":{\"kind\":1,\"target\":\"content\"},\"required\":true,\"metadata\":{\"label\":\"Post\",\"placeholder\":\"Write something...\"}},{\"id\":\"media\",\"type\":\"string\",\"uiPlugin\":\"media\",\"attachTo\":\"content\",\"mapTo\":{\"kind\":1,\"target\":\"tag\",\"tagName\":\"r\"},\"metadata\":{\"label\":\"Media\",\"accept\":[\"image/*\",\"video/*\"],\"maxFiles\":4,\"expandable\":true}},{\"id\":\"refs\",\"type\":\"string\",\"uiPlugin\":\"reference\",\"attachTo\":\"content\",\"mapTo\":{\"kind\":1,\"target\":\"tag\",\"tagName\":\"r\"},\"visibility\":{\"view\":\"hidden\"},\"metadata\":{\"label\":\"Links\",\"expandable\":true}},{\"id\":\"mentions\",\"type\":\"profile\",\"uiPlugin\":\"profile\",\"attachTo\":\"content\",\"mapTo\":{\"kind\":1,\"target\":\"tag\",\"tagName\":\"p\"},\"visibility\":{\"view\":\"hidden\"},\"metadata\":{\"label\":\"Mentions\"}},{\"id\":\"tags\",\"type\":\"string\",\"uiPlugin\":\"hashtag\",\"attachTo\":\"content\",\"mapTo\":{\"kind\":1,\"target\":\"tag\",\"tagName\":\"t\"},\"metadata\":{\"label\":\"Tags\",\"expandable\":true},\"defaultValue\":[\"test\",\"nostr-post\"]}],\"metadata\":{\"name\":\"Standard Kind 1 Post\",\"description\":\"Standard kind 1 post/comment with text, media attachments, @mentions and hashtags.\",\"tags\":[\"kind1\",\"standard\",\"comment\",\"reply\"]}}",
  "pubkey": "<pubkey>"
}

Preview

Test your manifest in real-time

Composer

Feed (Published events)

Connect a signer to load your feed and enable comments/reactions.