← All NIPs

NIP-68

Picture-first feeds

DraftEvents

Kind 20 posts are built around photos, Instagram-style: images hosted elsewhere and described in imeta tags, with a caption as content.

At a glance

Status
In use and still allowed to change.
Kinds
Tags
  • content-warning
  • imeta
  • l
  • p
  • t
  • title
Last changed
Jun 13, 2026

Try it

Edit the form or the JSON: both stay in sync, the badge says whether the result is valid, and tapping any field explains it.

Examples
Valid 1 note

Not signed yet · Demo keys only. These personas' secret keys are public on purpose.

Form
Jan 1, 2025, 12:00 AM UTC

Content

The caption or description.

Tags

  1. title Required

    Short title of the post. Required.

  2. imeta Required

    One image: space-separated "key value" entries. Repeat for each picture.

  3. m Recommended

    Media type of an image, so relays can filter by format.

  4. x Recommended

    SHA-256 of an image file, so it can be looked up by hash.

  5. t Optional

    Hashtag.

  6. t Optional

    Hashtag.

  7. location Optional

    Where it was taken, in words.

  8. g Optional

    Where it was taken, as a geohash.

Add tag

How this NIP works

Step 1 of 5

Upload first, then describe

Images live on media servers. Each imeta tag describes one image: its URL, type, size, hash, alt text and fallback copies.

In the course

No course chapter covers this NIP yet. The editor above is the quickest way in.

Builds on

See also

Specification

Specification text is quoted in English from the nostr-protocol/nips repository. Our explanations and the interface are translated. Source on GitHub at commit 0046368

Read the spec390 words, quoted from the repository at commit 0046368.

This NIP defines event kind 20 for picture-first clients. Images must be self-contained. They are hosted externally and referenced using imeta tags.

The idea is for this type of event to cater to Nostr clients resembling platforms like Instagram, Flickr, Snapchat, or 9GAG, where the picture itself takes center stage in the user experience.

Picture Events

Picture events contain a title tag and description in the .content.

They may contain multiple images to be displayed as a single post.

{
  "id": <32-bytes lowercase hex-encoded SHA-256 of the the serialized event data>,
  "pubkey": <32-bytes lowercase hex-encoded public key of the event creator>,
  "created_at": <Unix timestamp in seconds>,
  "kind": 20,
  "content": "<description of post>",
  "tags": [
    ["title", "<short title of post>"],

    // Picture Data
    [
      "imeta",
      "url https://nostr.build/i/my-image.jpg",
      "m image/jpeg",
      "thumbhash zOcFFIIKmXdCinaXaHcmcHUFSA==",
      "blurhash eVF$^OI:${M{o#*0-nNFxakD-?xVM}WEWB%iNKxvR-oetmo#R-aen$",
      "dim 3024x4032",
      "alt A scenic photo overlooking the coast of Costa Rica",
      "x <sha256 hash as specified in NIP 94>",
      "fallback https://nostrcheck.me/alt1.jpg",
      "fallback https://void.cat/alt1.jpg"
    ],
    [
      "imeta",
      "url https://nostr.build/i/my-image2.jpg",
      "m image/jpeg",
      "thumbhash zOcFFIIKmXgzmWaXWIcmcFQEGA",
      "dim 3024x4032",
      "alt Another scenic photo overlooking the coast of Costa Rica",
      "x <sha256 hash as specified in NIP 94>",
      "fallback https://nostrcheck.me/alt2.jpg",
      "fallback https://void.cat/alt2.jpg",

      "annotate-user <32-bytes hex of a pubkey>:<posX>:<posY>" // Tag users in specific locations in the picture
    ],

    ["content-warning", "<reason>"], // if NSFW

    // Tagged users
    ["p", "<32-bytes hex of a pubkey>", "<optional recommended relay URL>"],
    ["p", "<32-bytes hex of a pubkey>", "<optional recommended relay URL>"],

    // Specify the media type for filters to allow clients to filter by supported kinds
    ["m", "image/jpeg"],

    // Hashes of each image to make them queryable
    ["x", "<sha256>"]

    // Hashtags
    ["t", "<tag>"],
    ["t", "<tag>"],

    // location
    ["location", "<location>"], // city name, state, country
    ["g", "<geohash>"],

    // When text is written in the image, add the tag to represent the language
    ["L", "ISO-639-1"],
    ["l", "en", "ISO-639-1"]
  ]
}

The imeta tag annotate-user places a user link in the specific position in the image.

Only the following media types are accepted:

  • image/apng: Animated Portable Network Graphics (APNG)
  • image/avif: AV1 Image File Format (AVIF)
  • image/gif: Graphics Interchange Format (GIF)
  • image/jpeg: Joint Photographic Expert Group image (JPEG)
  • image/png: Portable Network Graphics (PNG)
  • image/webp: Web Picture format (WEBP)

Picture events might be used with NIP-71's kind 22 to display short vertical videos in the same feed.