2025-01-01 11:43:11 +00:00
NIP-100
======
Kanban Boards
------------
`draft` `optional`
This NIP defines a protocol for creating and managing Kanban boards on Nostr.
## Abstract
This NIP introduces event kinds and conventions for implementing Kanban boards, allowing users to create boards with multiple columns and cards that can be organized and tracked in a visual workflow.
## Motivation
Kanban boards are a popular project management tool that enables visual organization of tasks and workflows. Adding native Kanban support to Nostr allows for decentralized project management while maintaining the platform's permissionless and censorship-resistant nature.
## Specification
### Board Event
```javascript
{
2025-01-02 00:25:33 +00:00
"created_at": 34324234234, //< Unix timestamp in seconds >
"kind": 30301,
"tags": [
["d", "< board-d-identifier > "],
["title", "Board Name"],
2025-01-11 16:19:15 +00:00
["description","Board Description"], //can contain markdown too
["alt","A board to track my work"], //Human-readable plaintext summary to be shown in non-supporting clients - as per NIP-31
// List of all columns in the board below in format ["col","col-id","name","order",< < csv of card statuses that need to be displayed in the column > >]
// If the last element in the 'col' tag is not defined, it is assumed that column will display those cards (see event below) whose 's' tags EXACTLY the column name
["col", "col1-id", "To Do", "0"],
["col", "col2-id", "In Progress", "1"],
["col", "col3-id", "Done", "2","Done, Completed, Finished"],
2025-01-12 03:03:22 +00:00
// Clients may designate a 'maintainers' list who can add/edit cards in this board
[ "p", "82341f882b6eabcd2ba7f1ef90aad961cf074af15b9ef44a09f9d2a8fbfbe6a2" ],
[ "p", "fa984bd7dbb282f07e16e7ae87b26a2a7b9b90b7246a44771f0cf5ae58018f52" ],
[ "p", "460c25e682fda7832b52d1f22d3d22b3176d972f60dcdc3212ed8c92ef85065c" ],
2025-01-02 00:25:33 +00:00
// other fields...
2025-01-11 16:19:15 +00:00
]
2025-01-01 11:43:11 +00:00
}
```
2025-01-12 03:03:22 +00:00
In case there are no `p` tags to designate maintainers, the owner of the board is the only person who can publish cards on the boards.
2025-01-11 16:19:15 +00:00
2025-01-12 03:03:22 +00:00
Editing the board event is possible only by the creator of the board.
2025-01-11 16:19:15 +00:00
2025-01-01 11:43:11 +00:00
### Card Event
```javascript
{
2025-01-02 00:25:33 +00:00
"created_at": 34324234234, //< Unix timestamp in seconds >
"kind": 30302,
"tags": [
["d", "< card-d-identifier > "],
["title", "Card Title"],
2025-01-11 16:19:15 +00:00
["description","Card Description"], //can contain markdown too
["alt","A card representing a task"], //Human-readable plaintext summary to be shown in non-supporting clients - as per NIP-31
["s", "To do"], //status of the card
["rank","10"], // order of the card in the column - cards may be displayed in the ascending order of rank by default
// card url attachments with 'u' tags similar to NIP-98
["u","https://attachment1"],
["u","https://attachment2"],
2025-01-12 03:03:22 +00:00
// add assignees using 'p' tag
[ "p", "82341f882b6eabcd2ba7f1ef90aad961cf074af15b9ef44a09f9d2a8fbfbe6a2"],
[ "p", "fa984bd7dbb282f07e16e7ae87b26a2a7b9b90b7246a44771f0cf5ae58018f52"],
[ "p", "460c25e682fda7832b52d1f22d3d22b3176d972f60dcdc3212ed8c92ef85065c"],
2025-01-11 16:19:15 +00:00
// The list of boards this card will be a part of.
2025-01-12 03:03:22 +00:00
// However, the card will be displayed on a board only when this event's pubkey matches an entry in the board's maintainers list
2025-01-11 16:19:15 +00:00
["a", "30301:< board-1-creator-pubkey > :< board-1-d-identifier > ", "< optional-relay-url > "],
["a", "30301:< board-2-creator-pubkey > :< board-2-d-identifier > ", "< optional-relay-url > "],
2025-01-02 00:25:33 +00:00
],
// other fields...
2025-01-01 11:43:11 +00:00
}
```
2025-01-11 16:19:15 +00:00
When editing a card, the maintainers can copy the card event with the `d` tag intact and publish a new event.
When a client gets multiple card events with the same `d` tag, it takes the latest one by any maintainer or the creator of the board event as the source of truth.
### Tracker Card Event
In case one wants to just track another nostr event (like a tracker card, without modifying the original event), one can designate a tracker card using a `k` tag to denote kind and `e` tag to denote the nostr event to be tracked.
```javascript
{
"created_at": 34324234234, //< Unix timestamp in seconds >
"kind": 30302,
"tags": [
["d", "< card-d-identifier > "],
["k", "1"], //this one tracks a text note
["e", "< event-id > ", "< relay-url > "] // as per NIP-10
2025-01-12 03:03:22 +00:00
// other fields as per card event above...
2025-01-11 16:19:15 +00:00
],
}
```
The clients MAY display this tracker card like they display the tracked event, or using the 'alt' tag of the original event if not supported.
Any `30302` event with a `k` tag will be treated as a tracker card.
#### Automatic movement of tracker cards
In case of tracked card, its status is deemed to be the `s` tag value of the event it tracks.
2025-01-12 03:03:22 +00:00
This allows the automatic movement of a card (like a Git issue) across different columns as the card's status changes in the source system, without any manual updates in the board.
2025-01-11 16:19:15 +00:00
If the tracked event does not have an `s` tag, then tracker card event's `s` tag is the status of the card.
2025-01-01 11:43:11 +00:00
### Event Kinds
- 30301: Kanban Board Definition
- 30302: Kanban Card
### Required Tags
#### Board Events (kind: 30301)
- `d` : Unique identifier for the board
- `title` : Board name
#### Card Events (kind: 30302)
- `d` : Unique identifier for the card
- `title` : Card title
2025-01-11 16:19:15 +00:00
- `a` : At least one. This points to the board that this card belongs to
2025-01-01 11:43:11 +00:00
### Access Control
1. Only the board creator can:
- Modify board
2025-01-11 16:19:15 +00:00
2. Only the board maintainers can:
- Add a card to the board
- Publish edits to the existing cards (including the status)
2025-01-01 11:43:11 +00:00
2025-01-11 16:19:15 +00:00
2. Any user can:
2025-01-01 11:43:11 +00:00
- View the board and cards
- React, comment, zap on board and cards
### Client Behavior
2025-01-11 16:19:15 +00:00
Clients MAY:
2025-01-01 11:43:11 +00:00
- Display boards in a visual column layout
- Allow drag-and-drop card movement for authorized users
- Implement proper authorization checks before allowing modifications
- Implement additional features like card labels, due dates, or assignments
- Support board templates
- Provide filtering and search capabilities
2025-01-11 16:19:15 +00:00
- Prioritize to show the maintainer comments on cards
2025-01-01 11:43:11 +00:00
## Security Considerations
1. Clients MUST verify event signatures and delegation tokens before allowing modifications
2. Relays MAY implement additional spam prevention measures
2025-01-11 16:19:15 +00:00
3. Relays MAY choose to retain only a few recent versions of board and card events.
2025-01-01 11:43:11 +00:00
## Implementation Notes
To maintain a consistent board state:
1. Clients should handle concurrent updates by:
- Using the event timestamp to resolve conflicts
- Maintaining card order within columns
2025-01-11 16:19:15 +00:00
2. For performance, clients can:
2025-01-01 11:43:11 +00:00
- Cache board and card data locally
- Use efficient subscription filters when requesting updates
## Client-Relay Communication Example
```javascript
// Subscribe to the cards of a board
{
"kinds": [30302],
2025-01-11 16:19:15 +00:00
"#a": ["30301:< board-creator-pubkey > :< board-d-identifier > ",...]
2025-01-01 11:43:11 +00:00
}
```