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.
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.
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:
| Field | Requirement | Rule |
|---|---|---|
| content | MUST | A URL that points directly to an audio file. No text, no markup, only the URL. |
| tags | MAY | Tags 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 asaudio/ogg,audio/webm, oraudio/mpeg(mp3). The spec recommendsaudio/mp4for 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.
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:
contentMUST be a URL that points directly to an audio file.- The file SHOULD be
audio/mp4(.m4a) with AAC or Opus encoding; clients MAY supportaudio/ogg,audio/webm, oraudio/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
tandg.
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.
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:
| Entry | Value | Purpose |
|---|---|---|
| waveform | space-separated whole integers | Amplitude values over time. Fewer than 100 values is enough for a nice visual. |
| duration | integer, seconds | The audio length. Lets the client show a play time before download. |
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:
{
"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:
-- 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/mp4with 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
imetapreview entries (#1984).
Original Proposal - Credits
| Author | Fabian |
| First commit | 2025-07-23 — “NIP-A0: Voice Messages” (PR #1984) |
| Status | draft — optional media feature for clients |
| Source | A0.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
imetatag 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.