> ## Documentation Index
> Fetch the complete documentation index at: https://docs.janet.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Sprints

> Organize your team's work into sprints

<div className="img-showcase">
  <div className="sprint-mock">
    <div className="sprint-mock-header">
      <div className="sprint-mock-meta">
        {/* Active badge */}

        <span className="sprint-mock-badge sprint-mock-badge-active">
          <svg width="10" height="10" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2.5" strokeLinecap="round" strokeLinejoin="round">
            <path d="M12 2L2 7l10 5 10-5-10-5z" />

            <path d="M2 17l10 5 10-5" />

            <path d="M2 12l10 5 10-5" />
          </svg>

          Active
        </span>

        {/* Date range */}

        <span className="sprint-mock-date">
          <svg width="10" height="10" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round">
            <rect x="3" y="4" width="18" height="18" rx="2" ry="2" />

            <path d="M16 2v4" />

            <path d="M8 2v4" />

            <path d="M3 10h18" />
          </svg>

          Mar 24
        </span>

        <span className="sprint-mock-date-sep">–</span>

        <span className="sprint-mock-date">
          <svg width="10" height="10" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round">
            <rect x="3" y="4" width="18" height="18" rx="2" ry="2" />

            <path d="M16 2v4" />

            <path d="M8 2v4" />

            <path d="M3 10h18" />
          </svg>

          Apr 4
        </span>
      </div>

      {/* Sprint name */}

      <div className="sprint-mock-name">Sprint 14</div>

      {/* Progress */}

      <div className="sprint-mock-progress">
        <div className="sprint-mock-progress-labels">
          <span className="sprint-mock-progress-text">3 of 7 complete</span>
          <span className="sprint-mock-progress-pct">43%</span>
        </div>

        <div className="sprint-mock-progress-track">
          <div className="sprint-mock-progress-fill" style={{width: '43%'}} />
        </div>
      </div>
    </div>

    <div className="sprint-mock-divider" />

    <div className="sprint-mock-tickets">
      <div className="sprint-mock-tickets-head">
        <span className="sprint-mock-tickets-title">Tickets</span>
        <span className="sprint-mock-tickets-badge">7</span>
      </div>

      {/* In Progress group */}

      <div className="sprint-mock-col-header">
        <span className="sprint-mock-col-name">In Progress</span>
      </div>

      <div className="sprint-mock-ticket">
        <svg width="16" height="16" viewBox="0 0 16 16" fill="none">
          <rect x="3" y="2" width="10" height="1.8" rx="0.9" fill="#e11d48" />

          <rect x="3" y="5.3" width="10" height="1.8" rx="0.9" fill="#e11d48" />

          <rect x="3" y="8.6" width="10" height="1.8" rx="0.9" fill="#e11d48" />

          <rect x="3" y="11.9" width="10" height="1.8" rx="0.9" fill="#e11d48" />
        </svg>

        <span className="sprint-mock-ticket-id">PRJ-128</span>
        <span className="sprint-mock-ticket-title">Fix auth token refresh on expired sessions</span>
      </div>

      <div className="sprint-mock-ticket">
        <svg width="16" height="16" viewBox="0 0 16 16" fill="none">
          <rect x="3" y="3.5" width="10" height="1.8" rx="0.9" fill="#e08007" />

          <rect x="3" y="7.1" width="10" height="1.8" rx="0.9" fill="#e08007" />

          <rect x="3" y="10.7" width="10" height="1.8" rx="0.9" fill="#e08007" />
        </svg>

        <span className="sprint-mock-ticket-id">PRJ-131</span>
        <span className="sprint-mock-ticket-title">Add rate limiting to public API endpoints</span>
      </div>

      {/* In Review group */}

      <div className="sprint-mock-col-header">
        <span className="sprint-mock-col-name">In Review</span>
      </div>

      <div className="sprint-mock-ticket">
        <svg width="16" height="16" viewBox="0 0 16 16" fill="none">
          <rect x="3" y="3.5" width="10" height="1.8" rx="0.9" fill="rgba(200,200,210,0.5)" />

          <rect x="3" y="7.1" width="10" height="1.8" rx="0.9" fill="#65a30d" />

          <rect x="3" y="10.7" width="10" height="1.8" rx="0.9" fill="#65a30d" />
        </svg>

        <span className="sprint-mock-ticket-id">PRJ-125</span>
        <span className="sprint-mock-ticket-title">Migrate user preferences to Postgres JSONB</span>
      </div>

      <div className="sprint-mock-ticket">
        <svg width="16" height="16" viewBox="0 0 16 16" fill="none">
          <rect x="3" y="3.5" width="10" height="1.8" rx="0.9" fill="rgba(200,200,210,0.5)" />

          <rect x="3" y="7.1" width="10" height="1.8" rx="0.9" fill="rgba(200,200,210,0.5)" />

          <rect x="3" y="10.7" width="10" height="1.8" rx="0.9" fill="#0ea5e9" />
        </svg>

        <span className="sprint-mock-ticket-id">PRJ-134</span>
        <span className="sprint-mock-ticket-title">Update changelog for v2.4 release</span>
      </div>

      {/* Done group */}

      <div className="sprint-mock-col-header">
        <span className="sprint-mock-col-name">Done</span>
      </div>

      <div className="sprint-mock-ticket">
        <svg width="16" height="16" viewBox="0 0 16 16" fill="none">
          <rect x="3" y="3.5" width="10" height="1.8" rx="0.9" fill="#e08007" />

          <rect x="3" y="7.1" width="10" height="1.8" rx="0.9" fill="#e08007" />

          <rect x="3" y="10.7" width="10" height="1.8" rx="0.9" fill="#e08007" />
        </svg>

        <span className="sprint-mock-ticket-id">PRJ-119</span>
        <span className="sprint-mock-ticket-title">Implement webhook retry with exponential backoff</span>
      </div>

      <div className="sprint-mock-ticket">
        <svg width="16" height="16" viewBox="0 0 16 16" fill="none">
          <rect x="3" y="3.5" width="10" height="1.8" rx="0.9" fill="rgba(200,200,210,0.5)" />

          <rect x="3" y="7.1" width="10" height="1.8" rx="0.9" fill="#65a30d" />

          <rect x="3" y="10.7" width="10" height="1.8" rx="0.9" fill="#65a30d" />
        </svg>

        <span className="sprint-mock-ticket-id">PRJ-122</span>
        <span className="sprint-mock-ticket-title">Add org member count to billing dashboard</span>
      </div>

      <div className="sprint-mock-ticket">
        <svg width="16" height="16" viewBox="0 0 16 16" fill="none">
          <rect x="3" y="2" width="10" height="1.8" rx="0.9" fill="#e11d48" />

          <rect x="3" y="5.3" width="10" height="1.8" rx="0.9" fill="#e11d48" />

          <rect x="3" y="8.6" width="10" height="1.8" rx="0.9" fill="#e11d48" />

          <rect x="3" y="11.9" width="10" height="1.8" rx="0.9" fill="#e11d48" />
        </svg>

        <span className="sprint-mock-ticket-id">PRJ-116</span>
        <span className="sprint-mock-ticket-title">Fix SSO callback race condition</span>
      </div>
    </div>

    <div className="sprint-mock-footer">
      <span className="sprint-mock-footer-btn">
        <svg width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2">
          <path d="M12 5v14M5 12h14" />
        </svg>

        Add tickets
      </span>
    </div>
  </div>
