# Projects - Behavior Rules

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

---

## Overview

**Projects** are containers for organizing related tasks and notes in tududi. They sit in the middle of the hierarchy (Areas > Projects > Tasks) and provide a focused workspace for achieving specific goals.

**Key characteristics:**
- Group related tasks and notes together
- Track progress and completion percentage
- Can belong to an Area for higher-level organization
- Support collaboration through sharing
- Have status lifecycle (Planned → In Progress → Done)
- Can be pinned to sidebar for quick access
- Support tags, priorities, and due dates

**URL:** `/project/:uid`

---

## Core Principles

1. **Projects are optional containers**
   - Tasks and notes can exist without projects (orphaned)
   - But projects help organize work into logical groupings

2. **Projects don't cascade delete**
   - Deleting a project orphans its tasks/notes, doesn't delete them
   - This prevents accidental data loss

3. **Projects track progress automatically**
   - Completion percentage calculated from child tasks
   - "Stalled" detection for projects with no active tasks

4. **Projects can be shared**
   - Share with other users (read-only or read-write)
   - Shared project access extends to all tasks/notes within

---

## Hierarchy

```
Areas (highest level - life domains)
  └── Projects (mid level - specific goals/initiatives)
        ├── Tasks (actionable items)
        └── Notes (reference material)
```

**Example:**
```
Area: "Personal"
  └── Project: "Home Renovation"
        ├── Task: "Get quotes from contractors"
        ├── Task: "Choose paint colors"
        └── Note: "Inspiration photos from Pinterest"
```

---

## Project Properties

### Basic Information

1. **Name** (required)
   - The project title
   - Example: "Q1 Marketing Campaign", "Home Renovation", "Learn Spanish"

2. **Description** (optional)
   - Longer explanation of the project's purpose
   - Supports multi-line text
   - Displayed at top of project page

3. **UID** (auto-generated)
   - Unique identifier for the project
   - Used in URLs: `/project/:uid`
   - Cannot be changed

### Organization

4. **Area** (optional)
   - Parent area this project belongs to
   - Used for high-level grouping
   - Can be changed or removed
   - Examples: "Work", "Personal", "Health"

5. **Tags** (optional)
   - Flexible categorization system
   - Multiple tags supported: `#q1`, `#urgent`, `#client-work`
   - Tags created automatically when used
   - Shared across projects, tasks, and notes

### Status and Lifecycle

6. **Status** (required, default: `not_started`)
   - **Planned**: Future project, not started yet
   - **Not Started**: Ready to begin but not yet started
   - **In Progress**: Currently being worked on
   - **Waiting**: Blocked or waiting on external dependency
   - **Done**: Project completed successfully
   - **Cancelled**: Project abandoned or no longer relevant

7. **Priority** (optional)
   - 0 = None (default)
   - 1 = Medium
   - 2 = High
   - Visual indicator in UI (colored dot)

8. **Due Date** (optional)
   - When the project should be completed
   - Triggers notifications when approaching or overdue
   - Displayed in project cards and detail view

### Display and Organization

9. **Pin to Sidebar** (boolean, default: `false`)
   - Pins project to left sidebar for quick access
   - Pinned projects shown above unpinned ones
   - Useful for currently active projects

10. **Banner Image** (optional)
    - Visual header image for the project
    - Uploaded via image picker
    - Displayed at top of project detail page
    - Can be edited or removed

### Task Display Preferences

11. **Show Completed Tasks** (boolean, default: `false`)
    - Controls whether completed tasks are visible
    - Per-project setting
    - Helps reduce clutter on active projects

12. **Task Sort Order** (string, default: `created_at:desc`)
    - How tasks are sorted within the project
    - Options: `created_at:asc`, `created_at:desc`, `due_date:asc`, `priority:desc`, etc.
    - Per-project preference

---

## Calculated Properties

These properties are computed automatically based on project content:

### Task Status Tracking

**task_status** object:
- `total`: Total number of tasks in project
- `done`: Count of completed tasks
- `in_progress`: Count of tasks currently being worked on
- `not_started`: Count of tasks not yet started

**Example:**
```json
{
  "total": 10,
  "done": 6,
  "in_progress": 3,
  "not_started": 1
}
```

### Completion Percentage

