Skip to main content

Goals

This document explains how goals work in tududi from a user behavior perspective. For technical implementation details, see the backend code in /backend/modules/goals/ and frontend components in /frontend/components/Goal/.


Overview

Goals are top-level outcome intentions that answer why a group of projects or tasks exists. They are the highest-level planning layer — above areas — with their own list page, detail page, and sidebar navigation.

Hierarchy position:

Goals (season- or year-scale outcomes)   ← top level
├── Projects (specific initiatives)
│ └── Tasks (actionable items)
└── Tasks (directly assigned, without a project)

Areas (life domains, organizational containers) ← parallel, not parent
└── Projects (can belong to an area AND a goal)

Key characteristics:

  • Top-level standalone entities — accessible from /goals and the sidebar
  • Not tied to any area; goals are independent of the Areas system
  • Projects can link to a goal regardless of which area they belong to
  • Have a time horizon: season or year
  • Have a status lifecycle: active → achieved / paused / dropped
  • Tasks can be assigned directly to a goal (in addition to the project→goal path)

URL: /goals


Goal Properties

FieldTypeRequiredNotes
titlestringyesThe outcome statement. Max 255 chars.
whytextnoThe motivation behind the goal. Displayed in italics.
horizonenumyesseason or year. Default: season.
target_datedatenoOptional deadline for the goal.
statusenumyesactive, achieved, paused, dropped. Default: active.
area_idintegernoStored in the database but not exposed in the UI. Goals are area-independent.
uidstringautoURL-safe unique identifier.

Goal Lifecycle

Status transitions

active → achieved   (outcome reached)
active → paused (temporarily on hold)
active → dropped (abandoned or no longer relevant)
paused → active (resuming)

There is no enforced ordering — any status can transition to any other.

Creating a goal

Goals can be created from multiple entry points:

  1. Goals list page (/goals) — header button opens the goal modal
  2. Sidebar — click the + icon next to the Goals section heading
  3. Area detail page — click Add goal next to the Goals heading

The goal modal has these fields:

  • Title (required)
  • Why (optional)
  • Horizon (season / year)
  • Status (defaults to active)
  • Target date (optional)
  • Area (optional — pick from the dropdown or leave blank)

Editing a goal

Click the pencil (edit) icon on any goal card on the Goals list page, or the edit button in the goal detail page header. The goal modal opens pre-filled. Save to update.

From the area detail page, click the pencil icon on a goal row — the same modal opens.

Deleting a goal

Click the trash icon (Goals list page, goal detail page, or area detail page). A confirmation dialog warns that linked projects will become unlinked. The goal record is deleted; projects that referenced it have their goal cleared.


Scarcity Rule

The area detail page displays a warning banner when an area has more than 5 active goals. This is a soft nudge to keep you focused, not an enforced limit.


Goals List Page

A grid view of all your goals across all areas.

Layout: Responsive grid (1 / 2 / 3 / 4 columns depending on screen size)

Each goal card shows:

  • Title
  • Why text (truncated)
  • Status badge (color-coded)
  • Horizon badge
  • Area name (if set)
  • Project count and task count in a footer stats bar
  • Three-dot menu (on hover) with Edit and Delete

Clicking a card navigates to the goal detail page.


Goal Detail Page

URL format: /goal/{uid}-{title-slug} — for example /goal/abc123-launch-new-product

Header banner:

  • Goal title
  • Why text (italic, below the title)
  • Status badge and horizon badge
  • Target date (if set)
  • Area name as a link to the area (if set)
  • Task and project counts
  • Edit (pencil) and Delete (trash) buttons

Two-column layout:

┌─────────────────────┐  ┌─────────────────────────────┐
│ Projects (1/3) │ │ Tasks (2/3) │
│ │ │ │
│ [project card] │ │ [active tasks list] │
│ [project card] │ │ │
│ │ │ Completed (n) │
│ │ │ [completed tasks list] │
└─────────────────────┘ └─────────────────────────────┘

Projects section:

  • Lists projects linked to this goal
  • Each project shows name, status, and a left-colored border
  • Click navigates to the project detail page

Tasks section:

  • Lists tasks assigned directly to this goal (not via a project)
  • Active tasks shown first, completed tasks below in a "Completed (n)" subsection
  • Task rows show name, due date, and a check icon

