Projects
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
-
Projects are optional containers
- Tasks and notes can exist without projects (orphaned)
- But projects help organize work into logical groupings
-
Projects don't cascade delete
- Deleting a project orphans its tasks/notes, doesn't delete them
- This prevents accidental data loss
-
Projects track progress automatically
- Completion percentage calculated from child tasks
- "Stalled" detection for projects with no active tasks
-
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
-
Name (required)
- The project title
- Example: "Q1 Marketing Campaign", "Home Renovation", "Learn Spanish"
-
Description (optional)
- Longer explanation of the project's purpose
- Supports multi-line text
- Displayed at top of project page
-
UID (auto-generated)
- Unique identifier for the project
- Used in URLs:
/project/:uid - Cannot be changed
Organization
-
Area (optional)
- Parent area this project belongs to
- Used for high-level grouping
- Can be changed or removed
- Examples: "Work", "Personal", "Health"
-
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
-
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
-
Priority (optional)
- 0 = None (default)
- 1 = Medium
- 2 = High
- Visual indicator in UI (colored dot)
-
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
-
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
-
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
-
Show Completed Tasks (boolean, default:
false)- Controls whether completed tasks are visible
- Per-project setting
- Helps reduce clutter on active projects
-
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 projectdone: Count of completed tasksin_progress: Count of tasks currently being worked onnot_started: Count of tasks not yet started
Example:
{
"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_progressORplanned - AND has zero active tasks (no "in_progress" or "not_started" tasks)
- Status is
- 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:
- Click "New Project" button on Projects page
- Use
+Projectsyntax in Inbox and convert - 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→donenot_started→in_progress→donein_progress→waiting→in_progressin_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:
- Project record is deleted from database
- Tasks belonging to project are orphaned (project_id set to null)
- Notes belonging to project are orphaned (project_id set to null)
- Project tags associations are removed
- 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
cancelledif 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:
- Select project in task detail modal
- Use
+ProjectNamesyntax in Inbox - Create task directly from project page
- 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:
- Select project in note modal
- Use
+ProjectNamesyntax in Inbox when converting to note - 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
-
Read-Only (
ro)- View project, tasks, and notes
- Cannot edit or add content
- Cannot share with others
-
Read-Write (
rw)- View project, tasks, and notes
- Edit existing content
- Add new tasks and notes
- Cannot delete project
- Cannot change sharing settings
-
Owner (implicit)
- Full control
- Can delete project
- Can change sharing settings
- Can change project status
Sharing a Project
How to share:
- Open project detail page
- Click "Share" button
- Enter email of user to share with
- Select access level (read-only or read-write)
- 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:
- Due Soon: Project due date within 24 hours
- 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
doneorcancelled - 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
-
By Status
- Query:
?status=in_progress - Values:
planned,not_started,in_progress,waiting,done,cancelled - Can filter multiple:
?status[]=in_progress&status[]=planned
- Query:
-
By Active State
- Query:
?active=true true: Shows planned, in_progress, waitingfalse: Shows not_started, done, cancelled
- Query:
-
By Area
- Query:
?area=:area-uid - Shows only projects in specified area
- Use area UID from URL
- Query:
-
By Pinned
- Query:
?pin_to_sidebar=true true: Only pinned projectsfalse: Only unpinned projects
- Query:
-
Grouped by Area
- Query:
?grouped=true - Groups projects under area names
- Special "No Area" group for orphaned projects
- Query:
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:
- Click pin icon on project card
- Toggle "Pin to sidebar" in project modal
- 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
plannedorin_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:
- Add new tasks to move project forward
- Change status to "done" if actually complete
- 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
- Navigate to
/projects - Click "New Project" button
- Fill in details:
- Name: "Website Redesign"
- Description: "Redesign company website for Q1 launch"
- Area: Work
- Status: Planned
- Priority: High
- Tags: #q1, #design
- Save project
- Add first task: "Research design trends"
- Change status to "In Progress" when ready to begin
Workflow 2: Track Project Progress
Scenario: Monitoring ongoing project
- Open project detail page
- Review completion percentage (e.g., 60%)
- Check task breakdown:
- 6 done
- 2 in progress
- 2 not started
- Complete some tasks
- Completion percentage updates automatically
- When all tasks done, mark project status as "Done"
Workflow 3: Share Project with Collaborator
Scenario: Working with team member
- Open project "Client Onboarding"
- Click "Share" button
- Enter collaborator email: alice@example.com
- Select "Read-Write" access
- Save
- Alice receives notification
- Alice can now:
- View all project tasks
- Add new tasks
- Complete tasks
- Add notes
- Both see real-time updates
Workflow 4: Organize with Areas
Scenario: High-level life organization
- Create Areas:
- Work
- Personal
- Health
- Assign projects to areas:
- "Q1 Marketing" → Work
- "Home Renovation" → Personal
- "Exercise Routine" → Health
- View projects grouped by area
- Get high-level view of balance across life domains
Workflow 5: Clean Up Completed Projects
Scenario: End of quarter cleanup
- Navigate to
/projects?status=in_progress - 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
- Move completed projects out of active view
- 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:
- Banner Image (if set) - full-width header
- Project Header
- Name (editable inline)
- Status dropdown
- Priority selector
- Pin toggle
- Share button
- Metadata Row
- Area (linked)
- Due date (if set)
- Tags (editable)
- Description (expandable text area)
- Progress Section
- Completion percentage bar
- Task breakdown (done/in progress/not started)
- Tasks Section
- Task list (sorted per project preference)
- "Add Task" button
- Show/hide completed toggle
- Notes Section
- Note cards (most recent first)
- "Add Note" button
- 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:
- Click "Edit Banner" on project detail page
- Upload image file (JPG, PNG)
- Image stored in
/api/uploads/projects/ - 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 taskShift+N: Create new notee: Edit project detailsp: Pin/unpin project/: Focus search
Global shortcuts:
gthenp: 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:
- Go to Tasks page
- Filter by "No Project"
- You'll see all orphaned tasks
- Re-assign to a different project if needed
"Project shows 0% complete but I have completed tasks"
Possible causes:
- All completed items are subtasks (only parent tasks count)
- Completed items were soft-deleted
- Tasks belong to different project
How to check:
- Open project detail page
- Check task list - are completed tasks visible?
- Toggle "Show completed tasks" if hidden
- Verify tasks actually belong to this project
"Shared project not appearing for collaborator"
Checklist:
- Did you use exact email address?
- Does user have tududi account with that email?
- Check share count - is it > 0?
- Have them refresh their projects list
- 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:
- Add new tasks for next phase of work
- Or change project status to "done" if actually complete
- Or change status to "waiting" if blocked
"Can't delete a project"
Possible reasons:
- You're not the owner (only owner can delete)
- Permission issue (check if you have
rwor justro)
Alternative:
- If you can't delete, change status to "cancelled"
- Unpin from sidebar
- Filter it out of active views
Related Documentation
- Areas - Top-level organizational categories and project grouping
- Recurring Tasks Behavior - How recurring tasks work within projects
- Today Page Sections - How project tasks appear on Today page
- Inbox Page - How to create projects from inbox
- Architecture Overview - Technical architecture
- Backend Patterns - Module structure
- Database & Migrations - 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