tududi/docs/05-notes-system.md
2026-03-15 09:01:38 +02:00

952 lines
No EOL
25 KiB
Markdown

# Notes System - Behavior Rules
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
1. **Information, not action**
- Notes store knowledge, not tasks
- No due dates, priorities, or status tracking
- Permanent reference material vs. temporary to-dos
2. **Flexible structure**
- Can be standalone or linked to projects
- Tag-based categorization
- Full Markdown formatting support
3. **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): `uid` field
- Used in URLs: `/notes/abc123def456`
- Immutable - persists through all edits
---
## Creating Notes
### Method 1: Direct Creation
**From Notes page:**
1. Navigate to `/notes`
2. Click **+ icon** in top right
3. New note opens in edit mode
4. Start typing - auto-saves after 1 second
5. No explicit "Save" required
**Keyboard shortcut:**
- `n` (while on Notes page) - Create new note
### Method 2: From Inbox
**Convert inbox item to note:**
1. Capture item in Inbox: `Article link https://example.com +Reading #bookmark`
2. Click "Note" button or press Ctrl+N (Cmd+N on Mac)
3. 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`
4. Inbox item marked as processed
**See:** [Inbox Page documentation](04-inbox-page.md) for details
### Method 3: From Project Page
**Via project view:**
1. Open project detail page
2. Click "Add Note" in notes section
3. Note pre-linked to current project
4. Start editing
---
## Editing Notes
### Inline Editing
**How it works:**
1. Click on a note in the list to preview it
2. Click anywhere on the preview (title or content)
3. Note switches to edit mode
4. Changes auto-save every 1 second
5. 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: `- item` or `1. item`
- Links: `[text](url)`
- Bold: `**text**`
- Italic: `_text_`
- Code: `` `inline` `` or triple backticks for blocks
- Checkboxes: `- [ ] unchecked` or `- [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:**
1. In edit mode, click **project icon** or "Add project"
2. Dropdown shows all available projects
3. Select project or choose "No Project" to unlink
4. 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:**
1. In edit mode, click **tag icon** or "Add tags"
2. Tag input field appears
3. Type tag name and press Enter
4. Select from existing tags (autocomplete) or create new
5. 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:**
1. Click **⋮ menu** (three vertical dots) in top right
2. Color palette grid appears
3. Click desired color swatch
4. Background changes immediately
5. 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:**
1. Click **expand icon** (↗️) in top right
2. Note expands to full screen
3. 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 `Esc` key
- 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:**
1. Enter query in search box (top of note list)
2. Results filter in real-time
3. 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:**
1. **Created At** (default) - Newest first
2. **Title** - Alphabetical A-Z
3. **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:**
1. Select note or enter edit mode
2. Click **⋮ menu** (three dots)
3. Click **Delete** (red text)
4. Confirmation dialog appears:
- "Are you sure you want to delete this note?"
- Shows note title
5. 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:**
1. View note list
2. Tap note → Preview opens (list hidden)
3. Tap anywhere → Edit mode
4. Tap "← Back" → Returns to list
---
## Integration with Other Features
### Inbox Integration
**Creating notes from inbox:**
- Inbox items with URLs suggest "Note"
- Inbox items with `#bookmark` tag suggest "Note"
- Conversion preserves tags and project references
- See: [Inbox Page documentation](04-inbox-page.md)
**URL title extraction:**
- System fetches webpage `<title>` tag
- 3-second timeout
- Falls back to URL if fetch fails
- Auto-adds `#bookmark` tag
### 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/:uid` lists 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:**
1. User types in title or content
2. Save status changes to "• Unsaved changes"
3. After 1 second of inactivity, triggers save
4. Status changes to "Saving..."
5. On success: "✓ Saved"
6. 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 `title` is 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) or `1. item` (ordered)
- **Checkboxes:** `- [ ] todo` or `- [x] done`
- **Code:** `` `inline` `` or ` ```language\nblock\n``` `
- **Blockquotes:** `> quote`
- **Horizontal rules:** `---` or `***`
- **Tables:** Pipe-separated cells
- **Images:** `![alt](url)` (rendered as `<img>`)
**Rendering engine:**
- Uses `MarkdownRenderer` component
- 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
1. Press `g` then `n` to open Notes page
2. Click **+** to create new note
3. Type title: "Product idea - Voice control"
4. Write content:
```markdown
## Overview
Users want hands-free interaction
## Features
- Voice commands for task creation
- Smart parsing of natural language
- Integration with existing task flow
```
5. Auto-saves after 1 second
6. Add tags: `#product`, `#ideas`
7. Link to project: "Product Roadmap"
8. Press Esc to exit edit mode
### Workflow 2: Meeting Notes
**Scenario:** Documenting a client meeting
1. Navigate to `/notes`
2. Create new note
3. Title: "Client Meeting - Acme Corp - 2026-03-14"
4. Content:
```markdown
## 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
```
5. Link to project: "Acme Corp"
6. Add tags: `#meetings`, `#clients`, `#acme`
7. Auto-saves throughout
8. Click "Focus mode" for distraction-free review
### Workflow 3: Bookmark Collection
**Scenario:** Save an article to read later
1. From Inbox: `https://example.com/article +Reading #bookmark`
2. Press `Ctrl+N` (or `Cmd+N`)
3. System:
- Fetches title: "10 Tips for Better Focus"
- Creates note with URL as content
- Links to "Reading" project
- Adds `#bookmark` tag
4. Note auto-saved and opens in edit mode
5. Add notes below URL:
```markdown
https://example.com/article
## Key Takeaways
- Pomodoro technique
- Single-tasking
- Environment matters
```
6. Press Esc to save and exit
### Workflow 4: Knowledge Base
**Scenario:** Building a personal wiki
1. Create note: "Git Cheatsheet"
2. Content:
```markdown
## 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
```
3. Add tags: `#reference`, `#git`, `#dev`
4. Link to project: "Developer Resources"
5. Set color: Blue (for tech references)
6. Bookmark `/notes/:uid` for quick access
### Workflow 5: Weekly Review
**Scenario:** Process and organize accumulated notes
1. Navigate to `/notes`
2. Sort by "Updated" to see recent notes
3. Search for "meeting" to find unprocessed meeting notes
4. 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
5. Search for untagged notes (manual review)
6. Ensure all bookmarks are properly categorized
---
## Troubleshooting
### "Auto-save not working"
**Possible causes:**
1. Title is empty → Auto-save only triggers with non-empty title
2. Network error → Check browser console for errors
3. Session expired → Re-authenticate
4. 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:**
1. Are you in edit mode? (shows raw Markdown)
2. Switch to preview mode (click note in list or press Esc)
3. Ensure Markdown syntax is correct
- ❌ `#Heading` (no space)
- ✅ `# Heading` (space required)
### "Can't link note to project"
**Possible causes:**
1. Project doesn't exist → Create project first
2. No write access to project → Check collaboration permissions
3. 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:**
1. Tag name has invalid characters?
- Use only alphanumeric, hyphens, underscores
2. Network error during save?
- Check browser console
3. Tag input didn't close properly?
- Click outside tag input to trigger save
### "Color not appearing"
**Check:**
1. Is `ENABLE_NOTE_COLOR` feature flag enabled?
- Check with admin/developer
2. Browser caching issue?
- Hard refresh: `Ctrl+Shift+R` or `Cmd+Shift+R`
3. Dark mode conflict?
- Try switching theme
---
## Best Practices
### Organization
1. **Use consistent tagging:**
- Create a tag hierarchy: `#project-ideas`, `#project-specs`, `#project-retros`
- Avoid tag proliferation: Reuse existing tags
2. **Link notes to projects:**
- Project-specific notes → Link to project
- General knowledge → Leave unlinked or create "Resources" project
3. **Color coding:**
- Develop personal system: Red = urgent, Blue = reference, Green = ideas
- Or by topic: Purple = client work, Teal = personal
### Content
1. **Use Markdown effectively:**
- Headings for structure
- Lists for clarity
- Checkboxes for tracking follow-ups within notes
- Code blocks for technical snippets
2. **Include metadata:**
- Date in title for meeting notes: "Meeting - Client - 2026-03-14"
- Context in content: "Source: [Article](url)"
3. **Break up long notes:**
- Split into multiple notes by subtopic
- Link between notes using markdown links
- Use tags to group related notes
### Maintenance
1. **Regular review:**
- Weekly: Process new notes, add tags, link to projects
- Monthly: Archive or delete obsolete notes
- Quarterly: Reorganize tag system
2. **Search before creating:**
- Check if similar note exists
- Consolidate duplicates
3. **Bookmark frequently accessed:**
- Copy note URL: `/notes/:uid`
- Save in browser bookmarks for quick access
---
## Limitations and Constraints
### Current Limitations
1. **No note history/versions:**
- Edits overwrite previous content
- No undo beyond current session
- Workaround: Use external version control for critical notes
2. **Single project per note:**
- Cannot link note to multiple projects
- Workaround: Duplicate note or use tags for cross-referencing
3. **No hierarchical notes:**
- Flat structure only (no sub-notes)
- Workaround: Use Markdown headings and lists
4. **No collaborative editing:**
- Only one user can edit at a time
- No conflict resolution
- Last save wins (potential data loss)
5. **No attachments:**
- Cannot upload files/images to notes
- Workaround: Host elsewhere, link via Markdown
6. **Limited rich text:**
- Markdown only (no WYSIWYG editor)
- No inline images (must use external URLs)
- No tables with complex formatting
### Technical Constraints
1. **Search limitations:**
- No fuzzy matching
- No search within tags/projects
- No advanced operators (AND, OR, NOT)
2. **Performance:**
- All notes loaded at once (no pagination)
- Slow with 1000+ notes
- No virtualized scrolling
3. **Mobile experience:**
- Single-panel only (no split view)
- Harder to reference multiple notes
---
## Related Documentation
- [Inbox Page](04-inbox-page.md) - Quick capture and conversion to notes
- [Today Page Sections](02-today-page-sections.md) - Task-focused workflow
- [Architecture Overview](architecture.md) - Technical architecture
- [Development Workflow](development-workflow.md) - Working with the codebase
- [Common Tasks](common-tasks.md) - 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