</div>

Sprints let you scope a fixed window of work within a project. Each sprint has a name, start date, end date, and a set of assigned tickets. A progress bar tracks how many tickets have reached a resolved column.

## Creating a sprint

Open the **Sprints** dropdown from the project header (or press **S**) and click **Create**. Give the sprint a name and pick a start and end date. A sprint's status badge updates automatically to **Active**, **Completed**, or **Overdue** based on the date range and whether unresolved tickets remain.

## Managing tickets

Click **Manage** on the sprint bar or the edit icon in the dropdown to open the sprint detail panel. From there you can add tickets via the side panel, which lists every ticket in the project not already assigned to a sprint, grouped by status. Search by title or ticket ID to find specific tickets. Remove a ticket by hovering its row and clicking the remove button.

When a sprint is selected and you click the **+** button in the project header, you get two options: **Create ticket** (opens the standard create modal) or **Add to \[Sprint]** (opens the manage panel directly).

## Viewing sprint tickets

Sprints integrate with both project views:

* **Kanban** -- Select a sprint from the dropdown to filter the board to only that sprint's tickets. A bar below the header shows the sprint name, date range, and a **Manage** link. The board automatically includes resolved tickets regardless of age so you can see the full sprint scope.
* **List** -- Toggle one or more sprints from the dropdown. Sprint tickets appear in their own collapsible section above the regular status groups, sorted by status then priority. Drag and drop tickets between sprints and status groups.

Your sprint selection persists per project across sessions.

## Using Janet to manage sprints

Ask the [Janet Agent](/agent) to handle sprint operations in natural language.

<CardGroup cols={2}>
  <Card title="Create a sprint">
    "Create a sprint called 'Sprint 8' starting next Monday"
  </Card>

  <Card title="Add tickets">
    "Add SW-42 and SW-43 to Sprint 7"
  </Card>

  <Card title="View sprint tickets">
    "Show all tickets in the current sprint"
  </Card>

  <Card title="Create and assign">
    "Create 3 tickets for the auth feature and add to current sprint"
  </Card>
</CardGroup>
