# Implementation Plan: Custom Start Page Application ## Overview This implementation plan breaks down the Custom Start Page Application into discrete, actionable coding tasks. The application uses a hypermedia-driven architecture with HTMX for dynamic interactions, Go for the backend, and DynamoDB for data storage. The implementation follows an incremental approach, building core infrastructure first, then adding features layer by layer, with testing integrated throughout. The plan is organized into major phases: 1. Project setup and infrastructure 2. Authentication system 3. Core data models and DynamoDB integration 4. Page and widget management 5. Bookmark widget with tags and groups 6. Notes widget with rich content support 7. Weather widget 8. Sharing functionality 9. UI polish and responsive design 10. Performance optimization and scale testing Each task references specific requirements from the requirements document and includes sub-tasks for implementation and testing. ## Tasks - [x] 1. Project setup and infrastructure - Initialize Go project with module structure - Set up directory structure (cmd, internal, pkg, templates, static) - Configure DynamoDB local for development - Set up testing framework (testing package + gopter for property tests) - Create base HTML templates with HTMX integration - Set up Tailwind CSS or basic CSS framework - Configure environment variables and configuration management - _Requirements: All (foundational)_ - [ ] 2. Implement authentication system - [x] 2.1 Create User data model and DynamoDB Users table - Define User struct with all fields (id, email, oauth_provider, oauth_id, timestamps) - Implement DynamoDB table creation script - Implement user CRUD operations in storage layer - _Requirements: 1.1, 1.3_ - [x] 2.2 Implement OAuth service with Google provider - Set up golang.org/x/oauth2 configuration - Implement InitiateOAuth method (generate redirect URL) - Implement HandleOAuthCallback method (exchange code for token, create/retrieve user) - Create OAuth endpoints (GET /auth/oauth/:provider, GET /auth/callback/:provider) - _Requirements: 1.2, 1.3, 1.5, 1.6_ - [x] 2.3 Implement session management - Set up gorilla/sessions or similar for session handling - Implement ValidateSession method - Implement Logout method - Create session middleware for protected routes - Store session tokens in secure, httponly cookies - _Requirements: 1.7, 1.8_ - [x] 2.4 Create login and dashboard templates - Create login.html template with OAuth provider buttons - Create base dashboard layout template - Implement redirect logic (unauthenticated → login, authenticated → dashboard) - _Requirements: 1.1_ - [ ]* 2.5 Write property tests for authentication - **Property 1: Unauthenticated users see login page** - **Property 3: Successful OAuth creates or retrieves user** - **Property 5: Session persistence across refresh** - **Property 6: Logout terminates session** - **Validates: Requirements 1.1, 1.3, 1.7, 1.8** - [ ]* 2.6 Write unit tests for authentication edge cases - Test OAuth failure scenarios (invalid code, network errors) - Test session expiration handling - Test concurrent session conflicts - _Requirements: 1.4_ - [ ] 3. Implement core data models and DynamoDB integration - [x] 3.1 Create DynamoDB storage service wrapper - Implement StorageService interface with DynamoDB operations - Set up aws-sdk-go-v2 client with connection pooling - Implement retry logic with exponential backoff - Implement transaction support (TransactWrite) - Implement batch operations (BatchGet, BatchWrite) - _Requirements: 8.1, 8.8_ - [x] 3.2 Define all data models - Create Page model struct - Create Widget model struct with type enum - Create Bookmark model struct with version field - Create Note model struct with format and language fields - Create TagAssociation model struct - Create Group model struct - Create Share model struct - Create Preferences model struct - _Requirements: 2.1, 4.2, 5.2, 8.3, 8.4, 8.5_ - [x] 3.3 Create DynamoDB table schemas - Implement Pages table creation with composite key - Implement Widgets table creation - Implement Bookmarks table creation with UserBookmarksIndex GSI - Implement Notes table creation with UserNotesIndex GSI - Implement TagAssociations table creation with TagItemsIndex GSI - Implement Groups table creation - Implement SharedItems table creation with UserSharesIndex GSI - Implement Preferences table creation - _Requirements: 8.3, 8.4, 8.5, 11.6_ - [ ]* 3.4 Write property tests for data model round-trip - **Property 44: Data round-trip consistency** - Test serialization/deserialization for all models - Test DynamoDB storage and retrieval preserves all fields - **Validates: Requirements 8.2, 8.3, 8.4, 8.5** - [ ] 4. Implement page management - [~] 4.1 Create PageService with all CRUD operations - Implement GetPages method (query by user_id, sort by order) - Implement CreatePage method with default "Home" page for new users - Implement UpdatePage method (name and order updates) - Implement DeletePage method with cascade delete of widgets - Implement ReorderPages method - Add validation: prevent deletion of last page - _Requirements: 2.1, 2.2, 2.3, 2.5, 2.6, 2.7, 2.8_ - [~] 4.2 Create page HTTP endpoints - Implement GET /dashboard (full page with page tabs) - Implement GET /pages/:id (returns widget grid HTML fragment) - Implement POST /pages (create page, returns updated tabs HTML) - Implement PUT /pages/:id (update page, returns updated tab HTML) - Implement DELETE /pages/:id (delete page, returns updated tabs HTML) - Implement POST /pages/reorder (reorder pages, returns updated tabs HTML) - _Requirements: 2.2, 2.3, 2.4, 2.5, 2.7_ - [~] 4.3 Create page templates - Create page tabs partial template - Create page creation form template - Create page edit form template - Add HTMX attributes for dynamic updates - _Requirements: 2.2, 2.3, 2.4, 10.2_ - [ ]* 4.4 Write property tests for page management - **Property 7: New users get default page** - **Property 8: Adding page increases count** - **Property 9: Page switching displays correct widgets** - **Property 10: Page deletion removes page and widgets** - **Property 11: Page reordering persists** - **Validates: Requirements 2.1, 2.2, 2.4, 2.5, 2.7** - [ ]* 4.5 Write unit tests for page edge cases - Test last page deletion prevention - Test page name validation (length, special characters) - Test concurrent page operations - _Requirements: 2.6_ - [~] 5. Checkpoint - Ensure all tests pass - Ensure all tests pass, ask the user if questions arise. - [ ] 6. Implement widget management foundation - [~] 6.1 Create WidgetService with CRUD operations - Implement GetWidgets method (query by page_id) - Implement CreateWidget method with unique ID generation - Implement UpdateWidget method (position, size, config, title) - Implement DeleteWidget method with cascade delete of widget data - _Requirements: 7.1, 7.2, 7.3, 7.5, 7.7, 7.8_ - [~] 6.2 Create widget HTTP endpoints - Implement GET /widgets/:id (returns widget HTML) - Implement POST /pages/:pageId/widgets (create widget, returns widget HTML) - Implement PUT /widgets/:id (update widget, returns updated HTML) - Implement DELETE /widgets/:id (delete widget, returns empty) - Implement POST /widgets/:id/position (update position, returns success) - _Requirements: 7.2, 7.3, 7.4, 7.5_ - [~] 6.3 Create base widget templates - Create widget container template with drag handles - Create widget type selection menu template - Create widget header template with title and delete button - Add Sortable.js initialization for drag-and-drop - _Requirements: 7.1, 7.4, 7.5_ - [ ]* 6.4 Write property tests for widget management - **Property 15: Widget creation increases count** - **Property 16: Widget deletion decreases count** - **Property 17: Widget position updates persist** - **Property 18: Widget IDs are unique** - **Property 19: Widget title customization** - **Validates: Requirements 7.2, 7.3, 7.5, 7.8, 4.8, 5.10, 6.7** - [ ] 7. Implement tag system - [~] 7.1 Create TagService with all operations - Implement GetTags method (query user's tags with counts) - Implement AddTagToItem method with transaction (increment version, create association) - Implement RemoveTagFromItem method - Implement DeleteTag method (batch delete all associations) - Implement RenameTag method (batch update all associations) - Implement GetTagSuggestions method (prefix search with autocomplete) - Add tag normalization (lowercase, trim) - _Requirements: 4.9, 4.14, 4.15, 5.12, 5.15, 5.16, 8.9, 8.10_ - [~] 7.2 Create tag HTTP endpoints - Implement GET /tags (returns tag list HTML) - Implement POST /items/:itemId/tags (add tag, returns updated tag list HTML) - Implement DELETE /items/:itemId/tags/:tagName (remove tag, returns updated HTML) - Implement DELETE /tags/:tagName (delete tag from all items, returns success) - Implement PUT /tags/:oldName/rename (rename tag, returns success) - Implement GET /tags/suggest?prefix=:prefix (returns datalist HTML) - _Requirements: 4.9, 4.15, 5.12, 5.16_ - [~] 7.3 Create tag UI components - Create tag input component with autocomplete - Create tag list display component - Create tag filter component (multi-select with AND/OR logic) - Add HTMX attributes for dynamic tag operations - _Requirements: 4.9, 4.10, 5.12, 5.13_ - [ ]* 7.4 Write property tests for tag system - **Property 34: Tag association supports one-to-many** - **Property 35: Tag filtering returns matching items** - **Property 36: Tag deletion removes from all items** - **Property 37: Concurrent tag updates preserve data** - **Validates: Requirements 4.9, 4.10, 4.14, 4.15, 5.12, 5.13, 5.15, 5.16, 8.9, 8.10** - [ ]* 7.5 Write unit tests for tag edge cases - Test tag normalization (uppercase, whitespace) - Test duplicate tag addition (idempotent) - Test tag name conflicts during rename - Test empty tag filter behavior - Test non-existent tag in filter - _Requirements: 4.9, 4.10, 4.15, 5.12, 5.13, 5.16_ - [ ] 8. Implement bookmark widget - [~] 8.1 Create BookmarkService with all operations - Implement GetBookmarks method (query by widget_id, sort by order) - Implement CreateBookmark method with validation (title, URL required) - Implement UpdateBookmark method with optimistic locking (version check) - Implement DeleteBookmark method with cascade delete of tag associations - Implement ReorderBookmarks method - Implement GetBookmarksByTags method (query TagItemsIndex, compute intersection for AND logic) - Add URL validation - _Requirements: 4.2, 4.3, 4.4, 4.5, 4.6, 4.10, 4.13, 4.14_ - [~] 8.2 Create bookmark HTTP endpoints - Implement GET /widgets/:widgetId/bookmarks (returns bookmarks HTML) - Implement POST /widgets/:widgetId/bookmarks (create bookmark, returns bookmark HTML) - Implement PUT /bookmarks/:id (update bookmark, returns updated HTML) - Implement DELETE /bookmarks/:id (delete bookmark, returns empty) - Implement POST /bookmarks/reorder (reorder bookmarks, returns success) - Implement GET /bookmarks/filter?tags=tag1,tag2&logic=and (returns filtered HTML) - _Requirements: 4.2, 4.3, 4.4, 4.5, 4.6, 4.10_ - [~] 8.3 Create bookmark widget templates - Create bookmark widget container template - Create bookmark list template with titles and URLs - Create bookmark item template with click handler (open in new tab) - Create bookmark add form template - Create bookmark edit form template with tag input - Add favicon display (optional) - _Requirements: 4.1, 4.2, 4.3, 4.7, 4.8_ - [ ]* 8.4 Write property tests for bookmark widget - **Property 20: Bookmark addition persists** - **Property 21: Bookmark editing updates values** - **Property 22: Bookmark deletion removes from list** - **Property 23: Bookmark reordering persists** - **Property 24: Bookmark rendering includes all titles** - **Validates: Requirements 4.2, 4.4, 4.5, 4.6, 4.7** - [ ]* 8.5 Write unit tests for bookmark edge cases - Test invalid URL rejection - Test empty title handling - Test bookmark with 10+ tags - Test version conflict handling - _Requirements: 4.2, 4.4, 4.14_ - [ ] 9. Implement group system for bookmarks - [~] 9.1 Create GroupService with all operations - Implement GetGroups method (query by widget_id, sort by order) - Implement CreateGroup method - Implement UpdateGroup method (name and order updates) - Implement DeleteGroup method (move bookmarks to specified destination) - Implement MoveBookmarkToGroup method - Implement ReorderGroups method - _Requirements: 4.11, 4.12_ - [~] 9.2 Create group HTTP endpoints - Implement GET /widgets/:widgetId/groups (returns groups HTML) - Implement POST /widgets/:widgetId/groups (create group, returns group HTML) - Implement PUT /groups/:id (update group, returns updated HTML) - Implement DELETE /groups/:id (delete group, returns success) - Implement POST /bookmarks/:id/move (move bookmark to group, returns updated HTML) - _Requirements: 4.11, 4.12_ - [~] 9.3 Create group UI components - Create group container template - Create group header with name and collapse/expand - Update bookmark list template to support grouping - Create group creation form - Add drag-and-drop between groups - _Requirements: 4.11, 4.12_ - [ ]* 9.4 Write property tests for group system - **Property 25: Group creation and assignment** - **Property 26: Bookmark group reassignment** - **Validates: Requirements 4.11, 4.12** - [ ]* 9.5 Write unit tests for group edge cases - Test deleting group with bookmarks (move to ungrouped) - Test deleting group with bookmarks (move to another group) - Test moving bookmark to non-existent group - Test duplicate group names within widget - _Requirements: 4.11, 4.12_ - [~] 10. Checkpoint - Ensure all tests pass - Ensure all tests pass, ask the user if questions arise. - [ ] 11. Implement notes widget with rich content support - [~] 11.1 Create NotesService with all operations - Implement GetNote method (query by widget_id) - Implement UpdateNote method with optimistic locking (version check) - Implement GetNotesByTags method (query TagItemsIndex) - Add content size validation (warn at 50KB, reject at 400KB) - Add format validation (enum: plain, rtf, code, yaml, markdown) - _Requirements: 5.1, 5.2, 5.3, 5.4, 5.9, 5.13, 5.14, 5.15_ - [~] 11.2 Create notes HTTP endpoints - Implement GET /widgets/:widgetId/note (returns note HTML) - Implement POST /widgets/:widgetId/note (update note, returns save status HTML) - Implement GET /notes/filter?tags=tag1,tag2&logic=and (returns filtered HTML) - Add debounced auto-save (500ms delay) - _Requirements: 5.2, 5.9, 5.13_ - [~] 11.3 Create notes widget templates for plain text mode - Create notes widget container template - Create plain text editor template (textarea with auto-save) - Create format selector dropdown - Add Unicode support (UTF-8 throughout) - _Requirements: 5.1, 5.2, 5.3, 5.5, 5.10_ - [~] 11.4 Add rich text (RTF) mode support - Integrate TinyMCE or Quill.js for rich text editing - Implement RTF rendering with HTML sanitization (DOMPurify) - Support basic formatting (bold, italic, lists, headings) - Store content as sanitized HTML - _Requirements: 5.3, 5.4, 5.8_ - [~] 11.5 Add code mode support with syntax highlighting - Integrate CodeMirror or Monaco Editor for code editing - Add language selector dropdown (JavaScript, Python, Go, Java, etc.) - Integrate Prism.js or Highlight.js for syntax highlighting - Add line numbers and copy button - Store language metadata in Note model - _Requirements: 5.3, 5.4, 5.6_ - [~] 11.6 Add YAML mode support - Create YAML editor template (textarea with monospace font) - Add tab support for indentation - Render YAML in
 tag with indentation preservation
    - Store content as-is (no validation)
    - _Requirements: 5.3, 5.4, 5.7_

  - [~] 11.7 Add Markdown mode support
    - Create Markdown editor template (split view or live preview)
    - Integrate marked.js for Markdown parsing
    - Render Markdown as sanitized HTML
    - Store content as raw Markdown
    - _Requirements: 5.3, 5.4_

  - [ ]* 11.8 Write property tests for notes widget
    - **Property 27: Notes content persists**
    - **Property 28: Content format preservation**
    - **Property 29: Unicode content preservation**
    - **Property 30: Format switching preserves content**
    - **Property 31: Code syntax highlighting**
    - **Property 32: YAML indentation preservation**
    - **Property 33: RTF formatting preservation**
    - **Validates: Requirements 5.2, 5.4, 5.5, 5.6, 5.7, 5.8, 5.9, 5.11, 5.18**

  - [ ]* 11.9 Write unit tests for notes edge cases
    - Test content size limits (50KB warning, 400KB rejection)
    - Test format switching without data loss
    - Test Unicode characters (emoji, international text)
    - Test malformed YAML (stored as-is)
    - Test malformed Markdown (rendered gracefully)
    - Test XSS prevention in RTF mode
    - Test version conflict handling
    - _Requirements: 5.3, 5.4, 5.5, 5.14, 5.15, 5.18_

