Chapter A0 - Media
A0
Nostr Implementation Possibility - Hex № A0

Voice Messages

Short audio posts and audio replies: kind 1222 for root voice messages, kind 1244 for voice replies, with an optional waveform preview.

1 Overview

Some things are easier to say than to type. This NIP defines a voice message: a short audio clip, typically up to 60 seconds long, published as a Nostr event. It gives voice posts their own kinds, so audio feeds do not mix with kind-1 text notes.

The NIP defines two event kinds. Kind 1222 is a root voice message. It starts a thread. Kind 1244 is a voice reply. It answers a root message or another reply, and follows the comment structure of NIP-22.

The audio itself does not live inside the event. The event content is a URL that points directly to an audio file on a media server. Clients download or stream the file from that URL. An optional imeta tag from NIP-92 carries a waveform and a duration, so clients can draw a preview before they fetch any audio.

Hint!

Think walkie-talkie, not podcast. The 60-second target keeps voice feeds fast to scan and cheap to host. For long-form audio or video, look at other media NIPs such as NIP-71.

Recorder client A Media server hosts the .m4a Relay Listener client B 1. upload audio 2. EVENT 1222 3. REQ / EVENT 4. stream audio
Fig. A0-1 — Voice message flow. The audio file goes to a media server. The event carries only the URL.

2 Root Voice Messages: Kind 1222

A kind 1222 event is a standalone voice post. It is a regular event under the NIP-01 storage rules. Its fields follow these rules:

Kind 1222 - field rules
FieldRequirementRule
contentMUSTA URL that points directly to an audio file. No text, no markup, only the URL.
tagsMAYTags from other NIPs are allowed. Examples: t for hashtags, g for a geohash.

The audio file itself has two SHOULD rules:

  • Format. The file SHOULD be audio/mp4 (.m4a) with AAC or Opus encoding. Clients MAY support other common formats such as audio/ogg, audio/webm, or audio/mpeg (mp3). The spec recommends audio/mp4 for broad compatibility and efficiency.
  • Duration. The audio SHOULD be no longer than 60 seconds. A publishing client SHOULD enforce this limit, or show the user a clear warning when the recording exceeds it.
Warning!

The event does not contain the audio. If the media server deletes the file, the voice message goes silent, even though the event still verifies. Choose durable hosting, or mirror the file on several servers.

3 Voice Replies: Kind 1244

A kind 1244 event is a voice reply. Its content and audio rules are identical to kind 1222:

  • content MUST be a URL that points directly to an audio file.
  • The file SHOULD be audio/mp4 (.m4a) with AAC or Opus encoding; clients MAY support audio/ogg, audio/webm, or audio/mpeg.
  • The audio SHOULD be no longer than 60 seconds; enforce the limit or warn the user.
  • Tags from other NIPs MAY be included, such as t and g.

One rule is extra: a kind 1244 event MUST follow the threading structure of NIP-22. Uppercase tags (E, K, P) point to the root voice message. Lowercase tags (e, k, p) point to the direct parent. In a top-level reply, root and parent are the same event.

kind 1222 root voice message kind 1244 reply to root kind 1244 reply to a reply E K P + e k p e k p → parent E K P → root
Fig. A0-2 — Thread structure per NIP-22. Uppercase tags always point to the root; lowercase tags point to the direct parent.
Tech Note

The source spec has a copy-paste slip: in the kind 1244 section, the duration rule says clients publishing kind: 1222 events should enforce the limit. In context the rule clearly targets kind 1244. Also, the spec shows only a root example; it defines no separate reply example.

4 Visual Preview with imeta

Downloading audio just to draw a feed is wasteful. The event MAY carry an imeta tag from NIP-92, so clients can render a visual preview without fetching the audio file first. Two imeta entries matter here:

imeta entries for voice messages (optional)
EntryValuePurpose
waveformspace-separated whole integersAmplitude values over time. Fewer than 100 values is enough for a nice visual.
durationinteger, secondsThe audio length. Lets the client show a play time before download.
Hint!

Sample the waveform on the recording device, where the raw audio is already in memory. Normalize the values to a fixed range such as 0-100. The listener's client only scales bars; it never decodes audio for the preview.

5 Worked Example

A real root voice message, taken from the spec. The content URL points to an 8-second clip on a media server. The imeta tag repeats the URL and adds the waveform and duration:

Event - kind 1222 root voice message
{
  "content": "https://blossom.primal.net/5fe7df0e46ee6b14b5a8b8b929
              39e84e3ca5e3950eb630299742325d5ed9891b.mp4",
  "created_at": 1752501052,
  "id": "...",
  "kind": 1222,
  "pubkey": "...",
  "sig": "...",
  "tags": [
    [
      "imeta",
      "url https://blossom.primal.net/5fe7df0e46ee6b14b5a8b8b929
       39e84e3ca5e3950eb630299742325d5ed9891b.mp4",
      "waveform 0 7 35 8 100 100 49 8 4 16 8 10 7 2 20 10 100 100
       100 100 100 100 15 100 100 100 25 60 5 4 3 1 0 100 100 15
       100 29 88 0 33 11 39 100 100 19 4 100 42 35 5 0 1 5 0 0 11
       38 100 94 17 11 44 58 5 100 100 100 55 14 72 100 100 57 6
       1 14 2 16 100 100 40 16 100 100 6 32 14 13 41 36 16 14 6 3
       0 1 2 1 6 0",
      "duration 8"
    ]
  ]
}

A voice reply answers that message with a kind 1244 event. The tags follow NIP-22. Here the reply targets the root directly, so the uppercase and lowercase tags point to the same event:

Session transcript - publishing a voice reply
-- Client B replies to root event a0f1c2... by pubkey 22a12a12... --
→ ["EVENT", {"kind":1244,
     "content":"https://media.example.com/reply-clip.m4a",
     "tags":[
       ["E", "a0f1c2...", "wss://relay.example.com", "22a12a12..."],
       ["K", "1222"],
       ["P", "22a12a12..."],
       ["e", "a0f1c2...", "wss://relay.example.com", "22a12a12..."],
       ["k", "1222"],
       ["p", "22a12a12..."],
       ["imeta", "url https://media.example.com/reply-clip.m4a",
        "waveform 0 12 40 88 60 22 5", "duration 6"]
     ],
     "created_at":1752501300, "id":"b7d3e4...", "pubkey":"f7234bd4...",
     "sig":"..."}]
← ["OK", "b7d3e4...", true, ""]

6 Version History

NIP-A0 is young and small. Its whole history is two commits, days apart:

  • 20252025-07-27Updated the audio format and waveform recommendations: audio/mp4 with AAC or Opus became the recommended format (#1990).
  • Origin2025-07-23Fabian published the initial spec: kinds 1222 and 1244, the 60-second guideline, and the imeta preview entries (#1984).

Original Proposal - Credits

AuthorFabian
First commit2025-07-23 — “NIP-A0: Voice Messages” (PR #1984)
Statusdraft — optional media feature for clients
SourceA0.md on GitHub - full change history

7 See Also

  • NIP-01 — the base event format and client-relay flow that kinds 1222 and 1244 ride on.
  • NIP-22 — the comment structure that kind 1244 replies must follow.
  • NIP-92 — the imeta tag that carries the waveform and duration preview.
  • NIP-94 — file metadata events for describing hosted media in more detail.
  • NIP-71 — video events; the long-form cousin of voice messages.