Projects group tasks and milestones under a named initiative with Nostr Markdown content and links to associated resources. Milestones are referenced as a tags pointing to Milestone events (kind:30316); resource links use named tags (repository, application, etc.) so the event is self-descriptive without parsing kind numbers. Tasks reference a project and a milestone independently via a tags; clients group them in the UI.
Project (kind:30315)
An addressable event representing a project. Content is a Nostr Markdown description of the initiative. a tags referencing kind:30316 events list the project’s milestones in order; named resource tags (repository, application, etc.) link associated Nostr resources.
Required Tags
| Tag | Description |
|---|---|
d |
Unique slug for the project (e.g. zapstore-v2). |
title |
Display name of the project. |
Optional Tags
| Tag | Description |
|---|---|
a |
Milestone reference: 30316:<pubkey>:<slug>. Repeat in order; tag order defines milestone sequence. |
summary |
One-line description for lists and previews. |
repository |
Git repository: ["repository", "30617:<pubkey>:<d>", "<relay-url>"]. |
application |
App event: ["application", "32267:<pubkey>:<d>", "<relay-url>"]. |
calendar |
Calendar event: ["calendar", "31923:<pubkey>:<d>", "<relay-url>"]. |
docs |
Documentation collection: ["docs", "30101:<pubkey>:<d>", "<relay-url>"]. |
e |
Related event by id. Repeat for each. |
p |
Pubkey with optional role. Repeat for each person. |
t |
Category tag. Repeat for each. |
due |
Project deadline as Unix timestamp. |
Person Roles (p tag)
| Role | Description |
|---|---|
owner |
Project owner / decision-maker |
member |
Active contributor |
| (empty) | Mentioned or CC’d |
Content
Project description, goals, and context. Follows Nostr Markdown. MAY use wikilinks to reference related wiki articles.
Event Structure
{
"kind": 30315,
"pubkey": "<owner-pubkey>",
"tags": [
["d", "zapstore-v2"],
["title", "Zapstore v2"],
["summary", "Full rewrite of the Zapstore app"],
["a", "30316:<pubkey>:alpha", "<relay-url>"],
["a", "30316:<pubkey>:beta", "<relay-url>"],
["a", "30316:<pubkey>:v1-0", "<relay-url>"],
["repository", "30617:<pubkey>:zapstore", "<relay-url>"],
["application", "32267:<pubkey>:app.zapstore", "<relay-url>"],
["p", "<pubkey>", "owner"],
["p", "<pubkey>", "member"],
["due", "1740000000"],
["t", "mobile"],
["t", "nostr"]
],
"content": "## Goals\n\n- Rewrite in Flutter\n- Add zap-split support\n- NIP-47 wallet connect",
"created_at": 1700000000
}
Referencing a Project and Milestone from a Task
A Task event carries both references as plain a tags. Clients resolve the kind in each address to determine the type and group tasks by project and milestone in the UI.
{
"kind": 37060,
"tags": [
["d", "add-zap-split"],
["title", "Add zap-split support"],
["a", "30315:<pubkey>:zapstore-v2"],
["a", "30316:<pubkey>:beta"],
["p", "<pubkey>", "assignee"],
["due", "1725000000"]
],
"content": "Implement zap-split per NIP-57."
}
A task MAY reference a project without a milestone, or a milestone without its parent project (the milestone event carries the back-reference).
See Also
- Milestone — Milestone events (kind:30316) and status tracking
- Task — Task events that target projects and milestones
- Status — Status and priority tracking
- Nostr Markdown — Content format
Comments
Public conversation about this article.
No comments yet.
Article metadata
About this entry
Event Id
Raw event
Other authors
No one else has published this topic yet.