- [ ] 12. Implement weather widget
  - [~] 12.1 Create WeatherService
    - Implement GetWeather method (fetch from external API)
    - Implement ValidateLocation method
    - Add caching for weather data (TTL-based)
    - Add error handling for API failures
    - Choose weather API (OpenWeatherMap or similar)
    - _Requirements: 6.2, 6.4, 6.5_

  - [~] 12.2 Create weather HTTP endpoints
    - Implement GET /weather?location=:location (returns weather HTML)
    - Add periodic refresh logic (client-side polling or server-sent events)
    - _Requirements: 6.2, 6.6_

  - [~] 12.3 Create weather widget templates
    - Create weather widget container template
    - Create weather display template (temperature, condition, icon)
    - Create location input form
    - Add error message template for API failures
    - _Requirements: 6.1, 6.2, 6.3, 6.4, 6.5, 6.7_

  - [ ]* 12.4 Write property tests for weather widget
    - **Property 40: Weather data fetching**
    - **Property 41: Weather location updates**
    - **Property 42: Weather error handling**
    - **Validates: Requirements 6.2, 6.3, 6.4, 6.5**

  - [ ]* 12.5 Write unit tests for weather edge cases
    - Test invalid location handling
    - Test API timeout handling
    - Test rate limiting
    - Test cached data retrieval
    - _Requirements: 6.4, 6.5_