The Goals section appears in the left sidebar between Areas and Notes.

  • Click the section label → navigates to /goals
  • Click the + icon (hover to reveal) → opens the goal modal to create a new goal
  • Click the chevron → expands/collapses an inline list of active goals
  • Each goal row in the expanded list → navigates to that goal's detail page

Only active goals appear in the expandable list.


Projects and Goals

Each project in an area can be in one of three states relative to goals:

StateMeaning
Linked to goalProject is working toward a specific goal
MaintenanceProject keeps something running — not goal-directed
UnlinkedProject not yet assigned to a goal or marked as maintenance

Linking a project to a goal

From the area detail page, unlinked projects show a link… button. Clicking it opens an inline picker to select a goal or mark the project as maintenance.

From the project modal (when editing a project):

  1. Expand the Goal section (flag icon in the toolbar)
  2. An area must already be selected — goals are fetched for that area
  3. Choose from: No goal / Maintenance / active goals / inactive goals

Unlinking

Deleting a goal unlinks all of its projects. To unlink manually, open the project modal → Goal section → select No goal.


Tasks and Goals

Tasks can be assigned directly to a goal, independent of any project.

Assigning a task to a goal

On the task detail page (/task/:uid), the right sidebar contains a Goal card below the Area card. Click it to open a searchable dropdown of all goals, then select one to save.

To remove the goal, click the X button on the selected goal, or click the card and choose a different goal.

What this means

  • A task can carry its own goal that is separate from its project's goal.
  • The goal detail page lists tasks that are directly assigned to the goal via this field.
  • Tasks do not inherit a goal from their project — the two are independent fields.

Area Detail Page — Goals Section

The area detail page (/area/:uid-slug) has a goals column showing all goals belonging to that area.

Buckets in the goals column:

  1. Active goals — each with its linked project cards underneath
  2. Maintenance — projects flagged as maintenance
  3. Unlinked — projects with no goal and no maintenance flag
  4. Inactive goals — collapsed into an expandable section

For the full area detail page layout, see Areas.


API Reference

All endpoints require authentication. Responses are scoped to the current user.

List goals

GET /api/goals
GET /api/goals?area_uid=:uid
GET /api/goals?area_id=:id

Returns { goals: Goal[] }. Pass area_uid or area_id to filter to a single area.

GET /api/goals/:uid

Returns { goal: Goal }. The goal object includes Tasks and Projects arrays.

Create goal

POST /api/goals
Body: { title, area_id?, why?, horizon?, target_date?, status? }

Returns { goal: Goal, active_goals_count: number }.

Validation:

  • title required, non-empty
  • area_id is optional (nullable)

Update goal

PATCH /api/goals/:uid
Body: { title?, area_id?, why?, horizon?, target_date?, status? }

Returns { goal: Goal, active_goals_count: number }.

Delete goal

DELETE /api/goals/:uid

Returns 204. Projects and tasks referencing this goal become unlinked.


MCP Tools

Goals are accessible via the MCP integration using five tools:

ToolDescription
list_goalsList goals, optionally filtered by area or status
get_goalGet a single goal by UID (includes linked tasks and projects)
create_goalCreate a new goal (title required; area is optional)
update_goalUpdate title, why, horizon, target date, area, or status
delete_goalDelete a goal (linked projects and tasks become unlinked)

See MCP Integration for full parameter details.


  • Areas - Goals can optionally belong to areas; the area detail page shows goals for that area
  • Projects - Projects can link to a goal or be flagged as maintenance
  • Tasks - Tasks carry their own goal for direct assignment
  • MCP Integration - AI tool access to goals via Model Context Protocol
  • Database & Migrations - Data model details

Technical Implementation Files:

  • Goal model: /backend/models/goal.js
  • Goals module: /backend/modules/goals/ (routes, controller, service, repository)
  • MCP tools: /backend/modules/mcp/tools/goalTools.js
  • Goals list page: /frontend/components/Goals.tsx
  • Goal detail page: /frontend/components/Goal/GoalDetails.tsx
  • Goal modal: /frontend/components/Goal/GoalModal.tsx
  • Sidebar section: /frontend/components/Sidebar/SidebarGoals.tsx
  • Task goal card: /frontend/components/Task/TaskDetails/TaskGoalCard.tsx
  • Goals API client: /frontend/utils/goalsService.ts