{"id":"5c49e86a0b9a8d049211a4f672a3b44a7e3be384d425341d7e3b2aa6395fb590","pubkey":"b22b06b051fd5232966a9344a634d956c3dc33a7f5ecdcad9ed11ddc4120a7f2","created_at":1787569123,"kind":30817,"tags":[["d","todo-lists"],["title","NIP: Todo Lists"],["summary","This NIP defines a standard for creating and managing todo lists on Nostr, enabling interoperability between different todo list applications."],["published_at","1759690654"],["t","todo"],["t","nip"],["k","713","Todo Item"],["k","714","Todo Status"],["alt","A specification: NIP: Todo Lists"],["client","openspecs"]],"content":"NIP: Todo Lists\n\nThis NIP defines a standard for creating and managing todo lists on Nostr, enabling interoperability between different todo list applications.\n\n## Abstract\n\nThis specification introduces two new event kinds for managing todo items: kind `713` for creating todos and kind `714` for updating todo status. It supports both public and encrypted private todos, with a simple status system for tracking progress.\n\n## Specification\n\n### Event Kind 713: Todo Item\n\nA new todo item is represented by an event with kind `713`.\n\nThe content field contains the todo description. For private todos, the content should be encrypted according to [NIP-44](https://github.com/nostr-protocol/nips/blob/master/44.md).\n\n```json\n{\n  \"kind\": 713,\n  \"content\": \"<todo description>\",\n  \"tags\": [],\n  ...\n}\n```\n\nFor encrypted todos, an `encrypted` tag should be added to indicate the encryption method:\n\n```json\n{\n  \"kind\": 713,\n  \"content\": \"<encrypted todo description>\",\n  \"tags\": [[\"encrypted\", \"NIP-44\"]],\n  ...\n}\n```\n\n### Event Kind 714: Todo Status Update\n\nTodo status updates are represented by events with kind `714`. The status is stored in the content field and references the todo event using an `e` tag.\n\nSupported statuses:\n- `DOING` - Todo is in progress\n- `DONE` - Todo is completed\n- `BLOCKED` - Todo is blocked/waiting on something\n\nBy default, todos have no status marker and are considered \"pending\" or \"to do\". Status events should only be created when the status changes.\n\n```json\n{\n  \"kind\": 714,\n  \"content\": \"<status>\",\n  \"tags\": [[\"e\", \"<todo-event-id>\"]],\n  ...\n}\n```\n\n### Deleting Todos\n\nTo delete a todo, use the deletion event as specified in [NIP-09](https://github.com/nostr-protocol/nips/blob/master/09.md).\n\n## Todo Lifecycle\n\n1. **Creation**: A todo is created with kind `713` event\n2. **In Progress** (optional): A kind `714` event with content `DOING` marks the todo as in progress\n3. **Completion**: A kind `714` event with content `DONE` marks the todo as completed\n4. **Deletion** (optional): A deletion event per NIP-09 removes the todo\n\n## Client Behavior\n\nClients SHOULD:\n- Display todos without status events as \"pending\" or \"to do\"\n- Only show the most recent status for each todo\n- Support both encrypted and unencrypted todos\n- Respect deletion events and hide deleted todos\n\n## Security Considerations\n\n- Private todos SHOULD use NIP-44 encryption\n- Clients MUST clearly indicate which todos are encrypted vs public\n- Users should be aware that todo metadata (event kind, timestamp) remains public even for encrypted todos\n\n## Examples\n\n### Creating a Public Todo\n\n```json\n{\n  \"kind\": 713,\n  \"content\": \"Write documentation for the new feature\",\n  ...\n}\n```\n\n### Creating an Encrypted Todo\n\n```json\n{\n  \"kind\": 713,\n  \"tags\": [[\"encrypted\", \"NIP-44\"]],\n  \"content\": \"<base64-encoded encrypted content>\",\n  ...\n}\n```\n\n### Marking a Todo as In Progress\n\n```json\n{\n  \"kind\": 714,\n  \"tags\": [[\"e\", \"<todo-event-id>\"]],\n  \"content\": \"DOING\",\n  ...\n}\n```\n\n### Marking a Todo as Completed\n\n```json\n{\n  \"kind\": 714,\n  \"tags\": [[\"e\", \"<todo-event-id>\"]],\n  \"content\": \"DONE\",\n  ...\n}\n```\n\n### Marking a Todo as Blocked\n\n```json\n{\n  \"kind\": 714,\n  \"tags\": [[\"e\", \"<todo-event-id>\"]],\n  \"content\": \"BLOCKED\",\n  ...\n}\n```","sig":"a2be8af289c2ed73470003b8b62f656e37de2a22b637740103eb990227b33934c4712df1d80ad4f6c494582de4d5a20b0b99bdfa8daa987c1233b3ca2e870092"}