- [ ] 13. Implement search functionality
  - [~] 13.1 Create search provider configuration
    - Define search provider enum (google, duckduckgo, bing)
    - Implement search URL generation for each provider
    - Store search provider preference in Preferences table
    - Default to Google if not configured
    - _Requirements: 3.2, 3.4, 3.5, 3.6_

  - [~] 13.2 Create search UI components
    - Create search bar template in top toolbar
    - Add search form with HTMX attributes
    - Add search provider selector in preferences
    - Add empty query validation (client-side and server-side)
    - _Requirements: 3.1, 3.2, 3.3, 3.7_

  - [ ]* 13.3 Write property tests for search functionality
    - **Property 12: Search generates correct URL**
    - **Property 13: Search provider selection persists**
    - **Property 14: Empty search is rejected**
    - **Validates: Requirements 3.2, 3.4, 3.7**

- [ ] 14. Implement sharing functionality
  - [~] 14.1 Create SharingService with all operations
    - Implement CreateShare method (generate unique share ID)
    - Implement GetSharedItem method (increment access count atomically)
    - Implement RevokeShare method
    - Implement GetUserShares method
    - Add share ID generation (cryptographically random)
    - Add expiration handling
    - _Requirements: 4.16, 5.17_

  - [~] 14.2 Create sharing HTTP endpoints
    - Implement POST /share (create share, returns share dialog HTML with link)
    - Implement GET /share/:shareId (public endpoint, returns shared item HTML)
    - Implement DELETE /share/:shareId (revoke share, returns success)
    - Implement GET /shares (returns user's shares list HTML)
    - Add rate limiting on share access
    - _Requirements: 4.16, 5.17_

  - [~] 14.3 Create sharing UI components
    - Create share button for bookmarks and notes
    - Create share dialog template with copy link button
    - Create shared item view template (read-only)
    - Create shares list template
    - Add expiration date selector (optional)
    - _Requirements: 4.16, 5.17_

  - [ ]* 14.4 Write property tests for sharing
    - **Property 38: Share link generation**
    - **Property 39: Shared note preserves formatting**
    - **Validates: Requirements 4.16, 5.17**

  - [ ]* 14.5 Write unit tests for sharing edge cases
    - Test expired share access
    - Test revoked share access
    - Test share ID uniqueness
    - Test access count increment
    - Test XSS prevention in shared content
    - _Requirements: 4.16, 5.17_

- [~] 15. Checkpoint - Ensure all tests pass
  - Ensure all tests pass, ask the user if questions arise.

- [ ] 16. Implement preferences management
  - [~] 16.1 Create preferences HTTP endpoints
    - Implement GET /preferences (returns preferences form HTML)
    - Implement POST /preferences (update preferences, returns success)
    - _Requirements: 3.4, 8.5_

  - [~] 16.2 Create preferences UI
    - Create preferences page template
    - Add search provider selector
    - Add theme selector (optional)
    - _Requirements: 3.3, 3.4_

  - [ ]* 16.3 Write property tests for preferences
    - Test preference persistence across sessions
    - Test default values for new users
    - **Validates: Requirements 3.4, 8.5**

- [ ] 17. Implement responsive design
  - [~] 17.1 Create responsive layouts
    - Implement multi-column grid layout for desktop
    - Implement adaptive layout for tablet
    - Implement single-column layout for mobile
    - Add CSS media queries for breakpoints
    - _Requirements: 9.1, 9.2, 9.3_

  - [~] 17.2 Optimize for touch devices
    - Ensure interactive elements are appropriately sized for touch
    - Add touch-friendly drag-and-drop
    - Test on mobile devices
    - _Requirements: 9.4_

  - [ ]* 17.3 Write property tests for responsive design
    - **Property 50: Responsive layout reflow**
    - Test layout at various viewport sizes
    - **Validates: Requirements 9.5**

- [ ] 18. Implement UI polish and visual feedback
  - [~] 18.1 Add visual feedback for interactions
    - Add hover states for all interactive elements
    - Add click/active states for buttons
    - Add focus states for inputs
    - Add loading indicators for async operations
    - Add success/error toast notifications
    - _Requirements: 10.4, 10.5, 10.7_

  - [~] 18.2 Implement consistent styling
    - Apply consistent spacing and typography
    - Add consistent color scheme
    - Add consistent border radius and shadows
    - Ensure WCAG accessibility compliance
    - _Requirements: 10.6_

  - [~] 18.3 Create top toolbar
    - Implement toolbar layout with search bar, page tabs, and user menu
    - Add user menu dropdown (settings, logout)
    - Style page tabs horizontally
    - _Requirements: 10.1, 10.2, 10.3_

  - [ ]* 18.4 Write property tests for UI feedback
    - **Property 47: Interactive element feedback**
    - **Property 48: Action confirmation feedback**
    - **Property 49: Loading indicators**
    - **Validates: Requirements 10.4, 10.5, 10.7**

- [ ] 19. Implement data persistence guarantees
  - [ ]* 19.1 Write property tests for data persistence
    - **Property 43: Immediate persistence**
    - **Property 44: Data round-trip consistency**
    - **Property 45: Data isolation**
    - **Property 46: Storage error handling**
    - Test all CRUD operations persist immediately
    - Test logout/login restores state
    - Test user data isolation
    - **Validates: Requirements 2.8, 7.7, 8.1, 8.2, 8.6, 8.7**

  - [ ]* 19.2 Write unit tests for error handling
    - Test DynamoDB connection failures
    - Test conditional write failures (version conflicts)
    - Test transaction rollback
    - Test batch operation partial failures
    - _Requirements: 8.6, 8.10_

- [ ] 20. Performance optimization and scale testing
  - [~] 20.1 Implement caching strategy
    - Add Redis cache for frequently accessed data (user preferences, tag lists)
    - Implement cache invalidation on updates
    - Add ETags for static assets
    - _Requirements: 4.13, 5.14, 8.8_

  - [~] 20.2 Optimize DynamoDB queries
    - Implement pagination for large bookmark/note lists
    - Optimize batch operations
    - Add connection pooling
    - _Requirements: 4.13, 5.14, 8.8_

  - [~] 20.3 Add performance monitoring
    - Add CloudWatch metrics for DynamoDB operations
    - Add latency tracking for all endpoints
    - Add error rate monitoring
    - _Requirements: 8.8_

  - [ ]* 20.4 Write scale tests
    - Test with 10,000+ bookmarks per user
    - Test with 1,000+ notes per user
    - Test with 100+ tags per user
    - Test concurrent tag updates from multiple sessions
    - Test tag deletion from 1,000+ items
    - Measure query latency (target: <100ms p95)
    - **Validates: Requirements 4.13, 4.14, 5.14, 5.15, 8.8, 11.2, 11.4**

  - [ ]* 20.5 Write load tests
    - Test 1,000 concurrent users
    - Test 100 requests/second per server instance
    - Measure p95 latency (target: <200ms)
    - _Requirements: 8.8_

- [ ] 21. Final integration and end-to-end testing
  - [ ]* 21.1 Write end-to-end tests for critical user journeys
    - Test: Login → create page → add widgets → add bookmarks with tags
    - Test: Create notes with different formats
    - Test: Filter bookmarks/notes by tags
    - Test: Create groups and organize bookmarks
    - Test: Share bookmarks and notes
    - Test: Concurrent tag updates from multiple sessions
    - Test: Session persistence across browser refresh
    - _Requirements: All_

  - [ ]* 21.2 Write cross-browser compatibility tests
    - Test on Chrome, Firefox, Safari, Edge
    - Test HTMX functionality across browsers
    - Test drag-and-drop across browsers
    - _Requirements: 9.1, 9.2, 9.3, 9.4, 9.5_

  - [ ]* 21.3 Write accessibility tests
    - Test keyboard navigation
    - Test screen reader compatibility
    - Test WCAG compliance
    - _Requirements: 10.1, 10.2, 10.3, 10.4, 10.5, 10.6, 10.7_

- [~] 22. Final checkpoint - Ensure all tests pass
  - Ensure all tests pass, ask the user if questions arise.

## Notes

- Tasks marked with `*` are optional testing tasks and can be skipped for faster MVP
- Each task references specific requirements for traceability
- Checkpoints ensure incremental validation at major milestones
- Property tests validate universal correctness properties with minimum 100 iterations
- Unit tests validate specific examples, edge cases, and error conditions
- The implementation follows an incremental approach: infrastructure → auth → core features → advanced features → polish → optimization
- All property tests should be tagged with: `Feature: custom-start-page, Property {number}: {property_text}`
- DynamoDB local should be used for development and testing
- Mock external services (OAuth providers, Weather API) in tests