**completion_percentage**: `0-100`
- Calculated as: `(done / total) * 100`
- Rounded to whole number
- Shows `0%` if project has no tasks
- Based on parent tasks only (subtasks don't count separately)

### Stalled Detection

**is_stalled**: `true | false`
- A project is "stalled" when:
  - Status is `in_progress` OR `planned`
  - AND has zero active tasks (no "in_progress" or "not_started" tasks)
- Indicates projects that need attention
- Surfaced in Productivity Assistant

**Example scenarios:**
- ✅ Status: `in_progress`, Tasks: 5 (3 done, 2 not_started) → NOT stalled
- ❌ Status: `in_progress`, Tasks: 5 (all done) → STALLED
- ✅ Status: `done`, Tasks: 5 (all done) → NOT stalled (done projects can't be stalled)
- ❌ Status: `planned`, Tasks: 0 → STALLED

### Sharing Metadata

**share_count**: Number of users project is shared with
**is_shared**: `true` if `share_count > 0`

---

## Project Lifecycle

### Creating a Project

**Ways to create:**
1. Click "New Project" button on Projects page
2. Use `+Project` syntax in Inbox and convert
3. Create via modal when adding task/note

**Required fields:**
- Name

**Default values:**
- Status: `not_started`
- Pin to sidebar: `false`
- Show completed tasks: `false`
- Task sort order: `created_at:desc`

**Auto-generated:**
- UID (unique identifier)
- Timestamps (created_at, updated_at)

### Editing a Project

**What you can edit:**
- All basic properties (name, description, area, status, priority, due date)
- Tags (add/remove)
- Banner image (upload/change/remove)
- Display preferences (pin, show completed, sort order)

**What you cannot edit:**
- UID
- User ID (owner)
- Created timestamp

**Who can edit:**
- Project owner (full access)
- Users with read-write (`rw`) share access
- Admin users

### Changing Status

**Status transitions:**
- Any status can change to any other status (no enforced workflow)
- Common flows:
  - `planned` → `in_progress` → `done`
  - `not_started` → `in_progress` → `done`
  - `in_progress` → `waiting` → `in_progress`
  - `in_progress` → `cancelled`

**Effects of status change:**
- Affects "active projects" filter (planned/in_progress/waiting)
- Affects stalled detection
- Updates last modified timestamp

### Deleting a Project

**What happens:**
1. Project record is deleted from database
2. **Tasks belonging to project are orphaned** (project_id set to null)
3. **Notes belonging to project are orphaned** (project_id set to null)
4. Project tags associations are removed
5. Share permissions are deleted

**What is NOT deleted:**
- Tasks (they become orphaned, appear in "No Project" filter)
- Notes (they become orphaned)
- Tags (they remain in system)
- Area (parent area is unaffected)

**Who can delete:**
- Project owner only
- Admin users

**No undo:**
- Deletion is permanent
- Use status `cancelled` if you want to preserve but deactivate

---

## Areas and Projects

### What is an Area?

An **Area** is a top-level category representing a life domain or responsibility area. Examples:
- Personal
- Work
- Health
- Finance
- Learning

### Relationship

**Projects belong to Areas (optional):**
- One project can belong to one area
- A project can have no area (orphaned)
- An area can have multiple projects
- Deleting an area orphans its projects (doesn't delete them)

### Grouping

**On Projects page:**
- Projects can be grouped by area (`?grouped=true`)
- Shows "No Area" group for orphaned projects
- Useful for high-level overview of work

**Example grouped view:**
```
Work
  ├── Q1 Marketing Campaign
  ├── Website Redesign
  └── Client Onboarding

Personal
  ├── Home Renovation
  └── Learn Spanish

No Area
  └── Random Ideas
```

---

## Tasks and Notes in Projects

### Adding Tasks to Projects

**Ways to assign task to project:**
1. Select project in task detail modal
2. Use `+ProjectName` syntax in Inbox
3. Create task directly from project page
4. Bulk assign existing orphaned tasks

**Task inheritance:**
- Tasks inherit nothing from parent project
- Task status is independent of project status
- Task due date is independent of project due date
- Task priority is independent of project priority

**Task visibility:**
- All project tasks shown on project detail page
- Can filter by status (not_started, in_progress, done)
- Can toggle "Show completed" per project
- Parent tasks only (subtasks nested under parents)

### Adding Notes to Projects

**Ways to assign note to project:**
1. Select project in note modal
2. Use `+ProjectName` syntax in Inbox when converting to note
3. Create note directly from project page

**Note display:**
- Notes shown in separate "Notes" section on project page
- Sorted by most recent first
- Can be tagged independently

### Orphaned Tasks/Notes

**What are orphaned items:**
- Tasks or notes with no project assigned (`project_id = null`)
- Created without project, or project was deleted

**How to find:**
- Tasks page: Filter by "No Project"
- Can bulk-assign to projects later

**Not a problem:**
- Orphaned items are perfectly valid
- Projects are optional organizational containers

---

## Project Sharing and Collaboration

### Share Levels

1. **Read-Only (`ro`)**
   - View project, tasks, and notes
   - Cannot edit or add content
   - Cannot share with others

2. **Read-Write (`rw`)**
   - View project, tasks, and notes
   - Edit existing content
   - Add new tasks and notes
   - Cannot delete project
   - Cannot change sharing settings

3. **Owner (implicit)**
   - Full control
   - Can delete project
   - Can change sharing settings
   - Can change project status

### Sharing a Project

**How to share:**
1. Open project detail page
2. Click "Share" button
3. Enter email of user to share with
4. Select access level (read-only or read-write)
5. User receives notification

**Requirements:**
- Other user must have a tududi account
- Must use exact email address
- Cannot share with yourself

### Access Inheritance

**When you share a project:**
- Shared user gets access to ALL tasks in project
- Shared user gets access to ALL notes in project
- Access level applies to entire project tree

**Example:**
- You share "Website Redesign" project with Alice (read-write)
- Alice can now view/edit:
  - The project itself
  - All tasks in the project
  - All notes in the project
  - All subtasks of tasks in the project

### Shared Projects Behavior

**For shared users:**
- Shared projects appear in their Projects list
- Can filter projects by ownership vs shared
- Shared indicator shown on project card
- Cannot change Area (only owner can)
- Cannot delete project (only owner can)

**Notifications:**
- Project owner sees share count badge
- Shared users see owner's name
- Activity on shared project can trigger notifications

---

## Due Dates and Notifications

### Setting Due Dates

**Project due date:**
- Optional field
- Date + time picker
- Represents project deadline

**Independent from task due dates:**
- Project due date doesn't affect task due dates
- Tasks can be due before, during, or after project due date
- No validation or warnings if dates mismatch

### Due Date Notifications

**Automated notifications created when:**
1. **Due Soon**: Project due date within 24 hours
2. **Overdue**: Project due date has passed

**Notification timing:**
- Checked via cron job (runs periodically)
- Notifications sent in-app
- Can also send via Telegram if configured

**Notification rules:**
- Only for projects with status NOT `done` or `cancelled`
- Only if user has notifications enabled for this type
- Won't create duplicate notifications
- Old unread notifications deleted before creating new one
- Dismissed notifications won't be recreated

**Example messages:**
- "Your project 'Website Redesign' is due in 6 hours"
- "Your project 'Q1 Report' was due yesterday"
- "Your project 'Client Onboarding' was due 3 days ago"

---

## Filtering and Viewing Projects

### Projects List Page

**URL:** `/projects`

**Default view:**
- All projects for current user
- Includes owned and shared projects
- Sorted alphabetically by name
- Shows project cards with:
  - Name, description (truncated)
  - Status badge
  - Priority indicator
  - Completion percentage
  - Task count
  - Tags
  - Area name
  - Pinned indicator
  - Shared indicator

### Filter Options

1. **By Status**
   - Query: `?status=in_progress`
   - Values: `planned`, `not_started`, `in_progress`, `waiting`, `done`, `cancelled`
   - Can filter multiple: `?status[]=in_progress&status[]=planned`

2. **By Active State**
   - Query: `?active=true`
   - `true`: Shows planned, in_progress, waiting
   - `false`: Shows not_started, done, cancelled

3. **By Area**
   - Query: `?area=:area-uid`
   - Shows only projects in specified area
   - Use area UID from URL

4. **By Pinned**
   - Query: `?pin_to_sidebar=true`
   - `true`: Only pinned projects
   - `false`: Only unpinned projects

5. **Grouped by Area**
   - Query: `?grouped=true`
   - Groups projects under area names
   - Special "No Area" group for orphaned projects

**Example URLs:**
- `/projects?status=in_progress` - Active projects
- `/projects?active=true` - All active projects
- `/projects?pin_to_sidebar=true` - Pinned projects only
- `/projects?area=abc123&grouped=true` - Projects in specific area, grouped

---

## Sidebar Pinning

### What is Pinning?

**Pin to Sidebar** is a quick-access feature that:
- Shows project in left sidebar navigation
- Provides one-click access to frequently used projects
- Appears under "Pinned Projects" section

### How to Pin

**Ways to pin:**
1. Click pin icon on project card
2. Toggle "Pin to sidebar" in project modal
3. Update via project detail page

**Pin behavior:**
- Pinned projects shown above unpinned ones in sidebar
- Sorted alphabetically within pinned section
- Can pin unlimited projects (but UI gets crowded)

### When to Pin

**Good candidates for pinning:**
- Currently active projects you access daily
- Projects in "in_progress" status
- Projects with frequent task additions
- Projects you're actively collaborating on

**Not recommended:**
- Completed or cancelled projects
- Future/planned projects not yet active
- Projects you rarely access

---

## Project Insights and Metrics

### Task Status Metrics

Displayed on project cards and detail page:

**Total tasks**: Count of all parent tasks (excluding subtasks)
**Completion percentage**: Visual progress bar
**Breakdown by status**:
- Done (green)
- In progress (blue)
- Not started (gray)

### Stalled Projects

**What is a stalled project?**
- Status is `planned` or `in_progress`
- Has zero active tasks (all tasks are done, or no tasks exist)

**Why it matters:**
- Indicates project needs attention
- Either needs new tasks, or should change status to "done"
- Surfaced in Productivity Assistant feature

**How to fix:**
1. Add new tasks to move project forward
2. Change status to "done" if actually complete
3. Change status to "waiting" or "cancelled" if appropriate

### Productivity Assistant

**Location:** Today page (if enabled in settings)

**Insights about projects:**
- **Stalled Projects**: Lists projects that need tasks/actions
- **Projects Near Deadline**: Due soon or overdue
- **Vague Projects**: Projects with vague task descriptions

---

## Common Workflows

### Workflow 1: Start a New Project

**Scenario:** Beginning a new initiative

1. Navigate to `/projects`
2. Click "New Project" button
3. Fill in details:
   - Name: "Website Redesign"
   - Description: "Redesign company website for Q1 launch"
   - Area: Work
   - Status: Planned
   - Priority: High
   - Tags: #q1, #design
4. Save project
5. Add first task: "Research design trends"
6. Change status to "In Progress" when ready to begin

### Workflow 2: Track Project Progress

**Scenario:** Monitoring ongoing project

1. Open project detail page
2. Review completion percentage (e.g., 60%)
3. Check task breakdown:
   - 6 done
   - 2 in progress
   - 2 not started
4. Complete some tasks
5. Completion percentage updates automatically
6. When all tasks done, mark project status as "Done"

### Workflow 3: Share Project with Collaborator

**Scenario:** Working with team member

1. Open project "Client Onboarding"
2. Click "Share" button
3. Enter collaborator email: alice@example.com
4. Select "Read-Write" access
5. Save
6. Alice receives notification
7. Alice can now:
   - View all project tasks
   - Add new tasks
   - Complete tasks
   - Add notes
8. Both see real-time updates

### Workflow 4: Organize with Areas

**Scenario:** High-level life organization

1. Create Areas:
   - Work
   - Personal
   - Health
2. Assign projects to areas:
   - "Q1 Marketing" → Work
   - "Home Renovation" → Personal
   - "Exercise Routine" → Health
3. View projects grouped by area
4. Get high-level view of balance across life domains

### Workflow 5: Clean Up Completed Projects

**Scenario:** End of quarter cleanup

1. Navigate to `/projects?status=in_progress`
2. Review each project:
   - If all tasks done → Change status to "Done"
   - If abandoned → Change status to "Cancelled"
   - If stalled → Add new tasks or change status
3. Move completed projects out of active view
4. Focus on truly active projects

---

## Project Display Rules

### Project Cards (List View)

**Information shown:**
- Project name (bold, clickable)
- Description (first 100 chars, truncated with "...")
- Status badge (color-coded)
- Priority dot (if set)
- Completion percentage bar
- Task count: "X of Y tasks done"
- Area name (if assigned)
- Tags (up to 3 shown, "+N more" if exceeded)
- Last updated timestamp
- Pin indicator (star icon)
- Share indicator (user icon + count)

**Color coding:**
- **Planned**: Purple badge
- **Not Started**: Gray badge
- **In Progress**: Blue badge
- **Waiting**: Yellow badge
- **Done**: Green badge
- **Cancelled**: Red badge

### Project Detail Page

**Sections:**
1. **Banner Image** (if set) - full-width header
2. **Project Header**
   - Name (editable inline)
   - Status dropdown
   - Priority selector
   - Pin toggle
   - Share button
3. **Metadata Row**
   - Area (linked)
   - Due date (if set)
   - Tags (editable)
4. **Description** (expandable text area)
5. **Progress Section**
   - Completion percentage bar
   - Task breakdown (done/in progress/not started)
6. **Tasks Section**
   - Task list (sorted per project preference)
   - "Add Task" button
   - Show/hide completed toggle
7. **Notes Section**
   - Note cards (most recent first)
   - "Add Note" button
8. **Insights Panel** (if productivity assistant enabled)
   - Auto-suggested next actions
   - Stalled warning
   - Due date alerts

---

## Special Features

### 1. Auto-Suggest Next Action

**What it does:**
- AI-powered suggestions for next steps
- Analyzes project context, tasks, and notes
- Suggests concrete actions to move project forward

**Appears when:**
- Project has description and some tasks
- User has AI features enabled
- Accessed via "Suggest Next Action" button

**Example suggestions:**
- "Schedule a meeting with the designer"
- "Review the latest mockups"
- "Get feedback from stakeholders"

### 2. Banner Images

**Purpose:**
- Visual identity for projects
- Makes projects more recognizable
- Improves aesthetic appeal

**How to set:**
1. Click "Edit Banner" on project detail page
2. Upload image file (JPG, PNG)
3. Image stored in `/api/uploads/projects/`
4. Can replace or remove later

**Recommended:**
- Use relevant imagery (website screenshot for web project, house for renovation)
- High resolution (1200x400 or larger)
- Landscape orientation

### 3. Task Sorting Preferences

**Per-project sorting:**
- Each project can have its own task sort order
- Doesn't affect other projects
- Persisted across sessions

**Sort options:**
- Created date (newest/oldest first)
- Due date (soonest/latest first)
- Priority (highest/lowest first)
- Status (by progress)
- Name (A-Z, Z-A)

**Use cases:**
- Sprint project: Sort by priority
- Research project: Sort by created date
- Deadline-driven project: Sort by due date

### 4. Keyboard Shortcuts

**On project page:**
- `n`: Create new task
- `Shift+N`: Create new note
- `e`: Edit project details
- `p`: Pin/unpin project
- `/`: Focus search

**Global shortcuts:**
- `g` then `p`: Go to Projects page

---

## Troubleshooting

### "My tasks disappeared when I deleted the project"

**What happened:**
- Tasks are not deleted, they're orphaned
- They still exist in your database

**How to find:**
1. Go to Tasks page
2. Filter by "No Project"
3. You'll see all orphaned tasks
4. Re-assign to a different project if needed

### "Project shows 0% complete but I have completed tasks"

**Possible causes:**
1. All completed items are subtasks (only parent tasks count)
2. Completed items were soft-deleted
3. Tasks belong to different project

**How to check:**
1. Open project detail page
2. Check task list - are completed tasks visible?
3. Toggle "Show completed tasks" if hidden
4. Verify tasks actually belong to this project

### "Shared project not appearing for collaborator"

**Checklist:**
1. Did you use exact email address?
2. Does user have tududi account with that email?
3. Check share count - is it > 0?
4. Have them refresh their projects list
5. Check notifications - did they receive share notification?

### "Project marked as stalled but it has tasks"

**Why it's stalled:**
- All tasks are marked "done"
- Or all tasks are subtasks (parent tasks are all done)

**How to fix:**
1. Add new tasks for next phase of work
2. Or change project status to "done" if actually complete
3. Or change status to "waiting" if blocked

### "Can't delete a project"

**Possible reasons:**
1. You're not the owner (only owner can delete)
2. Permission issue (check if you have `rw` or just `ro`)

**Alternative:**
- If you can't delete, change status to "cancelled"
- Unpin from sidebar
- Filter it out of active views

---

## Related Documentation

- [Areas](07-areas.md) - Top-level organizational categories and project grouping
- [Recurring Tasks Behavior](01-recurring-tasks-behavior.md) - How recurring tasks work within projects
- [Today Page Sections](02-today-page-sections.md) - How project tasks appear on Today page
- [Inbox Page](04-inbox-page.md) - How to create projects from inbox
- [Architecture Overview](architecture.md) - Technical architecture
- [Backend Patterns](backend-patterns.md) - Module structure
- [Database & Migrations](database.md) - Data model details

**Technical Implementation Files:**
- Project model: `/backend/models/project.js`
- Area model: `/backend/models/area.js`
- Projects service: `/backend/modules/projects/service.js`
- Projects controller: `/backend/modules/projects/controller.js`
- Projects repository: `/backend/modules/projects/repository.js`
- Due project service: `/backend/modules/projects/dueProjectService.js`
- Permissions service: `/backend/services/permissionsService.js`
- Frontend components: `/frontend/components/Project/`
- Project detail page: `/frontend/components/Project/ProjectDetails.tsx`
- Project item card: `/frontend/components/Project/ProjectItem.tsx`
- Project modal: `/frontend/components/Project/ProjectModal.tsx`
- Share modal: `/frontend/components/Project/ProjectShareModal.tsx`

---

**Document Version:** 1.0.0
**Last Updated:** 2026-03-14
**Audience:** Developers, AI assistants, and end users