summaryrefslogtreecommitdiff
path: root/internal
AgeCommit message (Collapse)Author
2026-01-26Add Google Tasks integration (#43)Peter Stone
- New GoogleTasksClient for fetching and managing Google Tasks - Tasks appear in Timeline view with yellow indicator dot - Tap checkbox to complete/uncomplete tasks via Google API - Shares credentials file with Google Calendar (GOOGLE_CREDENTIALS_FILE) - Configure task list via GOOGLE_TASKS_LIST_ID env var (default: @default) - Supports comma-separated list IDs for multiple lists New files: - internal/api/google_tasks.go - Google Tasks API client Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-26Add shopping mode for focused single-store shopping (#34)Peter Stone
- Full-screen view for one store at a time - Tap items to toggle completion - Completed items greyed and sorted to bottom - Quick-add form at bottom of screen - Store switcher pills for easy navigation - "Shop" button on each store in shopping tab Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-26Fix multiple UI issues and shopping completion bugPeter Stone
- #54: Fix shopping item completion - now works for all sources (trello, plantoeat, user) with state stored in local DB - #48: Hide 12:00am times in timeline (all-day items) - #49: Remove "Task" type label from timeline items for cleaner UI - #51: Combine multiple PlanToEat meals for same date+mealType - #52: Change Conditions tab to standard link to standalone page Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-26Add day of week to timeline section headingsPeter Stone
Section headings now show the day of week for better orientation: - "Today - Monday" - "Tomorrow - Tuesday" - "Wednesday, Jan 29+" (for later items) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-26Use configured timezone throughout codebasePeter Stone
- Add config/timezone.go with timezone utilities: - SetDisplayTimezone(), GetDisplayTimezone() - Now(), Today() - current time/date in display TZ - ParseDateInDisplayTZ(), ToDisplayTZ() - parsing helpers - Initialize timezone at startup in main.go - Update all datetime logic to use configured timezone: - handlers/handlers.go - all time.Now() calls - handlers/timeline.go - date parsing - handlers/timeline_logic.go - now calculation - models/atom.go - ComputeUIFields() - models/timeline.go - ComputeDaySection() - api/plantoeat.go - meal date parsing - api/todoist.go - due date parsing - api/trello.go - due date parsing This ensures all dates/times display correctly regardless of server timezone setting. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-26Fix calendar timezone handling with configurable display timezonePeter Stone
- Add TIMEZONE config option (defaults to Pacific/Honolulu) - Store display timezone in GoogleCalendarClient - Convert all event times to configured display timezone - Parse events in their native timezone then convert for display This fixes the issue where events were showing 10 hours off due to server running in UTC while user is in Hawaii. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-26Fix Google Calendar timezone handlingPeter Stone
- Use event's TimeZone field when parsing DateTime - Handle cases where DateTime has no timezone offset - Parse in event timezone then convert to local for display Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-26Fix Google Calendar credential loadingPeter Stone
Use option.WithCredentialsFile instead of non-existent option.WithAuthCredentialsFile function. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-26Phase 5: Extract functions to reduce complexityPeter Stone
- Create atoms.go with BuildUnifiedAtomList, SortAtomsByUrgency, PartitionAtomsByTime - Create helpers.go with parseFormOr400, requireFormValue - Refactor HandleTabTasks from 95 lines to 25 lines using extracted functions - Remove duplicate atomUrgencyTier function - Update handlers to use parseFormOr400 helper Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-26Phase 4: Extract magic numbers to constantsPeter Stone
Create config/constants.go with centralized configuration values: - Concurrency limits (MaxConcurrentTrelloRequests) - Timeouts (HTTP, Google Calendar, graceful shutdown, request) - Meal times (breakfast, lunch, dinner hours) - Database pool settings (connections, lifetime) - Session and rate limiting settings Update all files to use these constants instead of hardcoded values. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-26Phase 3: Error handling and security hardeningPeter Stone
- Handle JSON marshal errors in sqlite.go (log + fallback to empty array) - Add 30s timeout to Google Calendar client initialization - Fix CSRF timing attack by using subtle.ConstantTimeCompare Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-26Phase 2: Fix data race in GetBoardsWithCardsPeter Stone
Add mutex synchronization for writes to board slice elements (Cards and Lists fields) from concurrent goroutines. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-26Phase 1: Critical security fixesPeter Stone
- Remove default password fallback - require DEFAULT_PASS in all environments - Fix XSS vulnerabilities in HTML generation (handlers.go:795,920) - Add security headers middleware (X-Frame-Options, CSP, HSTS, etc.) - Add rate limiting on login endpoint (5 req/15min per IP) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-25Fix all static analysis errors (golangci-lint)Peter Stone
- Fix errcheck: handle all error return values in production code - Fix errcheck: handle all error return values in test files - Fix staticcheck: replace deprecated WithCredentialsFile with WithAuthCredentialsFile - Remove unused code: authHeaders, planToEatPlannerItem, planToEatResponse - Use defer func() { _ = x.Close() }() pattern for ignored close errors Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-25Refactor: extract helpers and clean up hardcoded HTMLPeter Stone
- Extract parseEventTime() and deduplicateEvents() in google_calendar.go - Add scanTask() and scanTasks() SQL helpers in sqlite.go - Move completed-atom HTML to partial template - Add loadTestTemplates() test helper for template-dependent tests Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-25Fix timezone and date handling bugs #40, #41, #42Peter Stone
#40, #41: Fix calendar event timezone handling - Parse all-day events in local timezone using ParseInLocation - Convert timed events to local time after parsing RFC3339 - Update ComputeDaySection to normalize both now and item time to local before comparison, ensuring consistent today/tomorrow classification #42: Mobile conditions page now uses 2 columns - Changed 600px breakpoint from 1 column to 2 columns Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-25Implement architectural refactors for feature requests #28, #30, #31, #33-38Peter Stone
Phase 1: Bugs as First-Class Atoms (#28) - Add resolved_at column to bugs table (migration 007) - Add GetUnresolvedBugs(), ResolveBug(), UnresolveBug() store methods - Include bugs in Tasks tab via BugToAtom() with completion toggle - Add unit tests for bug resolution Phase 2: Timeline as Default + Enhancements (#35, #37) - Change default tab from tasks to timeline - Add IsCompleted, DaySection, Source fields to TimelineItem - Group timeline items by today/tomorrow/later sections - Add completion checkboxes for tasks/cards, grey completed items - Collapse tomorrow/later sections by default Phase 3: Shopping Quick-Add (#33) - Add user_shopping_items table (migration 008) - Add SaveUserShoppingItem(), GetUserShoppingItems(), ToggleUserShoppingItem() - Add HandleShoppingQuickAdd() and HandleShoppingToggle() handlers - Add quick-add form to shopping tab Phase 4: Mobile Swipe Navigation (#38) - Add touch event handlers for swipe left/right tab switching - 50px threshold triggers tab change Phase 5: Consistent Background Opacity (#30) - Add CSS variables for panel/card/input/modal backgrounds - Update templates to use consistent opacity classes Phase 6: Tab Reorganization (#37) - Reorganize tabs: Timeline, Shopping, Conditions as main tabs - Move Tasks, Planning, Meals under Details dropdown Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-25Fix bugs and add bug management scriptsPeter Stone
Bug fixes: - #36: Hide recurring tasks until due day (add IsRecurring to Task/Atom) - Trello cards missing: change filter=visible to filter=open - Build fix: add missing fmt import in atom.go Infrastructure: - Add scripts/bugs and scripts/resolve-bug for DB bug tracking - Remove issues/ directory (bugs now tracked in DB) - Add timeline_logic_test.go Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-24Add Conditions page with live volcano and weather feedsPeter Stone
- Standalone full-screen page at /conditions - Tiled grid layout with autoplaying video feeds - USGS Kilauea webcams (V1cam, V2cam) via YouTube embeds - Windy weather maps (local Hawaii + national US) - Opens in new tab from dashboard nav Closes #29 Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-24Fix UI bugs and add Timeline viewPeter Stone
Bug fixes: - #25: Replace 📅 with 🗓️ to avoid misleading date display - #30: Standardize background opacity (shopping items now use bg-white/5) New feature: - #11: Add Timeline view showing chronological events/tasks/meals Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-24Add Shopping tab combining Trello and PlanToEat listsPeter Stone
- New Shopping tab aggregates items from Trello Shopping board and PlanToEat - Items grouped by store, then by category (for PlanToEat) - Trello list names treated as store names - Replace PlanToEat meals API with web scraping (uses session cookie) - Add error logging for PlanToEat fetch operations - Recipe links now point to cooking view (/recipes/{id}/cook/{event_id}) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-23Fix uncomplete: add HX-Reswap header to prevent empty swapPeter Stone
The uncomplete response was returning an empty body, causing HTMX to swap the element with nothing before the refresh-tasks trigger fired. Added HX-Reswap: none header to preserve the element while the refresh event propagates. Also fixed TestGetCardsByDateRange test data to include all required columns (list_id, list_name, url). Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-23Refactor: reduce code duplication with shared abstractionsPeter Stone
- Add BaseClient HTTP abstraction (internal/api/http.go) to eliminate duplicated HTTP boilerplate across Todoist, Trello, and PlanToEat clients - Add response helpers (internal/handlers/response.go) for JSON/HTML responses - Add generic cache wrapper (internal/handlers/cache.go) using Go generics - Consolidate HandleCompleteAtom/HandleUncompleteAtom into handleAtomToggle - Merge TabsHandler into Handler, delete tabs.go - Extract sortTasksByUrgency and filterAndSortTrelloTasks helpers - Update tests to work with new BaseClient structure Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-23Fix calendar dedup: use Unix timestamp to handle timezone differencesPeter Stone
Events copied across calendars may have different timezone representations in their RFC3339 strings. Using Unix timestamps ensures the same moment in time produces the same dedup key. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-23Fix bugs #24-27: calendar dedup, uncomplete tasks, planning viewPeter Stone
Bug fixes: - #24: Deduplicate calendar events across multiple calendars using summary + start time as key - #25: Change event icon from calendar to clock to avoid confusion with date display - #26: Add task uncomplete functionality via ReopenTask API for Todoist and closed=false for Trello - #27: Restructure planning view with sections for Scheduled (timed events/tasks), Today (unscheduled), Quick Add, and Upcoming (3 days) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-23Fix high priority issues from code reviewPeter Stone
- Default password: Fatal error in production if DEFAULT_PASS not set - API timeouts: Reduce from 30s to 15s (4 APIs × 15s < 60s global) - Trello lists: Log warning when list fetch fails instead of silent ignore Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-23Fix critical resilience issues from code reviewPeter Stone
- DB connection pool: Allow 5 connections instead of 1 for better concurrency - JSON unmarshal: Add error handling to prevent nil slice issues - Context cancellation: Check ctx.Done() in aggregateData goroutines - Migration path: Make configurable via MIGRATION_DIR env var Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-22Add shopping quick-add featurePeter Stone
- Add Shopping tab to action modal (Ctrl+K) - Add /partials/shopping-lists endpoint to fetch lists from Shopping board - Store dropdown populated dynamically from Trello - Items added via existing unified-add endpoint Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-22Fix slice reallocation bug in GetBoardsPeter Stone
The boardMap was storing pointers to Board structs in the boards slice. When the slice grew and reallocated, those pointers became stale, causing cards to be added to old memory locations instead of the current slice. Fixed by storing indices instead of pointers in boardMap. Added tests to verify multiple boards with varying card counts are correctly saved and retrieved. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-22Fix slice reallocation bug in GetBoardsPeter Stone
2026-01-22Add debug logging to board save/retrievePeter Stone
2026-01-22Add debug logging for Trello card fetchingPeter Stone
Log API responses and errors to diagnose empty boards issue. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-22Support multiple Google CalendarsPeter Stone
GOOGLE_CALENDAR_ID now accepts comma-separated calendar IDs: GOOGLE_CALENDAR_ID=cal1@group.calendar.google.com,cal2@gmail.com Events from all calendars are merged and sorted by start time. If one calendar fails to fetch, others still load. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-22Add debug logging for Google CalendarPeter Stone
Log calendar ID on init and event count on fetch to help diagnose configuration issues. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-22Add Google Calendar integrationPeter Stone
- Add GoogleCalendarClient for fetching upcoming events - Add GoogleCalendarAPI interface and CalendarEvent model - Add config for GOOGLE_CREDENTIALS_FILE and GOOGLE_CALENDAR_ID - Display events in Planning tab with date/time formatting - Update handlers and tests to support optional calendar client Config env vars: - GOOGLE_CREDENTIALS_FILE: Path to service account JSON - GOOGLE_CALENDAR_ID: Calendar ID (defaults to "primary") Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-22Fix background image CORS issuePeter Stone
Switch from Unsplash Source API to Lorem Picsum which has proper CORS headers for cross-origin image loading. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-21Implement 10 UI/UX improvements and bug fixesPeter Stone
- Fix outdated Todoist task URL format (showTask -> app/task) - Fix quick-add date defaulting to tomorrow in evening (client-side JS) - Add tap-to-expand for task descriptions with checkbox completion - Add visual differentiation: overdue (red), future (gray), today (normal) - Sort tasks by urgency: overdue > today-timed > today-allday > future - Keep completed tasks visible with strikethrough until refresh - Add random Unsplash landscape background with content overlay - Hide future tasks behind collapsible fold with count badge - Unified modal menu for Quick Add + Bug Report (Ctrl+K shortcut) - Click task title to edit description in modal Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-20UI improvements and bug fixesPeter Stone
- Gray out overdue tasks (past today) - Sort tasks with specific times before midnight-due tasks - Fix timezone bug in quick add (use local timezone) - Remove "Personal Dashboard" header, minimal refresh/logout bar - Change Todoist icon from checkmark to red circle - Show due time when set (not just date) - Compact task list styling Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-20Add in-app bug reporting featurePeter Stone
- New bugs table in SQLite (migration 005) - Store methods for saving and retrieving bugs - Handlers for GET/POST /bugs - Floating bug button with modal UI - Shows recent bug reports in modal Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-20Add STATIC_DIR configuration supportPeter Stone
Allow static file directory to be configured via environment variable for flexible deployment layouts. Also fix gitignore to not ignore cmd/dashboard directory. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-20Add API research tests for sync optimizationPeter Stone
Include tests exploring Todoist Sync API and Trello field filtering for efficient incremental data fetching. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-20Add CSRF protection and auth unit testsPeter Stone
Add CSRF token middleware for state-changing request protection, integrate tokens into templates and HTMX headers, and add unit tests for authentication service and handlers. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-20Add session-based authenticationPeter Stone
Implement secure authentication using scs session manager with SQLite backing store and bcrypt password hashing. - Add users and sessions tables (migration 004) - Create internal/auth package with Service, Middleware, and Handlers - Protect all routes except /login, /logout, /static/* - Add login page template and logout button to dashboard - Default credentials: admin/changeme (configurable via env vars) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-20Remove Obsidian integration for public server deploymentPeter Stone
Obsidian relied on local filesystem access which is incompatible with public server deployment. This removes all Obsidian-related code including: - API client and interface - Store layer methods (SaveNotes, GetNotes, SearchNotes) - Handler methods and routes - UI tab and templates - Configuration fields - Related tests Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-20Implement efficient sync for Todoist and Trello APIsPeter Stone
- Add Todoist Sync API v9 support with incremental sync tokens - Store sync tokens in SQLite for persistence across restarts - Add field filtering to Trello API calls to reduce payload size - Update handlers to use incremental sync (merge changes vs full replace) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-19Fix stale Todoist tasks persisting after refreshPeter Stone
Clear tasks table before inserting fresh API data, matching the fix applied to SaveBoards. This ensures completed/updated/deleted tasks are properly removed from the cache. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-19Set Quick Add due date default to todayPeter Stone
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-19Refactor Trello client to use url.Values for query paramsPeter Stone
Replace manual string concatenation with url.Values for cleaner, safer query parameter construction in GetBoards, GetCards, and getLists. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-19Refactor: Add cache key constants and configurable template pathPeter Stone
Code quality improvements: - Define CacheKey* constants in store package for type safety - Add TemplateDir to config (default: web/templates, env: TEMPLATE_DIR) - Update handlers to use store.CacheKey* instead of hardcoded strings - Update NewTabsHandler to accept templateDir parameter - Use filepath.Join for cross-platform template path construction Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-19Implement Unified Quick Add for Tasks tab (Phase 3 Step 8)Peter Stone
Add Quick Add form to create Todoist tasks or Trello cards directly from the Tasks tab with optional due date support. Features: - HandleUnifiedAdd handler with due date parsing - HandleGetListsOptions for dynamic Trello list loading - Quick Add form with source toggle (Todoist/Trello) - Date picker for due dates - HX-Trigger refresh after successful creation - Pass boards to tasks-tab template for board selector Cleanup: - Remove resolved issue tracking files Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>