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

# Task dependencies

> Mark a task as blocked by another task, see which blockers are still open, and understand the loop guard that stops circular dependencies.

A dependency says "this task cannot finish until that one does". TimeTracker calls the other task a **blocker**.

## What is a dependency?

A dependency is a one-way link between two tasks in the same project:

> `WR-145 Send for review` is blocked by `WR-144 Build in Figma`

The task you are looking at is the **dependent**. The task it waits on is the **blocker**.

Dependencies are informational, not enforcing. You can still complete a blocked task – the product asks you to confirm first, rather than stopping you.

## Dependency vs subtask

| Dependency                                    | Subtask                                 |
| --------------------------------------------- | --------------------------------------- |
| Two independent tasks, one waits on the other | A child of a parent task                |
| Both can be anywhere in the project           | Lives in the same project as its parent |
| No hierarchy                                  | One level of hierarchy                  |
| Shown in the **Dependencies** section         | Shown in the **Subtasks** section       |

## Add a blocker

<Steps>
  <Step title="Open the full task page">
    Dependencies live on the full page, under Subtasks.
  </Step>

  <Step title="Find Add a dependency">
    A dropdown lists the other tasks in this project. Tasks that are already blockers are left out, and so is the task itself.
  </Step>

  <Step title="Pick the blocking task">
    It is added straight away and appears in the blockers list.
  </Step>
</Steps>

Adding the same blocker twice does nothing – the second attempt is quietly ignored.

## Read the blockers list

Each blocker shows its title and its current state. A blocker that is not yet done carries a **blocking indicator**, so you can see at a glance what is actually holding the task up.

A blocker counts as cleared when its section reaches the **Done** category.

<Note>
  If a blocker is deleted, it stops blocking and drops out of the list. The link itself survives, so restoring the deleted task brings the blocker back exactly as it was.
</Note>

## Remove a blocker

<Steps>
  <Step title="Click the X on the blocker row">
    A confirmation opens – "Remove dependency?"
  </Step>

  <Step title="Confirm">
    The link is removed. You can add it back at any time.
  </Step>
</Steps>

Removing a dependency is a plain confirmation, not a typed one, because it is trivially re-addable.

## The loop guard

TimeTracker refuses to create a circular dependency. That includes an indirect loop through several tasks.

If A is blocked by B, and B is blocked by C, then C cannot be blocked by A. The picker shows the message inline, right where you clicked:

> That would create a loop – a task can't depend on itself, directly or indirectly.

The check runs on the server before anything is saved, so a loop can never end up stored.

## Completing a blocked task

When you click **Mark complete** on a task with unfinished blockers, a confirmation appears:

> **Complete anyway?**
> 2 tasks this depends on aren't done yet. Completing now ignores that.

Confirm and the task completes normally. The dependency is a warning, not a lock – sometimes the work really did finish out of order.

## Example

On Bluebird Coffee – **Website Redesign**, Priya Raman sets up the handoff:

| Task                     | Blocked by               |
| ------------------------ | ------------------------ |
| `WR-145` Send for review | `WR-144` Build in Figma  |
| `WR-150` Build homepage  | `WR-145` Send for review |

Jonas Bergman opens `WR-150` and sees one blocker, still open, with the blocking indicator. He knows not to start.

When Priya tries to add `WR-150` as a blocker on `WR-144`, the picker refuses it inline – that would close the loop.

## Options and settings

| Control                            | What it does                           |
| ---------------------------------- | -------------------------------------- |
| **Add a dependency** dropdown      | Lists eligible tasks in this project   |
| Blocking indicator                 | Marks a blocker that is not yet done   |
| **X** on a blocker                 | Opens the remove confirmation          |
| Blocker count on **Mark complete** | Warns before you finish a blocked task |

The picker only ever offers tasks from the **same project**. Cross-project dependencies are not supported.

## What happens next

* The task's **Activity** feed records the blocker being added or removed.
* The **Mark complete** button starts asking for confirmation while any blocker is open.
* Nothing is scheduled or reordered. A dependency does not move dates.

## Permissions

| Action                | Capability                            |
| --------------------- | ------------------------------------- |
| See a task's blockers | Project reach – you can open the task |
| Add a blocker         | `task.edit`                           |
| Remove a blocker      | `task.edit`                           |

Owner, Admin, Project Manager, Member and Contractor all hold `task.edit`. Finance and Client do not.

Dependencies belong to the **Projects & tasks** app, which every workspace has and which is on the **Free** plan. Turning off the Planner does not affect them.

## Common questions

<AccordionGroup>
  <Accordion title="Can a task block a task in another project?">
    No. The picker only offers tasks in the same project.
  </Accordion>

  <Accordion title="Does a dependency stop time being tracked?">
    No. Blockers never prevent tracking, editing or completing – they warn.
  </Accordion>

  <Accordion title="Does a dependency push dates?">
    No. TimeTracker does not reschedule a task because its blocker moved. Move the dates yourself, or plan the work in the Planner.
  </Accordion>

  <Accordion title="How many blockers can a task have?">
    There is no fixed limit. In practice, a task with a long blocker list usually wants splitting.
  </Accordion>

  <Accordion title="What counts as a cleared blocker?">
    A blocker is cleared when it sits in a section whose category is **Done** – whatever your project calls that section.
  </Accordion>
</AccordionGroup>

## Troubleshooting

<AccordionGroup>
  <Accordion title="The task I want is not in the dropdown">
    It is either already a blocker, is this task itself, or belongs to another project.
  </Accordion>

  <Accordion title="I see the loop message and do not understand why">
    Follow the chain. The task you picked already depends on this one, directly or through other tasks. Remove the existing link first if the direction was wrong.
  </Accordion>

  <Accordion title="A blocker vanished from the list">
    It was deleted. A deleted blocker no longer blocks. Restore it from Trash to bring the link back – see [/settings/trash](/settings/trash).
  </Accordion>

  <Accordion title="I get a permission message when adding a blocker">
    You do not hold `task.edit` in this workspace.
  </Accordion>
</AccordionGroup>

## Related guides

<CardGroup cols={2}>
  <Card title="Subtasks" icon="list-tree" href="/tasks/subtasks">
    A different kind of relationship.
  </Card>

  <Card title="Task details" icon="panel-right" href="/tasks/task-details">
    Where the Dependencies section lives.
  </Card>

  <Card title="Project sections" icon="columns" href="/projects/project-sections">
    What makes a blocker count as done.
  </Card>

  <Card title="Planner overview" icon="calendar" href="/planner/overview">
    Scheduling work across the week.
  </Card>

  <Card title="Task permissions" icon="lock" href="/tasks/task-permissions">
    Who may add and remove blockers.
  </Card>
</CardGroup>
