Milestone
Milestones mark named checkpoints within a "Project". The project event lists its milestones as a tags pointing to kind:30316 events in order. Each milestone is a standalone addressable event for full status tracking; tasks reference it directly via an a tag alongside the project reference.
Milestone (kind:30316)
An addressable event representing one milestone of a project. The d tag is the milestone’s slug, matching the slug declared in the parent project’s milestone tag. Status is tracked via "Status" events (kind:1983), same as tasks.
Required Tags
| Tag | Description |
|-----|-------------|
| d | Milestone slug. MUST match the slug in the parent project’s milestone tag. |
| title | Display name of the milestone. |
| a | Back-reference to the parent project: 30315:<pubkey>:<project-slug>. Required for reverse discovery. |
Optional Tags
| Tag | Description |
|-----|-------------|
| due | Milestone deadline as Unix timestamp. |
| t | Category tag. |
Content
Milestone description, goals, and acceptance criteria. Follows "Nostr Markdown".
Event Structure
{
"kind": 30316,
"pubkey": "<owner-pubkey>",
"tags": [
["d", "beta"],
["title", "Beta Release"],
["a", "30315:<pubkey>:zapstore-v2", "<relay-url>"],
["due", "1730000000"]
],
"content": "Feature-complete beta open to testers. All core features merged. Crash-free rate > 99%.",
"created_at": 1700000000
}
Status Tracking
"Status" events (kind:1983) attach status to a milestone via its a tag address, identical to how they work for tasks.
Applicable status values from "Status":
| Value | Meaning |
|-------|---------|
| backlog | Defined but not yet scheduled |
| open | Scheduled, work not started |
| in-progress | Work underway |
| in-review | Under review / acceptance testing |
| closed | Milestone completed |
| canceled | Milestone dropped |
Discovering Milestones for a Project
The canonical ordered list of a project’s milestones is the sequence of a tags pointing to kind:30316 events in the project event — no separate relay query needed. To fetch the full milestone events, use the a addresses already present in the project event, or query by back-reference:
{"kinds": [30316], "#a": ["30315:<pubkey>:<project-slug>"]}
This works because each milestone event carries a required a back-reference to its parent project.