Features
Tasks

Tasks

Tasks are the individual work items within a board. They contain all the information needed to track and complete work.

Task Properties

PropertyTypeDescription
idstringUnique identifier
boardIdstringParent board
groupIdstringParent group
namestringTask title
descriptionstringDetailed description
statusenumdone, working, stuck, pending, review
priorityenumcritical, high, medium, low
assigneesstring[]Assigned user IDs
dueDateDateDue date
startDateDateStart date
endDateDateEnd date
columnValuesobjectCustom column data

Creating Tasks

Via Table View

  1. Click in an empty row within a group
  2. Type the task name
  3. Press Enter to create

Via API

POST /api/tasks
Content-Type: application/json
 
{
  "boardId": "board-id",
  "groupId": "group-id",
  "name": "Implement new feature",
  "status": "pending",
  "priority": "high",
  "assignees": ["user-id"],
  "dueDate": "2025-01-15"
}

Task Details Panel

Click on a task to open the details panel:

  • Header - Task name (editable)
  • Status & Priority - Quick update dropdowns
  • Assignees - Add/remove team members
  • Due Date - Date picker
  • Description - Rich text area
  • Subtasks - Nested checklist
  • Comments - Discussion thread
  • Time Tracking - Timer and entries
  • Files - Attachments
  • Activity - Change history

Subtasks

Break down tasks into smaller steps:

interface Subtask {
  id: string
  name: string
  completed: boolean
  subtasks?: Subtask[]  // Supports nesting
}

Add Subtask

  1. Open task details
  2. Click + Add Subtask
  3. Enter subtask name

Nested Subtasks

Subtasks can contain their own subtasks for complex work breakdown:

Task: "Launch Feature"
├── Subtask: "Development"
│   ├── Subtask: "Backend API"
│   └── Subtask: "Frontend UI"
├── Subtask: "Testing"
│   ├── Subtask: "Unit tests"
│   └── Subtask: "E2E tests"
└── Subtask: "Documentation"

Comments

Collaborate with your team through comments:

interface Comment {
  id: string
  userId: string
  content: string
  mentions?: string[]  // Mentioned user IDs
  createdAt: Date
}

Add Comment

// Via store action
const addComment = useAppStore((s) => s.addComment)
addComment(taskId, "This looks great! @john", ["john-user-id"])

Mentions

Type @ to mention team members. They'll receive a notification.

Dependencies

Link tasks that depend on each other:

POST /api/tasks/[id]/dependencies
Content-Type: application/json
 
{
  "dependsOn": "other-task-id"
}

Dependencies are visualized in Timeline view.

File Attachments

Attach files to tasks:

interface FileAttachment {
  id: string
  name: string
  type: string        // MIME type
  size: number        // Bytes
  url: string         // Download URL
  uploadedBy: string
  createdAt: Date
}

Supported operations:

  • Upload - Drag & drop or click to select
  • Preview - View images and PDFs inline
  • Download - Direct download link
  • Delete - Remove attachment

Drag and Drop

Tasks support drag and drop using dnd-kit:

  • Reorder within the same group
  • Move between groups
  • Kanban - Drag between status columns
import { 
  DndContext, 
  useDraggable, 
  useDroppable 
} from '@dnd-kit/core'
 
function DraggableTask({ task }) {
  const { attributes, listeners, setNodeRef, transform } = 
    useDraggable({ id: task.id })
  
  return (
    <div ref={setNodeRef} {...attributes} {...listeners}>
      {task.name}
    </div>
  )
}

API Reference

Create Task

POST /api/tasks
Content-Type: application/json
 
{
  "boardId": "board-id",
  "groupId": "group-id",
  "name": "Task name",
  "status": "pending",
  "priority": "medium"
}

Update Task

PATCH /api/tasks/[id]
Content-Type: application/json
 
{
  "name": "Updated name",
  "status": "working",
  "assignees": ["user-1", "user-2"]
}

Delete Task

DELETE /api/tasks/[id]

Move Task

PATCH /api/tasks/[id]/move
Content-Type: application/json
 
{
  "groupId": "new-group-id"
}

Store Usage

import { useAppStore } from '@/lib/store'
 
// Get tasks for current board
const tasks = useAppStore((s) => 
  s.tasks.filter(t => t.boardId === s.selectedBoardId)
)
 
// Task actions
const addTask = useAppStore((s) => s.addTask)
const updateTask = useAppStore((s) => s.updateTask)
const deleteTask = useAppStore((s) => s.deleteTask)
const moveTask = useAppStore((s) => s.moveTask)
const duplicateTask = useAppStore((s) => s.duplicateTask)
const addComment = useAppStore((s) => s.addComment)
 
// Create task
addTask({
  boardId: 'board-id',
  groupId: 'group-id', 
  name: 'New task',
  status: 'pending',
  priority: 'medium'
})
 
// Update status
updateTask(taskId, { status: 'done' })
 
// Move to different group
moveTask(taskId, 'new-group-id')