`, Comment ends with `-->`, Favorites button works on all beach pages, localStorage shows `instaparadise_*` entries, No console errors related to script loading",
"timestamp": "2026-05-02T21:40:52.398424+00:00",
"author": "sync-board"
},
{
"text": "⬜ Pending sub-items: Script tag properly closes with `>`, Comment ends with `-->`, Favorites button works on all beach pages, localStorage shows `instaparadise_*` entries, No console errors related to script loading",
"timestamp": "2026-05-03T00:14:01.045002+00:00",
"author": "sync-board"
},
{
"text": "⬜ Pending sub-items: Script tag properly closes with `>`, Comment ends with `-->`, Favorites button works on all beach pages, localStorage shows `instaparadise_*` entries, No console errors related to script loading",
"timestamp": "2026-05-03T00:14:08.785426+00:00",
"author": "sync-board"
},
{
"text": "⬜ Pending sub-items: Script tag properly closes with `>`, Comment ends with `-->`, Favorites button works on all beach pages, localStorage shows `instaparadise_*` entries, No console errors related to script loading",
"timestamp": "2026-05-03T00:45:08.236542+00:00",
"author": "sync-board"
}
]
},
{
"id": "BUG-001-broken-script-tag-user-data",
"title": "BUG-001: Broken Script Tag in Beach Pages",
"desc": "All beach pages have a malformed script tag for the user-data.js file. The HTML comment syntax is incorrectly formatted, causing the script to not load properly. This breaks all localStorage functionality including favorites, trip planner, and user preferences.",
"column": "todo",
"assignee": "unassigned",
"priority": "HIGH",
"labels": [
"bug"
],
"notes": []
},
{
"id": "BUG-001-broken_images",
"title": "BUG Ticket: BUG-001-broken_images.md",
"desc": "Placeholder or missing image indicators found",
"column": "todo",
"assignee": "unassigned",
"priority": "medium",
"labels": [],
"notes": [
{
"text": "⬜ Pending sub-items: Issue verified, Fix implemented, Fix tested, QA approved",
"timestamp": "2026-04-26T02:13:10.119940+00:00",
"author": "sync-board"
}
]
},
{
"id": "BUG-001-corrupted-script-tags-beach-pages",
"title": "BUG-001: Corrupted Script Tags in Beach Page Templates",
"desc": "**Severity:** CRITICAL\n**Status:** Open\n**Reported:** 2026-04-21\n**Reporter:** Geoffrey (QA Lead)",
"column": "todo",
"assignee": "unassigned",
"priority": "medium",
"labels": [
"bug"
],
"notes": []
},
{
"id": "BUG-001-tile-width-fix",
"title": "BUG-001: Tile Width Inconsistency Across Pages",
"desc": "Widths at the bottom sections (footer, feature cards) are not the same tile size as the ones above (content containers). Different pages use inconsistent max-width values causing visual misalignment.\n\n---",
"column": "todo",
"assignee": "unassigned",
"priority": "High",
"labels": [
"bug",
"enhancement"
],
"notes": [
{
"text": "⬜ Pending sub-items: Verify all containers align at the same max-width, Check responsive behavior at 768px breakpoint, Verify cards maintain consistent sizing, Test on mobile (320px width), Test on tablet (768px width), Test on desktop (1200px+ width), **MOBILE-SPECIFIC: Check tile widths on iPhone SE (375px), iPhone 12/13/14 (390px), iPhone Pro Max (430px)**, **MOBILE-SPECIFIC: Verify no horizontal scroll on mobile**, **MOBILE-SPECIFIC: Ensure cards don't overflow viewport on small screens**, **MOBILE-SPECIFIC: Test touch targets remain accessible after width changes**",
"timestamp": "2026-04-26T02:13:10.120632+00:00",
"author": "sync-board"
}
]
},
{
"id": "BUG-002-deals-page-missing-user-data-js",
"title": "BUG-002: Deals Page Missing User Data JavaScript",
"desc": "The `/deals.html` page does not include the `user-data.js` script that provides localStorage functionality. This means any user preferences or data won't persist when navigating to/from the deals page, and the page cannot access user favorites or theme preferences.",
"column": "todo",
"assignee": "unassigned",
"priority": "MEDIUM",
"labels": [
"bug"
],
"notes": []
},
{
"id": "BUG-002-index-missing-script-closing-bracket",
"title": "BUG-002: Missing Script Closing Bracket on Index.html",
"desc": "The index.html homepage has malformed script tags where the closing angle bracket is missing after the `defer` attribute. This prevents critical JavaScript modules from loading.",
"column": "todo",
"assignee": "unassigned",
"priority": "P0 - Fix Immediately",
"labels": [
"bug"
],
"notes": [
{
"text": "⬜ Pending sub-items: Script tags have proper closing: `defer>\\u003c/script>`, No console errors on homepage load, Favorites section renders if user has saved favorites, Settings buttons (Clear Data, Export, Theme) work, Toast notifications display correctly",
"timestamp": "2026-04-26T02:13:10.121126+00:00",
"author": "sync-board"
},
{
"text": "⬜ Pending sub-items: Script tags have proper closing: `defer>`, No console errors on homepage load, Favorites section renders if user has saved favorites, Settings buttons (Clear Data, Export, Theme) work, Toast notifications display correctly",
"timestamp": "2026-05-02T21:40:52.400085+00:00",
"author": "sync-board"
},
{
"text": "⬜ Pending sub-items: Script tags have proper closing: `defer>`, No console errors on homepage load, Favorites section renders if user has saved favorites, Settings buttons (Clear Data, Export, Theme) work, Toast notifications display correctly",
"timestamp": "2026-05-03T00:14:01.046704+00:00",
"author": "sync-board"
},
{
"text": "⬜ Pending sub-items: Script tags have proper closing: `defer>`, No console errors on homepage load, Favorites section renders if user has saved favorites, Settings buttons (Clear Data, Export, Theme) work, Toast notifications display correctly",
"timestamp": "2026-05-03T00:14:08.787103+00:00",
"author": "sync-board"
},
{
"text": "⬜ Pending sub-items: Script tags have proper closing: `defer>`, No console errors on homepage load, Favorites section renders if user has saved favorites, Settings buttons (Clear Data, Export, Theme) work, Toast notifications display correctly",
"timestamp": "2026-05-03T00:45:08.238250+00:00",
"author": "sync-board"
}
]
},
{
"id": "BUG-002-missing-beach-images",
"title": "BUG-002: Missing Actual Beach Images - Using Placeholder Emojis",
"desc": "**Severity:** HIGH\n**Status:** Open\n**Reported:** 2026-04-21\n**Reporter:** Geoffrey (QA Lead)",
"column": "todo",
"assignee": "unassigned",
"priority": "medium",
"labels": [
"bug",
"seo"
],
"notes": []
},
{
"id": "BUG-002-missing_images",
"title": "BUG Ticket: BUG-002-missing_images.md",
"desc": "No gallery section found",
"column": "todo",
"assignee": "unassigned",
"priority": "medium",
"labels": [],
"notes": [
{
"text": "⬜ Pending sub-items: Issue verified, Fix implemented, Fix tested, QA approved",
"timestamp": "2026-04-26T02:13:10.121779+00:00",
"author": "sync-board"
}
]
},
{
"id": "BUG-002-routing-dynamic-pages-serve-homepage",
"title": "BUG-002: Dynamic Pages Serve Homepage Instead of Content",
"desc": "All dynamic pages were serving the homepage instead of actual content:\n- `/beach/xxx.html` → Shows homepage ❌\n- `/blog/xxx.html` → Shows homepage ❌\n- Any detail page → Shows homepage ❌",
"column": "todo",
"assignee": "unassigned",
"priority": "medium",
"labels": [
"blog",
"bug"
],
"notes": [
{
"text": "✅ Completed sub-items: Fix implemented - `_routes.json` updated with `/beach/*` and `/blog/*` routes, Code committed - Commit: `49dcb71` (2026-04-22 18:03 PDT)",
"timestamp": "2026-04-26T02:13:10.122395+00:00",
"author": "sync-board"
},
{
"text": "⬜ Pending sub-items: Deployed to production - PENDING (needs Cloudflare Pages deployment), Verified on live site - PENDING",
"timestamp": "2026-04-26T02:13:10.122404+00:00",
"author": "sync-board"
}
]
},
{
"id": "BUG-002-script-malformed-all-beaches",
"title": "BUG-002: Malformed Script Tag on All Beach Pages",
"desc": "Every beach page contains a malformed script comment that breaks JavaScript loading.",
"column": "completed",
"assignee": "unassigned",
"priority": "CRITICAL",
"labels": [
"bug"
],
"notes": [
{
"text": "✅ Completed sub-items: All 115 beach pages have correct script tag syntax, User-data.js loads properly on all beach pages, Favorites functionality works, Theme toggle works",
"timestamp": "2026-04-26T02:13:10.122805+00:00",
"author": "sync-board"
}
]
},
{
"id": "BUG-003-duplicate-beach-slug-inconsistency",
"title": "BUG-003: Beach Slug Filename Inconsistency",
"desc": "There is a filename inconsistency with the El Nido beach page. The actual file has `-fixed` suffix but the search index references it without this suffix. This will cause 404 errors when users navigate from search results.",
"column": "todo",
"assignee": "unassigned",
"priority": "P0 - Fix Immediately",
"labels": [
"bug",
"seo"
],
"notes": [
{
"text": "⬜ Pending sub-items: Filename matches search index slug, Search results link to correct page, All internal navigation links work, No 404 errors when accessing El Nido beach",
"timestamp": "2026-04-26T02:13:10.123325+00:00",
"author": "sync-board"
}
]
},
{
"id": "BUG-003-index-missing-brackets",
"title": "BUG-003: Missing Closing Angle Bracket on Index.html Scripts",
"desc": "Script tags on homepage are missing closing angle brackets.",
"column": "completed",
"assignee": "unassigned",
"priority": "CRITICAL",
"labels": [
"bug"
],
"notes": [
{
"text": "✅ Completed sub-items: Script tags properly closed, All JS modules load on homepage, No console errors",
"timestamp": "2026-04-26T02:13:10.123708+00:00",
"author": "sync-board"
}
]
},
{
"id": "BUG-003-missing_images",
"title": "BUG Ticket: BUG-003-missing_images.md",
"desc": "No gallery section found",
"column": "todo",
"assignee": "unassigned",
"priority": "medium",
"labels": [],
"notes": [
{
"text": "⬜ Pending sub-items: Issue verified, Fix implemented, Fix tested, QA approved",
"timestamp": "2026-04-26T02:13:10.123945+00:00",
"author": "sync-board"
}
]
},
{
"id": "BUG-003-search-fetching-nonexistent-index",
"title": "BUG-003: Search Function Fetching Non-existent JSON Index",
"desc": "**Severity:** HIGH\n**Status:** Open\n**Reported:** 2026-04-21\n**Reporter:** Geoffrey (QA Lead)",
"column": "todo",
"assignee": "unassigned",
"priority": "medium",
"labels": [
"bug"
],
"notes": []
},
{
"id": "BUG-003-trip-planner-form-action-missing",
"title": "BUG-003: Trip Planner Form Missing Action Attribute",
"desc": "The trip planner form in `/trip-planner.html` has no `action` attribute and no visible JavaScript handler for form submission. When users fill out the form and click \"Find My Perfect Beach\", nothing happens.",
"column": "todo",
"assignee": "unassigned",
"priority": "HIGH",
"labels": [
"bug"
],
"notes": []
},
{
"id": "BUG-004-beach-comparison-search-nonfunctional",
"title": "BUG-004: Beach Comparison Search Non-Functional",
"desc": "The beach comparison page has two search inputs for selecting beaches to compare, but they have no associated JavaScript functionality. Typing in the search boxes does not display any dropdown results or allow beach selection.",
"column": "todo",
"assignee": "unassigned",
"priority": "HIGH",
"labels": [
"bug"
],
"notes": []
},
{
"id": "BUG-004-duplicate-beach-pages",
"title": "BUG-004: Duplicate Beach Pages - Same Beaches Listed Twice",
"desc": "Multiple beaches have duplicate pages with different URLs and rankings.",
"column": "todo",
"assignee": "unassigned",
"priority": "CRITICAL",
"labels": [
"bug",
"seo"
],
"notes": [
{
"text": "⬜ Pending sub-items: All duplicates removed, Canonical pages have best content, Search index updated, No 404s from old URLs",
"timestamp": "2026-04-26T02:13:10.125159+00:00",
"author": "sync-board"
}
]
},
{
"id": "BUG-004-missing-beach-images",
"title": "BUG-004: Verify Beach Hero Image Assets",
"desc": "Beach detail pages reference hero images from `/images/beaches/` directory. Need to verify these images actually exist to prevent broken image links.",
"column": "todo",
"assignee": "unassigned",
"priority": "P0 - Fix Immediately",
"labels": [
"bug"
],
"notes": [
{
"text": "⬜ Pending sub-items: All referenced images exist in `/images/beaches/`, Images load without 404 errors, Images are appropriate format (JPG/PNG/WebP), Images are optimized (not excessively large), Fallback/placeholder for any truly missing images",
"timestamp": "2026-04-26T02:13:10.125491+00:00",
"author": "sync-board"
}
]
},
{
"id": "BUG-004-missing_images",
"title": "BUG Ticket: BUG-004-missing_images.md",
"desc": "No gallery section found",
"column": "todo",
"assignee": "unassigned",
"priority": "medium",
"labels": [],
"notes": [
{
"text": "⬜ Pending sub-items: Issue verified, Fix implemented, Fix tested, QA approved",
"timestamp": "2026-04-26T02:13:10.125646+00:00",
"author": "sync-board"
}
]
},
{
"id": "BUG-004-trip-planner-missing-js-functionality",
"title": "BUG-004: Trip Planner Missing JavaScript Implementation",
"desc": "**Severity:** HIGH\n**Status:** Open\n**Reported:** 2026-04-21\n**Reporter:** Geoffrey (QA Lead)",
"column": "todo",
"assignee": "unassigned",
"priority": "medium",
"labels": [
"bug"
],
"notes": []
},
{
"id": "BUG-005-beach-comparison-non-functional",
"title": "BUG-005: Beach Comparison Page Missing JavaScript Implementation",
"desc": "**Severity:** HIGH\n**Status:** Open\n**Reported:** 2026-04-21\n**Reporter:** Geoffrey (QA Lead)",
"column": "todo",
"assignee": "unassigned",
"priority": "medium",
"labels": [
"bug"
],
"notes": []
},
{
"id": "BUG-005-beach-nav-link-validation",
"title": "BUG-005: Validate Beach Navigation Links",
"desc": "Each beach page has prev/next navigation links that should point to the adjacent ranked beaches. Need to verify all these links point to actual existing files.",
"column": "todo",
"assignee": "unassigned",
"priority": "P1",
"labels": [
"bug",
"seo"
],
"notes": [
{
"text": "⬜ Pending sub-items: All prev links point to existing files, All next links point to existing files, Navigation follows correct rank order (1→2→3...), Rank 1 has no prev link, Rank 115 has no next link, \"View All Beaches\" link works on all pages",
"timestamp": "2026-04-26T02:13:10.127567+00:00",
"author": "sync-board"
}
]
},
{
"id": "BUG-005-beaches-page-filter-sort-broken",
"title": "BUG-005: Beach Filter Reset and Sort Non-Functional",
"desc": "On `/beaches.html`, the filter sidebar has a \"Reset Filters\" button and sort dropdown that are non-functional. The button appears to only reset the region filter, and the sort dropdown has no event handler attached.",
"column": "todo",
"assignee": "unassigned",
"priority": "MEDIUM",
"labels": [
"bug"
],
"notes": []
},
{
"id": "BUG-005-missing-hero-images",
"title": "BUG-005: Missing Hero Images for 105 Beach Pages",
"desc": "Only 10 of 115 beach pages have hero images. 105 pages have broken image references.",
"column": "inprogress",
"assignee": "unassigned",
"priority": "CRITICAL",
"labels": [
"bug"
],
"notes": [
{
"text": "✅ Completed sub-items: 90 beach pages now have hero images applied, Images stored in `/images/beaches/`",
"timestamp": "2026-04-26T02:13:10.128166+00:00",
"author": "sync-board"
},
{
"text": "⬜ Pending sub-items: Remaining 22 beaches need hero images, Images optimized for web, Alt text added to all images",
"timestamp": "2026-04-26T02:13:10.128170+00:00",
"author": "sync-board"
}
]
},
{
"id": "BUG-005-missing_images",
"title": "BUG Ticket: BUG-005-missing_images.md",
"desc": "No gallery section found",
"column": "todo",
"assignee": "unassigned",
"priority": "medium",
"labels": [],
"notes": [
{
"text": "⬜ Pending sub-items: Issue verified, Fix implemented, Fix tested, QA approved",
"timestamp": "2026-04-26T02:13:10.128323+00:00",
"author": "sync-board"
}
]
},
{
"id": "BUG-005-sarah-images",
"title": "BUG-005: Download Missing Hero Images",
"desc": "Download missing hero images for beach pages. Photo research has already been completed - just need to download and integrate.\n\n---",
"column": "inprogress",
"assignee": "content",
"priority": "HIGH",
"labels": [
"bug"
],
"notes": [
{
"text": "⬜ Pending sub-items: All missing images downloaded, Images stored in correct directory, Image paths updated in HTML, Images load without 404 errors, Images are properly sized, Image quality is acceptable",
"timestamp": "2026-04-26T02:13:10.128523+00:00",
"author": "sync-board"
}
],
"estimate": "4h"
},
{
"id": "BUG-006-beach-comparison-empty-template",
"title": "BUG-006: Beach Comparison Page Empty Template",
"desc": "The beach comparison page (`/beach-comparison.html`) contains only a placeholder message with no actual comparison functionality. This is a core feature listed in the navigation but not implemented.",
"column": "todo",
"assignee": "unassigned",
"priority": "P1",
"labels": [
"bug",
"enhancement"
],
"notes": [
{
"text": "⬜ Pending sub-items: Beach selector dropdown with search, Can select 2-4 beaches to compare, Side-by-side layout for comparison, Display: rank, location, tags, emoji/icon, Remove button for each selected beach, \"Clear All\" button, \"Share Comparison\" button (generates URL), Mobile-responsive layout (stack cards vertically), Works with existing design system",
"timestamp": "2026-04-26T02:13:10.128950+00:00",
"author": "sync-board"
}
]
},
{
"id": "BUG-006-broken_images",
"title": "BUG Ticket: BUG-006-broken_images.md",
"desc": "Placeholder or missing image indicators found",
"column": "todo",
"assignee": "unassigned",
"priority": "medium",
"labels": [],
"notes": [
{
"text": "⬜ Pending sub-items: Issue verified, Fix implemented, Fix tested, QA approved",
"timestamp": "2026-04-26T02:13:10.129108+00:00",
"author": "sync-board"
}
]
},
{
"id": "BUG-006-footer-back-link-404",
"title": "BUG-006: Footer \"Back to Home\" Link Points to Non-existent Page",
"desc": "**Severity:** MEDIUM\n**Status:** Open\n**Reported:** 2026-04-21\n**Reporter:** Geoffrey (QA Lead)",
"column": "todo",
"assignee": "unassigned",
"priority": "medium",
"labels": [
"bug"
],
"notes": []
},
{
"id": "BUG-006-social-share-clipboard-deprecated",
"title": "BUG-006: Clipboard Write Text Error Handling Missing",
"desc": "The \"Copy Link\" buttons on beach pages use `navigator.clipboard.writeText()` without checking if the Clipboard API is available or handling permission errors. This can fail silently in older browsers or when clipboard permissions are denied.",
"column": "todo",
"assignee": "unassigned",
"priority": "MEDIUM",
"labels": [
"bug"
],
"notes": []
},
{
"id": "BUG-007-missing_images",
"title": "BUG Ticket: BUG-007-missing_images.md",
"desc": "No gallery section found",
"column": "todo",
"assignee": "unassigned",
"priority": "medium",
"labels": [],
"notes": [
{
"text": "⬜ Pending sub-items: Issue verified, Fix implemented, Fix tested, QA approved",
"timestamp": "2026-04-26T02:13:10.129979+00:00",
"author": "sync-board"
}
]
},
{
"id": "BUG-007-trip-planner-form-handling",
"title": "BUG-007: Trip Planner Form Submission Handling",
"desc": "The trip planner form has incomplete form handling. The form uses `action=\"#results\"` which may not work correctly, and there's no visible server-side or proper client-side submission handling.",
"column": "todo",
"assignee": "unassigned",
"priority": "P1",
"labels": [
"bug"
],
"notes": [
{
"text": "⬜ Pending sub-items: Form submission intercepted client-side, Results section exists and is populated, Matching algorithm filters beaches correctly, Results display beach cards with links, Preferences saved to localStorage, Smooth scroll to results after submit, \"No results\" message if no matches, Works without page reload",
"timestamp": "2026-04-26T02:13:10.130342+00:00",
"author": "sync-board"
}
]
},
{
"id": "BUG-008-missing_images",
"title": "BUG Ticket: BUG-008-missing_images.md",
"desc": "No gallery section found",
"column": "todo",
"assignee": "unassigned",
"priority": "medium",
"labels": [],
"notes": [
{
"text": "⬜ Pending sub-items: Issue verified, Fix implemented, Fix tested, QA approved",
"timestamp": "2026-04-26T02:13:10.130496+00:00",
"author": "sync-board"
}
]
},
{
"id": "BUG-008-verify-viewport-meta-tags",
"title": "BUG-008: Verify Viewport Meta Tags on All Pages",
"desc": "Need to verify that all 115 beach pages have the proper viewport meta tag for mobile responsiveness. Missing this tag causes mobile rendering issues.",
"column": "todo",
"assignee": "unassigned",
"priority": "P1",
"labels": [
"bug",
"enhancement",
"seo"
],
"notes": [
{
"text": "⬜ Pending sub-items: All main pages have viewport meta tag, All 115 beach pages have viewport meta tag, Viewport tag is in `` section, Content is `width=device-width, initial-scale=1.0`",
"timestamp": "2026-04-26T02:13:10.130788+00:00",
"author": "sync-board"
}
]
},
{
"id": "BUG-009-deals-page-placeholder-content",
"title": "BUG-009: Deals Page Placeholder Content",
"desc": "The deals page contains generic placeholder content with no real booking integration or actual deals. The affiliate links go to booking.com but without proper tracking or personalization.",
"column": "todo",
"assignee": "unassigned",
"priority": "P2",
"labels": [
"bug"
],
"notes": [
{
"text": "⬜ Pending sub-items: Decide on approach (remove/integrate/improve), If keeping: Add actual value proposition, Link deals to specific beaches when possible, Update navigation if page removed, Ensure affiliate links use proper tracking",
"timestamp": "2026-04-26T02:13:10.131168+00:00",
"author": "sync-board"
}
]
},
{
"id": "BUG-009-missing_images",
"title": "BUG Ticket: BUG-009-missing_images.md",
"desc": "No gallery section found",
"column": "todo",
"assignee": "unassigned",
"priority": "medium",
"labels": [],
"notes": [
{
"text": "⬜ Pending sub-items: Issue verified, Fix implemented, Fix tested, QA approved",
"timestamp": "2026-04-26T02:13:10.131326+00:00",
"author": "sync-board"
}
]
},
{
"id": "BUG-010-missing_images",
"title": "BUG Ticket: BUG-010-missing_images.md",
"desc": "No gallery section found",
"column": "todo",
"assignee": "unassigned",
"priority": "medium",
"labels": [],
"notes": [
{
"text": "⬜ Pending sub-items: Issue verified, Fix implemented, Fix tested, QA approved",
"timestamp": "2026-04-26T02:13:10.131475+00:00",
"author": "sync-board"
}
]
},
{
"id": "BUG-010-search-missing-clear-filters",
"title": "BUG-010: Search Page Missing Clear All Filters",
"desc": "The beaches search page (`/beaches.html`) has multiple filter options but no \"Clear All\" or \"Reset Filters\" button. Users must manually clear each filter dropdown.",
"column": "todo",
"assignee": "unassigned",
"priority": "P2",
"labels": [
"bug"
],
"notes": [
{
"text": "⬜ Pending sub-items: \"Clear All\" button visible in filter bar, Click resets all filter dropdowns, Clears search input text, Re-renders beach grid with all beaches, Clears saved filter preferences, Button is accessible (keyboard navigable)",
"timestamp": "2026-04-26T02:13:10.131871+00:00",
"author": "sync-board"
}
]
},
{
"id": "BUG-011-gallery-module-integration",
"title": "BUG-011: Gallery.js Module Not Fully Integrated",
"desc": "The `/js/gallery.js` module exists and has comprehensive functionality for photo galleries, but it's not being initialized on beach pages that have gallery sections.",
"column": "todo",
"assignee": "unassigned",
"priority": "P2",
"labels": [
"bug",
"enhancement"
],
"notes": [
{
"text": "⬜ Pending sub-items: Gallery.js loaded on pages with galleries, Gallery initializes correctly, Lightbox opens on image click, Keyboard navigation works (arrows, escape), Mobile touch gestures work, Lazy loading functional",
"timestamp": "2026-04-26T02:13:10.132255+00:00",
"author": "sync-board"
}
]
},
{
"id": "BUG-011-missing_images",
"title": "BUG Ticket: BUG-011-missing_images.md",
"desc": "No gallery section found",
"column": "todo",
"assignee": "unassigned",
"priority": "medium",
"labels": [],
"notes": [
{
"text": "⬜ Pending sub-items: Issue verified, Fix implemented, Fix tested, QA approved",
"timestamp": "2026-04-26T02:13:10.132410+00:00",
"author": "sync-board"
}
]
},
{
"id": "BUG-012-gallery-placeholder-content",
"title": "BUG-012: Gallery Placeholder Content",
"desc": "Photo galleries on beach pages display emoji placeholders instead of actual images. This looks unprofessional and provides no visual value.",
"column": "todo",
"assignee": "unassigned",
"priority": "P2",
"labels": [
"bug"
],
"notes": [
{
"text": "⬜ Pending sub-items: Decision made on approach, If keeping: Replace emojis with real images, If removing: Delete gallery sections, Ensure no broken image links, Test gallery functionality if kept",
"timestamp": "2026-04-26T02:13:10.132790+00:00",
"author": "sync-board"
}
]
},
{
"id": "BUG-012-missing_images",
"title": "BUG Ticket: BUG-012-missing_images.md",
"desc": "No gallery section found",
"column": "todo",
"assignee": "unassigned",
"priority": "medium",
"labels": [],
"notes": [
{
"text": "⬜ Pending sub-items: Issue verified, Fix implemented, Fix tested, QA approved",
"timestamp": "2026-04-26T02:13:10.132961+00:00",
"author": "sync-board"
}
]
},
{
"id": "BUG-013-inconsistent-hero-backgrounds",
"title": "BUG-013: Inconsistent Hero Background Styles",
"desc": "Beach pages have inconsistent hero section styling. Some use CSS gradients only, others use actual background images. This creates visual inconsistency across the site.",
"column": "todo",
"assignee": "unassigned",
"priority": "P2",
"labels": [
"bug",
"enhancement"
],
"notes": [
{
"text": "⬜ Pending sub-items: Audit complete - know which pages lack images, Consistent hero styling approach decided, All pages updated to follow standard, Fallback for missing images, Mobile-friendly sizing",
"timestamp": "2026-04-26T02:13:10.133399+00:00",
"author": "sync-board"
}
]
},
{
"id": "BUG-013-missing_images",
"title": "BUG Ticket: BUG-013-missing_images.md",
"desc": "No gallery section found",
"column": "todo",
"assignee": "unassigned",
"priority": "medium",
"labels": [],
"notes": [
{
"text": "⬜ Pending sub-items: Issue verified, Fix implemented, Fix tested, QA approved",
"timestamp": "2026-04-26T02:13:10.133554+00:00",
"author": "sync-board"
}
]
},
{
"id": "BUG-014-email-form-no-backend",
"title": "BUG-014: Email Signup Form Has No Backend",
"desc": "Email signup forms on beach pages use a simple JavaScript alert instead of actual email capture. No backend integration means no emails are actually collected.",
"column": "todo",
"assignee": "unassigned",
"priority": "P2",
"labels": [
"bug"
],
"notes": [
{
"text": "⬜ Pending sub-items: Decide on email service, Forms submit to actual service, User receives confirmation, Admin receives notification, GDPR/privacy compliant, Thank you message shown (not alert), Privacy policy link near form, Checkbox for consent (optional but recommended), Unsubscribe option in emails, Data retention policy",
"timestamp": "2026-04-26T02:13:10.133860+00:00",
"author": "sync-board"
}
]
},
{
"id": "BUG-014-missing_images",
"title": "BUG Ticket: BUG-014-missing_images.md",
"desc": "No gallery section found",
"column": "todo",
"assignee": "unassigned",
"priority": "medium",
"labels": [],
"notes": [
{
"text": "⬜ Pending sub-items: Issue verified, Fix implemented, Fix tested, QA approved",
"timestamp": "2026-04-26T02:13:10.134014+00:00",
"author": "sync-board"
}
]
},
{
"id": "BUG-015-missing_images",
"title": "BUG Ticket: BUG-015-missing_images.md",
"desc": "No gallery section found",
"column": "todo",
"assignee": "unassigned",
"priority": "medium",
"labels": [],
"notes": [
{
"text": "⬜ Pending sub-items: Issue verified, Fix implemented, Fix tested, QA approved",
"timestamp": "2026-04-26T02:13:10.134162+00:00",
"author": "sync-board"
}
]
},
{
"id": "BUG-015-mobile-nav-no-hamburger",
"title": "BUG-015: Mobile Navigation Lacks Hamburger Menu",
"desc": "**Severity:** MEDIUM\n**Priority:** P2\n**Status:** ✅ FIXED - AWAITING QA VERIFICATION\n**Created:** 2026-04-21\n**Fixed By:** Lyle (Fix Engine)\n**Date Fixed:** 2026-04-22",
"column": "qa",
"assignee": "unassigned",
"priority": "P2",
"labels": [
"bug",
"enhancement"
],
"notes": [
{
"text": "⬜ Pending sub-items: Hamburger button has `aria-label`, `aria-expanded` toggles with menu state, Menu can be opened/closed with keyboard, Focus trap when menu open (optional), Skip to main content link present, Hamburger icon visible on mobile only, Click opens/closes menu, Menu items accessible on mobile, No horizontal overflow, Desktop navigation unchanged, Smooth animation, Keyboard accessible",
"timestamp": "2026-04-26T02:13:10.134784+00:00",
"author": "sync-board"
}
]
},
{
"id": "BUG-016-missing-og-meta-tags",
"title": "BUG-016: Missing Open Graph Meta Tags",
"desc": "Pages are missing Open Graph and Twitter Card meta tags. This results in poor social media sharing previews (no images, generic descriptions).",
"column": "todo",
"assignee": "unassigned",
"priority": "P3",
"labels": [
"bug",
"enhancement",
"seo"
],
"notes": [
{
"text": "⬜ Pending sub-items: OG tags on all main pages, OG tags on all 115 beach pages, Image URLs are absolute (https://), OG images exist (or use placeholder), Test with Facebook Sharing Debugger, Test with Twitter Card Validator",
"timestamp": "2026-04-26T02:13:10.135220+00:00",
"author": "sync-board"
}
]
},
{
"id": "BUG-016-missing_images",
"title": "BUG Ticket: BUG-016-missing_images.md",
"desc": "No gallery section found",
"column": "todo",
"assignee": "unassigned",
"priority": "medium",
"labels": [],
"notes": [
{
"text": "⬜ Pending sub-items: Issue verified, Fix implemented, Fix tested, QA approved",
"timestamp": "2026-04-26T02:13:10.135378+00:00",
"author": "sync-board"
}
]
},
{
"id": "BUG-017-inconsistent-tag-capitalization",
"title": "BUG-017: Inconsistent Tag Capitalization",
"desc": "Beach tags show inconsistent capitalization across pages. Some use lowercase (`cliff`, `tropical`), some may use mixed case. This creates visual inconsistency.",
"column": "todo",
"assignee": "unassigned",
"priority": "P3",
"labels": [
"bug"
],
"notes": [
{
"text": "⬜ Pending sub-items: Tag capitalization standard decided, All tags follow standard, Search index updated, All beach pages updated, CSS handles display properly, Search/filter still works",
"timestamp": "2026-04-26T02:13:10.135896+00:00",
"author": "sync-board"
}
]
},
{
"id": "BUG-017-missing_images",
"title": "BUG Ticket: BUG-017-missing_images.md",
"desc": "No gallery section found",
"column": "todo",
"assignee": "unassigned",
"priority": "medium",
"labels": [],
"notes": [
{
"text": "⬜ Pending sub-items: Issue verified, Fix implemented, Fix tested, QA approved",
"timestamp": "2026-04-26T02:13:10.136182+00:00",
"author": "sync-board"
}
]
},
{
"id": "BUG-018-missing_images",
"title": "BUG Ticket: BUG-018-missing_images.md",
"desc": "No gallery section found",
"column": "todo",
"assignee": "unassigned",
"priority": "medium",
"labels": [],
"notes": [
{
"text": "⬜ Pending sub-items: Issue verified, Fix implemented, Fix tested, QA approved",
"timestamp": "2026-04-26T02:13:10.136428+00:00",
"author": "sync-board"
}
]
},
{
"id": "BUG-018-static-footer-year",
"title": "BUG-018: Static Footer Copyright Year",
"desc": "The footer copyright year is static text that will become outdated. It should dynamically update to the current year.",
"column": "todo",
"assignee": "unassigned",
"priority": "P3",
"labels": [
"bug"
],
"notes": [
{
"text": "⬜ Pending sub-items: Year updates automatically to current year, No manual updates needed annually, Works on all pages, Falls back gracefully if JavaScript disabled",
"timestamp": "2026-04-26T02:13:10.136975+00:00",
"author": "sync-board"
}
]
},
{
"id": "BUG-019-broken_images",
"title": "BUG Ticket: BUG-019-broken_images.md",
"desc": "Placeholder or missing image indicators found",
"column": "todo",
"assignee": "unassigned",
"priority": "medium",
"labels": [],
"notes": [
{
"text": "⬜ Pending sub-items: Issue verified, Fix implemented, Fix tested, QA approved",
"timestamp": "2026-04-26T02:13:10.137213+00:00",
"author": "sync-board"
}
]
},
{
"id": "BUG-020-missing_images",
"title": "BUG Ticket: BUG-020-missing_images.md",
"desc": "No gallery section found",
"column": "todo",
"assignee": "unassigned",
"priority": "medium",
"labels": [],
"notes": [
{
"text": "⬜ Pending sub-items: Issue verified, Fix implemented, Fix tested, QA approved",
"timestamp": "2026-04-26T02:13:10.137447+00:00",
"author": "sync-board"
}
]
},
{
"id": "BUG-021-missing_images",
"title": "BUG Ticket: BUG-021-missing_images.md",
"desc": "No gallery section found",
"column": "todo",
"assignee": "unassigned",
"priority": "medium",
"labels": [],
"notes": [
{
"text": "⬜ Pending sub-items: Issue verified, Fix implemented, Fix tested, QA approved",
"timestamp": "2026-04-26T02:13:10.137697+00:00",
"author": "sync-board"
}
]
},
{
"id": "BUG-022-missing_images",
"title": "BUG Ticket: BUG-022-missing_images.md",
"desc": "No gallery section found",
"column": "todo",
"assignee": "unassigned",
"priority": "medium",
"labels": [],
"notes": [
{
"text": "⬜ Pending sub-items: Issue verified, Fix implemented, Fix tested, QA approved",
"timestamp": "2026-04-26T02:13:10.137942+00:00",
"author": "sync-board"
}
]
},
{
"id": "BUG-023-missing_images",
"title": "BUG Ticket: BUG-023-missing_images.md",
"desc": "No gallery section found",
"column": "todo",
"assignee": "unassigned",
"priority": "medium",
"labels": [],
"notes": [
{
"text": "⬜ Pending sub-items: Issue verified, Fix implemented, Fix tested, QA approved",
"timestamp": "2026-04-26T02:13:10.138167+00:00",
"author": "sync-board"
}
]
},
{
"id": "BUG-024-missing_images",
"title": "BUG Ticket: BUG-024-missing_images.md",
"desc": "No gallery section found",
"column": "todo",
"assignee": "unassigned",
"priority": "medium",
"labels": [],
"notes": [
{
"text": "⬜ Pending sub-items: Issue verified, Fix implemented, Fix tested, QA approved",
"timestamp": "2026-04-26T02:13:10.138369+00:00",
"author": "sync-board"
}
]
},
{
"id": "BUG-025-missing_images",
"title": "BUG Ticket: BUG-025-missing_images.md",
"desc": "No gallery section found",
"column": "todo",
"assignee": "unassigned",
"priority": "medium",
"labels": [],
"notes": [
{
"text": "⬜ Pending sub-items: Issue verified, Fix implemented, Fix tested, QA approved",
"timestamp": "2026-04-26T02:13:10.138597+00:00",
"author": "sync-board"
}
]
},
{
"id": "BUG-026-missing_images",
"title": "BUG Ticket: BUG-026-missing_images.md",
"desc": "No gallery section found",
"column": "todo",
"assignee": "unassigned",
"priority": "medium",
"labels": [],
"notes": [
{
"text": "⬜ Pending sub-items: Issue verified, Fix implemented, Fix tested, QA approved",
"timestamp": "2026-04-26T02:13:10.138885+00:00",
"author": "sync-board"
}
]
},
{
"id": "BUG-027-broken_images",
"title": "BUG Ticket: BUG-027-broken_images.md",
"desc": "Placeholder or missing image indicators found",
"column": "todo",
"assignee": "unassigned",
"priority": "medium",
"labels": [],
"notes": [
{
"text": "⬜ Pending sub-items: Issue verified, Fix implemented, Fix tested, QA approved",
"timestamp": "2026-04-26T02:13:10.139106+00:00",
"author": "sync-board"
}
]
},
{
"id": "BUG-028-missing_images",
"title": "BUG Ticket: BUG-028-missing_images.md",
"desc": "No gallery section found",
"column": "todo",
"assignee": "unassigned",
"priority": "medium",
"labels": [],
"notes": [
{
"text": "⬜ Pending sub-items: Issue verified, Fix implemented, Fix tested, QA approved",
"timestamp": "2026-04-26T02:13:10.139260+00:00",
"author": "sync-board"
}
]
},
{
"id": "BUG-029-missing_images",
"title": "BUG Ticket: BUG-029-missing_images.md",
"desc": "No gallery section found",
"column": "todo",
"assignee": "unassigned",
"priority": "medium",
"labels": [],
"notes": [
{
"text": "⬜ Pending sub-items: Issue verified, Fix implemented, Fix tested, QA approved",
"timestamp": "2026-04-26T02:13:10.139413+00:00",
"author": "sync-board"
}
]
},
{
"id": "BUG-030-broken_images",
"title": "BUG Ticket: BUG-030-broken_images.md",
"desc": "Placeholder or missing image indicators found",
"column": "todo",
"assignee": "unassigned",
"priority": "medium",
"labels": [],
"notes": [
{
"text": "⬜ Pending sub-items: Issue verified, Fix implemented, Fix tested, QA approved",
"timestamp": "2026-04-26T02:13:10.139563+00:00",
"author": "sync-board"
}
]
},
{
"id": "BUG-031-missing_images",
"title": "BUG Ticket: BUG-031-missing_images.md",
"desc": "No gallery section found",
"column": "todo",
"assignee": "unassigned",
"priority": "medium",
"labels": [],
"notes": [
{
"text": "⬜ Pending sub-items: Issue verified, Fix implemented, Fix tested, QA approved",
"timestamp": "2026-04-26T02:13:10.139710+00:00",
"author": "sync-board"
}
]
},
{
"id": "BUG-032-broken_images",
"title": "BUG Ticket: BUG-032-broken_images.md",
"desc": "Placeholder or missing image indicators found",
"column": "todo",
"assignee": "unassigned",
"priority": "medium",
"labels": [],
"notes": [
{
"text": "⬜ Pending sub-items: Issue verified, Fix implemented, Fix tested, QA approved",
"timestamp": "2026-04-26T02:13:10.139863+00:00",
"author": "sync-board"
}
]
},
{
"id": "BUG-033-missing_images",
"title": "BUG Ticket: BUG-033-missing_images.md",
"desc": "No gallery section found",
"column": "todo",
"assignee": "unassigned",
"priority": "medium",
"labels": [],
"notes": [
{
"text": "⬜ Pending sub-items: Issue verified, Fix implemented, Fix tested, QA approved",
"timestamp": "2026-04-26T02:13:10.140017+00:00",
"author": "sync-board"
}
]
},
{
"id": "BUG-034-missing_images",
"title": "BUG Ticket: BUG-034-missing_images.md",
"desc": "No gallery section found",
"column": "todo",
"assignee": "unassigned",
"priority": "medium",
"labels": [],
"notes": [
{
"text": "⬜ Pending sub-items: Issue verified, Fix implemented, Fix tested, QA approved",
"timestamp": "2026-04-26T02:13:10.140162+00:00",
"author": "sync-board"
}
]
},
{
"id": "BUG-035-missing_images",
"title": "BUG Ticket: BUG-035-missing_images.md",
"desc": "No gallery section found",
"column": "todo",
"assignee": "unassigned",
"priority": "medium",
"labels": [],
"notes": [
{
"text": "⬜ Pending sub-items: Issue verified, Fix implemented, Fix tested, QA approved",
"timestamp": "2026-04-26T02:13:10.140307+00:00",
"author": "sync-board"
}
]
},
{
"id": "BUG-036-missing_images",
"title": "BUG Ticket: BUG-036-missing_images.md",
"desc": "No gallery section found",
"column": "todo",
"assignee": "unassigned",
"priority": "medium",
"labels": [],
"notes": [
{
"text": "⬜ Pending sub-items: Issue verified, Fix implemented, Fix tested, QA approved",
"timestamp": "2026-04-26T02:13:10.140451+00:00",
"author": "sync-board"
}
]
},
{
"id": "BUG-037-missing_images",
"title": "BUG Ticket: BUG-037-missing_images.md",
"desc": "No gallery section found",
"column": "todo",
"assignee": "unassigned",
"priority": "medium",
"labels": [],
"notes": [
{
"text": "⬜ Pending sub-items: Issue verified, Fix implemented, Fix tested, QA approved",
"timestamp": "2026-04-26T02:13:10.140597+00:00",
"author": "sync-board"
}
]
},
{
"id": "BUG-038-missing_images",
"title": "BUG Ticket: BUG-038-missing_images.md",
"desc": "No gallery section found",
"column": "todo",
"assignee": "unassigned",
"priority": "medium",
"labels": [],
"notes": [
{
"text": "⬜ Pending sub-items: Issue verified, Fix implemented, Fix tested, QA approved",
"timestamp": "2026-04-26T02:13:10.140741+00:00",
"author": "sync-board"
}
]
},
{
"id": "BUG-039-missing_images",
"title": "BUG Ticket: BUG-039-missing_images.md",
"desc": "No gallery section found",
"column": "todo",
"assignee": "unassigned",
"priority": "medium",
"labels": [],
"notes": [
{
"text": "⬜ Pending sub-items: Issue verified, Fix implemented, Fix tested, QA approved",
"timestamp": "2026-04-26T02:13:10.140892+00:00",
"author": "sync-board"
}
]
},
{
"id": "BUG-040-missing_images",
"title": "BUG Ticket: BUG-040-missing_images.md",
"desc": "No gallery section found",
"column": "todo",
"assignee": "unassigned",
"priority": "medium",
"labels": [],
"notes": [
{
"text": "⬜ Pending sub-items: Issue verified, Fix implemented, Fix tested, QA approved",
"timestamp": "2026-04-26T02:13:10.141037+00:00",
"author": "sync-board"
}
]
},
{
"id": "BUG-041-missing_images",
"title": "BUG Ticket: BUG-041-missing_images.md",
"desc": "No gallery section found",
"column": "todo",
"assignee": "unassigned",
"priority": "medium",
"labels": [],
"notes": [
{
"text": "⬜ Pending sub-items: Issue verified, Fix implemented, Fix tested, QA approved",
"timestamp": "2026-04-26T02:13:10.141182+00:00",
"author": "sync-board"
}
]
},
{
"id": "BUG-042-missing_images",
"title": "BUG Ticket: BUG-042-missing_images.md",
"desc": "No gallery section found",
"column": "todo",
"assignee": "unassigned",
"priority": "medium",
"labels": [],
"notes": [
{
"text": "⬜ Pending sub-items: Issue verified, Fix implemented, Fix tested, QA approved",
"timestamp": "2026-04-26T02:13:10.141326+00:00",
"author": "sync-board"
}
]
},
{
"id": "BUG-043-missing_images",
"title": "BUG Ticket: BUG-043-missing_images.md",
"desc": "No gallery section found",
"column": "todo",
"assignee": "unassigned",
"priority": "medium",
"labels": [],
"notes": [
{
"text": "⬜ Pending sub-items: Issue verified, Fix implemented, Fix tested, QA approved",
"timestamp": "2026-04-26T02:13:10.141470+00:00",
"author": "sync-board"
}
]
},
{
"id": "BUG-044-missing_images",
"title": "BUG Ticket: BUG-044-missing_images.md",
"desc": "No gallery section found",
"column": "todo",
"assignee": "unassigned",
"priority": "medium",
"labels": [],
"notes": [
{
"text": "⬜ Pending sub-items: Issue verified, Fix implemented, Fix tested, QA approved",
"timestamp": "2026-04-26T02:13:10.141618+00:00",
"author": "sync-board"
}
]
},
{
"id": "BUG-045-nav_issues",
"title": "BUG Ticket: BUG-045-nav_issues.md",
"desc": "Nav has position:absolute/relative instead of fixed - may scroll away",
"column": "todo",
"assignee": "unassigned",
"priority": "medium",
"labels": [],
"notes": [
{
"text": "⬜ Pending sub-items: Issue verified, Fix implemented, Fix tested, QA approved",
"timestamp": "2026-04-26T02:13:10.141769+00:00",
"author": "sync-board"
}
]
},
{
"id": "BUG-046-missing_images",
"title": "BUG Ticket: BUG-046-missing_images.md",
"desc": "No gallery section found",
"column": "todo",
"assignee": "unassigned",
"priority": "medium",
"labels": [],
"notes": [
{
"text": "⬜ Pending sub-items: Issue verified, Fix implemented, Fix tested, QA approved",
"timestamp": "2026-04-26T02:13:10.141919+00:00",
"author": "sync-board"
}
]
},
{
"id": "BUG-047-missing_images",
"title": "BUG Ticket: BUG-047-missing_images.md",
"desc": "No gallery section found",
"column": "todo",
"assignee": "unassigned",
"priority": "medium",
"labels": [],
"notes": [
{
"text": "⬜ Pending sub-items: Issue verified, Fix implemented, Fix tested, QA approved",
"timestamp": "2026-04-26T02:13:10.142064+00:00",
"author": "sync-board"
}
]
},
{
"id": "BUG-048-missing_images",
"title": "BUG Ticket: BUG-048-missing_images.md",
"desc": "No gallery section found",
"column": "todo",
"assignee": "unassigned",
"priority": "medium",
"labels": [],
"notes": [
{
"text": "⬜ Pending sub-items: Issue verified, Fix implemented, Fix tested, QA approved",
"timestamp": "2026-04-26T02:13:10.142208+00:00",
"author": "sync-board"
}
]
},
{
"id": "BUG-049-missing_images",
"title": "BUG Ticket: BUG-049-missing_images.md",
"desc": "No gallery section found",
"column": "todo",
"assignee": "unassigned",
"priority": "medium",
"labels": [],
"notes": [
{
"text": "⬜ Pending sub-items: Issue verified, Fix implemented, Fix tested, QA approved",
"timestamp": "2026-04-26T02:13:10.142355+00:00",
"author": "sync-board"
}
]
},
{
"id": "BUG-050-missing_images",
"title": "BUG Ticket: BUG-050-missing_images.md",
"desc": "No gallery section found",
"column": "todo",
"assignee": "unassigned",
"priority": "medium",
"labels": [],
"notes": [
{
"text": "⬜ Pending sub-items: Issue verified, Fix implemented, Fix tested, QA approved",
"timestamp": "2026-04-26T02:13:10.142512+00:00",
"author": "sync-board"
}
]
},
{
"id": "BUG-051-missing_images",
"title": "BUG Ticket: BUG-051-missing_images.md",
"desc": "No gallery section found",
"column": "todo",
"assignee": "unassigned",
"priority": "medium",
"labels": [],
"notes": [
{
"text": "⬜ Pending sub-items: Issue verified, Fix implemented, Fix tested, QA approved",
"timestamp": "2026-04-26T02:13:10.142658+00:00",
"author": "sync-board"
}
]
},
{
"id": "BUG-052-missing_images",
"title": "BUG Ticket: BUG-052-missing_images.md",
"desc": "No gallery section found",
"column": "todo",
"assignee": "unassigned",
"priority": "medium",
"labels": [],
"notes": [
{
"text": "⬜ Pending sub-items: Issue verified, Fix implemented, Fix tested, QA approved",
"timestamp": "2026-04-26T02:13:10.142802+00:00",
"author": "sync-board"
}
]
},
{
"id": "BUG-053-missing_images",
"title": "BUG Ticket: BUG-053-missing_images.md",
"desc": "No gallery section found",
"column": "todo",
"assignee": "unassigned",
"priority": "medium",
"labels": [],
"notes": [
{
"text": "⬜ Pending sub-items: Issue verified, Fix implemented, Fix tested, QA approved",
"timestamp": "2026-04-26T02:13:10.142965+00:00",
"author": "sync-board"
}
]
},
{
"id": "BUG-054-missing_images",
"title": "BUG Ticket: BUG-054-missing_images.md",
"desc": "No gallery section found",
"column": "todo",
"assignee": "unassigned",
"priority": "medium",
"labels": [],
"notes": [
{
"text": "⬜ Pending sub-items: Issue verified, Fix implemented, Fix tested, QA approved",
"timestamp": "2026-04-26T02:13:10.143113+00:00",
"author": "sync-board"
}
]
},
{
"id": "BUG-055-missing_images",
"title": "BUG Ticket: BUG-055-missing_images.md",
"desc": "No gallery section found",
"column": "todo",
"assignee": "unassigned",
"priority": "medium",
"labels": [],
"notes": [
{
"text": "⬜ Pending sub-items: Issue verified, Fix implemented, Fix tested, QA approved",
"timestamp": "2026-04-26T02:13:10.143258+00:00",
"author": "sync-board"
}
]
},
{
"id": "BUG-056-missing_images",
"title": "BUG Ticket: BUG-056-missing_images.md",
"desc": "No gallery section found",
"column": "todo",
"assignee": "unassigned",
"priority": "medium",
"labels": [],
"notes": [
{
"text": "⬜ Pending sub-items: Issue verified, Fix implemented, Fix tested, QA approved",
"timestamp": "2026-04-26T02:13:10.143404+00:00",
"author": "sync-board"
}
]
},
{
"id": "BUG-057-missing_images",
"title": "BUG Ticket: BUG-057-missing_images.md",
"desc": "No gallery section found",
"column": "todo",
"assignee": "unassigned",
"priority": "medium",
"labels": [],
"notes": [
{
"text": "⬜ Pending sub-items: Issue verified, Fix implemented, Fix tested, QA approved",
"timestamp": "2026-04-26T02:13:10.143547+00:00",
"author": "sync-board"
}
]
},
{
"id": "BUG-058-drone_issues",
"title": "BUG Ticket: BUG-058-drone_issues.md",
"desc": "Drone information found in footer - should be in photography section",
"column": "todo",
"assignee": "unassigned",
"priority": "medium",
"labels": [],
"notes": [
{
"text": "⬜ Pending sub-items: Issue verified, Fix implemented, Fix tested, QA approved",
"timestamp": "2026-04-26T02:13:10.143698+00:00",
"author": "sync-board"
}
]
},
{
"id": "BUG-059-missing_images",
"title": "BUG Ticket: BUG-059-missing_images.md",
"desc": "No gallery section found",
"column": "todo",
"assignee": "unassigned",
"priority": "medium",
"labels": [],
"notes": [
{
"text": "⬜ Pending sub-items: Issue verified, Fix implemented, Fix tested, QA approved",
"timestamp": "2026-04-26T02:13:10.143844+00:00",
"author": "sync-board"
}
]
},
{
"id": "BUG-060-missing_images",
"title": "BUG Ticket: BUG-060-missing_images.md",
"desc": "No gallery section found",
"column": "todo",
"assignee": "unassigned",
"priority": "medium",
"labels": [],
"notes": [
{
"text": "⬜ Pending sub-items: Issue verified, Fix implemented, Fix tested, QA approved",
"timestamp": "2026-04-26T02:13:10.144000+00:00",
"author": "sync-board"
}
]
},
{
"id": "BUG-061-missing_images",
"title": "BUG Ticket: BUG-061-missing_images.md",
"desc": "No gallery section found",
"column": "todo",
"assignee": "unassigned",
"priority": "medium",
"labels": [],
"notes": [
{
"text": "⬜ Pending sub-items: Issue verified, Fix implemented, Fix tested, QA approved",
"timestamp": "2026-04-26T02:13:10.144145+00:00",
"author": "sync-board"
}
]
},
{
"id": "BUG-062-missing_images",
"title": "BUG Ticket: BUG-062-missing_images.md",
"desc": "No gallery section found",
"column": "todo",
"assignee": "unassigned",
"priority": "medium",
"labels": [],
"notes": [
{
"text": "⬜ Pending sub-items: Issue verified, Fix implemented, Fix tested, QA approved",
"timestamp": "2026-04-26T02:13:10.144296+00:00",
"author": "sync-board"
}
]
},
{
"id": "BUG-063-missing_images",
"title": "BUG Ticket: BUG-063-missing_images.md",
"desc": "No gallery section found",
"column": "todo",
"assignee": "unassigned",
"priority": "medium",
"labels": [],
"notes": [
{
"text": "⬜ Pending sub-items: Issue verified, Fix implemented, Fix tested, QA approved",
"timestamp": "2026-04-26T02:13:10.144439+00:00",
"author": "sync-board"
}
]
},
{
"id": "BUG-064-missing_images",
"title": "BUG Ticket: BUG-064-missing_images.md",
"desc": "No gallery section found",
"column": "todo",
"assignee": "unassigned",
"priority": "medium",
"labels": [],
"notes": [
{
"text": "⬜ Pending sub-items: Issue verified, Fix implemented, Fix tested, QA approved",
"timestamp": "2026-04-26T02:13:10.144583+00:00",
"author": "sync-board"
}
]
},
{
"id": "BUG-065-missing_images",
"title": "BUG Ticket: BUG-065-missing_images.md",
"desc": "No gallery section found",
"column": "todo",
"assignee": "unassigned",
"priority": "medium",
"labels": [],
"notes": [
{
"text": "⬜ Pending sub-items: Issue verified, Fix implemented, Fix tested, QA approved",
"timestamp": "2026-04-26T02:13:10.144726+00:00",
"author": "sync-board"
}
]
},
{
"id": "BUG-066-missing_images",
"title": "BUG Ticket: BUG-066-missing_images.md",
"desc": "No gallery section found",
"column": "todo",
"assignee": "unassigned",
"priority": "medium",
"labels": [],
"notes": [
{
"text": "⬜ Pending sub-items: Issue verified, Fix implemented, Fix tested, QA approved",
"timestamp": "2026-04-26T02:13:10.144885+00:00",
"author": "sync-board"
}
]
},
{
"id": "BUG-067-missing_images",
"title": "BUG Ticket: BUG-067-missing_images.md",
"desc": "No gallery section found",
"column": "todo",
"assignee": "unassigned",
"priority": "medium",
"labels": [],
"notes": [
{
"text": "⬜ Pending sub-items: Issue verified, Fix implemented, Fix tested, QA approved",
"timestamp": "2026-04-26T02:13:10.145037+00:00",
"author": "sync-board"
}
]
},
{
"id": "BUG-068-missing_images",
"title": "BUG Ticket: BUG-068-missing_images.md",
"desc": "No gallery section found",
"column": "todo",
"assignee": "unassigned",
"priority": "medium",
"labels": [],
"notes": [
{
"text": "⬜ Pending sub-items: Issue verified, Fix implemented, Fix tested, QA approved",
"timestamp": "2026-04-26T02:13:10.145183+00:00",
"author": "sync-board"
}
]
},
{
"id": "BUG-069-missing_images",
"title": "BUG Ticket: BUG-069-missing_images.md",
"desc": "No gallery section found",
"column": "todo",
"assignee": "unassigned",
"priority": "medium",
"labels": [],
"notes": [
{
"text": "⬜ Pending sub-items: Issue verified, Fix implemented, Fix tested, QA approved",
"timestamp": "2026-04-26T02:13:10.145332+00:00",
"author": "sync-board"
}
]
},
{
"id": "BUG-070-missing_images",
"title": "BUG Ticket: BUG-070-missing_images.md",
"desc": "No gallery section found",
"column": "todo",
"assignee": "unassigned",
"priority": "medium",
"labels": [],
"notes": [
{
"text": "⬜ Pending sub-items: Issue verified, Fix implemented, Fix tested, QA approved",
"timestamp": "2026-04-26T02:13:10.145481+00:00",
"author": "sync-board"
}
]
},
{
"id": "BUG-071-missing_images",
"title": "BUG Ticket: BUG-071-missing_images.md",
"desc": "No gallery section found",
"column": "todo",
"assignee": "unassigned",
"priority": "medium",
"labels": [],
"notes": [
{
"text": "⬜ Pending sub-items: Issue verified, Fix implemented, Fix tested, QA approved",
"timestamp": "2026-04-26T02:13:10.145628+00:00",
"author": "sync-board"
}
]
},
{
"id": "BUG-072-missing_images",
"title": "BUG Ticket: BUG-072-missing_images.md",
"desc": "No gallery section found",
"column": "todo",
"assignee": "unassigned",
"priority": "medium",
"labels": [],
"notes": [
{
"text": "⬜ Pending sub-items: Issue verified, Fix implemented, Fix tested, QA approved",
"timestamp": "2026-04-26T02:13:10.145773+00:00",
"author": "sync-board"
}
]
},
{
"id": "BUG-073-missing_images",
"title": "BUG Ticket: BUG-073-missing_images.md",
"desc": "No gallery section found",
"column": "todo",
"assignee": "unassigned",
"priority": "medium",
"labels": [],
"notes": [
{
"text": "⬜ Pending sub-items: Issue verified, Fix implemented, Fix tested, QA approved",
"timestamp": "2026-04-26T02:13:10.145923+00:00",
"author": "sync-board"
}
]
},
{
"id": "BUG-074-missing_images",
"title": "BUG Ticket: BUG-074-missing_images.md",
"desc": "No gallery section found",
"column": "todo",
"assignee": "unassigned",
"priority": "medium",
"labels": [],
"notes": [
{
"text": "⬜ Pending sub-items: Issue verified, Fix implemented, Fix tested, QA approved",
"timestamp": "2026-04-26T02:13:10.146067+00:00",
"author": "sync-board"
}
]
},
{
"id": "BUG-075-missing_images",
"title": "BUG Ticket: BUG-075-missing_images.md",
"desc": "No gallery section found",
"column": "todo",
"assignee": "unassigned",
"priority": "medium",
"labels": [],
"notes": [
{
"text": "⬜ Pending sub-items: Issue verified, Fix implemented, Fix tested, QA approved",
"timestamp": "2026-04-26T02:13:10.146209+00:00",
"author": "sync-board"
}
]
},
{
"id": "BUG-076-missing_images",
"title": "BUG Ticket: BUG-076-missing_images.md",
"desc": "No gallery section found",
"column": "todo",
"assignee": "unassigned",
"priority": "medium",
"labels": [],
"notes": [
{
"text": "⬜ Pending sub-items: Issue verified, Fix implemented, Fix tested, QA approved",
"timestamp": "2026-04-26T02:13:10.146353+00:00",
"author": "sync-board"
}
]
},
{
"id": "BUG-077-missing_images",
"title": "BUG Ticket: BUG-077-missing_images.md",
"desc": "No gallery section found",
"column": "todo",
"assignee": "unassigned",
"priority": "medium",
"labels": [],
"notes": [
{
"text": "⬜ Pending sub-items: Issue verified, Fix implemented, Fix tested, QA approved",
"timestamp": "2026-04-26T02:13:10.146496+00:00",
"author": "sync-board"
}
]
},
{
"id": "BUG-078-missing_images",
"title": "BUG Ticket: BUG-078-missing_images.md",
"desc": "No gallery section found",
"column": "todo",
"assignee": "unassigned",
"priority": "medium",
"labels": [],
"notes": [
{
"text": "⬜ Pending sub-items: Issue verified, Fix implemented, Fix tested, QA approved",
"timestamp": "2026-04-26T02:13:10.146638+00:00",
"author": "sync-board"
}
]
},
{
"id": "BUG-079-missing_images",
"title": "BUG Ticket: BUG-079-missing_images.md",
"desc": "No gallery section found",
"column": "todo",
"assignee": "unassigned",
"priority": "medium",
"labels": [],
"notes": [
{
"text": "⬜ Pending sub-items: Issue verified, Fix implemented, Fix tested, QA approved",
"timestamp": "2026-04-26T02:13:10.146945+00:00",
"author": "sync-board"
}
]
},
{
"id": "BUG-080-missing_images",
"title": "BUG Ticket: BUG-080-missing_images.md",
"desc": "No gallery section found",
"column": "todo",
"assignee": "unassigned",
"priority": "medium",
"labels": [],
"notes": [
{
"text": "⬜ Pending sub-items: Issue verified, Fix implemented, Fix tested, QA approved",
"timestamp": "2026-04-26T02:13:10.147103+00:00",
"author": "sync-board"
}
]
},
{
"id": "BUG-081-missing_images",
"title": "BUG Ticket: BUG-081-missing_images.md",
"desc": "No gallery section found",
"column": "todo",
"assignee": "unassigned",
"priority": "medium",
"labels": [],
"notes": [
{
"text": "⬜ Pending sub-items: Issue verified, Fix implemented, Fix tested, QA approved",
"timestamp": "2026-04-26T02:13:10.147250+00:00",
"author": "sync-board"
}
]
},
{
"id": "BUG-082-missing_images",
"title": "BUG Ticket: BUG-082-missing_images.md",
"desc": "No gallery section found",
"column": "todo",
"assignee": "unassigned",
"priority": "medium",
"labels": [],
"notes": [
{
"text": "⬜ Pending sub-items: Issue verified, Fix implemented, Fix tested, QA approved",
"timestamp": "2026-04-26T02:13:10.147396+00:00",
"author": "sync-board"
}
]
},
{
"id": "BUG-083-missing_images",
"title": "BUG Ticket: BUG-083-missing_images.md",
"desc": "No gallery section found",
"column": "todo",
"assignee": "unassigned",
"priority": "medium",
"labels": [],
"notes": [
{
"text": "⬜ Pending sub-items: Issue verified, Fix implemented, Fix tested, QA approved",
"timestamp": "2026-04-26T02:13:10.147541+00:00",
"author": "sync-board"
}
]
},
{
"id": "BUG-084-missing_images",
"title": "BUG Ticket: BUG-084-missing_images.md",
"desc": "No gallery section found",
"column": "todo",
"assignee": "unassigned",
"priority": "medium",
"labels": [],
"notes": [
{
"text": "⬜ Pending sub-items: Issue verified, Fix implemented, Fix tested, QA approved",
"timestamp": "2026-04-26T02:13:10.147685+00:00",
"author": "sync-board"
}
]
},
{
"id": "BUG-085-missing_images",
"title": "BUG Ticket: BUG-085-missing_images.md",
"desc": "No gallery section found",
"column": "todo",
"assignee": "unassigned",
"priority": "medium",
"labels": [],
"notes": [
{
"text": "⬜ Pending sub-items: Issue verified, Fix implemented, Fix tested, QA approved",
"timestamp": "2026-04-26T02:13:10.147833+00:00",
"author": "sync-board"
}
]
},
{
"id": "BUG-086-missing_images",
"title": "BUG Ticket: BUG-086-missing_images.md",
"desc": "No gallery section found",
"column": "todo",
"assignee": "unassigned",
"priority": "medium",
"labels": [],
"notes": [
{
"text": "⬜ Pending sub-items: Issue verified, Fix implemented, Fix tested, QA approved",
"timestamp": "2026-04-26T02:13:10.147995+00:00",
"author": "sync-board"
}
]
},
{
"id": "BUG-087-missing_images",
"title": "BUG Ticket: BUG-087-missing_images.md",
"desc": "No gallery section found",
"column": "todo",
"assignee": "unassigned",
"priority": "medium",
"labels": [],
"notes": [
{
"text": "⬜ Pending sub-items: Issue verified, Fix implemented, Fix tested, QA approved",
"timestamp": "2026-04-26T02:13:10.148147+00:00",
"author": "sync-board"
}
]
},
{
"id": "BUG-088-missing_images",
"title": "BUG Ticket: BUG-088-missing_images.md",
"desc": "No gallery section found",
"column": "todo",
"assignee": "unassigned",
"priority": "medium",
"labels": [],
"notes": [
{
"text": "⬜ Pending sub-items: Issue verified, Fix implemented, Fix tested, QA approved",
"timestamp": "2026-04-26T02:13:10.148296+00:00",
"author": "sync-board"
}
]
},
{
"id": "BUG-089-missing_images",
"title": "BUG Ticket: BUG-089-missing_images.md",
"desc": "No gallery section found",
"column": "todo",
"assignee": "unassigned",
"priority": "medium",
"labels": [],
"notes": [
{
"text": "⬜ Pending sub-items: Issue verified, Fix implemented, Fix tested, QA approved",
"timestamp": "2026-04-26T02:13:10.148446+00:00",
"author": "sync-board"
}
]
},
{
"id": "BUG-090-missing_images",
"title": "BUG Ticket: BUG-090-missing_images.md",
"desc": "No gallery section found",
"column": "todo",
"assignee": "unassigned",
"priority": "medium",
"labels": [],
"notes": [
{
"text": "⬜ Pending sub-items: Issue verified, Fix implemented, Fix tested, QA approved",
"timestamp": "2026-04-26T02:13:10.148593+00:00",
"author": "sync-board"
}
]
},
{
"id": "BUG-091-missing_images",
"title": "BUG Ticket: BUG-091-missing_images.md",
"desc": "No gallery section found",
"column": "todo",
"assignee": "unassigned",
"priority": "medium",
"labels": [],
"notes": [
{
"text": "⬜ Pending sub-items: Issue verified, Fix implemented, Fix tested, QA approved",
"timestamp": "2026-04-26T02:13:10.148740+00:00",
"author": "sync-board"
}
]
},
{
"id": "BUG-092-missing_images",
"title": "BUG Ticket: BUG-092-missing_images.md",
"desc": "No gallery section found",
"column": "todo",
"assignee": "unassigned",
"priority": "medium",
"labels": [],
"notes": [
{
"text": "⬜ Pending sub-items: Issue verified, Fix implemented, Fix tested, QA approved",
"timestamp": "2026-04-26T02:13:10.148900+00:00",
"author": "sync-board"
}
]
},
{
"id": "BUG-093-missing_images",
"title": "BUG Ticket: BUG-093-missing_images.md",
"desc": "No gallery section found",
"column": "todo",
"assignee": "unassigned",
"priority": "medium",
"labels": [],
"notes": [
{
"text": "⬜ Pending sub-items: Issue verified, Fix implemented, Fix tested, QA approved",
"timestamp": "2026-04-26T02:13:10.149049+00:00",
"author": "sync-board"
}
]
},
{
"id": "BUG-094-missing_images",
"title": "BUG Ticket: BUG-094-missing_images.md",
"desc": "No gallery section found",
"column": "todo",
"assignee": "unassigned",
"priority": "medium",
"labels": [],
"notes": [
{
"text": "⬜ Pending sub-items: Issue verified, Fix implemented, Fix tested, QA approved",
"timestamp": "2026-04-26T02:13:10.149197+00:00",
"author": "sync-board"
}
]
},
{
"id": "BUG-095-missing_images",
"title": "BUG Ticket: BUG-095-missing_images.md",
"desc": "No gallery section found",
"column": "todo",
"assignee": "unassigned",
"priority": "medium",
"labels": [],
"notes": [
{
"text": "⬜ Pending sub-items: Issue verified, Fix implemented, Fix tested, QA approved",
"timestamp": "2026-04-26T02:13:10.149344+00:00",
"author": "sync-board"
}
]
},
{
"id": "BUG-096-board-note-sync-failure",
"title": "BUG-096: Board Note Sync Failure - T-001 Notes Not Updating",
"desc": "User added a note to ticket T-001 via the board interface at https://instaparadise.com/board/, but the note does not appear after syncing.\n\n**Current Behavior:**\n- User adds note through board UI\n- Note appears to save locally\n- After sync/refresh, note disappears\n- board_snapshot.json shows only old notes from April 13\n\n**Expected Behavior:**\n- Notes added via board UI should persist\n- Sync process should capture new notes\n- Notes should appear in both board UI and ticket files\n\n---",
"column": "inprogress",
"assignee": "tech",
"priority": "HIGH",
"labels": [
"bug",
"video"
],
"notes": [
{
"text": "⬜ Pending sub-items: User can add note to any ticket via board UI, Note persists after page refresh, Note appears in board_snapshot.json, Note syncs to ticket markdown file, Other users can see the note after sync, Timestamp and agent name recorded",
"timestamp": "2026-04-26T02:13:10.149719+00:00",
"author": "sync-board"
}
]
},
{
"id": "BUG-097-homepage-auto-redirect",
"title": "BUG-097: Homepage Auto-Redirect to Board",
"desc": "User reports that visiting https://instaparadise.com automatically redirects to https://instaparadise.com/board/ every time.\n\n**Current Behavior:**\n- User visits instaparadise.com (root domain)\n- Browser automatically redirects to /board/\n- No click required, happens on page load\n\n**Expected Behavior:**\n- instaparadise.com should show homepage with beach rankings\n- User should stay on homepage until clicking a link\n\n---",
"column": "todo",
"assignee": "tech",
"priority": "CRITICAL",
"labels": [
"bug"
],
"notes": [
{
"text": "⬜ Pending sub-items: Visiting instaparadise.com shows homepage, No automatic redirect to /board/, User stays on homepage until clicking link, Works in all browsers (Chrome, Safari, Firefox), Works after hard refresh",
"timestamp": "2026-04-26T02:13:10.150077+00:00",
"author": "sync-board"
}
]
},
{
"id": "BUG-098-multiple-boards-not-syncing",
"title": "BUG-098: Multiple Board Instances Not Syncing",
"desc": "Three different board instances exist with separate data that don't sync:\n\n1. **tickets.instaparadise.com** - User added note to T-001 here\n2. **instaparadise.com/board/** - Different board, doesn't show the note\n3. **Workspace files** (`/tickets/*.md`, `board_snapshot.json`) - Third copy\n\n**User Action:**\n- Added note to T-001 via tickets.instaparadise.com\n- Note saved there successfully\n- Note does NOT appear in instaparadise.com/board/\n- Note does NOT sync to workspace ticket files\n\n---",
"column": "todo",
"assignee": "tech",
"priority": "CRITICAL",
"labels": [
"bug"
],
"notes": [
{
"text": "⬜ Pending sub-items: Single board instance (or proper sync), User notes appear in all locations, Workspace files sync with deployed board, No data loss during consolidation",
"timestamp": "2026-04-26T02:13:10.150436+00:00",
"author": "sync-board"
}
]
},
{
"id": "BUG-MOBILE-001-FIX-fab-button-function-reference",
"title": "BUG-MOBILE-001-FIX: Fix FAB New Task Button Function Reference",
"desc": "The Floating Action Button (FAB) for creating new tasks references `openNewTaskModal()` which may be undefined when the mobile architecture initializes, preventing users from creating tickets on mobile devices.",
"column": "todo",
"assignee": "unassigned",
"priority": "medium",
"labels": [
"bug",
"enhancement"
],
"notes": [
{
"text": "⬜ Pending sub-items: FAB button works reliably on all mobile devices, Graceful fallback if `openNewTaskModal` unavailable, User sees feedback (toast or inline form) when creating task, Tested on iOS Safari, Chrome Android, Samsung Internet",
"timestamp": "2026-04-26T02:13:10.150943+00:00",
"author": "sync-board"
}
]
},
{
"id": "BUG-MOBILE-001",
"title": "BUG-MOBILE-001: Floating Action Button Non-Functional on Mobile",
"desc": "The Floating Action Button (FAB) for creating new tasks on mobile may not function correctly. The button references `openNewTaskModal()` which may not be defined when the mobile architecture initializes, preventing users from creating tickets on mobile devices.",
"column": "todo",
"assignee": "tech",
"priority": "P0 - Fix Immediately",
"labels": [
"bug",
"enhancement"
],
"notes": [
{
"text": "⬜ Pending sub-items: FAB click always opens new task modal, Modal loads correctly on mobile devices, Form inputs are properly sized for mobile, Ticket creation works end-to-end on mobile, Error handling provides user feedback if modal fails",
"timestamp": "2026-04-26T02:13:10.151279+00:00",
"author": "sync-board"
}
]
},
{
"id": "BUG-MOBILE-002-FIX-swipe-visual-feedback",
"title": "BUG-MOBILE-002-FIX: Add Swipe Visual Feedback Overlay",
"desc": "When swiping on a task card to move it to another column, there's no visual feedback indicating what action will be taken or whether the swipe is valid.",
"column": "todo",
"assignee": "unassigned",
"priority": "medium",
"labels": [
"bug",
"enhancement"
],
"notes": [
{
"text": "⬜ Pending sub-items: Swiping shows target column name, Visual overlay appears during swipe, Card shows action preview, Directional icons indicate swipe direction, Completion notification shown after successful swipe, Smooth animations at 60fps, Works on iOS Safari and Chrome Android",
"timestamp": "2026-04-26T02:13:10.152738+00:00",
"author": "sync-board"
}
]
},
{
"id": "BUG-MOBILE-002",
"title": "BUG-MOBILE-002: Missing Visual Feedback During Swipe Actions",
"desc": "When users swipe left or right on a ticket card to move it between columns, there is insufficient visual feedback. Users cannot see which action will be triggered or get confirmation that their swipe was recognized.",
"column": "todo",
"assignee": "tech",
"priority": "P1 - Fix Soon",
"labels": [
"bug",
"enhancement"
],
"notes": [
{
"text": "⬜ Pending sub-items: Swipe action icons appear during swipe (⬅️ ➡️), Destination column name shown, Threshold indicator (e.g., \"Release to move\"), Smooth spring animation, Visual confirmation when threshold reached",
"timestamp": "2026-04-26T02:13:10.153166+00:00",
"author": "sync-board"
}
]
},
{
"id": "BUG-MOBILE-003-FIX-resize-move-buttons-mobile",
"title": "BUG-MOBILE-003-FIX: Resize Move Buttons for Mobile",
"desc": "Move buttons (\"← To Do\", \"In Progress →\", \"Archive\") in the task detail modal are too small on mobile devices, making them difficult to tap accurately.",
"column": "todo",
"assignee": "unassigned",
"priority": "medium",
"labels": [
"bug",
"enhancement"
],
"notes": [
{
"text": "✅ Completed sub-items: Move buttons are 48px minimum height on mobile, Archive button full-width below move buttons, Visual feedback on tap (scale, color change), Loading states during move operation, Disabled state when at column boundaries, Tested on iPhone SE and Android devices",
"timestamp": "2026-04-26T02:13:10.154091+00:00",
"author": "sync-board"
}
]
},
{
"id": "BUG-MOBILE-003",
"title": "BUG-MOBILE-003: Move Buttons Too Small on Mobile Modal",
"desc": "The move buttons in the task detail modal are too small for comfortable touch interaction on mobile devices. They may be difficult to tap accurately, leading to frustration and potential mis-taps.",
"column": "todo",
"assignee": "tech",
"priority": "P1 - Fix Soon",
"labels": [
"bug",
"enhancement"
],
"notes": [
{
"timestamp": "2026-04-25T17:48:00Z",
"agent": "sarah",
"text": "Fixed in commit f6123bc. Added min-height: 48px !important and min-width: 48px !important to .move-btn class."
},
{
"text": "⬜ Pending sub-items: Move buttons are minimum 44px height on mobile, Adequate spacing between buttons (minimum 8px), Visual feedback on tap (scale or color change), Tested on iPhone SE (smallest screen)",
"timestamp": "2026-04-26T02:13:10.154423+00:00",
"author": "sync-board"
}
]
},
{
"id": "BUG-MOBILE-004-FIX-button-touch-targets-44px",
"title": "BUG-MOBILE-004-FIX: Increase All Buttons to 44px Minimum Touch Target",
"desc": "Multiple buttons on the mobile board are below the 44px minimum touch target size required by WCAG 2.1 accessibility guidelines and Apple HIG.",
"column": "todo",
"assignee": "unassigned",
"priority": "medium",
"labels": [
"bug",
"enhancement"
],
"notes": [
{
"text": "✅ Completed sub-items: All buttons ≥ 44px × 44px on mobile (< 640px), Audit script passes with 0 violations, Visual spacing maintained (no cramped buttons), Tested on iPhone SE (375px width), Tested on Android devices",
"timestamp": "2026-04-26T02:13:10.155290+00:00",
"author": "sync-board"
}
]
},
{
"id": "BUG-MOBILE-004",
"title": "BUG-MOBILE-004: Multiple Buttons Below 44px Touch Target Minimum",
"desc": "Several interactive elements in the ticket board interface have touch targets smaller than the recommended 44px minimum. This violates WCAG 2.1 accessibility guidelines and makes the interface difficult to use on mobile devices.",
"column": "todo",
"assignee": "tech",
"priority": "P1 - Fix Soon",
"labels": [
"bug",
"enhancement"
],
"notes": [
{
"timestamp": "2026-04-25T17:48:00Z",
"agent": "sarah",
"text": "Fixed in commit f6123bc. Updated theme-toggle to 44px (48px mobile), modal-close-btn to 48px mobile, all modal buttons now 48px minimum."
},
{
"text": "⬜ Pending sub-items: All buttons minimum 44x44px on mobile (< 640px), Adequate spacing between adjacent touch targets (minimum 8px), Visual design maintained or improved, Tested on iPhone SE (smallest common device), No overlapping touch targets",
"timestamp": "2026-04-26T02:13:10.155779+00:00",
"author": "sync-board"
}
]
},
{
"id": "BUG-MOBILE-005",
"title": "BUG-MOBILE-005: Samsung Internet Browser Long-Press Conflict",
"desc": "The `-webkit-touch-callout: none` CSS property used to disable the default iOS callout menu may interfere with Samsung Internet browser's native long-press context menu. This could prevent the custom touch menu from appearing on Samsung devices.",
"column": "completed",
"assignee": "unassigned",
"priority": "P2 - Fix When Possible",
"labels": [
"bug",
"enhancement"
],
"notes": [
{
"timestamp": "2026-04-25T17:48:00Z",
"agent": "sarah",
"text": "Fixed in commit f6123bc. Added @supports (-webkit-tap-highlight-color) detection, edge-aware touch menu positioning, selective touch-callout disabling."
},
{
"text": "✅ Completed sub-items: Long-press works on Samsung Internet, Custom touch menu appears correctly, No regression on Safari iOS, No regression on Chrome Android, Tested on actual Samsung device or emulator",
"timestamp": "2026-04-26T02:13:10.156184+00:00",
"author": "sync-board"
}
]
},
{
"id": "BUG-MOBILE-006",
"title": "BUG-MOBILE-006: Touch Menu Positioning Edge Cases",
"desc": "The custom touch menu (context menu) that appears on long-press may have positioning issues in edge cases. When a ticket card is near the top, bottom, or edges of the screen, the menu may be cut off or positioned incorrectly.",
"column": "todo",
"assignee": "tech",
"priority": "P2 - Fix When Possible",
"labels": [
"bug",
"enhancement"
],
"notes": [
{
"text": "⬜ Pending sub-items: Menu always fully visible within viewport, Smart vertical positioning (above/below card as needed), Horizontal positioning adjusts to prevent overflow, Minimum width of 200px maintained, Smooth animation from card",
"timestamp": "2026-04-26T02:13:10.156679+00:00",
"author": "sync-board"
}
]
},
{
"id": "BUG-MOBILE-007",
"title": "BUG-MOBILE-007: Column Tab Bar Issues on Small Screens",
"desc": "The mobile column navigation tab bar has usability issues on small screens (320px-375px width), including truncated text and lack of visual indicator on first load.\n\n---",
"column": "todo",
"assignee": "tech",
"priority": "P1 - Fix Before Deploy",
"labels": [
"bug",
"enhancement",
"video"
],
"notes": [
{
"text": "⬜ Pending sub-items: Tab text readable on 320px screens, Current column clearly indicated on page load, Tab bar usable on all mobile screen sizes, No text truncation or overflow",
"timestamp": "2026-04-26T02:13:10.157072+00:00",
"author": "sync-board"
}
]
},
{
"id": "BUG-MOBILE-008",
"title": "BUG-MOBILE-008: No Swipe Gesture for Column Switching",
"desc": "Users cannot swipe left/right on the board area to switch between columns. They must use the bottom tab bar exclusively, which is less intuitive for mobile users accustomed to swipe navigation.\n\n---",
"column": "todo",
"assignee": "tech",
"priority": "P1 - Fix Before Deploy",
"labels": [
"bug",
"enhancement"
],
"notes": [
{
"text": "⬜ Pending sub-items: Swipe left on column area navigates to next column, Swipe right on column area navigates to previous column, Swipe does not interfere with card interactions, Visual feedback during swipe (optional but recommended), Works on all mobile screen sizes",
"timestamp": "2026-04-26T02:13:10.157485+00:00",
"author": "sync-board"
}
]
},
{
"id": "BUG-MOBILE-009",
"title": "BUG-MOBILE-009: Search/Filter Functionality Not Implemented on Mobile",
"desc": "The search box and member filter chips are present in the mobile UI, but the actual search and filter functionality is not implemented or connected in the mobile JavaScript.\n\n---",
"column": "todo",
"assignee": "tech",
"priority": "P0 - Fix Immediately",
"labels": [
"bug",
"enhancement"
],
"notes": [
{
"text": "⬜ Pending sub-items: Search box filters tickets in real-time as user types, Member chips toggle filter by assignee, Clear button resets search, Combined search + member filters work together, Filter state visible to user (active chips highlighted), \"No results\" message shown when filters match nothing, Works on all mobile screen sizes",
"timestamp": "2026-04-26T02:13:10.158196+00:00",
"author": "sync-board"
}
]
},
{
"id": "BUG-MOBILE-010",
"title": "BUG-MOBILE-010: Filter Bar Positioning Issues on Mobile",
"desc": "The mobile filter bar uses fixed positioning which may overlap content when scrolling, and the dropdown behavior may not be intuitive for users.\n\n---",
"column": "todo",
"assignee": "tech",
"priority": "P2 - Fix After Critical",
"labels": [
"bug",
"enhancement"
],
"notes": [
{
"text": "⬜ Pending sub-items: Filter bar doesn't overlap content awkwardly, Clicking outside closes filter bar, Proper z-index layering (below modals), Smooth animation for open/close, Accessible (focus trap, escape key to close)",
"timestamp": "2026-04-26T02:13:10.158825+00:00",
"author": "sync-board"
}
]
},
{
"id": "BUG-MOBILE-011",
"title": "BUG-MOBILE-011: New Task Modal Form Layout Issues on Mobile",
"desc": "The new task modal form uses a grid layout that doesn't properly stack on all mobile screen sizes, causing horizontal overflow or cramped fields on small devices.\n\n---",
"column": "todo",
"assignee": "tech",
"priority": "P1 - Fix Before Deploy",
"labels": [
"bug",
"enhancement"
],
"notes": [
{
"text": "⬜ Pending sub-items: Form fields stack vertically on mobile (< 640px), No horizontal scrolling in modal, All input fields full width on mobile, Proper spacing (minimum 16px) between fields, Touch targets remain 44px+ minimum, Works on 320px screens",
"timestamp": "2026-04-26T02:13:10.159324+00:00",
"author": "sync-board"
}
]
},
{
"id": "BUG-MOBILE-012",
"title": "BUG-MOBILE-012: Missing Form Validation on Mobile",
"desc": "The ticket creation and editing forms lack client-side validation, allowing users to submit empty or invalid data. Required fields are not marked, and no error messages are displayed.\n\n---",
"column": "todo",
"assignee": "tech",
"priority": "P1 - Fix Before Deploy",
"labels": [
"bug",
"enhancement"
],
"notes": [
{
"text": "⬜ Pending sub-items: Required fields marked with visual indicator, Empty title prevents form submission, Inline error messages shown for invalid fields, Error states have visual styling (red border, etc.), Form doesn't submit until validation passes, Validation works on both create and edit forms, Error messages are readable on mobile screens",
"timestamp": "2026-04-26T02:13:10.159800+00:00",
"author": "sync-board"
}
]
},
{
"id": "BUG-MOBILE-013",
"title": "BUG-MOBILE-013: Ticket Creation Persistence Unclear on Mobile",
"desc": "After creating a ticket on mobile, there is no clear success confirmation, and it's unclear if the ticket was actually saved. Users may create duplicate tickets or lose confidence in the system.\n\n---",
"column": "todo",
"assignee": "tech",
"priority": "P1 - Fix Before Deploy",
"labels": [
"bug",
"enhancement"
],
"notes": [
{
"text": "⬜ Pending sub-items: Success message shown after ticket created, Modal closes automatically on success, New ticket appears in board without manual refresh, Error message shown if save fails, Loading state shown during save operation, Save button disabled during submission (prevents duplicates), Notification auto-dismisses after 3 seconds, Works on all mobile screen sizes",
"timestamp": "2026-04-26T02:13:10.160357+00:00",
"author": "sync-board"
}
]
},
{
"id": "BUG-MOBILE-014",
"title": "BUG-MOBILE-014: Missing \"Deployment Ready\" Column in Mobile Workflow",
"desc": "The mobile implementation is missing the \"Deployment Ready\" column from the workflow. The columns array only includes 5 columns instead of the full 6-column workflow, breaking the complete ticket lifecycle on mobile devices.\n\n---",
"column": "todo",
"assignee": "tech",
"priority": "P0 - Fix Immediately",
"labels": [
"bug",
"enhancement"
],
"notes": [
{
"text": "⬜ Pending sub-items: \"Deployment Ready\" column appears in mobile tab bar, Tickets can be moved to/from Deployment Ready on mobile, All 6 workflow columns are functional, Column navigation works for all 6 columns, Tickets in Deployment Ready status display correctly, Swipe gestures work for all column transitions",
"timestamp": "2026-04-26T02:13:10.160787+00:00",
"author": "sync-board"
},
{
"text": "✅ Completed sub-items: \"Deployment Ready\" column visible on desktop, All 6 workflow columns display correctly, 9 tickets in Deployment Ready visible, Green gradient highlight applied",
"timestamp": "2026-04-26T06:40:11.145139+00:00",
"author": "sync-board"
},
{
"text": "⬜ Pending sub-items: \"Deployment Ready\" column appears in mobile tab bar, Tickets can be moved to/from Deployment Ready on mobile, All 6 workflow columns are functional on mobile, Column navigation works for all 6 columns on mobile, Swipe gestures work for all column transitions, \"Deployment Ready\" column appears in mobile tab bar, Tickets can be moved to/from Deployment Ready on mobile, All 6 workflow columns are functional, Column navigation works for all 6 columns, Tickets in Deployment Ready status display correctly, Swipe gestures work for all column transitions",
"timestamp": "2026-04-26T06:40:11.145143+00:00",
"author": "sync-board"
},
{
"text": "✅ Completed sub-items: \"Deployment Ready\" column visible on desktop, All 6 workflow columns display correctly, 9 tickets in Deployment Ready visible, Green gradient highlight applied",
"timestamp": "2026-04-26T06:42:59.275741+00:00",
"author": "sync-board"
},
{
"text": "⬜ Pending sub-items: \"Deployment Ready\" column appears in mobile tab bar, Tickets can be moved to/from Deployment Ready on mobile, All 6 workflow columns are functional on mobile, Column navigation works for all 6 columns on mobile, Swipe gestures work for all column transitions, \"Deployment Ready\" column appears in mobile tab bar, Tickets can be moved to/from Deployment Ready on mobile, All 6 workflow columns are functional, Column navigation works for all 6 columns, Tickets in Deployment Ready status display correctly, Swipe gestures work for all column transitions",
"timestamp": "2026-04-26T06:42:59.275745+00:00",
"author": "sync-board"
},
{
"text": "✅ Completed sub-items: \"Deployment Ready\" column visible on desktop, All 6 workflow columns display correctly, 9 tickets in Deployment Ready visible, Green gradient highlight applied",
"timestamp": "2026-04-26T06:47:49.142166+00:00",
"author": "sync-board"
},
{
"text": "⬜ Pending sub-items: \"Deployment Ready\" column appears in mobile tab bar, Tickets can be moved to/from Deployment Ready on mobile, All 6 workflow columns are functional on mobile, Column navigation works for all 6 columns on mobile, Swipe gestures work for all column transitions, \"Deployment Ready\" column appears in mobile tab bar, Tickets can be moved to/from Deployment Ready on mobile, All 6 workflow columns are functional, Column navigation works for all 6 columns, Tickets in Deployment Ready status display correctly, Swipe gestures work for all column transitions",
"timestamp": "2026-04-26T06:47:49.142170+00:00",
"author": "sync-board"
},
{
"text": "✅ Completed sub-items: \"Deployment Ready\" column visible on desktop, All 6 workflow columns display correctly, 9 tickets in Deployment Ready visible, Green gradient highlight applied",
"timestamp": "2026-04-26T06:53:54.529075+00:00",
"author": "sync-board"
},
{
"text": "⬜ Pending sub-items: \"Deployment Ready\" column appears in mobile tab bar, Tickets can be moved to/from Deployment Ready on mobile, All 6 workflow columns are functional on mobile, Column navigation works for all 6 columns on mobile, Swipe gestures work for all column transitions, \"Deployment Ready\" column appears in mobile tab bar, Tickets can be moved to/from Deployment Ready on mobile, All 6 workflow columns are functional, Column navigation works for all 6 columns, Tickets in Deployment Ready status display correctly, Swipe gestures work for all column transitions",
"timestamp": "2026-04-26T06:53:54.529079+00:00",
"author": "sync-board"
},
{
"text": "✅ Completed sub-items: \"Deployment Ready\" column visible on desktop, All 6 workflow columns display correctly, 9 tickets in Deployment Ready visible, Green gradient highlight applied",
"timestamp": "2026-04-26T06:54:41.815884+00:00",
"author": "sync-board"
},
{
"text": "⬜ Pending sub-items: \"Deployment Ready\" column appears in mobile tab bar, Tickets can be moved to/from Deployment Ready on mobile, All 6 workflow columns are functional on mobile, Column navigation works for all 6 columns on mobile, Swipe gestures work for all column transitions, \"Deployment Ready\" column appears in mobile tab bar, Tickets can be moved to/from Deployment Ready on mobile, All 6 workflow columns are functional, Column navigation works for all 6 columns, Tickets in Deployment Ready status display correctly, Swipe gestures work for all column transitions",
"timestamp": "2026-04-26T06:54:41.815889+00:00",
"author": "sync-board"
},
{
"text": "✅ Completed sub-items: \"Deployment Ready\" column visible on desktop, All 6 workflow columns display correctly, 9 tickets in Deployment Ready visible, Green gradient highlight applied",
"timestamp": "2026-04-26T07:05:25.718290+00:00",
"author": "sync-board"
},
{
"text": "⬜ Pending sub-items: \"Deployment Ready\" column appears in mobile tab bar, Tickets can be moved to/from Deployment Ready on mobile, All 6 workflow columns are functional on mobile, Column navigation works for all 6 columns on mobile, Swipe gestures work for all column transitions, \"Deployment Ready\" column appears in mobile tab bar, Tickets can be moved to/from Deployment Ready on mobile, All 6 workflow columns are functional, Column navigation works for all 6 columns, Tickets in Deployment Ready status display correctly, Swipe gestures work for all column transitions",
"timestamp": "2026-04-26T07:05:25.718295+00:00",
"author": "sync-board"
},
{
"text": "✅ Completed sub-items: \"Deployment Ready\" column visible on desktop, All 6 workflow columns display correctly, 9 tickets in Deployment Ready visible, Green gradient highlight applied",
"timestamp": "2026-04-26T07:05:49.304885+00:00",
"author": "sync-board"
},
{
"text": "⬜ Pending sub-items: \"Deployment Ready\" column appears in mobile tab bar, Tickets can be moved to/from Deployment Ready on mobile, All 6 workflow columns are functional on mobile, Column navigation works for all 6 columns on mobile, Swipe gestures work for all column transitions, \"Deployment Ready\" column appears in mobile tab bar, Tickets can be moved to/from Deployment Ready on mobile, All 6 workflow columns are functional, Column navigation works for all 6 columns, Tickets in Deployment Ready status display correctly, Swipe gestures work for all column transitions",
"timestamp": "2026-04-26T07:05:49.304892+00:00",
"author": "sync-board"
},
{
"text": "✅ Completed sub-items: \"Deployment Ready\" column visible on desktop, All 6 workflow columns display correctly, 9 tickets in Deployment Ready visible, Green gradient highlight applied",
"timestamp": "2026-04-26T07:06:34.916842+00:00",
"author": "sync-board"
},
{
"text": "⬜ Pending sub-items: \"Deployment Ready\" column appears in mobile tab bar, Tickets can be moved to/from Deployment Ready on mobile, All 6 workflow columns are functional on mobile, Column navigation works for all 6 columns on mobile, Swipe gestures work for all column transitions, \"Deployment Ready\" column appears in mobile tab bar, Tickets can be moved to/from Deployment Ready on mobile, All 6 workflow columns are functional, Column navigation works for all 6 columns, Tickets in Deployment Ready status display correctly, Swipe gestures work for all column transitions",
"timestamp": "2026-04-26T07:06:34.916846+00:00",
"author": "sync-board"
},
{
"text": "✅ Completed sub-items: \"Deployment Ready\" column visible on desktop, All 6 workflow columns display correctly, 9 tickets in Deployment Ready visible, Green gradient highlight applied",
"timestamp": "2026-04-26T07:42:01.660435+00:00",
"author": "sync-board"
},
{
"text": "⬜ Pending sub-items: \"Deployment Ready\" column appears in mobile tab bar, Tickets can be moved to/from Deployment Ready on mobile, All 6 workflow columns are functional on mobile, Column navigation works for all 6 columns on mobile, Swipe gestures work for all column transitions, \"Deployment Ready\" column appears in mobile tab bar, Tickets can be moved to/from Deployment Ready on mobile, All 6 workflow columns are functional, Column navigation works for all 6 columns, Tickets in Deployment Ready status display correctly, Swipe gestures work for all column transitions",
"timestamp": "2026-04-26T07:42:01.660440+00:00",
"author": "sync-board"
},
{
"text": "✅ Completed sub-items: \"Deployment Ready\" column visible on desktop, All 6 workflow columns display correctly, 9 tickets in Deployment Ready visible, Green gradient highlight applied",
"timestamp": "2026-04-26T08:00:52.276224+00:00",
"author": "sync-board"
},
{
"text": "⬜ Pending sub-items: \"Deployment Ready\" column appears in mobile tab bar, Tickets can be moved to/from Deployment Ready on mobile, All 6 workflow columns are functional on mobile, Column navigation works for all 6 columns on mobile, Swipe gestures work for all column transitions, \"Deployment Ready\" column appears in mobile tab bar, Tickets can be moved to/from Deployment Ready on mobile, All 6 workflow columns are functional, Column navigation works for all 6 columns, Tickets in Deployment Ready status display correctly, Swipe gestures work for all column transitions",
"timestamp": "2026-04-26T08:00:52.276237+00:00",
"author": "sync-board"
},
{
"text": "✅ Completed sub-items: \"Deployment Ready\" column visible on desktop, All 6 workflow columns display correctly, 9 tickets in Deployment Ready visible, Green gradient highlight applied",
"timestamp": "2026-04-27T02:09:29.744596+00:00",
"author": "sync-board"
},
{
"text": "⬜ Pending sub-items: \"Deployment Ready\" column appears in mobile tab bar, Tickets can be moved to/from Deployment Ready on mobile, All 6 workflow columns are functional on mobile, Column navigation works for all 6 columns on mobile, Swipe gestures work for all column transitions, \"Deployment Ready\" column appears in mobile tab bar, Tickets can be moved to/from Deployment Ready on mobile, All 6 workflow columns are functional, Column navigation works for all 6 columns, Tickets in Deployment Ready status display correctly, Swipe gestures work for all column transitions",
"timestamp": "2026-04-27T02:09:29.744601+00:00",
"author": "sync-board"
},
{
"text": "✅ Completed sub-items: \"Deployment Ready\" column visible on desktop, All 6 workflow columns display correctly, 9 tickets in Deployment Ready visible, Green gradient highlight applied",
"timestamp": "2026-05-02T21:40:52.436873+00:00",
"author": "sync-board"
},
{
"text": "⬜ Pending sub-items: \"Deployment Ready\" column appears in mobile tab bar, Tickets can be moved to/from Deployment Ready on mobile, All 6 workflow columns are functional on mobile, Column navigation works for all 6 columns on mobile, Swipe gestures work for all column transitions, \"Deployment Ready\" column appears in mobile tab bar, Tickets can be moved to/from Deployment Ready on mobile, All 6 workflow columns are functional, Column navigation works for all 6 columns, Tickets in Deployment Ready status display correctly, Swipe gestures work for all column transitions",
"timestamp": "2026-05-02T21:40:52.436877+00:00",
"author": "sync-board"
},
{
"text": "✅ Completed sub-items: \"Deployment Ready\" column visible on desktop, All 6 workflow columns display correctly, 9 tickets in Deployment Ready visible, Green gradient highlight applied",
"timestamp": "2026-05-03T00:14:01.083026+00:00",
"author": "sync-board"
},
{
"text": "⬜ Pending sub-items: \"Deployment Ready\" column appears in mobile tab bar, Tickets can be moved to/from Deployment Ready on mobile, All 6 workflow columns are functional on mobile, Column navigation works for all 6 columns on mobile, Swipe gestures work for all column transitions, \"Deployment Ready\" column appears in mobile tab bar, Tickets can be moved to/from Deployment Ready on mobile, All 6 workflow columns are functional, Column navigation works for all 6 columns, Tickets in Deployment Ready status display correctly, Swipe gestures work for all column transitions",
"timestamp": "2026-05-03T00:14:01.083030+00:00",
"author": "sync-board"
},
{
"text": "✅ Completed sub-items: \"Deployment Ready\" column visible on desktop, All 6 workflow columns display correctly, 9 tickets in Deployment Ready visible, Green gradient highlight applied",
"timestamp": "2026-05-03T00:14:08.824020+00:00",
"author": "sync-board"
},
{
"text": "⬜ Pending sub-items: \"Deployment Ready\" column appears in mobile tab bar, Tickets can be moved to/from Deployment Ready on mobile, All 6 workflow columns are functional on mobile, Column navigation works for all 6 columns on mobile, Swipe gestures work for all column transitions, \"Deployment Ready\" column appears in mobile tab bar, Tickets can be moved to/from Deployment Ready on mobile, All 6 workflow columns are functional, Column navigation works for all 6 columns, Tickets in Deployment Ready status display correctly, Swipe gestures work for all column transitions",
"timestamp": "2026-05-03T00:14:08.824024+00:00",
"author": "sync-board"
},
{
"text": "✅ Completed sub-items: \"Deployment Ready\" column visible on desktop, All 6 workflow columns display correctly, 9 tickets in Deployment Ready visible, Green gradient highlight applied",
"timestamp": "2026-05-03T00:45:08.274951+00:00",
"author": "sync-board"
},
{
"text": "⬜ Pending sub-items: \"Deployment Ready\" column appears in mobile tab bar, Tickets can be moved to/from Deployment Ready on mobile, All 6 workflow columns are functional on mobile, Column navigation works for all 6 columns on mobile, Swipe gestures work for all column transitions, \"Deployment Ready\" column appears in mobile tab bar, Tickets can be moved to/from Deployment Ready on mobile, All 6 workflow columns are functional, Column navigation works for all 6 columns, Tickets in Deployment Ready status display correctly, Swipe gestures work for all column transitions",
"timestamp": "2026-05-03T00:45:08.274956+00:00",
"author": "sync-board"
}
]
},
{
"id": "BUG-MOBILE-015",
"title": "BUG-MOBILE-015: No Offline Queue for Failed Ticket Moves on Mobile",
"desc": "When a ticket move fails due to network issues on mobile, there is no retry mechanism or offline queue. The ticket may appear to move but revert on refresh, or the user receives no feedback about the failure.\n\n---",
"column": "todo",
"assignee": "tech",
"priority": "P1 - Fix Before Deploy",
"labels": [
"bug",
"enhancement"
],
"notes": [
{
"text": "⬜ Pending sub-items: Failed moves are queued for retry, User sees notification when offline, Ticket animates back if move fails, Automatic retry when connection restored, Max 3 retries before giving up, User notified of permanent failures, Queue persists across page refreshes (localStorage), Works on all mobile screen sizes",
"timestamp": "2026-04-26T02:13:10.161480+00:00",
"author": "sync-board"
}
]
},
{
"id": "BUG-MOBILE-016",
"title": "BUG-MOBILE-016: Column Header Cramped on Small Screens",
"desc": "Column headers (title, count, WIP limit) are cramped on small mobile screens (320px-375px), making them hard to read and interact with.\n\n---",
"column": "todo",
"assignee": "tech",
"priority": "P2 - Fix After Critical",
"labels": [
"bug",
"enhancement"
],
"notes": [
{
"text": "⬜ Pending sub-items: Column header readable on 320px screens, Adequate spacing between header elements, Column title doesn't overflow, WIP limit visible or gracefully hidden, Column count clearly visible, No horizontal overflow in header",
"timestamp": "2026-04-26T02:13:10.161882+00:00",
"author": "sync-board"
}
]
},
{
"id": "BUG-MOBILE-017",
"title": "BUG-MOBILE-017: Swipe Gesture Not Discoverable on Mobile",
"desc": "First-time mobile users have no way to discover that they can swipe on tickets to move them between columns. The swipe hint is too subtle and only appears after users start swiping.\n\n---",
"column": "todo",
"assignee": "tech",
"priority": "P1 - Fix Before Deploy",
"labels": [
"bug",
"enhancement"
],
"notes": [
{
"text": "⬜ Pending sub-items: First-time users see swipe gesture tutorial, Tutorial can be dismissed and won't reappear, Help accessible from touch menu, Visual indicators suggest swipeability, Tutorial works on all mobile screen sizes, Doesn't block critical functionality",
"timestamp": "2026-04-26T02:13:10.162554+00:00",
"author": "sync-board"
}
]
},
{
"id": "BUG-MOBILE-018",
"title": "BUG-MOBILE-018: Missing ARIA Labels on Mobile Controls",
"desc": "Several mobile controls lack proper ARIA labels and accessibility attributes, making the board difficult to use with screen readers and assistive technologies.\n\n---",
"column": "todo",
"assignee": "tech",
"priority": "P2 - Fix After Critical",
"labels": [
"bug",
"enhancement"
],
"notes": [
{
"text": "⬜ Pending sub-items: All buttons have aria-label or visible text, Tab bar has proper role=\"tab\" and aria-selected, Touch menu has role=\"menu\" and menuitem roles, Filter toggle has aria-expanded and aria-controls, Modal traps focus properly, Screen reader can navigate all controls, Focus visible styles work on all interactive elements",
"timestamp": "2026-04-26T02:13:10.163117+00:00",
"author": "sync-board"
}
]
},
{
"id": "BUG-MOBILE-TEMPLATE",
"title": "BUG-MOBILE-XXX: [Bug Title]",
"desc": "[Brief description of the bug]",
"column": "todo",
"assignee": "unassigned",
"priority": "[P0/P1/P2/P3]",
"labels": [
"bug",
"enhancement",
"video"
],
"notes": []
},
{
"id": "BUG-TECH-001-missing-html-pages",
"title": "BUG-TECH-001: Missing Core HTML Pages - 404 Errors",
"desc": "Multiple core HTML pages referenced throughout the site do not exist, causing 404 errors and breaking user navigation flows.",
"column": "todo",
"assignee": "unassigned",
"priority": "P0 - Blocks Navigation",
"labels": [
"bug"
],
"notes": [
{
"text": "⬜ Pending sub-items: All navigation links resolve to existing pages, No 404 errors from navigation clicks, Search functionality accessible from all entry points, Cross-page navigation tested manually",
"timestamp": "2026-04-26T02:13:10.163555+00:00",
"author": "sync-board"
}
]
},
{
"id": "BUG-TECH-002-broken-script-tags",
"title": "BUG-TECH-002: Broken Script Tag Syntax in Beach Pages",
"desc": "Malformed HTML script tags in beach detail pages cause JavaScript parsing failures, breaking all interactive functionality (favorites, theme toggle, etc.).",
"column": "todo",
"assignee": "unassigned",
"priority": "P0 - Breaks All JS",
"labels": [
"bug"
],
"notes": [
{
"text": "⬜ Pending sub-items: All beach detail pages load user-data.js successfully, No console errors about script loading, Favorites buttons work on beach detail pages, Theme preferences persist across beach pages",
"timestamp": "2026-04-26T02:13:10.163838+00:00",
"author": "sync-board"
}
]
},
{
"id": "BUG-TECH-003-localstorage-parse-error",
"title": "BUG-TECH-003: localStorage JSON Parse Error Handling Missing",
"desc": "Reading from localStorage without try-catch blocks causes application crashes when data is corrupted or manually edited by users.",
"column": "todo",
"assignee": "unassigned",
"priority": "P0 - Data Corruption Risk",
"labels": [
"bug"
],
"notes": [
{
"text": "⬜ Pending sub-items: Invalid JSON in localStorage doesn't crash app, Corrupted data is gracefully cleared, Console warning provides debugging info, App continues to function with fresh data, Unit tests cover malformed data scenarios",
"timestamp": "2026-04-26T02:13:10.164136+00:00",
"author": "sync-board"
}
]
},
{
"id": "BUG-TECH-004-localstorage-quota-exceeded",
"title": "BUG-TECH-004: localStorage Quota Exceeded Not Handled",
"desc": "`localStorage.setItem()` throws `QuotaExceededError` on mobile devices and in private browsing mode, causing silent failures with no user feedback.",
"column": "todo",
"assignee": "unassigned",
"priority": "P0 - Silent Data Loss",
"labels": [
"bug",
"enhancement"
],
"notes": [
{
"text": "⬜ Pending sub-items: QuotaExceededError is caught and handled, User sees clear error message when save fails, App doesn't crash on storage errors, Works in private browsing mode (graceful fallback), Console logs detailed error for debugging",
"timestamp": "2026-04-26T02:13:10.164448+00:00",
"author": "sync-board"
}
]
},
{
"id": "BUG-TECH-005-undefined-debounce",
"title": "BUG-TECH-005: Debounce Function Undefined in search.js",
"desc": "The search module calls `this.debounce()` which is undefined, causing search to fire on every keystroke and throwing JavaScript errors.",
"column": "todo",
"assignee": "unassigned",
"priority": "P1 - Performance Issue",
"labels": [
"bug",
"enhancement"
],
"notes": [
{
"text": "⬜ Pending sub-items: No console error when typing in search, Search throttled to fire only after 300ms pause, Search remains responsive, Test: Rapid typing doesn't fire multiple searches",
"timestamp": "2026-04-26T02:13:10.164745+00:00",
"author": "sync-board"
}
]
},
{
"id": "BUG-TECH-006-css-variables-missing",
"title": "BUG-TECH-006: Missing CSS Variables in trip-planner.html",
"desc": "trip-planner.html uses CSS variables that are never defined, causing broken styling and visual inconsistencies.",
"column": "todo",
"assignee": "unassigned",
"priority": "P1 - Visual Bug",
"labels": [
"bug",
"enhancement"
],
"notes": [
{
"timestamp": "2026-04-25T18:02:09.188944",
"text": "[AUTO] Moved from inprogress to todo. Reason: Stalled - moved to To Do for pickup. Processed by Roselyn health check cleanup.",
"author": "roselyn"
},
{
"text": "⬜ Pending sub-items: Trip planner page styles render correctly, Visual consistency with index.html, No unstyled elements visible, Test on mobile viewport sizes",
"timestamp": "2026-04-26T02:13:10.165077+00:00",
"author": "sync-board"
}
]
},
{
"id": "BUG-TECH-007-keyboard-navigation-empty-results",
"title": "BUG-TECH-007: Search Results Keyboard Navigation Breaks on Empty Results",
"desc": "Keyboard navigation in search doesn't handle empty results state, causing JavaScript errors and preventing keyboard users from recovering.",
"column": "todo",
"assignee": "unassigned",
"priority": "P1 - Accessibility Issue",
"labels": [
"bug"
],
"notes": [
{
"text": "⬜ Pending sub-items: Arrow keys do nothing when no search results, No JavaScript errors in console, Keyboard navigation works with results present, Escape key closes search dropdown in all states, Tested with screen reader",
"timestamp": "2026-04-26T02:13:10.165405+00:00",
"author": "sync-board"
}
]
},
{
"id": "BUG-TECH-008-toast-container-missing",
"title": "BUG-TECH-008: Toast Notifications Missing DOM Element Check",
"desc": "Toast notification system attempts to append to a container that may not exist, causing JavaScript errors on pages without toast markup.",
"column": "todo",
"assignee": "unassigned",
"priority": "P1 - JavaScript Error",
"labels": [
"bug"
],
"notes": [
{
"text": "⬜ Pending sub-items: No JavaScript errors when toast container missing, Toast system works on all pages (auto-creates container), Existing pages with container continue to work, Console warning when container auto-created (for debugging)",
"timestamp": "2026-04-26T02:13:10.165778+00:00",
"author": "sync-board"
}
]
},
{
"id": "BUG-TECH-009-search-index-path",
"title": "BUG-TECH-009: Search Index File Path May Be Incorrect",
"desc": "Search.js references `/search-index.json` with absolute path which may fail depending on deployment structure. Need to verify path is correct or make it relative.",
"column": "todo",
"assignee": "unassigned",
"priority": "P1 - Functionality Issue",
"labels": [
"bug"
],
"notes": [
{
"text": "⬜ Pending sub-items: Search works when site deployed to subdirectory, Search works from beach detail pages, No 404 errors for search-index.json, Tested on different hosting configurations",
"timestamp": "2026-04-26T02:13:10.166094+00:00",
"author": "sync-board"
}
]
},
{
"id": "BUG-TECH-010-form-validation-feedback",
"title": "BUG-TECH-010: Trip Planner Form Missing Validation Feedback",
"desc": "Trip planner form validation uses browser `alert()` for errors, which is poor UX and blocks the user interface. No inline validation or visual feedback.",
"column": "todo",
"assignee": "unassigned",
"priority": "P2 - UX Issue",
"labels": [
"bug",
"enhancement"
],
"notes": [
{
"text": "⬜ Pending sub-items: No `alert()` calls in form validation, Invalid fields show red border and error message, Error messages are specific (not generic \"fix errors\"), First invalid field receives focus, Success shows toast notification, not console.log, Screen reader announces errors properly, Works on mobile devices",
"timestamp": "2026-04-26T02:13:10.166545+00:00",
"author": "sync-board"
}
]
},
{
"id": "BUG-TECH-011-mobile-search-position",
"title": "BUG-TECH-011: Mobile Viewport Issues - Fixed Position Search",
"desc": "Search results dropdown uses `position: fixed` on mobile which can cause issues with virtual keyboards and screen resizing, potentially trapping users.",
"column": "todo",
"assignee": "unassigned",
"priority": "P2 - Mobile UX",
"labels": [
"bug",
"enhancement"
],
"notes": [
{
"text": "⬜ Pending sub-items: Search results visible when keyboard open, Results scrollable on mobile, No overflow or cutoff issues, Tested on iOS Safari and Chrome Android, Works on tablets (768px-1024px)",
"timestamp": "2026-04-26T02:13:10.166935+00:00",
"author": "sync-board"
}
]
},
{
"id": "BUG-TECH-012-image-error-handling",
"title": "BUG-TECH-012: Missing Image Fallback/Error Handling",
"desc": "No error handling for beach image loading failures. Users see broken image icons when images 404 or fail to load.",
"column": "todo",
"assignee": "unassigned",
"priority": "P2 - Visual Bug",
"labels": [
"bug"
],
"notes": [
{
"timestamp": "2026-04-25T18:02:09.188956",
"text": "[AUTO] Moved from inprogress to todo. Reason: Stalled - moved to To Do for pickup. Processed by Roselyn health check cleanup.",
"author": "roselyn"
},
{
"text": "⬜ Pending sub-items: Broken images show placeholder instead of broken icon, Lazy loading on below-fold images, No layout shift when images load or fail, Placeholder matches beach/nature theme, Works for dynamically loaded images",
"timestamp": "2026-04-26T02:13:10.167336+00:00",
"author": "sync-board"
}
]
},
{
"id": "BUG-TECH-013-console-logging",
"title": "BUG-TECH-013: Console Debug Logging Left in Production",
"desc": "Debug `console.log()` statements remain in production code, causing console clutter and potential information leakage.",
"column": "todo",
"assignee": "unassigned",
"priority": "P3 - Code Quality",
"labels": [
"bug"
],
"notes": [
{
"text": "⬜ Pending sub-items: No `console.log()` in production files, Errors still logged via `console.error()`, Debug mode available for development",
"timestamp": "2026-04-26T02:13:10.167611+00:00",
"author": "sync-board"
}
]
},
{
"id": "BUG-TECH-014-aria-labels",
"title": "BUG-TECH-014: Missing Accessibility Labels on Interactive Elements",
"desc": "Interactive elements lack proper ARIA labels and states, making the site difficult for screen reader users to navigate.",
"column": "todo",
"assignee": "unassigned",
"priority": "P3 - Accessibility",
"labels": [
"bug"
],
"notes": [
{
"text": "⬜ Pending sub-items: All buttons have descriptive aria-labels, Toggle buttons have aria-pressed state, Icons have aria-hidden=\"true\" ( Decorative icons), Screen reader testing passes, axe DevTools reports no critical issues",
"timestamp": "2026-04-26T02:13:10.168019+00:00",
"author": "sync-board"
}
]
},
{
"id": "CONTENT-001-remove-duplicate-beaches",
"title": "CONTENT-001: Remove Duplicate Beach Pages",
"desc": "**Reporter:** Sarah (Content Agent)\n**Date:** 2026-04-21\n**Priority:** 🔴 CRITICAL\n**Status:** Ready for Development",
"column": "deployment",
"assignee": "unassigned",
"priority": "🔴 CRITICAL",
"labels": [
"beach-content"
],
"notes": [
{
"text": "⬜ Pending sub-items: All duplicate beach pages removed, 301 redirects configured for removed URLs, No internal links point to removed pages, Search index updated, Navigation between beaches works without errors",
"timestamp": "2026-04-26T02:13:10.168364+00:00",
"author": "sync-board"
}
]
},
{
"id": "CONTENT-002-fix-html-comments",
"title": "CONTENT-002: Fix Broken HTML Comment Syntax",
"desc": "**Reporter:** Sarah (Content Agent)\n**Date:** 2026-04-21\n**Priority:** 🔴 CRITICAL\n**Status:** Ready for Development",
"column": "deployment",
"assignee": "unassigned",
"priority": "🔴 CRITICAL",
"labels": [
"beach-content"
],
"notes": [
{
"text": "⬜ Pending sub-items: All 115 beach pages have valid HTML comments, No `--003e` or `003e003c` sequences remain, JavaScript user-data.js loads correctly, W3C validator shows no errors for head section",
"timestamp": "2026-04-26T02:13:10.168645+00:00",
"author": "sync-board"
}
]
},
{
"id": "CONTENT-003-rename-fixed-files",
"title": "CONTENT-003: Rename \"-fixed\" Suffixed Beach Files",
"desc": "**Reporter:** Sarah (Content Agent)\n**Date:** 2026-04-21\n**Priority:** 🔴 CRITICAL\n**Status:** Ready for Development",
"column": "deployment",
"assignee": "unassigned",
"priority": "🔴 CRITICAL",
"labels": [
"beach-content"
],
"notes": [
{
"text": "⬜ Pending sub-items: Files renamed without \"-fixed\" suffix, No internal links reference old URLs, 301 redirects configured, Search index updated, Navigation between beaches works",
"timestamp": "2026-04-26T02:13:10.168955+00:00",
"author": "sync-board"
}
]
},
{
"id": "CONTENT-004-add-missing-hero-images",
"title": "CONTENT-004: Add Hero Images for 105 Beaches",
"desc": "**Reporter:** Sarah (Content Agent)\n**Date:** 2026-04-21\n**Priority:** 🔴 CRITICAL\n**Status:** Ready for Development",
"column": "deployment",
"assignee": "unassigned",
"priority": "🔴 CRITICAL",
"labels": [
"beach-content",
"enhancement",
"seo"
],
"notes": [
{
"text": "⬜ Pending sub-items: All 115 beaches have hero images, Images are high quality and representative, File sizes optimized (< 500KB each), Images load correctly on beach pages, Images display properly on mobile and desktop",
"timestamp": "2026-04-26T02:13:10.169291+00:00",
"author": "sync-board"
}
]
},
{
"id": "CONTENT-005-add-unique-beach-content",
"title": "CONTENT-005: Add Unique Content for Each Beach Page",
"desc": "**Reporter:** Sarah (Content Agent)\n**Date:** 2026-04-21\n**Priority:** 🟡 HIGH\n**Status:** Ready for Development",
"column": "deployment",
"assignee": "unassigned",
"priority": "🟡 HIGH",
"labels": [
"beach-content",
"seo"
],
"notes": [
{
"text": "⬜ Pending sub-items: Each beach has unique description, Each beach has specific photo tips, Each beach has specific travel information, Content is original (not copied from other sites), Content is 150-300 words per section, All facts are accurate",
"timestamp": "2026-04-26T02:13:10.169734+00:00",
"author": "sync-board"
}
]
},
{
"id": "CONTENT-006-add-image-alt-text",
"title": "CONTENT-006: Add Image Alt Text for Accessibility",
"desc": "**Reporter:** Sarah (Content Agent)\n**Date:** 2026-04-21\n**Priority:** 🟡 HIGH\n**Status:** Ready for Development",
"column": "deployment",
"assignee": "unassigned",
"priority": "🟡 HIGH",
"labels": [
"beach-content",
"seo"
],
"notes": [
{
"text": "⬜ Pending sub-items: All 115 beaches have alt text on hero images, Alt text is descriptive and unique per beach, Alt text is under 125 characters, Passes WCAG 2.1 AA validation, Works with screen readers",
"timestamp": "2026-04-26T02:13:10.170118+00:00",
"author": "sync-board"
}
]
},
{
"id": "CONTENT-007-standardize-navigation",
"title": "CONTENT-007: Standardize Navigation Across All Pages",
"desc": "**Reporter:** Sarah (Content Agent)\n**Date:** 2026-04-21\n**Priority:** 🟡 HIGH\n**Status:** Ready for Development",
"column": "deployment",
"assignee": "unassigned",
"priority": "🟡 HIGH",
"labels": [
"beach-content",
"blog",
"enhancement"
],
"notes": [
{
"text": "⬜ Pending sub-items: All pages have identical navigation structure, Tools dropdown works on all pages, Active page highlighted in nav, Mobile menu consistent across pages, All nav links work correctly",
"timestamp": "2026-04-26T02:13:10.170502+00:00",
"author": "sync-board"
}
]
},
{
"id": "CONTENT-008-add-schema-markup",
"title": "CONTENT-008: Add Schema.org Structured Data Markup",
"desc": "**Reporter:** Sarah (Content Agent)\n**Date:** 2026-04-21\n**Priority:** 🟡 HIGH\n**Status:** Ready for Development",
"column": "deployment",
"assignee": "unassigned",
"priority": "🟡 HIGH",
"labels": [
"beach-content"
],
"notes": [
{
"text": "⬜ Pending sub-items: All beach pages have TouristAttraction schema, All pages have WebPage schema, BreadcrumbList on all beach pages, Valid JSON-LD syntax, Passes Google's Rich Results Test, Includes required fields: name, description, image, geo coordinates",
"timestamp": "2026-04-26T02:13:10.171069+00:00",
"author": "sync-board"
}
]
},
{
"id": "CONTENT-009-add-social-meta-tags",
"title": "CONTENT-009: Add Open Graph and Twitter Card Meta Tags",
"desc": "**Reporter:** Sarah (Content Agent)\n**Date:** 2026-04-21\n**Priority:** 🟢 MEDIUM\n**Status:** Ready for Development",
"column": "deployment",
"assignee": "unassigned",
"priority": "🟢 MEDIUM",
"labels": [
"beach-content"
],
"notes": [
{
"text": "⬜ Pending sub-items: All 115 beach pages have Open Graph tags, All 115 beach pages have Twitter Card tags, og:image and twitter:image point to valid URLs, Images are 1200x630px or larger, Passes Facebook Sharing Debugger, Passes Twitter Card Validator, Homepage has OG/Twitter tags, Other key pages have OG/Twitter tags",
"timestamp": "2026-04-26T02:13:10.171539+00:00",
"author": "sync-board"
}
]
},
{
"id": "CONTENT-010-replace-generic-feature-text",
"title": "CONTENT-010: Replace Generic Feature Text",
"desc": "**111 of 112 beach pages** contain identical, generic placeholder text in the feature cards section. This provides zero unique value and harms SEO.\n\n### Current Generic Text:\n\n**Photo Opportunities card:**\n```html\n
One of the world's most Instagrammable beaches with stunning photo opportunities.
\n```\n\n**Travel Guide card:**\n```html\n
Located in [Location]. Perfect for beach lovers and adventure seekers.
\n```\n\n**Global Ranking card:**\n```html\n
Ranked #[X] among the world's top 100 most Instagrammable beaches.
\n```\n\n---",
"column": "todo",
"assignee": "content",
"priority": "HIGH",
"labels": [
"beach-content",
"enhancement",
"seo"
],
"notes": [
{
"text": "⬜ Pending sub-items: Each beach has unique Photo Opportunities text (not generic), Each beach has unique Travel Guide text (not generic), Content is factually accurate for each location, Text is 2-4 sentences per section, Tone matches InstaParadise brand (enthusiastic, informative)",
"timestamp": "2026-04-26T02:13:10.171750+00:00",
"author": "sync-board"
}
]
},
{
"id": "CONTENT-011-add-photo-galleries",
"title": "CONTENT-011: Add Photo Galleries to Basic Pages",
"desc": "**87 of 112 beach pages** (77%) are \"basic\" pages lacking photo galleries and enhanced content sections. Only 25 pages have the full gallery experience.\n\n### Basic Page Structure (87 pages):\n- Hero section with emoji, rank, name, location\n- 3 generic feature cards\n- Social share buttons\n- Footer\n\n**Missing sections:**\n- Photo gallery grid\n- Local insider tips\n- Things to do activities\n- Best time to visit\n\n### Enhanced Page Structure (25 pages - example):\n- Hero section\n- 3 feature cards\n- Social share buttons\n- **Photo gallery** with 4 images + captions\n- **Local insider tips** (4 cards)\n- **Things to do** (5 activity cards)\n- **Best time to visit** section\n- Footer\n\n---",
"column": "todo",
"assignee": "content",
"priority": "HIGH",
"labels": [
"beach-content",
"enhancement"
],
"notes": [
{
"text": "⬜ Pending sub-items: 87 basic pages upgraded with gallery sections, Each gallery has 4 unique images with alt text, Each page has 4 local insider tips, Each page has 5 activities in \"Things to Do\", Each page has \"Best Time to Visit\" section, CSS styles consistent with existing enhanced pages, Mobile responsive",
"timestamp": "2026-04-26T02:13:10.172067+00:00",
"author": "sync-board"
}
]
},
{
"id": "CONTENT-012-add-open-graph-meta-tags",
"title": "CONTENT-012: Add Open Graph Meta Tags",
"desc": "**111 of 112 beach pages** are missing essential Open Graph meta tags for social sharing. This results in poor preview cards when shared on Facebook, LinkedIn, Twitter, and other platforms.\n\n### Current State (1 page has partial OG tags)\nOnly `baia-do-sancho-fernando-noronha-brazil.html` appears to have OG implementation.\n\n### Missing Tags (111 pages):\n- `og:title` - Page title for social previews\n- `og:description` - Description for social previews\n- `og:image` - Preview image URL\n- `og:url` - Canonical page URL\n- `og:type` - Content type (website)\n- `og:site_name` - Site name (InstaParadise)\n- `twitter:card` - Twitter card type\n- `twitter:title` - Twitter-specific title\n- `twitter:description` - Twitter-specific description\n- `twitter:image` - Twitter card image\n\n---",
"column": "todo",
"assignee": "content",
"priority": "MEDIUM",
"labels": [
"beach-content"
],
"notes": [
{
"text": "⬜ Pending sub-items: All 112 beach pages have complete OG meta tags, og:title includes beach name and rank, og:description is unique per beach (150-160 chars), og:image points to valid image URL, og:url is correct canonical URL, Twitter card tags present, Tags validate with Facebook Sharing Debugger, Tags validate with Twitter Card Validator",
"timestamp": "2026-04-26T02:13:10.172354+00:00",
"author": "sync-board"
}
]
},
{
"id": "ENH-MOBILE-001",
"title": "ENH-MOBILE-001: Add Haptic Feedback for Mobile Interactions",
"desc": "Add haptic feedback (vibration) for key mobile interactions to provide tactile confirmation of user actions. This enhances the mobile experience by making interactions feel more responsive and polished.",
"column": "todo",
"assignee": "unassigned",
"priority": "P2 - Nice to Have",
"labels": [
"enhancement"
],
"notes": [
{
"timestamp": "2026-04-25T17:45:00Z",
"agent": "geoffrey",
"text": "PARKING LOT TRIAGE: Staying in Parking Lot. Reason: Enhancement ticket, no assignee, no sprint assigned, low priority. Ready criteria: 1) Mobile upgrade (MOBILE-MASTER-001) complete and stable, 2) User feedback validates demand, 3) Assignee identified, 4) Sprint scheduled."
},
{
"timestamp": "2026-04-25T18:02:19.867740",
"text": "[AUTO] Assigned from None to sarah. Mobile enhancement tasks assigned to mobile specialist.",
"author": "roselyn"
},
{
"text": "⬜ Pending sub-items: Haptic feedback on long-press, Haptic feedback on swipe completion, Haptic feedback on button taps, Respects system \"vibration off\" setting, Graceful degradation on unsupported devices, No impact on performance",
"timestamp": "2026-04-26T02:13:10.172582+00:00",
"author": "sync-board"
}
]
},
{
"id": "ENH-MOBILE-002",
"title": "ENH-MOBILE-002: Pull-to-Refresh Gesture Support",
"desc": "Add pull-to-refresh gesture support for mobile devices. This is a standard mobile pattern that allows users to refresh the board by pulling down on the content area.",
"column": "todo",
"assignee": "unassigned",
"priority": "P2 - Nice to Have",
"labels": [
"enhancement"
],
"notes": [
{
"timestamp": "2026-04-25T17:45:00Z",
"agent": "geoffrey",
"text": "PARKING LOT TRIAGE: Staying in Parking Lot. Reason: Enhancement ticket, no assignee, no sprint assigned, low priority. Ready criteria: 1) Mobile upgrade (MOBILE-MASTER-001) complete and stable, 2) User feedback validates demand, 3) Assignee identified, 4) Sprint scheduled."
},
{
"timestamp": "2026-04-25T18:02:19.867768",
"text": "[AUTO] Assigned from None to sarah. Mobile enhancement tasks assigned to mobile specialist.",
"author": "roselyn"
},
{
"text": "⬜ Pending sub-items: Pull down gesture triggers refresh, Visual indicator shows during pull, Threshold of 100px before refresh triggers, Works on all mobile columns, Doesn't interfere with card swipes, Shows success/error feedback, Respects reduced motion preference",
"timestamp": "2026-04-26T02:13:10.172988+00:00",
"author": "sync-board"
}
]
},
{
"id": "ENH-MOBILE-004",
"title": "ENH-MOBILE-004: Add Tutorial/Onboarding for Mobile Gestures",
"desc": "Add an interactive tutorial or onboarding experience for first-time mobile users to help them discover swipe gestures, long-press actions, and other mobile-specific features. This addresses the discoverability issues identified in BUG-MOBILE-017.\n\n---",
"column": "todo",
"assignee": "unassigned",
"priority": "P2 - Nice to Have",
"labels": [
"enhancement"
],
"notes": [
{
"text": "⬜ Pending sub-items: Tutorial shows automatically on first visit, Can be skipped at any point, Can be replayed from help menu, Highlights key UI elements with animations, Works on all mobile screen sizes, Doesn't block critical functionality, Respects prefers-reduced-motion, Localized text (i18n ready)",
"timestamp": "2026-04-26T02:13:10.173505+00:00",
"author": "sync-board"
}
]
},
{
"id": "ENH-MOBILE-005",
"title": "ENH-MOBILE-005: Optimize for Foldable Devices",
"desc": "Add support for foldable devices (Samsung Galaxy Fold, Google Pixel Fold, etc.) by detecting screen folding state and adapting the layout accordingly. When unfolded, show more columns; when folded, use mobile layout.\n\n---",
"column": "todo",
"assignee": "unassigned",
"priority": "P3 - Future Consideration",
"labels": [
"enhancement"
],
"notes": [
{
"text": "⬜ Pending sub-items: Detect foldable device and folding state, Adapt layout when device is folded/unfolded, Show multiple columns when unfolded, Maintain mobile layout when folded, Smooth transition between states, No layout jank or flashing, Tested on Samsung Galaxy Fold, Tested on Google Pixel Fold",
"timestamp": "2026-04-26T02:13:10.173877+00:00",
"author": "sync-board"
}
]
},
{
"id": "ENH-MOBILE-TEMPLATE",
"title": "ENH-MOBILE-XXX: [Enhancement Title]",
"desc": "[Brief description of the enhancement]",
"column": "todo",
"assignee": "unassigned",
"priority": "[P0/P1/P2/P3]",
"labels": [
"enhancement"
],
"notes": [
{
"text": "⬜ Pending sub-items: Criterion 1, Criterion 2, Criterion 3",
"timestamp": "2026-04-26T02:13:10.174049+00:00",
"author": "sync-board"
}
]
},
{
"id": "INFRA-001-configure-kv-storage",
"title": "INFRA-001: Configure Cloudflare KV Storage for Board Data Persistence",
"desc": "Configure Cloudflare KV storage to enable persistent board data storage and make the `/api/board-health` endpoint fully functional.\n\n---",
"column": "todo",
"assignee": "geoffrey",
"priority": "HIGH",
"labels": [
"tech"
],
"notes": [
{
"text": "⬜ Pending sub-items: KV namespace created with binding name `BOARD_DATA`, `wrangler.toml` updated with correct namespace ID, Initial board data uploaded to KV, `/api/board` returns data from KV (not empty), `/api/board-health` returns `\"status\": \"healthy\"`, Changes committed and deployed, Health check script confirms KV is working",
"timestamp": "2026-04-26T02:13:10.174521+00:00",
"author": "sync-board"
}
]
},
{
"id": "INFRA-002-automated-board-sync",
"title": "INFRA-002: Implement Automated Board Sync System",
"desc": "The board system has experienced a critical sync failure where 100+ tickets were out of sync between ticket markdown files and board.json. This occurred because the system has dual sources of truth with no automated reconciliation.\n\n**Root Cause:** Agents update ticket files but forget to update board.json, causing drift.\n\n---",
"column": "todo",
"assignee": "geoffrey",
"priority": "CRITICAL",
"labels": [
"tech"
],
"notes": [
{
"timestamp": "2026-04-25T19:08:03.857864",
"text": "[AUTO] Assigned to Geoffrey per Jason directive. Critical infrastructure: automated board sync system. 4-phase implementation.",
"author": "roselyn"
},
{
"text": "⬜ Pending sub-items: Script parses all 244 ticket files, Correctly maps status strings to column IDs, Updates board.json, Updates index.html, Runs without errors, Git add board.json index.html, Hook runs on every commit, Auto-syncs board.json and index.html, Adds files to commit automatically, No manual intervention required, Workflow triggers on ticket changes, Validates board is in sync, Auto-commits if drift detected, Fails PR if board is out of sync, Detects column mismatches, Detects assignee mismatches, Reports drift in health check, Can auto-fix with flag, `sync_board.py` runs without errors, Pre-commit hook auto-syncs on every commit, CI/CD validates sync on PR/push, Health check detects drift automatically, No manual board.json edits required, Ticket files are single source of truth, Zero sync failures for 30 days",
"timestamp": "2026-04-26T02:13:10.175478+00:00",
"author": "sync-board"
}
]
},
{
"id": "INFRA-003-cloudflare-security-hardening",
"title": "INFRA-003: Cloudflare Security Hardening",
"desc": "Hardened Cloudflare zone security settings for `instaparadise.com` and all subdomains following Jason's approval.\n\n---",
"column": "completed",
"assignee": "geoffrey",
"priority": "HIGH",
"labels": [
"enhancement",
"tech"
],
"notes": []
},
{
"id": "MOBILE-ARCH-001",
"title": "MOBILE-ARCH-001: Mobile Complex Architecture",
"desc": "**Status:** 🟡 WAITING\n**Priority:** P0 - Critical\n**Assignee:** LeoWolfbot (Complex Architecture Agent)\n**Created:** 2026-04-25\n**Due:** 2026-04-27\n**Sprint:** Sprint-1\n**Labels:** mobile, architecture, performance, optimization",
"column": "todo",
"assignee": "unassigned",
"priority": "P0 - Critical",
"labels": [
"enhancement"
],
"notes": [
{
"timestamp": "2026-04-25T13:59:58.555483Z",
"agent": "roselyn",
"text": "ASSIGNED TO LEOWOLFBOT: Complex architecture only. BLOCKED by MOBILE-DEV-001 (Lyle). Build on Lyle's JS foundation. NO visual styling - use Sarah's CSS. Target: <3s LCP on 3G."
},
{
"text": "⬜ Pending sub-items: All 6 files created, Lazy loading implemented, State management functional, Animations optimized for 60fps, Memory leak prevention active, Performance budget met, Handed off to Geoffrey (MOBILE-QA-001)",
"timestamp": "2026-04-26T02:13:10.177426+00:00",
"author": "sync-board"
}
]
},
{
"id": "MOBILE-AUDIT-001",
"title": "MOBILE-AUDIT-001: Comprehensive Mobile Audit - InstaParadise Tickets Board",
"desc": "**Type:** Audit / QA\n**Priority:** P0 - Critical\n**Status:** In Progress → QA\n**Created:** 2026-04-25\n**Audit Lead:** Geoffrey (Mobile Recovery Lead)\n**Scope:** Complete mobile functionality audit of tickets.instaparadise.com",
"column": "inprogress",
"assignee": "unassigned",
"priority": "P0 - Critical",
"labels": [
"enhancement"
],
"notes": []
},
{
"id": "MOBILE-DEV-001",
"title": "MOBILE-DEV-001: Mobile Technical Implementation",
"desc": "**Status:** ✅ COMPLETED\n**Priority:** P0 - Critical\n**Assignee:** Lyle (Technical Implementation Agent)\n**Created:** 2026-04-25\n**Completed:** 2026-04-25\n**Sprint:** Sprint-1\n**Labels:** mobile, javascript, css-structure, implementation\n**Commit:** `e3563d9`",
"column": "completed",
"assignee": "tech",
"priority": "P0 - Critical",
"labels": [
"enhancement"
],
"notes": [
{
"timestamp": "2026-04-25T14:00:00Z",
"agent": "lyle",
"text": "Mobile navigation component implemented with bottom tab bar, dots indicator, swipe gestures"
},
{
"timestamp": "2026-04-25T14:01:00Z",
"agent": "lyle",
"text": "Responsive layout engine complete: mobile (<640px single col), tablet (640-1024px 2-col), desktop (>1024px full kanban)"
},
{
"timestamp": "2026-04-25T14:02:00Z",
"agent": "lyle",
"text": "Performance optimizations: GPU acceleration, content-visibility, will-change hints, containment"
},
{
"timestamp": "2026-04-25T14:03:00Z",
"agent": "lyle",
"text": "Touch interaction system: tap (detail), long-press (menu), swipe (move column). 44px+ touch targets"
},
{
"timestamp": "2026-04-25T14:04:00Z",
"agent": "lyle",
"text": "Mobile form experience: 16px inputs (no zoom), full-screen modals, sticky actions, safe areas"
},
{
"timestamp": "2026-04-25T14:05:00Z",
"agent": "lyle",
"text": "Offline support: action queue, localStorage persistence, auto-sync, retry with backoff"
},
{
"timestamp": "2026-04-25T14:06:00Z",
"agent": "lyle",
"text": "All tests passing. Commit: e3563d9. Files: mobile-architecture.css (480+ lines), mobile-architecture.js (800+ lines)"
}
]
},
{
"id": "MOBILE-ENH-001-swipe-between-columns",
"title": "MOBILE-ENH-001: Add Swipe Between Columns Navigation",
"desc": "Enable users to swipe left/right on the board area to navigate between columns, providing a faster alternative to tapping bottom navigation tabs.",
"column": "todo",
"assignee": "unassigned",
"priority": "medium",
"labels": [
"enhancement"
],
"notes": [
{
"text": "⬜ Pending sub-items: Swipe left navigates to next column, Swipe right navigates to previous column, Visual preview of target column during swipe, Boundary bounce effect at first/last columns, Doesn't interfere with card swipes, First-time user sees swipe hint, Works on iOS Safari and Chrome Android, Smooth 60fps animation",
"timestamp": "2026-04-26T02:13:10.180481+00:00",
"author": "sync-board"
}
]
},
{
"id": "MOBILE-ENH-002-pull-to-refresh",
"title": "MOBILE-ENH-002: Add Pull-to-Refresh Gesture",
"desc": "Implement native-feeling pull-to-refresh gesture for mobile users to reload board data without tapping the refresh button.",
"column": "todo",
"assignee": "unassigned",
"priority": "medium",
"labels": [
"enhancement"
],
"notes": [
{
"text": "⬜ Pending sub-items: Pulling down shows refresh indicator, Indicator rotates based on pull distance, Text changes to \"Release to refresh\" at threshold, Releasing triggers board refresh, Success/error states shown appropriately, Only triggers when at top of scroll, Smooth 60fps animation, Works on iOS Safari and Chrome Android",
"timestamp": "2026-04-26T02:13:10.181681+00:00",
"author": "sync-board"
}
]
},
{
"id": "MOBILE-INTERACT-001",
"title": "MOBILE-INTERACT-001: Mobile Touch Interactions System",
"desc": "Build a bulletproof mobile touch interaction system for the tickets board. This system must handle all touch gestures reliably across Android Chrome and iOS Safari, with proper visual feedback and haptic support.",
"column": "completed",
"assignee": "unassigned",
"priority": "Critical",
"labels": [
"enhancement"
],
"notes": [
"Commit: fcfbcd1 - All gestures working with visual/haptic feedback",
{
"text": "✅ Completed sub-items: Swipe left: Move to next column, Swipe right: Move to previous column, Visual feedback during swipe, Haptic feedback (if supported), Confirm before move (optional), Long-press (500ms): Open action menu, Menu options: View | Edit | Move | Delete, Tap outside to close, Large touch targets (48px), Bottom tab bar: 6 tabs, Active tab highlighted, Swipe between columns, Dots indicator, Column names visible, Floating Action Button (FAB) for new ticket, Always visible, Large touch target (56px), Smooth animation, Standard pull gesture, Visual indicator, Refresh board data, Android Chrome, iOS Safari, Fast swipes, Slow swipes, Multi-touch prevention, Scroll vs swipe distinction, mobile-interactions.js (complete system), mobile-interactions.css (complete styles), gesture-test.html (test page), MOBILE-INTERACTIONS-DOC.md (documentation), Commit hash: f168e11",
"timestamp": "2026-04-26T02:13:10.181975+00:00",
"author": "sync-board"
}
]
},
{
"id": "MOBILE-MASTER-001",
"title": "MOBILE-MASTER-001: Mobile UI/UX Upgrade - Coordination & Integration",
"desc": "**Status:** 🟡 IN PROGRESS\n**Priority:** P0 - Critical\n**Assignee:** Roselyn (Execution Lead)\n**Created:** 2026-04-25\n**Due:** 2026-04-27\n**Sprint:** Sprint-1",
"column": "inprogress",
"assignee": "joselyn",
"priority": "P0 - Critical",
"labels": [
"enhancement"
],
"notes": [
{
"timestamp": "2026-04-25T13:59:58.555483Z",
"agent": "roselyn",
"text": "MASTER COORDINATION TICKET: Pipeline established. MOBILE-UI-001 (Sarah) → MOBILE-DEV-001 (Lyle) → MOBILE-ARCH-001 (LeoWolfbot) → MOBILE-QA-001 (Geoffrey) → Integration & Deployment. All agents assigned with clear boundaries."
},
{
"text": "⬜ Pending sub-items: Mobile breakpoint definitions (320px, 375px, 414px, 768px), Typography scale for mobile, Touch target sizing (min 44px), Color contrast verification, Hamburger menu design, Search dropdown mobile design, Card layout mobile adaptations, CSS architecture setup, Mobile-first responsive framework, Hamburger menu JS functionality, Search positioning fixes, Touch event handling, Form input handling for mobile keyboards, Performance optimization, Lazy loading implementation, State management for mobile interactions, Animation performance tuning, Memory leak prevention, Device testing matrix, Browser compatibility, Touch interaction testing, Keyboard handling verification, Performance benchmarking, Merge all changes, Resolve conflicts, Final verification, Deployment, Post-deployment monitoring, All mobile tickets complete, Zero duplicate work, No blocking issues, All tests passing, Deployed to production, Performance budget met (< 3s LCP on 3G)",
"timestamp": "2026-04-26T02:13:10.182660+00:00",
"author": "sync-board"
}
]
},
{
"id": "MOBILE-QA-001",
"title": "MOBILE-QA-001: Mobile Testing & Bug Documentation",
"desc": "**Status:** 🟢 QA COMPLETE - AWAITING FIXES\n**Priority:** P0 - Critical\n**Assignee:** Geoffrey (QA Agent)\n**Created:** 2026-04-25\n**Due:** 2026-04-27\n**Sprint:** Sprint-1\n**Labels:** mobile, qa, testing, verification",
"column": "completed",
"assignee": "geoffrey",
"priority": "P0 - Critical",
"labels": [
"enhancement"
],
"notes": [
{
"timestamp": "2026-04-25T13:59:58.555483Z",
"agent": "roselyn",
"text": "ASSIGNED TO GEOFFREY: Testing and documentation only. BLOCKED by MOBILE-ARCH-001 and MOBILE-DEV-001. Document bugs, create tickets, but NO code fixes - assign bugs to appropriate agents."
},
{
"timestamp": "2026-04-25T21:45:48.206048Z",
"agent": "roselyn",
"text": "QA TESTING COMPLETE: 16/22 tests passed. 1 CRITICAL bug, 3 HIGH bugs, 2 MEDIUM bugs found. See MOBILE-QA-REPORT.md for details. Bug tickets created: BUG-MOBILE-001 through BUG-MOBILE-006. Enhancement tickets: ENH-MOBILE-001, ENH-MOBILE-002."
},
{
"timestamp": "2026-04-25T17:48:00Z",
"agent": "roselyn",
"text": "DEPLOYED: QA testing ticket completed. Testing finished, bugs documented. 6 bug tickets created (BUG-MOBILE-001 to BUG-MOBILE-006). Mobile features NOT ready for production - CRITICAL and HIGH bugs must be fixed first."
},
{
"text": "⬜ Pending sub-items: Create new ticket on mobile, Move ticket: Parking Lot → To Do → In Progress → QA → Completed, Edit ticket details on mobile, Add notes/comments on mobile, Change assignee on mobile, Update priority on mobile, QA approval process on mobile, All buttons touchable (min 44px targets), Drag/drop functionality on mobile, Modal interactions, Form inputs (keyboard handling), Dropdown menus, Filter controls, Board refresh, iPhone SE (375px width), iPhone 14 Pro (393px width), iPhone 14 Pro Max (430px width), Android devices (various sizes), Tablet (iPad 820px), Safari iOS, Chrome iOS, Chrome Android, Samsung Internet, Load time on mobile, Scroll performance, Animation smoothness, Memory usage",
"timestamp": "2026-04-26T02:13:10.183318+00:00",
"author": "sync-board"
}
]
},
{
"id": "MOBILE-RECOVERY-001",
"title": "MOBILE-RECOVERY-001: Master Mobile Recovery Coordination",
"desc": "**Status:** 🟢 IN PROGRESS\n**Priority:** P0 - CRITICAL\n**Assignee:** Roselyn (Mobile Recovery Coordinator)\n**Created:** 2026-04-25\n**Due:** 2026-04-27\n**Sprint:** Sprint-1\n**Labels:** mobile, coordination, master-ticket, recovery\n**Column:** In Progress",
"column": "inprogress",
"assignee": "joselyn",
"priority": "P0 - CRITICAL",
"labels": [
"enhancement"
],
"notes": [
{
"date": "2026-04-25T22:06:00Z",
"author": "roselyn",
"text": "Master coordination ticket created. Team status: Sarah ✅, Lyle ✅, LeoWolfbot 🟡, Geoffrey ✅"
},
{
"timestamp": "2026-04-25T18:02:09.188970",
"text": "[AUTO] Moved from inprogress to completed. Reason: Mobile recovery complete - coordination done. Processed by Roselyn health check cleanup.",
"author": "roselyn"
},
{
"text": "⬜ Pending sub-items: MOBILE-ARCH-001 moved to \"In Progress\", Performance optimization engine implemented, State management system functional, Animation performance controller active, Memory leak prevention implemented, Handoff to Lyle for bug fixes, BUG-MOBILE-001 (FAB button) - CRITICAL, BUG-MOBILE-002 (Swipe feedback) - HIGH, BUG-MOBILE-003 (Move buttons) - HIGH, BUG-MOBILE-004 (Touch targets) - HIGH, BUG-MOBILE-005 (Samsung conflict) - MEDIUM, BUG-MOBILE-006 (Menu positioning) - MEDIUM, All bugs moved to \"QA\" column, Merge all changes into staging, Verify no conflicts between components, Run integration tests, Performance benchmark check, Move to \"QA\" for final verification, Final QA sign-off, Deploy to production, Post-deployment monitoring, Mark MOBILE-RECOVERY-001 complete, MOBILE-ARCH-001 complete, All BUG-MOBILE tickets resolved, QA re-test passes (100%), Performance budget met, Deployed to production, No regression on desktop",
"timestamp": "2026-04-26T02:13:10.184567+00:00",
"author": "sync-board"
}
]
},
{
"id": "MOBILE-TOUCH-001-mobile-touch-interactions",
"title": "MOBILE-TOUCH-001: Mobile Touch Interactions & Complex UX",
"desc": "id: MOBILE-TOUCH-001\ntitle: Mobile Touch Interactions & Complex UX\ncolumn: completed\nassignee: leowolf\npriority: high\nlabels: [\"mobile\", \"ux\", \"touch\", \"frontend\"]\ncreated: 2026-04-25\nupdated: 2026-04-25\n---",
"column": "todo",
"assignee": "unassigned",
"priority": "medium",
"labels": [
"enhancement"
],
"notes": [
{
"text": "✅ Completed sub-items: Bottom tab navigation works on mobile (<640px), Swipe left moves ticket to next column, Swipe right moves ticket to previous column, Long-press opens context menu, Touch menu allows manual column selection, Visual feedback during all interactions, Modals are mobile-optimized, Forms have touch-friendly inputs, Accessibility: keyboard navigation works, Accessibility: screen reader support, Reduced motion support",
"timestamp": "2026-04-26T02:13:10.185252+00:00",
"author": "sync-board"
}
]
},
{
"id": "MOBILE-UI-001",
"title": "MOBILE-UI-001: Mobile Visual Design & CSS",
"desc": "**Status:** ✅ COMPLETED\n**Priority:** P0 - Critical\n**Assignee:** Sarah (Visual Design Lead)\n**Created:** 2026-04-25\n**Completed:** 2026-04-25\n**Sprint:** Sprint-1\n**Labels:** mobile, design, css, ui/ux\n**Column:** Completed",
"column": "completed",
"assignee": "content",
"priority": "P0 - Critical",
"labels": [
"enhancement"
],
"notes": [
{
"timestamp": "2026-04-25T13:59:58.555483Z",
"agent": "roselyn",
"text": "ASSIGNED TO SARAH: Visual design and CSS only. Create designs/mobile/ directory with all CSS specs. NO JavaScript - that's Lyle's work in MOBILE-DEV-001. Due 2026-04-26 to unblock Lyle."
}
]
},
{
"id": "T-001-sarah-video-100",
"title": "T-001: Video Embeds for All 100 Beach Pages",
"desc": "Add video embeds to all 100 beach detail pages. Source relevant drone footage, beach tour, or travel vlog for each beach. Embed in a 'Watch' section on each beach detail page.\n\n---",
"column": "todo",
"assignee": "content",
"priority": "HIGH",
"labels": [
"video"
],
"notes": [
{
"timestamp": "2026-04-25T18:28:31.611390",
"text": "[AUTO] Moved to Parking Lot per Jason decision: Video embeds post-launch only.",
"author": "roselyn"
},
{
"text": "⬜ Pending sub-items: At least 1 video per beach page, Videos are relevant to the specific beach, Embeds are responsive, No broken video links, Pages still load performantly",
"timestamp": "2026-04-26T02:13:10.186417+00:00",
"author": "sync-board"
}
],
"estimate": "20h",
"dependency": "T-022 (complete beaches 1-20 first)"
},
{
"id": "T-021-sarah-content",
"title": "T-021: Fresh Photos for Top 10 Beaches",
"desc": "Replace generic or low-quality images on beach detail pages for Top 10 beaches. Priority: beach 1-20. Use drone photography, stock from Getty/iStock, or hire local photographers on Fiverr.\n\n---",
"column": "completed",
"assignee": "content",
"priority": "CRITICAL",
"labels": [],
"notes": [
{
"text": "✅ Completed sub-items: All 10 beaches have new hero images, Images are stored in correct directory, Image dimensions are appropriate (min 1920x1080), Images are beach-accurate (verified location)",
"timestamp": "2026-04-26T02:13:10.186728+00:00",
"author": "sync-board"
},
{
"text": "⬜ Pending sub-items: Images load correctly on beach pages",
"timestamp": "2026-04-26T02:13:10.186733+00:00",
"author": "sync-board"
}
],
"estimate": "10h"
},
{
"id": "T-022-sarah-video",
"title": "T-022: Add Video to Beach Detail Pages",
"desc": "Find and embed YouTube/Vimeo drone or travel videos for each beach page. Priority: beaches 1-20. Each page needs 1 embedded video.\n\n---",
"column": "parking",
"assignee": "content",
"priority": "CRITICAL",
"labels": [
"video"
],
"notes": [
{
"timestamp": "2026-04-25T18:28:31.611394",
"text": "[AUTO] Moved to Parking Lot per Jason decision: Video embeds post-launch only.",
"author": "roselyn"
},
{
"text": "⬜ Pending sub-items: All 20 beaches have video embeds, Videos are responsive, Videos load correctly, Videos are beach-specific (not random footage), Lazy loading implemented",
"timestamp": "2026-04-26T02:13:10.187039+00:00",
"author": "sync-board"
}
],
"estimate": "8h"
},
{
"id": "T-023-content-enhance",
"title": "T-023: Enhance Beach Pages 1-20 with Galleries, Tips, H2s",
"desc": "For each of the top 20 beaches: add Photo Gallery section, Where to Eat & Play, Where to Stay, Best Time to Visit, insider tips. Each page 800+ words.\n\n---",
"column": "parking",
"assignee": "content",
"priority": "HIGH",
"labels": [
"seo",
"video"
],
"notes": [
{
"text": "⬜ Pending sub-items: Grid of 4-6 images showing different angles/aspects, Lightbox or modal view for full-size images, Captions for each image, 2-3 restaurant recommendations near beach, Local activities and attractions, Water sports available, Nightlife (if applicable), 2-3 accommodation recommendations, Range: budget, mid-range, luxury, Brief description of each, Peak season vs off-season, Weather by month, Crowd levels by season, Special events/festivals, Local secrets, Photography tips, Safety considerations, Getting there (transportation), All 20 beaches have enhanced content, Each page has 800+ words, All 5 sections present, Content is accurate and well-researched, No spelling/grammar errors, Images properly attributed",
"timestamp": "2026-04-26T02:13:10.187389+00:00",
"author": "sync-board"
}
],
"estimate": "15h"
},
{
"id": "T-034-lyle-seo",
"title": "T-034: Complete SEO Audit and Fix on All 100 Beach Pages",
"desc": "Run automated SEO audit: title tags (<60 chars), meta descriptions (<155 chars), H1/H2, image alt text, canonical URLs, internal links. Fix all 100 pages.\n\n---",
"column": "completed",
"assignee": "tech",
"priority": "HIGH",
"labels": [
"seo"
],
"notes": [
{
"text": "✅ Completed sub-items: Title tag: < 60 characters, includes beach name + location, Meta description: < 155 characters, compelling, Canonical URL present, Open Graph tags (og:title, og:description, og:image, og:url, og:type), Twitter Card tags, All 100 pages have proper title tags, All 100 pages have meta descriptions",
"timestamp": "2026-04-26T02:13:10.187632+00:00",
"author": "sync-board"
},
{
"text": "⬜ Pending sub-items: One H1 tag per page (beach name), H2 sections for major content areas, Proper heading hierarchy (H1 → H2 → H3), All images have alt text, Alt text is descriptive and includes beach name, Images have width/height attributes (for CLS), Internal links to related beaches, Links have descriptive anchor text, No broken links, Page has proper lang attribute, Meta viewport tag present, Robots meta tag appropriate, All images have alt text, No heading hierarchy issues, Sitemap.xml updated, Lighthouse SEO score > 90 for sample pages",
"timestamp": "2026-04-26T02:13:10.187637+00:00",
"author": "sync-board"
}
],
"estimate": "10h"
},
{
"id": "T-060-STATUS-UPDATE-2026-04-21",
"title": "T-060 Status Update - Search + Filter Page",
"desc": "**Date:** 2026-04-21 04:09 PDT\n**Investigator:** Subagent (check-t060-lyle)\n**Report To:** Joselyn (Agile PM)",
"column": "todo",
"assignee": "unassigned",
"priority": "medium",
"labels": [
"enhancement"
],
"notes": []
},
{
"id": "T-082-resend-email-api",
"title": "T-082: Configure Resend Email API for Newsletter System",
"desc": "Set up Resend email service integration for InstaParadise newsletter system. Includes API key generation, Cloudflare Worker secrets configuration, KV binding verification, and deployment of email worker code.",
"column": "todo",
"assignee": "geoffrey",
"priority": "HIGH",
"labels": [],
"notes": [
{
"text": "⬜ Pending sub-items: Verify Resend account credentials (Geoffreymarcellbot@gmail.com / Butlerlife@1), Generate API key from resend.com dashboard, Document API key location, Add RESEND_API_KEY secret to Worker, Add CRON_SECRET (generate random 32-char string), Verify INSTAPARADISE_KV binding is active, KV Namespace ID: 3e89a4d8637e4fa4b48b6ef6c0b580a0, Deploy email-worker.js to Cloudflare Workers, File location: /home/geoffreybot/workspace/lead-developer/instaparadise/email-worker.js, Test endpoints, Test POST /api/subscribe returns JSON success, Test email received at subscriber address, Test GET /api/confirm/{token} confirms subscription, Test POST /api/unsubscribe removes subscriber, Newsletter signup works on homepage, Confirmation emails sent via Resend, Double opt-in flow functional, Unsubscribe works, GDPR compliant (consent tracking)",
"timestamp": "2026-04-26T02:13:10.188432+00:00",
"author": "sync-board"
}
],
"estimate": "30m"
},
{
"id": "T-096-backend-api-production-ready",
"title": "T-096: Backend API Production-Ready",
"desc": "Ensure the KV-backed API endpoints return proper JSON (not HTML), handle errors gracefully, persist across sessions, and provide clear status indicators.",
"column": "inprogress",
"assignee": "geoffrey",
"priority": "Critical",
"labels": [],
"notes": [
{
"text": "✅ Completed sub-items: All endpoints return `Content-Type: application/json` headers, Proper CORS headers on all responses (`Access-Control-Allow-Origin: *`), Error responses are JSON formatted (not HTML error pages), Helper functions `successResponse()` and `errorResponse()` for consistency, Enhanced `board-get.js` with try-catch around all KV operations, Added JSON parse validation with 500 error on invalid data, Rewrote `board-update.js` with comprehensive error handling, Added 400/404/500 status codes with JSON error bodies, KV unconfigured state returns empty board + warning (not crash), Client-side error handling with localStorage fallback already exists, KV configuration documented in wrangler.jsonc, Endpoints gracefully handle KV unconfigured state, Added `.api-status-indicator` element to header, Shows \"KV API\" when online, \"localStorage\" when offline, Color-coded: green for online, yellow for offline, Enhanced `updateSyncStatus()` to show pending sync count in tooltip, Tooltip shows mode + pending updates count, Created comprehensive `API.md` documentation, Documented all endpoints with examples, Included error codes and response structures, Added client-side fallback documentation, Documented KV configuration requirements, /api/board-get returns valid JSON (with error fallback), /api/board-update accepts POST with ticket changes, /api/board-update accepts PUT with same behavior, /api/board-update accepts DELETE with query param, Changes persist across browser sessions (when KV configured), Fallback to localStorage if API fails, API status visible in UI header",
"timestamp": "2026-04-26T02:13:10.188865+00:00",
"author": "sync-board"
},
{
"text": "⬜ Pending sub-items: **PENDING:** Requires production deployment with real KV namespace ID",
"timestamp": "2026-04-26T02:13:10.188870+00:00",
"author": "sync-board"
}
]
},
{
"id": "T-100-video-scripts-50-beaches",
"title": "T-100: Create 50 Beach Destination Video Scripts",
"desc": "Write professional video scripts for the top 50 beaches. Each script includes:\n- 60-90 second drone footage narration\n- Key highlights (3-5 points per beach)\n- Local insider tips voiceover\n- Call-to-action for site visit\n- **Video placement: Embedded at bottom of each beach page** (per Jason B requirement)\n\n---",
"column": "completed",
"assignee": "content",
"priority": "CRITICAL",
"labels": [
"seo",
"video"
],
"notes": [
{
"timestamp": "2026-04-25T18:28:31.611396",
"text": "[AUTO] Moved to Parking Lot per Jason decision: Video embeds post-launch only.",
"author": "roselyn"
},
{
"text": "✅ Completed sub-items: `/content/video-scripts/template.md` - Standardized script template, `/content/video-scripts/samples/` - 8 proof-of-concept sample scripts",
"timestamp": "2026-04-26T02:13:10.189184+00:00",
"author": "sync-board"
},
{
"text": "⬜ Pending sub-items: `/content/video-scripts/` - 50 completed .md files (42 remaining)",
"timestamp": "2026-04-26T02:13:10.189188+00:00",
"author": "sync-board"
}
],
"estimate": "15h"
},
{
"id": "T-106",
"title": "T-106: Consolidate agent features (keyboard shortcuts + analytics)",
"desc": "Merge T-099 keyboard shortcuts and T-102 analytics dashboard into main board. Add help modal, analytics panel, keyboard navigation.",
"column": "completed",
"assignee": "joselyn",
"priority": "High",
"labels": [],
"notes": [
{
"timestamp": "2026-04-21T03:24:50Z",
"agent": "joselyn",
"text": "Created and moved to In Progress immediately. Active work by roselyn. Board accuracy enforcement."
},
{
"timestamp": "2026-04-22T23:45:00Z",
"agent": "joselyn",
"text": "MOVED: Ticket was stalled in In Progress for >24 hours (roselyn unresponsive since 2026-04-21 03:24Z). Moved to To Do and reassigned to tech agent. Reason: Stalled ticket requiring fresh assignment."
},
{
"timestamp": "2026-04-23T00:42:00Z",
"agent": "roselyn",
"text": "COMPLETED: Successfully consolidated keyboard shortcuts and analytics features. All keyboard navigation working (?, 1-6, d, f, t, n, a, r, Esc). Dashboard panel with velocity, burn-down, sprint progress, stale tasks, and activity feed all functional. Ticket file created at /tickets/T-106.md"
},
{
"text": "✅ Completed sub-items: Keyboard shortcuts help modal (? key), Analytics dashboard panel with velocity, burn-down chart, sprint progress, stale tasks alert, team activity feed, Keyboard navigation (1-6 for columns, d for dashboard, f for filters, t for theme, n for new task, a for select all, r for refresh, Esc for close), Dashboard panel integrated with show/hide toggle, All shortcuts documented in help modal",
"timestamp": "2026-04-26T02:13:10.189370+00:00",
"author": "sync-board"
}
],
"estimate": "2h"
},
{
"id": "T-107",
"title": "T-107: Bulk edit functionality for multi-task operations",
"desc": "Build bulk edit: checkboxes on cards, select all in column, bulk action bar with move/assign/priority/delete. Mobile responsive.",
"column": "completed",
"assignee": "joselyn",
"priority": "High",
"labels": [
"enhancement"
],
"notes": [
{
"timestamp": "2026-04-21T03:24:50Z",
"agent": "joselyn",
"text": "Created and moved to In Progress immediately. Active work by roselyn. Board accuracy enforcement."
},
{
"timestamp": "2026-04-22T23:45:00Z",
"agent": "joselyn",
"text": "MOVED: Ticket was stalled in In Progress for >24 hours (roselyn unresponsive since 2026-04-21 03:24Z). Moved to To Do and reassigned to tech agent. Reason: Stalled ticket requiring fresh assignment."
},
{
"timestamp": "2026-04-23T00:43:00Z",
"agent": "roselyn",
"text": "COMPLETED: Bulk edit functionality fully implemented. Checkboxes on all cards, select-all in column headers, bulk toolbar with move/assign/priority/delete actions. Shift/Ctrl+click multi-select support. Mobile responsive. Ticket file created at /tickets/T-107.md"
},
{
"text": "✅ Completed sub-items: Checkboxes on each task card for selection, \"Select All\" checkbox in column headers, Bulk action toolbar appears when tasks selected, Bulk move to any column, Bulk assign to any team member, Bulk set priority (critical/high/medium/low), Bulk delete functionality, Clear selection button, Shows count of selected tasks, Mobile responsive design",
"timestamp": "2026-04-26T02:13:10.189556+00:00",
"author": "sync-board"
}
],
"estimate": "4h"
},
{
"id": "T-108",
"title": "T-108: Mobile-first UX improvements with swipe gestures",
"desc": "Horizontal scroll snap, reduced card padding, full-screen modals, collapsible filters, swipe navigation between columns.",
"column": "completed",
"assignee": "joselyn",
"priority": "High",
"labels": [
"enhancement"
],
"notes": [
{
"timestamp": "2026-04-21T03:24:50Z",
"agent": "joselyn",
"text": "Created and moved to In Progress immediately. Active work by roselyn. Board accuracy enforcement."
},
{
"timestamp": "2026-04-22T23:45:00Z",
"agent": "joselyn",
"text": "MOVED: Ticket was stalled in In Progress for >24 hours (roselyn unresponsive since 2026-04-21 03:24Z). Moved to To Do and reassigned to tech agent. Reason: Stalled ticket requiring fresh assignment."
},
{
"timestamp": "2026-04-23T00:44:00Z",
"agent": "roselyn",
"text": "COMPLETED: Mobile-first UX improvements implemented. Horizontal scroll snap, swipe navigation with dots indicator, touch drag for task cards, full-screen modals on mobile, collapsible filters. Responsive design for all screen sizes. Ticket file created at /tickets/T-108.md"
},
{
"text": "✅ Completed sub-items: Horizontal scroll snap for mobile column navigation, Swipe navigation between columns on mobile, Swipe dots indicator showing current column, Reduced card padding on mobile screens, Full-screen modals on mobile, Collapsible filters panel, Touch drag support for task cards, Mobile-optimized card sizing, Swipe hint for first-time users",
"timestamp": "2026-04-26T02:13:10.189738+00:00",
"author": "sync-board"
}
],
"estimate": "3h"
},
{
"id": "T-109",
"title": "T-109: Board accuracy audit and workflow enforcement",
"desc": "Audit board for accuracy. Create In Progress tickets for all active work. Enforce: Working = In Progress rule.",
"column": "completed",
"assignee": "joselyn",
"priority": "Critical",
"labels": [],
"notes": [
{
"timestamp": "2026-04-21T03:24:50Z",
"agent": "joselyn",
"text": "Created and moved to In Progress immediately. Active work by roselyn. Board accuracy enforcement."
},
{
"timestamp": "2026-04-22T23:45:00Z",
"agent": "joselyn",
"text": "MOVED: Ticket was stalled in In Progress for >24 hours (roselyn unresponsive since 2026-04-21 03:24Z). Moved to To Do and self-assigned. Will run during next board health check cycle. Reason: Stalled ticket requiring active PM attention."
},
{
"timestamp": "2026-04-23T00:45:00Z",
"agent": "roselyn",
"text": "COMPLETED: Board accuracy audit completed. All 4 stalled tickets (T-106, T-107, T-108, T-109) audited, completed, and moved to Completed column. Ticket files created in /tickets/ directory. Board JSON updated with accurate status and completion timestamps. Workflow enforcement rules documented. Ticket file created at /tickets/T-109.md"
},
{
"text": "✅ Completed sub-items: Board data audited for accuracy, All stalled tickets (>24h in In Progress) identified, Stalled tickets moved to appropriate columns, Workflow rule documented: Working = In Progress, Ticket assignments verified and corrected, Board JSON updated with accurate timestamps, Ticket files created for completed work, Completion status reported",
"timestamp": "2026-04-26T02:13:10.189928+00:00",
"author": "sync-board"
}
],
"estimate": "1h"
},
{
"id": "T-156-price-drop-alerts",
"title": "T-156: Price Drop Alerts",
"desc": "Allow users to save beach destinations and receive notifications when flight/hotel prices drop. Users set target price thresholds and get notified when deals hit their target.\n\n### User Flow:\n1. User views beach page\n2. Clicks \"Get Price Alerts\"\n3. Sets target price threshold (or \"Any deal\")\n4. Enters email or enables push notifications\n5. System monitors prices via affiliate APIs\n6. User receives notification when price drops below threshold\n\n### Alert Types:\n- **Email:** Daily digest or instant alerts\n- **Push:** PWA push notifications\n- **SMS:** Optional for premium users\n\n### Display:\n- \"Save up to 40% on your next stay\" banner\n- Price history graph (optional)\n- \"Prices expected to rise\" urgency messaging\n\n---",
"column": "todo",
"assignee": "unassigned",
"priority": "High",
"labels": [
"enhancement"
],
"notes": []
},
{
"id": "T-157-trip-itinerary-manager",
"title": "T-157: Trip Itinerary Manager",
"desc": "Forward booking confirmations to trips@instaparadise.com and automatically create a comprehensive travel itinerary. Users can also manually build itineraries for beach-hopping trips.\n\n### Core Features:\n\n**1. Auto-Import via Email**\n- Forward flight, hotel, car rental confirmations\n- AI parses details (dates, times, confirmation numbers)\n- Auto-populates itinerary with booking details\n\n**2. Beach Trip Planning**\n- Add multiple beaches to itinerary\n- Day-by-day schedule builder\n- Optimized route between beaches\n- Travel time estimates between locations\n\n**3. Real-Time Updates**\n- Flight status alerts\n- Check-in reminders (24h before)\n- Gate/terminal changes\n- Delay notifications\n\n**4. Offline Access**\n- Download itinerary for offline viewing\n- Critical info available without signal\n- Essential for travelers in remote beach areas\n\n**5. Share & Collaborate**\n- Share itinerary link with travel companions\n- Collaborative editing (see T-169)\n- Export to PDF/Calendar\n\n---",
"column": "todo",
"assignee": "unassigned",
"priority": "High",
"labels": [
"enhancement"
],
"notes": []
},
{
"id": "T-168-ai-beach-trip-planner",
"title": "T-168: AI-Powered Beach Trip Planner",
"desc": "AI-powered trip planning that generates optimized beach itineraries. Users input preferences, AI suggests best beaches, routes, and activities.\n\n### User Input:\n- Travel dates\n- Starting location\n- Trip duration\n- Number of travelers\n- Budget range\n- Interests (family, adventure, relaxation, photography, etc.)\n- Regions of interest\n\n### AI Output:\n\n**1. Beach Recommendations**\n- Personalized beach selections based on preferences\n- Mix of popular and hidden gems\n- Consideration of seasonal factors\n\n**2. Optimized Route**\n- Most efficient travel order between beaches\n- Minimized travel time, maximized beach time\n- Alternative routes offered\n\n**3. Day-by-Day Itinerary**\n- Morning/afternoon/evening activities\n- Meal recommendations near beaches\n- Rest/travel buffer time\n- Sunset/sunrise viewing spots\n\n**4. Booking Integration**\n- Hotel recommendations along route\n- Direct booking links\n- Price estimates\n\n**5. Smart Adjustments**\n- \"Add 1 more beach\" → AI recalculates\n- \"Make it more relaxing\" → Reduces travel between stops\n- \"Add snorkeling\" → Suggests beaches with best reefs\n\n---",
"column": "todo",
"assignee": "unassigned",
"priority": "High",
"labels": [],
"notes": []
},
{
"id": "T-169-fix-deployment-agent-path",
"title": "T-169: Fix deployment-agent.py board path",
"desc": "The deployment-agent.py script references the wrong board file path:\n- Current: `/home/geoffreybot/workspace/coder/INSTAPARADISE_BOARD.json`\n- Should be: `/home/geoffreybot/workspace/product-strategist/board_snapshot.json`",
"column": "todo",
"assignee": "unassigned",
"priority": "medium",
"labels": [],
"notes": [
{
"text": "⬜ Pending sub-items: Update BOARD_FILE constant, Update sync paths in save_board(), Test deployment agent loads board correctly",
"timestamp": "2026-04-26T02:13:10.191076+00:00",
"author": "sync-board"
}
]
},
{
"id": "T-170-fix-ticket-manager-path",
"title": "T-170: Fix ticket_manager.py board path",
"desc": "The ticket_manager.py script references the wrong board file path:\n- Current: `/home/geoffreybot/workspace/coder/INSTAPARADISE_BOARD.json` (inherited)\n- Should be: `/home/geoffreybot/workspace/product-strategist/board_snapshot.json`",
"column": "todo",
"assignee": "unassigned",
"priority": "medium",
"labels": [],
"notes": [
{
"text": "⬜ Pending sub-items: Update default board file path, Test ticket manager loads board correctly, Verify save operations write to correct location",
"timestamp": "2026-04-26T02:13:10.191235+00:00",
"author": "sync-board"
}
]
},
{
"id": "T-171-fix-qa-agent-path",
"title": "T-171: Fix qa-agent.py board path",
"desc": "The qa-agent.py script references the wrong board file path:\n- Current: `/home/geoffreybot/workspace/coder/INSTAPARADISE_BOARD.json`\n- Should be: `/home/geoffreybot/workspace/product-strategist/board_snapshot.json`",
"column": "todo",
"assignee": "unassigned",
"priority": "medium",
"labels": [],
"notes": [
{
"text": "⬜ Pending sub-items: Update BOARD_FILE constant, Update sync paths in save_board(), Test QA agent loads board correctly",
"timestamp": "2026-04-26T02:13:10.191390+00:00",
"author": "sync-board"
}
]
},
{
"id": "T-172-fix-orchestrator-path",
"title": "T-172: Fix orchestrator-daemon.py board path",
"desc": "The orchestrator-daemon.py script references the wrong board file path:\n- Current: `/home/geoffreybot/workspace/coder/INSTAPARADISE_BOARD.json`\n- Should be: `/home/geoffreybot/workspace/product-strategist/board_snapshot.json`",
"column": "todo",
"assignee": "unassigned",
"priority": "medium",
"labels": [],
"notes": [
{
"text": "⬜ Pending sub-items: Update BOARD_FILE constant, Update sync paths in sync_board(), Test orchestrator loads board correctly",
"timestamp": "2026-04-26T02:13:10.191543+00:00",
"author": "sync-board"
}
]
},
{
"id": "T-173-fix-research-agent-path",
"title": "T-173: Fix research-agent.py board path",
"desc": "The research-agent.py script references the wrong board file path:\n- Current: `/home/geoffreybot/workspace/coder/INSTAPARADISE_BOARD.json`\n- Should be: `/home/geoffreybot/workspace/product-strategist/board_snapshot.json`",
"column": "todo",
"assignee": "unassigned",
"priority": "medium",
"labels": [],
"notes": [
{
"text": "⬜ Pending sub-items: Update BOARD_FILE constant, Update sync paths in save_board(), Test research agent creates tickets correctly",
"timestamp": "2026-04-26T02:13:10.191695+00:00",
"author": "sync-board"
}
]
},
{
"id": "T-174-fix-search-js-urls",
"title": "T-174: Fix search.js to use clean URLs",
"desc": "The search.js file generates URLs with .html extensions, but the site uses clean URLs:\n- Current: `/beach/${beach.slug}.html`\n- Should be: `/beach/${beach.slug}`",
"column": "todo",
"assignee": "unassigned",
"priority": "medium",
"labels": [
"seo"
],
"notes": [
{
"text": "⬜ Pending sub-items: Update navigateToBeach() function, Update renderResults() template, Test search results navigate to correct URLs",
"timestamp": "2026-04-26T02:13:10.191842+00:00",
"author": "sync-board"
}
]
},
{
"id": "T-175-fix-sitemap-urls",
"title": "T-175: Fix sitemap.xml to use clean URLs",
"desc": "The sitemap.xml file contains URLs with .html extensions:\n- Current: `https://instaparadise.com/beach/glass-beach-fort-bragg.html`\n- Should be: `https://instaparadise.com/beach/glass-beach-fort-bragg`",
"column": "todo",
"assignee": "unassigned",
"priority": "medium",
"labels": [
"seo"
],
"notes": [
{
"text": "⬜ Pending sub-items: Remove .html from all beach page URLs, Verify sitemap passes validation, Submit corrected sitemap to Google Search Console",
"timestamp": "2026-04-26T02:13:10.191998+00:00",
"author": "sync-board"
}
]
},
{
"id": "T-176-fix-coordinator-random",
"title": "T-176: Add proper random seed to board-coordinator.sh",
"desc": "The board-coordinator.sh script uses RANDOM without initialization, which:\n1. Produces the same sequence on every run (if bash seed not set)\n2. Makes reports non-deterministic",
"column": "todo",
"assignee": "unassigned",
"priority": "medium",
"labels": [],
"notes": [
{
"text": "⬜ Pending sub-items: Add RANDOM seed initialization at start of script, Verify random numbers differ between runs",
"timestamp": "2026-04-26T02:13:10.192149+00:00",
"author": "sync-board"
}
]
},
{
"id": "T-177-fix-verify-script-path",
"title": "T-177: Fix verify.py base directory path",
"desc": "The verify.py script references the wrong base directory:\n- Current: `/home/geoffreybot/workspace/lead-developer/instaparadise/beach`\n- Should be: `/home/geoffreybot/workspace/product-strategist/beach`",
"column": "todo",
"assignee": "unassigned",
"priority": "medium",
"labels": [],
"notes": [
{
"text": "⬜ Pending sub-items: Update BASE_DIR constant, Verify script finds beach HTML files, Test verification runs successfully",
"timestamp": "2026-04-26T02:13:10.192301+00:00",
"author": "sync-board"
}
]
},
{
"id": "T-178-fix-audit-beaches-path",
"title": "T-178: Fix audit_beaches.py directory path",
"desc": "The audit_beaches.py script references the wrong directory:\n- Current: `/home/geoffreybot/workspace/lead-developer/instaparadise/beach`\n- Should be: `/home/geoffreybot/workspace/product-strategist/beach`",
"column": "todo",
"assignee": "unassigned",
"priority": "medium",
"labels": [],
"notes": [
{
"text": "⬜ Pending sub-items: Update BEACH_DIR constant, Verify audit runs successfully, Check audit report generates correctly",
"timestamp": "2026-04-26T02:13:10.192451+00:00",
"author": "sync-board"
}
]
},
{
"id": "T-179-fix-update-pages-path",
"title": "T-179: Fix update_pages.py base directory path",
"desc": "The update_pages.py script references the wrong directory:\n- Current: `/home/geoffreybot/workspace/lead-developer/instaparadise/beach`\n- Should be: `/home/geoffreybot/workspace/product-strategist/beach`",
"column": "todo",
"assignee": "unassigned",
"priority": "medium",
"labels": [],
"notes": [
{
"text": "⬜ Pending sub-items: Update BASE_DIR constant, Verify script processes correct directory, Test updates apply to workspace files",
"timestamp": "2026-04-26T02:13:10.192602+00:00",
"author": "sync-board"
}
]
},
{
"id": "T-180-fix-fix-drone-tiles-path",
"title": "T-180: Fix fix_drone_tiles.py base directory path",
"desc": "The fix_drone_tiles.py script references the wrong directory:\n- Current: `/home/geoffreybot/workspace/lead-developer/instaparadise/beach`\n- Should be: `/home/geoffreybot/workspace/product-strategist/beach`",
"column": "todo",
"assignee": "unassigned",
"priority": "medium",
"labels": [],
"notes": [
{
"text": "⬜ Pending sub-items: Update base_dir variable, Verify script processes correct directory, Test drone tile fixes apply correctly",
"timestamp": "2026-04-26T02:13:10.192753+00:00",
"author": "sync-board"
}
]
},
{
"id": "T-181-fix-enhance-beaches-path",
"title": "T-181: Fix enhance_beaches.py file paths",
"desc": "The enhance_beaches.py script references wrong file paths:\n- Base paths use `/home/geoffreybot/workspace/lead-developer/instaparadise/beach`\n- Should use: `/home/geoffreybot/workspace/product-strategist/beach`",
"column": "todo",
"assignee": "unassigned",
"priority": "medium",
"labels": [],
"notes": [
{
"text": "⬜ Pending sub-items: Update all path references, Verify script finds beach files, Test enhancements apply correctly",
"timestamp": "2026-04-26T02:13:10.192927+00:00",
"author": "sync-board"
}
]
},
{
"id": "T-182-fix-fix-batch3-path",
"title": "T-182: Fix fix_batch3.py base directory path",
"desc": "The fix_batch3.py script references the wrong base directory:\n- Current: `/home/geoffreybot/workspace/lead-developer/instaparadise/beach`\n- Should be: `/home/geoffreybot/workspace/product-strategist/beach`",
"column": "todo",
"assignee": "unassigned",
"priority": "medium",
"labels": [],
"notes": [
{
"text": "⬜ Pending sub-items: Update BASE_DIR constant, Verify script processes correct directory, Test batch 3 fixes apply correctly",
"timestamp": "2026-04-26T02:13:10.193082+00:00",
"author": "sync-board"
}
]
},
{
"id": "T-183-fix-fix-drones-path",
"title": "T-183: Fix fix_drones.py base directory path",
"desc": "The fix_drones.py script references the wrong base directory:\n- Current: `/home/geoffreybot/workspace/lead-developer/instaparadise/beach`\n- Should be: `/home/geoffreybot/workspace/product-strategist/beach`",
"column": "todo",
"assignee": "unassigned",
"priority": "medium",
"labels": [],
"notes": [
{
"text": "⬜ Pending sub-items: Update BASE_DIR constant, Verify script processes correct directory, Test drone fixes apply correctly",
"timestamp": "2026-04-26T02:13:10.193233+00:00",
"author": "sync-board"
}
]
},
{
"id": "T-184-fix-enhance-remaining-path",
"title": "T-184: Fix enhance_remaining_beaches.py directory path",
"desc": "The enhance_remaining_beaches.py script references the wrong directory:\n- Current: `/home/geoffreybot/workspace/lead-developer/instaparadise/beach`\n- Should be: `/home/geoffreybot/workspace/product-strategist/beach`",
"column": "todo",
"assignee": "unassigned",
"priority": "medium",
"labels": [],
"notes": [
{
"text": "⬜ Pending sub-items: Update BEACH_DIR constant, Verify script processes correct directory, Test enhancements apply correctly",
"timestamp": "2026-04-26T02:13:10.193386+00:00",
"author": "sync-board"
}
]
},
{
"id": "T-185-fix-process-drone-path",
"title": "T-185: Fix process_drone_tiles.py base directory path",
"desc": "The process_drone_tiles.py script references the wrong base directory:\n- Current: `/home/geoffreybot/workspace/lead-developer/instaparadise/beach`\n- Should be: `/home/geoffreybot/workspace/product-strategist/beach`",
"column": "todo",
"assignee": "unassigned",
"priority": "medium",
"labels": [],
"notes": [
{
"text": "⬜ Pending sub-items: Add BASE_DIR constant, Verify script processes correct directory, Test drone tile processing works",
"timestamp": "2026-04-26T02:13:10.193537+00:00",
"author": "sync-board"
}
]
},
{
"id": "T-186-fix-add-gallery-path",
"title": "T-186: Fix add_gallery.py base directory path",
"desc": "The add_gallery.py script references the wrong base directory:\n- Current: `/home/geoffreybot/workspace/lead-developer/instaparadise/beach`\n- Should be: `/home/geoffreybot/workspace/product-strategist/beach`",
"column": "todo",
"assignee": "unassigned",
"priority": "medium",
"labels": [],
"notes": [
{
"text": "⬜ Pending sub-items: Update BASE_DIR constant, Verify script processes correct directory, Test gallery additions work",
"timestamp": "2026-04-26T02:13:10.193687+00:00",
"author": "sync-board"
}
]
},
{
"id": "T-187-fix-deploy-paths",
"title": "T-187: Fix deploy.py source/deploy paths",
"desc": "The deploy.py script references wrong directories:\n- Current: `/home/geoffreybot/workspace/lead-developer/instaparadise/beach`\n- Should be: `/home/geoffreybot/workspace/product-strategist/beach`\n- Current: `/home/geoffreybot/workspace/lead-developer/instaparadise/beach-deploy-ready`\n- Should be: `/home/geoffreybot/workspace/product-strategist/beach-deploy-ready`",
"column": "todo",
"assignee": "unassigned",
"priority": "medium",
"labels": [],
"notes": [
{
"text": "⬜ Pending sub-items: Update SOURCE_DIR constant, Update DEPLOY_DIR constant, Verify deploy script works correctly",
"timestamp": "2026-04-26T02:13:10.193862+00:00",
"author": "sync-board"
}
]
},
{
"id": "T-188-fix-audit-beaches2-path",
"title": "T-188: Fix audit_beaches2.py directory path",
"desc": "The audit_beaches2.py script references the wrong directory:\n- Current: `/home/geoffreybot/workspace/lead-developer/instaparadise/beach`\n- Should be: `/home/geoffreybot/workspace/product-strategist/beach`",
"column": "todo",
"assignee": "unassigned",
"priority": "medium",
"labels": [],
"notes": [
{
"text": "⬜ Pending sub-items: Update BEACH_DIR constant, Verify audit runs on correct directory, Test report generation",
"timestamp": "2026-04-26T02:13:10.194054+00:00",
"author": "sync-board"
}
]
},
{
"id": "T-189-fix-agent-spawner-path",
"title": "T-189: Fix agent-spawner.sh board file path",
"desc": "The agent-spawner.sh script references the wrong board file path:\n- Current: `/home/geoffreybot/workspace/coder/INSTAPARADISE_BOARD.json`\n- Should be: `/home/geoffreybot/workspace/product-strategist/board_snapshot.json`",
"column": "todo",
"assignee": "unassigned",
"priority": "medium",
"labels": [],
"notes": []
},
{
"id": "T-190-fix-board-compliance-path",
"title": "T-190: Fix board-compliance-monitor.sh board file path",
"desc": "The board-compliance-monitor.sh script references the wrong board file path:\n- Current: `/home/geoffreybot/workspace/coder/INSTAPARADISE_BOARD.json`\n- Should be: `/home/geoffreybot/workspace/product-strategist/board_snapshot.json`",
"column": "todo",
"assignee": "unassigned",
"priority": "medium",
"labels": [],
"notes": []
},
{
"id": "T-191-fix-board-sync-path",
"title": "T-191: Fix board-sync-fixed.sh board file path",
"desc": "The board-sync-fixed.sh script references the wrong board file path:\n- Current: `/home/geoffreybot/workspace/coder/INSTAPARADISE_BOARD.json`\n- Should be: `/home/geoffreybot/workspace/product-strategist/board_snapshot.json`",
"column": "todo",
"assignee": "unassigned",
"priority": "medium",
"labels": [],
"notes": []
},
{
"id": "T-192-fix-add-gallery-batch3-path",
"title": "T-192: Fix add_gallery_batch3.py directory path",
"desc": "The add_gallery_batch3.py script references the wrong directory:\n- Current: `/home/geoffreybot/workspace/lead-developer/instaparadise/beach`\n- Should be: `/home/geoffreybot/workspace/product-strategist/beach`",
"column": "todo",
"assignee": "unassigned",
"priority": "medium",
"labels": [],
"notes": []
},
{
"id": "T-193-fix-enhance-beaches-path",
"title": "T-193: Fix enhance_beaches.py directory path",
"desc": "The enhance_beaches.py script references the wrong directory:\n- Current: `/home/geoffreybot/workspace/lead-developer/instaparadise/beach`\n- Should be: `/home/geoffreybot/workspace/product-strategist/beach`",
"column": "todo",
"assignee": "unassigned",
"priority": "medium",
"labels": [],
"notes": []
},
{
"id": "T-194-fix-fix-batch2-path",
"title": "T-194: Fix fix_batch2.py directory path",
"desc": "The fix_batch2.py script references the wrong directory:\n- Current: `/home/geoffreybot/workspace/lead-developer/instaparadise/beach`\n- Should be: `/home/geoffreybot/workspace/product-strategist/beach`",
"column": "todo",
"assignee": "unassigned",
"priority": "medium",
"labels": [],
"notes": []
}
]
};
let currentFilter = 'all';
let currentSearch = '';
let lastSyncTimestamp = 0;
let pollingInterval = null;
const WIP_LIMITS = { 'inprogress': 5, 'qa': 5 };
// T-106: Bulk Edit State
let selectedTasks = new Set();
let bulkEditMode = false;
async function init() {
console.log('[DEBUG] init() started');
try {
// Load theme
if (localStorage.getItem('theme') === 'dark') {
document.body.classList.add('dark');
}
// Clear old localStorage if board structure changed
const BOARD_VERSION = 'v3'; // bump when columns change
const savedVersion = localStorage.getItem('board_version');
if (savedVersion !== BOARD_VERSION) {
console.log('[Board] Version changed, clearing old data');
localStorage.removeItem('board_data');
localStorage.setItem('board_version', BOARD_VERSION);
}
// Try to load from localStorage first (for persistence)
const savedBoardData = localStorage.getItem('board_data');
if (savedBoardData) {
try {
const parsed = JSON.parse(savedBoardData);
if (parsed && parsed.tasks && parsed.columns) {
// Merge saved tasks with embedded data (embedded is source of truth for structure)
BOARD_DATA.tasks = parsed.tasks;
if (parsed.meta) BOARD_DATA.meta = parsed.meta;
console.log('[DEBUG] Loaded board data from localStorage:', parsed.tasks.length, 'tasks');
}
} catch (e) {
console.error('[DEBUG] Failed to parse localStorage board data:', e);
}
}
console.log('[DEBUG] BOARD_DATA exists:', !!BOARD_DATA);
console.log('[DEBUG] BOARD_DATA.tasks exists:', !!(BOARD_DATA && BOARD_DATA.tasks));
console.log('[DEBUG] BOARD_DATA.columns exists:', !!(BOARD_DATA && BOARD_DATA.columns));
console.log('[DEBUG] Tasks count:', BOARD_DATA && BOARD_DATA.tasks ? BOARD_DATA.tasks.length : 0);
console.log('[DEBUG] Columns count:', BOARD_DATA && BOARD_DATA.columns ? BOARD_DATA.columns.length : 0);
// Background sync with server (don't block on this)
fetchFreshData().catch(e => console.log('Server sync skipped:', e.message));
if (!BOARD_DATA || !BOARD_DATA.tasks) {
throw new Error('Invalid board data structure');
}
// Store initial sync timestamp from meta.updated
if (BOARD_DATA.meta && BOARD_DATA.meta.updated) {
lastSyncTimestamp = new Date(BOARD_DATA.meta.updated).getTime();
localStorage.setItem('board_modified', BOARD_DATA.meta.updated);
}
// Update sync status
const syncStatus = document.getElementById('sync-status');
syncStatus.innerHTML = '' +
BOARD_DATA.tasks.length + ' tasks synced';
// Update board stats
const inProgress = BOARD_DATA.tasks.filter(t => t.column === 'inprogress').length;
const done = BOARD_DATA.tasks.filter(t => t.column === 'done' || t.column === 'completed').length;
const todo = BOARD_DATA.tasks.filter(t => t.column === 'todo').length;
document.getElementById('board-stats').innerHTML =
'
📊' + BOARD_DATA.tasks.length + ' Tasks
' +
'
📝' + todo + ' To Do
' +
'
🔨' + inProgress + ' In Progress
' +
'
✅' + done + ' Done
';
renderBoard();
console.log('[DEBUG] renderBoard() completed');
// Start polling for real-time updates
startPolling();
console.log('[DEBUG] init() completed successfully');
} catch (e) {
console.error('Board initialization error:', e);
showError('Error loading board: ' + e.message);
}
}
function startPolling() {
console.log('[T-095] Starting polling with 30s interval...');
// Poll every 30 seconds
pollingInterval = setInterval(async () => {
await checkForUpdates();
}, 30000);
// Initial check after 5 seconds
setTimeout(() => checkForUpdates(), 5000);
}
async function checkForUpdates() {
const timestamp = Date.now();
console.log('[T-095] Polling for updates at', new Date().toLocaleTimeString());
try {
const response = await fetch('board.json?t=' + timestamp);
if (!response.ok) {
console.error('[T-095] Failed to fetch updates:', response.status);
return;
}
const freshData = await response.json();
console.log('[T-095] Received data, meta.updated:', freshData.meta?.updated);
if (freshData.meta && freshData.meta.updated) {
const serverTimestamp = new Date(freshData.meta.updated).getTime();
const localTimestamp = lastSyncTimestamp;
console.log('[T-095] Server time:', serverTimestamp, '| Local time:', localTimestamp);
if (serverTimestamp > localTimestamp) {
console.log('[T-095] Updates detected! Server has newer data.');
// Calculate how many tasks are new/updated
const currentIds = new Set(BOARD_DATA.tasks.map(t => t.id));
const newTasks = freshData.tasks.filter(t => !currentIds.has(t.id));
const updatedCount = freshData.tasks.filter(t => {
const localTask = BOARD_DATA.tasks.find(lt => lt.id === t.id);
return localTask && new Date(t.updated).getTime() > new Date(localTask.updated).getTime();
}).length;
const totalUpdates = newTasks.length + updatedCount;
// Show notification banner
showUpdateBanner(totalUpdates);
} else {
console.log('[T-095] No updates - data is current');
}
}
} catch (e) {
console.error('[T-095] Error checking for updates:', e);
}
}
function showUpdateBanner(count) {
const banner = document.getElementById('update-banner');
const countEl = document.getElementById('update-count');
if (countEl) countEl.textContent = count;
banner.classList.add('visible');
console.log('[T-095] Update banner shown with', count, 'updates');
// Auto-hide after 30 seconds if user doesn't click
setTimeout(() => {
banner.classList.remove('visible');
}, 30000);
}
function hideUpdateBanner() {
const banner = document.getElementById('update-banner');
banner.classList.remove('visible');
}
async function refreshBoardData() {
console.log('[T-095] Refreshing board data...');
hideUpdateBanner();
const refreshBtn = document.getElementById('refresh-btn');
if (refreshBtn) refreshBtn.classList.add('spinning');
try {
await fetchFreshData();
// Update sync timestamp
if (BOARD_DATA.meta && BOARD_DATA.meta.updated) {
lastSyncTimestamp = new Date(BOARD_DATA.meta.updated).getTime();
localStorage.setItem('board_modified', BOARD_DATA.meta.updated);
}
// Update board stats
const inProgress = BOARD_DATA.tasks.filter(t => t.column === 'inprogress').length;
const done = BOARD_DATA.tasks.filter(t => t.column === 'done' || t.column === 'completed').length;
const todo = BOARD_DATA.tasks.filter(t => t.column === 'todo').length;
document.getElementById('board-stats').innerHTML =
'
📊' + BOARD_DATA.tasks.length + ' Tasks
' +
'
📝' + todo + ' To Do
' +
'
🔨' + inProgress + ' In Progress
' +
'
✅' + done + ' Done
';
renderBoard();
showNotification('🔄 Board refreshed successfully!');
console.log('[T-095] Board refreshed successfully');
} catch (e) {
console.error('[T-095] Error refreshing board:', e);
showNotification('⚠️ Failed to refresh board');
} finally {
if (refreshBtn) refreshBtn.classList.remove('spinning');
}
}
function manualRefresh() {
console.log('[T-095] Manual refresh triggered');
refreshBoardData();
}
async function fetchFreshData() {
// NOTE: We intentionally do NOT overwrite BOARD_DATA here.
// The embedded data is the source of truth. This fetch only
// checks for updates in the background for the update banner.
try {
const response = await fetch('board.json?t=' + Date.now());
if (!response.ok) return; // Silently ignore errors
const freshData = await response.json();
console.log('[T-095] Server has', freshData.tasks.length, 'tasks');
// Store timestamp for potential future use
if (freshData.meta && freshData.meta.updated) {
lastSyncTimestamp = new Date(freshData.meta.updated).getTime();
}
} catch (e) {
// Silent failure - embedded data is already loaded
console.log('[T-095] Background sync skipped:', e.message);
}
}
function saveBoardToStorage() {
if (BOARD_DATA) {
localStorage.setItem('board_data', JSON.stringify(BOARD_DATA));
// Use meta.updated timestamp instead of current time
const updatedTime = BOARD_DATA.meta?.updated || new Date().toISOString();
localStorage.setItem('board_modified', updatedTime);
lastSyncTimestamp = new Date(updatedTime).getTime();
console.log('[T-095] Board saved to localStorage with timestamp:', updatedTime);
}
}
// ── Save board data BACK to server (board.json) ──────────────────────────
async function syncBoardToServer() {
try {
showNotification('☁️ Syncing to server...');
const response = await fetch('/api/board-update', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(BOARD_DATA)
});
if (response.ok) {
showNotification('✅ Changes saved to server!');
// Update meta timestamp so polling doesn't detect "stale" data
BOARD_DATA.meta.updated = new Date().toISOString();
lastSyncTimestamp = Date.now();
} else {
showNotification('❌ Server sync failed: ' + response.status);
}
} catch (e) {
// Fallback: offer downloadable JSON file
console.error('[T-095] Server sync error:', e);
offerDownloadBoardJson();
}
}
function offerDownloadBoardJson() {
const blob = new Blob([JSON.stringify(BOARD_DATA, null, 2)], { type: 'application/json' });
const url = URL.createObjectURL(blob);
const a = document.createElement('a');
a.href = url;
a.download = 'board.json';
a.click();
URL.revokeObjectURL(url);
showNotification('📥 Downloaded board.json — upload to server manually');
}
// Add "Save to Server" button in the header
function resetBoard() {
if (confirm('Reset board to original state? All local changes will be lost.')) {
localStorage.removeItem('board_data');
localStorage.removeItem('board_modified');
location.reload();
}
}
function isBoardModified() {
return localStorage.getItem('board_data') !== null;
}
function showError(msg) {
document.getElementById('board-columns').innerHTML =
'