- Add basicAuth.enabled and basicAuth.htpasswd values
- Create middleware.yaml template for Secret and Traefik Middleware
- Update ingress to include middleware annotation when enabled
Usage:
helm upgrade taskplaner ./helm/taskplaner \
--set basicAuth.enabled=true \
--set basicAuth.htpasswd='admin:$apr1$...'
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
SvelteKit adapter-node uses TASKPLANER_ envPrefix for config.
Kubernetes creates SERVICENAME_* env vars for each service.
Service named "taskplaner" creates TASKPLANER_PORT_* which conflicts.
Changes:
- Add service.name option (default: "tp-app")
- Update ingress to reference configured service name
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Includes:
- Deployment with health checks and resource limits
- Service (ClusterIP by default)
- PersistentVolumeClaim for data storage
- Optional Ingress with TLS support
- Configurable via values.yaml
Usage: helm install taskplaner ./helm/taskplaner
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Archive roadmap, requirements, and audit to .planning/milestones/
- Update PROJECT.md with validated requirements and decisions
- Reset STATE.md for next milestone cycle
- Create MILESTONES.md for project history
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
All 31 requirements satisfied, 6/6 phases verified, 96% integration score.
Ready for milestone completion.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Quick Start with docker-compose commands
- Configuration with key environment variables
- Reverse proxy setup instructions
- Data persistence and volume info
- Backup and restore procedures
- Health check verification
- .env.example documents all configuration options
- backup.sh creates timestamped archive of Docker volume
- Supports custom volume name via VOLUME_NAME env var
- Update db/index.ts to read data directory from env var
- Update storage.ts to read data directory from env var
- Both default to ./data for local development
- Create Dockerfile with multi-stage build using node:22-alpine
- Run as non-root 'nodejs' user for security
- Add HEALTHCHECK for container orchestration
- Create docker-compose.yml with taskplaner_data named volume
- Add .dockerignore to optimize build context
- Install @sveltejs/adapter-node as dev dependency
- Configure adapter with out: 'build', precompress: true
- Set envPrefix to 'TASKPLANER_' for environment variables
Tasks completed: 3/3
- Create recent searches store and add dropdown UI
- Integrate filtering into EntryList with flat list mode
- Add highlighting to EntryCard and integrate search UI
SUMMARY: .planning/phases/05-search/05-03-SUMMARY.md
- Add searchQuery prop to EntryCard for text highlighting
- Use {@html highlightText()} for title and content in collapsed view
- Integrate SearchBar and FilterBar in +page.svelte
- Add search/filter state with reactive sync to filters.query
- Pass recentSearches store to SearchBar
- Update filterEntries to use generics for type preservation
- Add filters and searchQuery props to EntryList
- Apply filterEntries via $derived for reactive filtering
- Display flat list (no pinned separation) when filtering
- Show search-specific empty state when no matches
- Pass searchQuery to EntryCard for highlighting
- Add recentSearches persisted store with 5-item limit
- Add addRecentSearch() function for deduplication
- Update SearchBar with recentSearches dropdown
- Show dropdown on focus when input empty
- Use onmousedown to handle selection before blur
- Add to recent searches on blur with >= 2 chars
- Wrap matching text in <mark> tags with bold styling
- Escape HTML before highlighting to prevent XSS
- 2-character minimum query requirement
- Uses bg-transparent (no background per CONTEXT.md)
- Debounced value binding (300ms delay via $effect cleanup)
- Only trigger search when query >= 2 chars OR cleared to empty
- Bindable value prop for parent integration
- '/' keyboard shortcut to focus search (GitHub-style)
- Native event listener to avoid Svelte 5 keydown bug
- Add SearchFilters type and utilities (search.ts)
- Implement filterEntries with query, tags, type, dateRange filters
- Case-insensitive text search with 2-character minimum
- AND logic for tag filtering
- Date range inclusive of end date
- Add SearchFilters interface for query, tags, type, dateRange
- Add defaultFilters constant with empty/default values
- Add hasActiveFilters() to detect when filters are active
- Add getDatePreset() helper for today/week/month presets
- Create TagInput.svelte with Svelecte for multi-select autocomplete
- Support creating new tags inline via creatable mode
- Display tags on collapsed entry cards (max 3 with +N indicator)
- Add TagInput in expanded view for editing entry tags
- Pass availableTags through EntryList to EntryCard
- Handle tag changes with immediate save via updateTags action
- Install svelecte package for tag input with autocomplete
- Import tagRepository in +page.server.ts
- Attach tags to entries in load function alongside images
- Return allTags for autocomplete suggestions
- Add updateTags action to update entry tags via JSON payload
Tasks completed: 2/2
- Add tags schema with case-insensitive unique index
- Create tagRepository with tag operations
SUMMARY: .planning/phases/04-tags/04-01-SUMMARY.md
Tasks completed: 2/2
- Add togglePin and updateDueDate form actions
- Add pin button, due date picker, and pinned section UI
SUMMARY: .planning/phases/04-tags/04-02-SUMMARY.md
- Add pin button in expanded view with toggle functionality
- Add due date picker in expanded view with date input
- Show pin indicator and due date in collapsed view
- Separate EntryList into pinned and unpinned sections
- Pinned section appears at top with header label
- Add TagRepository interface with findOrCreate, getAll, getById, getByEntryId, updateEntryTags
- Implement SQLiteTagRepository with case-insensitive tag lookup
- updateEntryTags atomically replaces all tags for an entry
- Export tagRepository singleton
- Add tags table with nanoid PK and case-insensitive unique index on name
- Add entry_tags junction table with composite PK and cascade deletes
- Export lower() helper function for case-insensitive queries
- Export Tag, NewTag, EntryTag types for TypeScript inference
- Add togglePin action to toggle entry.pinned boolean state
- Add updateDueDate action to set/clear entry.dueDate
- Both actions validate entry exists before updating
- Remove CameraCapture modal which required getUserMedia (HTTPS only)
- Use native file input with capture="environment" attribute
- Opens camera directly via OS file picker on mobile
- Works over HTTP during development
- Simpler implementation with better browser compatibility
- Delete image files from filesystem (original + thumbnail)
- Delete image record from database
- Continue database deletion even if file deletion fails
- Returns success after cleanup