Notes System
This document explains how the Notes system works in tududi from a user behavior perspective. For technical implementation details, see the backend code in /backend/modules/notes/ and frontend components in /frontend/components/Notes.tsx.
Overview
Notes are tududi's flexible capture and reference system - a place to store information, ideas, bookmarks, meeting notes, and any other content that doesn't fit the structured task workflow. Unlike tasks, notes don't have due dates, priorities, or completion states - they're purely informational.
Key characteristics:
- Rich text support via Markdown
- Optional project association
- Tag-based organization
- Color customization (10 predefined colors)
- Focus mode for distraction-free writing
- Auto-save every 1 second
- Search across title and content
URL: /notes or /notes/:uid
Core Principles
-
Information, not action
- Notes store knowledge, not tasks
- No due dates, priorities, or status tracking
- Permanent reference material vs. temporary to-dos
-
Flexible structure
- Can be standalone or linked to projects
- Tag-based categorization
- Full Markdown formatting support
-
Seamless capture
- Auto-save prevents data loss
- Quick creation from inbox items
- Inline editing without modals
Note Structure
Fields
| Field | Type | Required | Description |
|---|---|---|---|
| Title | String | No | Note heading (untitled if empty) |
| Content | Text | No | Main note body (Markdown supported) |
| Project | Reference | No | Associated project |
| Tags | Array | No | Categorization tags |
| Color | String | No | Background color (visual organization) |
| Created At | Timestamp | Auto | Creation timestamp |
| Updated At | Timestamp | Auto | Last modification timestamp |
Unique Identifier
- Each note has a UID (unique identifier):
uidfield - Used in URLs:
/notes/abc123def456 - Immutable - persists through all edits
Creating Notes
Method 1: Direct Creation
From Notes page:
- Navigate to
/notes - Click + icon in top right
- New note opens in edit mode
- Start typing - auto-saves after 1 second
- No explicit "Save" required
Keyboard shortcut:
n(while on Notes page) - Create new note
Method 2: From Inbox
Convert inbox item to note:
- Capture item in Inbox:
Article link https://example.com +Reading #bookmark - Click "Note" button or press Ctrl+N (Cmd+N on Mac)
- System creates note with:
- Title: Fetched from URL (or URL itself if fetch fails)
- Content: Full inbox text
- Project: Linked from
+Reading - Tags: Extracted from
#bookmark
- Inbox item marked as processed
See: Inbox Page documentation for details
Method 3: From Project Page
Via project view:
- Open project detail page
- Click "Add Note" in notes section
- Note pre-linked to current project
- Start editing
Editing Notes
Inline Editing
How it works:
- Click on a note in the list to preview it
- Click anywhere on the preview (title or content)
- Note switches to edit mode
- Changes auto-save every 1 second
- Press Escape to save and exit edit mode
Save behavior:
- Auto-save: Triggers 1 second after you stop typing
- Save status indicators:
- ✓ Saved (green) - Changes persisted
- Saving... (blue) - Upload in progress
- • Unsaved changes (amber) - Save failed or pending
What triggers auto-save:
- Typing in title field
- Typing in content field
- Changing project
- Adding/removing tags
- Changing note color
Title Editing
Rules:
- Title is optional - can be blank
- Blank titles show as "Untitled Note" in UI
- Auto-save only triggers if title is non-empty
- Click title in preview mode to enter edit mode
Content Editing
Markdown support:
- Full GitHub-flavored Markdown
- Headings:
# H1,## H2,### H3 - Lists:
- itemor1. item - Links:
`[text](url)` - Bold:
**text** - Italic:
_text_ - Code:
`inline`or triple backticks for blocks - Checkboxes:
- [ ] uncheckedor- [x] checked
Preview rendering:
- Content renders as formatted Markdown in preview mode
- Click to edit - shows raw Markdown
- Live preview updates on save
Multi-line Editing
Textarea behavior:
- Content field is a resizable textarea
- Minimum height: 300px
- Expands to fill available vertical space
- Shift+Enter for new lines
Note Organization
Projects
Linking notes to projects:
- In edit mode, click project icon or "Add project"
- Dropdown shows all available projects
- Select project or choose "No Project" to unlink
- Auto-saves immediately
Project behavior:
- Notes can belong to 0 or 1 project (not multiple)
- Changing projects moves the note
- Deleting a project unlinks all its notes (notes remain)
- Project appears in note metadata (preview and edit mode)
Permission handling:
- Can only link notes to projects you have write access to
- Shared projects: respects collaboration permissions
- Attempting to link to restricted project shows error
Tags
Adding tags:
- In edit mode, click tag icon or "Add tags"
- Tag input field appears
- Type tag name and press Enter
- Select from existing tags (autocomplete) or create new
- Tags save immediately with note
Tag rules:
- Valid characters: Alphanumeric, hyphens, underscores
- ✅
work,high-priority,q1_2026 - ❌
tag with spaces,emoji🎉,punctuation!
- ✅
- Case insensitive:
Work=work=WORK - Auto-create: New tags created on-the-fly
- Multiple tags: No limit on number per note
Removing tags:
- Click X on tag chip in tag input
- Changes save immediately
Tag navigation:
- Click tag name in preview mode → Go to tag page
- Shows all tasks/notes/projects with that tag
Colors
Note color feature:
- Feature flag:
ENABLE_NOTE_COLOR(enabled by default) - 10 predefined colors: Red, Orange, Amber, Green, Teal, Blue, Indigo, Purple, Pink, Grey
- None option: Default white/dark background
Setting color:
- Click ⋮ menu (three vertical dots) in top right
- Color palette grid appears
- Click desired color swatch
- Background changes immediately
- Auto-saves
Color behavior:
- Applies to entire note background (edit and preview)
- Text color adjusts automatically (dark text on light colors, light text on dark colors)
- Persists across sessions
- Visible in note preview (full panel uses color)
Accessibility:
- Luminance calculation ensures readable text contrast
- Dark colors → White text (#ffffff)
- Light colors → Dark gray text (#333333)
Note Views
List View (Left Panel)
Default behavior:
- Shows all notes in scrollable list
- Most recent first (by default)
- Each item displays:
- Title (bold, truncated)
- Content preview (first 100 characters, 2 lines max)
- Last updated date
Active note indicator:
- Blue vertical bar on left edge
- Highlighted background (white/gray-900)
- Indicates currently selected note
Empty state:
- "No notes found" message
- Appears when search returns zero results
- Or when user has no notes
Preview Mode (Right Panel)
When note selected:
- Full title at top (large, bold)
- Metadata row:
- 🕐 Last updated date
- 📁 Project (clickable link if assigned)
- 🏷️ Tags (clickable links)
- Content rendered as Markdown below
- Click anywhere to enter edit mode
Click behavior:
- Title → Enter edit mode
- Content → Enter edit mode
- Project link → Navigate to project page
- Tag link → Navigate to tag page
Empty state:
- "Select a note to preview" message
- Shows when no note is selected (desktop only)
Edit Mode (Right Panel)
Layout:
- Title input at top (large, 2rem font)
- Metadata controls:
- 🕐 Last updated or "New"
- 📁 Project selector
- 🏷️ Tag manager
- Save status indicator (✓ Saved / Saving... / • Unsaved)
- Content textarea (full height)
- ⋮ menu (options):
- Color picker
- Save button
- Delete button (if note exists)
Back button (mobile):
- ← Back to list
- Appears only on mobile/tablet views
- Saves note before returning
Keyboard shortcuts:
Esc- Save and exit edit mode (if title exists)Ctrl/Cmd+S- Manual save (implicit - auto-save handles this)
Focus Mode
Purpose: Distraction-free editing for deep work
Entering focus mode:
- Click expand icon (↗️) in top right
- Note expands to full screen
- Hides sidebar, navigation, and note list
What's visible in focus mode:
- Note title (editable)
- Note content (editable)
- Minimal toolbar:
- Close button (top right)
- Save status
- Optional: Project and tag buttons (collapsed)
Exiting focus mode:
- Click X or close button
- Press
Esckey - Returns to standard two-panel view
Auto-save in focus mode:
- Same 1-second debounce
- Save status indicator remains visible
- Changes persist automatically
Searching and Filtering
Search
How to search:
- Enter query in search box (top of note list)
- Results filter in real-time
- Searches both title AND content
Search behavior:
- Case insensitive: "markdown" matches "Markdown", "MARKDOWN"
- Substring matching: "task" matches "tasks", "multitasking"
- Multi-word: All words must appear (AND logic)
- No regex: Plain text search only
Search scope:
- Title field
- Content field (full text)
- Does NOT search tags or project names
Sorting
Sort options:
- Created At (default) - Newest first
- Title - Alphabetical A-Z
- Updated - Most recently modified first
How to sort:
- Click sort icon (top of note list)
- Select sort option from dropdown
- List re-orders immediately
Sort persistence:
- Persists during session
- Resets to "Created At" on page reload
Tag Filtering
Via URL query:
/notes?tag=bookmark- Show only notes with #bookmark tag- API endpoint:
GET /api/notes?tag=bookmark - Filter by single tag only (not multiple)
No UI filter currently:
- Must use URL directly or navigate via tag page
- Click tag in note preview → Navigates to tag page showing all tagged items
Deleting Notes
Confirmation Required
Steps:
- Select note or enter edit mode
- Click ⋮ menu (three dots)
- Click Delete (red text)
- Confirmation dialog appears:
- "Are you sure you want to delete this note?"
- Shows note title
- Confirm or cancel
What gets deleted:
- Note record (title, content, metadata)
- Tag associations (note-tag links)
- Project association (if any)
What's preserved:
- Project (unlinking only)
- Tags (remain in tag list)
- No note history (deletion is permanent)
No undo:
- Deletion is immediate and irreversible
- No trash/archive feature
- Ensure confirmation before proceeding
Responsive Behavior
Desktop (≥768px)
Two-panel layout:
- Left panel: Note list (fixed width: 320px)
- Right panel: Preview/edit (flexible width)
- Both panels visible simultaneously
Auto-selection:
- First note auto-selected on page load
- Clicking note updates right panel
- No "back" navigation needed
Mobile/Tablet (<768px)
Single panel:
- Shows note list OR preview/edit (not both)
- Clicking note → Hides list, shows preview
- "← Back to list" button → Returns to list
Navigation flow:
- View note list
- Tap note → Preview opens (list hidden)
- Tap anywhere → Edit mode
- Tap "← Back" → Returns to list
Integration with Other Features
Inbox Integration
Creating notes from inbox:
- Inbox items with URLs suggest "Note"
- Inbox items with
#bookmarktag suggest "Note" - Conversion preserves tags and project references
- See: Inbox Page documentation
URL title extraction:
- System fetches webpage
<title>tag - 3-second timeout
- Falls back to URL if fetch fails
- Auto-adds
#bookmarktag
Project Integration
Notes in project view:
- Project detail page shows associated notes
- "Add Note" button creates pre-linked note
- Notes count appears in project card
- Deleting project unlinks notes (notes remain)
Shared project notes:
- Respects collaboration permissions
- Read-only access: Can view notes, cannot edit
- Read-write access: Can create/edit/delete notes
- Admin access: Full control
Tag Integration
Tag page shows notes:
/tag/:uidlists all tasks, notes, projects with tag- Notes appear in dedicated "Notes" section
- Clicking note → Opens in Notes page
Tag management:
- Tags created via notes appear in tag list
- Deleting tag removes from all notes
- Renaming tag (if supported) updates all notes
Auto-Save Behavior
Debounced Save
How it works:
- User types in title or content
- Save status changes to "• Unsaved changes"
- After 1 second of inactivity, triggers save
- Status changes to "Saving..."
- On success: "✓ Saved"
- On failure: "• Unsaved changes" (stays amber)
Debounce settings:
- Delay: 1000ms (1 second)
- Trailing: Yes (saves after typing stops)
- Leading: No (doesn't save on first keystroke)
What Triggers Save
Auto-save triggers:
- Title field changes
- Content field changes
- Project selection changes
- Tag additions/removals
- Color changes
No save triggers:
- Focusing input fields
- Scrolling
- Opening dropdowns
- Viewing preview mode
Save Guarantees
When navigation occurs:
- Leaving Notes page → Pending saves complete first
- Selecting different note → Current note saves first
- Mobile "Back" button → Saves before hiding panel
Error handling:
- Network failure → Status shows "• Unsaved changes"
- No automatic retry (user must trigger re-save by editing)
- Console error logged for debugging
Edge case - empty title:
- Auto-save only triggers if
titleis non-empty - Empty title note → Not saved to server
- User must enter title to persist note
Display and Rendering
Markdown Rendering
Supported syntax:
- Headings:
#,##,###,####,#####,###### - Bold:
**text**or__text__ - Italic:
*text*or_text_ - Links:
`[text](url)`or<url> - Lists:
- item(unordered) or1. item(ordered) - Checkboxes:
- [ ] todoor- [x] done - Code:
`inline`or```language\nblock\n``` - Blockquotes:
> quote - Horizontal rules:
---or*** - Tables: Pipe-separated cells
- Images:
``(rendered as<img>)
Rendering engine:
- Uses
MarkdownRenderercomponent - Safe HTML escaping (prevents XSS)
- Syntax highlighting for code blocks
- Opens external links in new tab
Title Display
Preview mode:
- Large heading (2rem font size)
- Medium weight (500)
- Truncated if very long (responsive)
- Shows "Untitled Note" if empty
Edit mode:
- Full-width input field
- Same size/weight as preview (2rem/500)
- Placeholder: "Note title..."
- Auto-focus on new note creation
Content Display
Preview mode:
- Rendered Markdown with styling
- Text size: 0.875rem (14px) on mobile, 1rem (16px) on desktop
- Line height: 1.5
- Scrollable if content exceeds viewport
Edit mode:
- Plain textarea (raw Markdown)
- Minimum height: 300px
- Expands to fill vertical space
- Monospace font (not specified, browser default)
- Placeholder: "Write your note content here... (Markdown supported)"
Color-Aware Text
Text color adjustment:
- Background luminance calculated from hex color
- Luminance < 0.4 → White text (#ffffff)
- Luminance ≥ 0.4 → Dark gray text (#333333)
- Applies to title, content, and metadata text
Formula:
luminance = (0.299 * R + 0.587 * G + 0.114 * B) / 255
Keyboard Shortcuts
Global (anywhere in app)
| Shortcut | Action |
|---|---|
g then n | Go to Notes page |
On Notes page
| Shortcut | Action |
|---|---|
n | Create new note |
| Click note | Open in preview mode |
In edit mode
| Shortcut | Action |
|---|---|
Esc | Save and exit edit mode (if title exists) |
Tab | Navigate between fields |
In focus mode
| Shortcut | Action |
|---|---|
Esc | Exit focus mode |
| Click X | Close focus mode |
Common Workflows
Workflow 1: Quick Note Capture
Scenario: Capture a fleeting idea
- Press
gthennto open Notes page - Click + to create new note
- Type title: "Product idea - Voice control"
- Write content:
## Overview
Users want hands-free interaction
## Features
- Voice commands for task creation
- Smart parsing of natural language
- Integration with existing task flow - Auto-saves after 1 second
- Add tags:
#product,#ideas - Link to project: "Product Roadmap"
- Press Esc to exit edit mode
Workflow 2: Meeting Notes
Scenario: Documenting a client meeting
- Navigate to
/notes - Create new note
- Title: "Client Meeting - Acme Corp - 2026-03-14"
- Content:
## Attendees
- John (Acme Corp CEO)
- Sarah (Product Manager)
- Me
## Discussion
- Requested new reporting dashboard
- Timeline: Q2 2026
- Budget: $50k
## Action Items
- [ ] Send proposal by Monday
- [ ] Schedule follow-up call
- [ ] Share mockups - Link to project: "Acme Corp"
- Add tags:
#meetings,#clients,#acme - Auto-saves throughout
- Click "Focus mode" for distraction-free review
Workflow 3: Bookmark Collection
Scenario: Save an article to read later
- From Inbox:
https://example.com/article +Reading #bookmark - Press
Ctrl+N(orCmd+N) - System:
- Fetches title: "10 Tips for Better Focus"
- Creates note with URL as content
- Links to "Reading" project
- Adds
#bookmarktag
- Note auto-saved and opens in edit mode
- Add notes below URL:
https://example.com/article
## Key Takeaways
- Pomodoro technique
- Single-tasking
- Environment matters - Press Esc to save and exit
Workflow 4: Knowledge Base
Scenario: Building a personal wiki
- Create note: "Git Cheatsheet"
- Content:
## Common Commands
### Branching
- `git branch <name>` - Create branch
- `git checkout <name>` - Switch branch
- `git checkout -b <name>` - Create and switch
### Committing
- `git add .` - Stage all changes
- `git commit -m "message"` - Commit with message
- `git commit --amend` - Amend last commit
### Remote
- `git push origin <branch>` - Push to remote
- `git pull` - Fetch and merge - Add tags:
#reference,#git,#dev - Link to project: "Developer Resources"
- Set color: Blue (for tech references)
- Bookmark
/notes/:uidfor quick access
Workflow 5: Weekly Review
Scenario: Process and organize accumulated notes
- Navigate to
/notes - Sort by "Updated" to see recent notes
- Search for "meeting" to find unprocessed meeting notes
- For each note:
- Review content
- Extract action items → Convert to tasks
- Add relevant tags
- Link to appropriate projects
- Archive or delete if no longer needed
- Search for untagged notes (manual review)
- Ensure all bookmarks are properly categorized
Troubleshooting
"Auto-save not working"
Possible causes:
- Title is empty → Auto-save only triggers with non-empty title
- Network error → Check browser console for errors
- Session expired → Re-authenticate
- Debounce hasn't elapsed → Wait 1 second after typing
Solution:
- Add a title (at minimum)
- Check network connection
- Refresh page and re-login if needed
- Observe save status indicator
"Note disappeared after creating"
Likely cause: Empty title + navigated away
What happened:
- Created note without title
- Auto-save didn't trigger (requires title)
- Navigated away → Note not persisted
Prevention:
- Always add a title before leaving edit mode
- Check for "✓ Saved" status before navigating
"Markdown not rendering"
Check:
- Are you in edit mode? (shows raw Markdown)
- Switch to preview mode (click note in list or press Esc)
- Ensure Markdown syntax is correct
- ❌
#Heading(no space) - ✅
# Heading(space required)
- ❌
"Can't link note to project"
Possible causes:
- Project doesn't exist → Create project first
- No write access to project → Check collaboration permissions
- Project is archived → Unarchive or choose different project
Solution:
- Verify project exists in project list
- Check permissions with project owner
- Select different project
"Tags not saving"
Check:
- Tag name has invalid characters?
- Use only alphanumeric, hyphens, underscores
- Network error during save?
- Check browser console
- Tag input didn't close properly?
- Click outside tag input to trigger save
"Color not appearing"
Check:
- Is
ENABLE_NOTE_COLORfeature flag enabled?- Check with admin/developer
- Browser caching issue?
- Hard refresh:
Ctrl+Shift+RorCmd+Shift+R
- Hard refresh:
- Dark mode conflict?
- Try switching theme
Best Practices
Organization
-
Use consistent tagging:
- Create a tag hierarchy:
#project-ideas,#project-specs,#project-retros - Avoid tag proliferation: Reuse existing tags
- Create a tag hierarchy:
-
Link notes to projects:
- Project-specific notes → Link to project
- General knowledge → Leave unlinked or create "Resources" project
-
Color coding:
- Develop personal system: Red = urgent, Blue = reference, Green = ideas
- Or by topic: Purple = client work, Teal = personal
Content
-
Use Markdown effectively:
- Headings for structure
- Lists for clarity
- Checkboxes for tracking follow-ups within notes
- Code blocks for technical snippets
-
Include metadata:
- Date in title for meeting notes: "Meeting - Client - 2026-03-14"
- Context in content: "Source: [Article](url)"
-
Break up long notes:
- Split into multiple notes by subtopic
- Link between notes using markdown links
- Use tags to group related notes
Maintenance
-
Regular review:
- Weekly: Process new notes, add tags, link to projects
- Monthly: Archive or delete obsolete notes
- Quarterly: Reorganize tag system
-
Search before creating:
- Check if similar note exists
- Consolidate duplicates
-
Bookmark frequently accessed:
- Copy note URL:
/notes/:uid - Save in browser bookmarks for quick access
- Copy note URL:
Limitations and Constraints
Current Limitations
-
No note history/versions:
- Edits overwrite previous content
- No undo beyond current session
- Workaround: Use external version control for critical notes
-
Single project per note:
- Cannot link note to multiple projects
- Workaround: Duplicate note or use tags for cross-referencing
-
No hierarchical notes:
- Flat structure only (no sub-notes)
- Workaround: Use Markdown headings and lists
-
No collaborative editing:
- Only one user can edit at a time
- No conflict resolution
- Last save wins (potential data loss)
-
No attachments:
- Cannot upload files/images to notes
- Workaround: Host elsewhere, link via Markdown
-
Limited rich text:
- Markdown only (no WYSIWYG editor)
- No inline images (must use external URLs)
- No tables with complex formatting
Technical Constraints
-
Search limitations:
- No fuzzy matching
- No search within tags/projects
- No advanced operators (AND, OR, NOT)
-
Performance:
- All notes loaded at once (no pagination)
- Slow with 1000+ notes
- No virtualized scrolling
-
Mobile experience:
- Single-panel only (no split view)
- Harder to reference multiple notes
Related Documentation
- Inbox Page - Quick capture and conversion to notes
- Today Page Sections - Task-focused workflow
- Architecture Overview - Technical architecture
- Development Workflow - Working with the codebase
- Common Tasks - How to modify notes functionality
Technical Implementation Files:
- Note model:
/backend/models/note.js - Note service:
/backend/modules/notes/service.js - Note controller:
/backend/modules/notes/controller.js - Note repository:
/backend/modules/notes/repository.js - Note API routes:
/backend/modules/notes/routes.js - Notes component:
/frontend/components/Notes.tsx - Note modal:
/frontend/components/Note/NoteModal.tsx - Note focus mode:
/frontend/components/Note/NoteFocusMode.tsx - Markdown renderer:
/frontend/components/Shared/MarkdownRenderer.tsx - Note service (frontend):
/frontend/utils/notesService.ts
Document Version: 1.0.0 Last Updated: 2026-03-14 Audience: Developers, AI assistants, and end users