๐Ÿ“ Changelog

Recent updates and improvements to ClaimIt

176 total commits ยท Last updated: January 8, 2026 10:13 PM

January 8, 2026

  • 8e39fec 10:09 PM
    Add visual indicator for gone items
    - Add red GONE badge overlay on item images
    - Dim gone items to 75% opacity (85% on hover)
    - Display badge on both item cards and detail pages
    by Dave Shevett

January 4, 2026

  • a25c236 10:19 AM
    Add user link to Slack notifications
    Enhanced Slack notifications to include a link to the poster's items page.
    Changes:
    - Modified includes/slack.php to build user listings URL
    - Both the text fallback and formatted message now show the poster's name with a clickable link
    Example: 'New item posted in mosaic by Bob Smith' where 'Bob Smith' links to their user-listings page.
    This helps community members quickly see all items from a specific poster.
    by Dave Shevett
  • b077753 9:26 AM
    Fix Slack image expiration in unfurled links
    Problem: When Slack unfurls item links, the image displays initially but breaks after 10-15 minutes because the Open Graph metadata was using presigned S3 URLs that expire after 1 hour.
    Solution: Changed Open Graph image URLs to use permanent CloudFront URLs instead of presigned URLs. Since images are public, CloudFront URLs never expire and Slack can cache them indefinitely.
    Changes:
    - Modified includes/utilities.php to use getCloudFrontUrl() instead of getPresignedUrl() for Open Graph metadata
    - Added comment explaining why permanent URLs are needed for social media sharing
    - Removed try/catch block since getCloudFrontUrl() is more reliable
    This fix ensures Slack unfurled images remain visible permanently.
    by Dave Shevett

January 2, 2026

  • 9384047 1:47 PM
    Fix item deletion to remove database entries
    Previously, deleting an item only removed S3 files (YAML and images) but left the database record intact.
    Changes:
    - Added deleteItemFromDb() function in includes/items.php
    - Deletes from items_communities table (foreign key associations)
    - Deletes from claims table (any claims on the item)
    - Deletes from items table (main item record)
    - Uses transaction to ensure atomic deletion
    - Updated delete_item handler in public/index.php to call deleteItemFromDb()
    Items are now fully deleted from both S3 storage and the database.
    by Dave Shevett
  • c20883b 1:28 PM
    Implemented Slack webhook notifications for new item postings
    โœ… Fully functional Slack integration - notifications automatically sent when items are posted
    Changes:
    - Added includes/slack.php with notification functions
    - Modified templates/communities.php to add Slack webhook URL and enable checkbox fields
    - Added 'Send Test Message' button to community editor (working)
    - Fixed test_slack action handler to accept action from GET parameters
    - Integrated Slack notifications into createItemInDb() function
    - Notifications now automatically sent when items are posted to communities with Slack enabled
    - Fixed item creation in templates/claim.php to pass community IDs to createItemInDb()
    - Slack unfurls item links automatically using existing Open Graph metadata (works on production)
    - Detailed logging added for debugging
    by Dave Shevett
  • f709546 12:14 PM
    Add Slack webhook notifications for communities (UI and testing)
    Database:
    - Added slack_webhook_url (TEXT, nullable) to communities table
    - Added slack_enabled (BOOLEAN, default false) to communities table
    - Created idempotent migration with column existence checks
    Backend (includes/communities.php):
    - Updated createCommunity() to save slack_webhook_url and slack_enabled
    - Updated updateCommunity() to save slack_webhook_url and slack_enabled
    - getAllCommunities() and getCommunityById() automatically include new fields
    Community Management UI (templates/communities.php):
    - Added Slack Webhook URL input field with validation
    - Added Enable Slack Notifications checkbox
    - Added 'Send Test Message' button for testing webhooks before enabling
    - Form loads and saves Slack settings when editing communities
    - Client-side validation for webhook URL format
    Test Webhook Handler (public/index.php):
    - Added test_slack action to communities API
    - Validates webhook URL format (must start with https://hooks.slack.com/services/)
    - Sends formatted test message to Slack using cURL
    - Returns success/failure with descriptive error messages
    Features:
    - Per-community Slack configuration
    - Test webhook before going live
    - Validates webhook URL format
    - Pretty formatted test message with blocks
    Next step: Implement actual item posting notifications (trigger when items are created)
    by Dave Shevett

December 30, 2025

  • 1777f9d 8:27 PM
    Add Share button to item cards on browse and user-listings pages
    - Added Share button to item-card.php for all contexts (listing, dashboard)
    - Moved shareItem() function to app.js for global availability
    - Share button now appears on page=items (browse) and page=user-listings
    - Consistent ๐Ÿ”— Share button across all item displays
    - All share buttons use same clipboard copy functionality
    by Dave Shevett
  • 6bfdbf2 8:15 PM
    Add Share button to copy item title and link to clipboard
    - Added ๐Ÿ”— Share button in item actions section
    - Button always visible to everyone (logged in or not)
    - Clicking copies item title + URL to clipboard
    - Shows success notification: 'Share info copied to clipboard'
    - Uses modern navigator.clipboard API with fallback for older browsers
    - Format: Title on first line, URL on second line
    This makes it easy for users to share items via email, text, social media, etc.
    by Dave Shevett
  • 5eae07d 4:23 PM
    Remove Zipcode column from admin user table to fix Actions visibility
    - Removed Zipcode column from table header (th)
    - Removed Zipcode column from table body (td)
    - Updated colspan from 10 to 9 for 'no users' message
    - This makes the table narrower so Actions column is visible without scrolling
    - Zipcode is still editable in the Edit User modal, just not shown in main table
    by Dave Shevett
  • 328c3bc 3:48 PM
    Fix merge conflict: restore hamburger menu mobile layout
    - Restored flex-direction: row for nav-container on mobile
    - Re-hid search box on mobile (was accidentally re-shown)
    - Restored compact logo and hamburger sizing on small screens
    - Ensures hamburger appears on right, logo on left (single horizontal line)
    This fixes the layout issues caused by PR merge conflicts.
    by Dave Shevett
  • f25c2c9 3:42 PM
    Implement hamburger menu for mobile to fix excessive white space
    - Added hamburger menu button (three-line icon with animation)
    - On mobile (โ‰ค768px), navigation collapses behind hamburger button
    - Menu slides down from navbar when hamburger is clicked
    - Logo and hamburger are on single horizontal line (logo left, hamburger right)
    - Menu items are left-aligned with clean styling
    - User dropdown opens within mobile menu with indented items
    - Click outside or on links closes the menu automatically
    - Search box hidden on mobile to maximize space
    - Navbar height reduced to ~50-56px on mobile (was 400-500px)
    This completely eliminates the excessive white space issue on mobile devices
    by collapsing the vertical navigation into a compact hamburger menu.
    by Dave Shevett
  • d25690c 12:20 PM
    Fix excessive white space on mobile home page
    - Reduced nav-container gap from 16px to 8px on tablet, 4px on mobile
    - Reduced navbar padding for more compact mobile layout
    - Fixed nav-search to be full-width on mobile
    - Reduced page-header and content-section padding on mobile
    - Removed duplicate @media (max-width: 768px) CSS rules
    - Made nav-logo and nav-menu more compact on mobile screens
    - Overall improved mobile spacing to eliminate large white gaps
    by Dave Shevett

December 29, 2025

  • 067a52f 6:47 PM
    Fix claim AJAX handler to support GET and POST parameters
    - Updated AJAX handler to check both $_POST and $_GET for action/id parameters
    - Fixed issue where claims were returning HTML instead of JSON
    - Improved fetch error handling in templates/item.php and templates/items.php
    - Changed fetch URLs from empty string to explicit '/' for clarity
    - Added debug logging to track AJAX request handling
    This fixes the 'Unexpected token' error when claiming items.
    by Dave Shevett
  • be2c5c4 6:17 PM
    Fix excessive blank space on mobile home page
    Mobile Layout Fixes:
    - Remove min-height from .main-content (was forcing full viewport height)
    - Reduce .page-header mobile padding from 2rem to 1rem
    - Reduce .content-section mobile padding from 2rem to 1rem
    This eliminates the large blank space between search bar and content
    on mobile devices when items are loading or no items are present.
    by Dave Shevett
  • d09df20 5:49 PM
    Fix claim and mark-as-gone functionality with improved error messages
    Critical Bugs Fixed:
    - Fix URL parameter formatting in markItemGone and relistItem functions
    - Remove spaces around = and & in request body parameters
    - Caused backend to not parse parameters correctly, breaking functionality
    Error Message Improvements:
    - Replace generic 'An error occurred' messages with descriptive errors
    - Show actual error messages from network errors in catch blocks
    - Added error.message to all catch blocks for better debugging
    - Apply to addClaimToItem, markItemGone, and relistItem functions
    Files Updated:
    - public/assets/js/app.js: Fixed parameter formatting and error messages
    - public/index.php: Improved claim error message
    - templates/item.php: Improved claim error message
    - templates/items.php: Improved claim error message
    by Dave Shevett
  • 0484b09 5:18 PM
    Add private communities and user management enhancements
    Private Communities:
    - Add migration for 'private' flag on communities table
    - Private communities hidden from non-admin users in browse list
    - Add private checkbox to community create/edit forms
    - Private communities require membership to view items
    - Items in General or non-private communities remain public
    - Admin users can see all communities
    User Management:
    - Add Edit button to admin user management table
    - Create edit modal for managing user details and community subscriptions
    - Allow admins to edit: display name, zipcode, admin status, notifications
    - Allow admins to manage user's community memberships
    - Fix bug where name/email were being overwritten during updates
    - Add is_admin field to user update SQL statement
    - Default community owner to current user when creating
    Item Visibility Security:
    - Implement access control for item detail pages
    - Items only in private communities require membership to view
    - Non-members see 'Item not found' error
    - Item owners and admins can always view
    - Items in General community are always public
    - Staging items (no communities) only visible to owner/admin
    by Dave Shevett
  • eba5f46 12:59 PM
    Implement community visibility system for items
    - Add explicit community associations via items_communities table
    - Community 1 (General) is default for new items
    - Items can belong to multiple communities or none (staging/invisible)
    - Home page filters items by user's subscribed communities
    - Anonymous users see General community items only
    - Update item creation/editing forms to select communities
    - Add getUserCommunityIds() to fetch user's subscriptions
    - Update getAllItemsFromDb() to accept array of community IDs
    - Display community visibility on item detail page
    - Tighten vertical spacing on item detail page
    - Remove 'All Communities' concept in favor of explicit associations
    by Dave Shevett

December 27, 2025

  • 193f6c9 10:13 PM
    Add community association feature for items
    - Add community selection when creating/editing items
    - Create items_communities junction table for many-to-many relationships
    - Add 'All Communities' option with automatic deselection logic
    - Fix edit item modal to include community checkboxes on all pages
    - Add community detail page (page=community)
    - Add join/leave community functionality for logged-in users
    - Fix AJAX handlers to properly process community associations
    - Remove duplicate backward compatibility handler block
    - Clean up debug logging and backup files
    - Update JavaScript to send POST data correctly
    by Dave Shevett
  • b670fd0 8:19 PM
    Update Communities nav link text to match other links
    Changed 'Communities' to 'Browse communities' to match the verb-based
    pattern of other navigation links (View, Make, Browse)
    by Dave Shevett
  • df4e14f 8:16 PM
    Make communities page public with admin-only controls
    Changes:
    - Communities page now accessible to everyone (removed admin-only check)
    - Changed title from 'Community Management' to 'Communities'
    - Add/Edit/Delete controls only visible to administrators
    - 'Add New Community' button hidden from non-admins
    - Edit and Delete buttons in table hidden from non-admins
    - 'Back to Admin' button only shown to admins
    - Added 'Communities' link to main navigation menu
    - Updated table colspan and messaging for public users
    - All PHPStan checks passing
    by Dave Shevett
  • 28cce16 7:56 PM
    Create users_communities junction table
    - New many-to-many relationship between users and communities
    - Allows users to belong to multiple communities
    - Allows communities to have multiple users
    - Indexes on user_id and community_id for fast lookups
    - Unique constraint on (user_id, community_id) pair
    - Idempotent migration with hasTable() check
    - Tested successfully
    by Dave Shevett
  • 040e983 6:51 PM
    Ensure all migrations are idempotent + add guidelines
    - Fixed add_is_admin_to_users migration to check if column exists
    - Created MIGRATION_GUIDELINES.md with best practices
    - All migrations now safe to re-run multiple times
    - Memory created to enforce idempotency for all future migrations
    by Dave Shevett
  • cd90085 6:47 PM
    Make migration idempotent: check if columns exist before renaming
    Migration was partially completed on production, causing errors on re-run.
    Now checks each step:
    - Check if item_tracking_number exists before renaming in claims
    - Check if item_tracking_number exists before renaming in items_communities
    - Check if tracking_number exists before renaming in items
    - Check if PRIMARY KEY exists before adding it
    - Safe to re-run multiple times
    by Dave Shevett
  • 0c40aba 6:45 PM
    Fix migration: Remove AUTO_INCREMENT before dropping PRIMARY KEY
    MySQL requires AUTO_INCREMENT to be removed before dropping PRIMARY KEY.
    Added MODIFY COLUMN step to convert id from AUTO_INCREMENT to regular INT.
    by Dave Shevett
  • e6d8e35 6:41 PM
    Fix migration for production: handle existing auto-increment id column
    - Check if auto-increment id column exists (prod vs dev difference)
    - Drop primary key and old id column before renaming tracking_number
    - Add primary key to renamed id column
    - Fixes 'Duplicate column name' error on production deploy
    by Dave Shevett
  • 7e81b7f 6:34 PM
    Major refactoring: Rename tracking_number to id and create items_communities table
    Database changes:
    - Renamed items.tracking_number to items.id
    - Renamed claims.item_tracking_number to claims.item_id
    - Renamed items_communities.item_tracking_number to items_communities.item_id
    - Created new items_communities junction table for many-to-many relationship
    Code changes:
    - Updated 12 PHP files (includes, templates, src)
    - Updated 1 JavaScript file (app.js)
    - Replaced 161 occurrences of tracking_number with id across codebase
    - All PHPStan checks passing
    - All functionality tested and working
    by Dave Shevett
  • 72909d4 4:29 PM
    Fix communities CRUD functionality
    - Fixed modal display issue: removed inline style conflict with CSS class
    - Fixed JavaScript event listener initialization with DOMContentLoaded
    - Fixed delete function to send action parameter in POST body
    - All CRUD operations (Create, Read, Update, Delete) now working correctly
    by Dave Shevett
  • 5fd143c 3:59 PM
    Migrate images and utilities functions out of functions.php
    - Moved 14 image/AWS functions to includes/images.php
    - Moved 14 utility functions to includes/utilities.php
    - Reduced functions.php from 1800+ lines to 35 lines
    - Complete modularization: 87 functions across 9 modules
    - All PHPStan checks passing
    by Dave Shevett
  • b0dc175 11:22 AM
    Fix waitlist bug and remove orphaned YAML code
    BUG FIX:
    - Fixed getClaimsForItem() to filter for status = 'active'
    - Issue: Removed claims were still showing in waitlist
    - Cause: Query was fetching ALL claims including removed ones
    - Now correctly filters to show only active claims
    CLEANUP:
    - Removed orphaned getItemsClaimedByUser() function (YAML-based)
    - Function was using legacy S3 YAML file iteration
    - Replaced by getItemsClaimedByUserOptimized() (database version)
    - Verified no code uses the old YAML function
    - Removed 105 lines of dead YAML code
    VERIFICATION:
    - All claims operations now use database only
    - No YAML references remain in claims.php
    - PHPStan clean: 0 errors
    - claims.php: 582 โ†’ 477 lines
    The waitlist now correctly updates when members are removed.
    by Dave Shevett
  • ddb93d3 10:47 AM
    Migrate items and claims functions to modular files
    ITEMS.PHP (13 functions, 588 lines):
    - getAllItemsEfficiently, getAllItemsFromDb, getUserItemsFromDb, getUserItemsEfficiently
    - getItem, getItemFromDb, createItemInDb, updateItemInDb
    - markItemAsGone, relistItem, isItemGone
    - clearItemsCache, shouldClearItemsCache
    CLAIMS.PHP (14 functions, 582 lines):
    - addClaimToItem, removeClaimFromItem, removeMyClaim
    - getActiveClaims, getPrimaryClaim, getUserClaimPosition
    - isUserClaimed, canUserClaim, hasUserClaimedItem
    - getItemsClaimedByUser, getItemsClaimedByUserOptimized
    - getClaimsForItem, getClaimedItemsByUser, createClaimInDb
    PROGRESS:
    - functions.php: 2,391 โ†’ 1,229 lines (1,162 lines moved)
    - Completed modules: core, auth, users, communities, items, claims
    - Remaining: 28 functions (images, cache, utilities)
    - PHPStan clean: 0 errors
    Modular structure now contains 1,991 lines in 6 completed modules:
    - core.php: 132 lines
    - auth.php: 135 lines
    - users.php: 423 lines
    - communities.php: 131 lines
    - items.php: 588 lines
    - claims.php: 582 lines
    by Dave Shevett
  • 2350b30 9:48 AM
    Remove duplicate function definitions from functions.php
    - Remove all functions now defined in modular files (core, auth, users, communities)
    - Removed 895 lines of duplicate code
    - functions.php now 2,391 lines (down from 3,286)
    - Remaining 55 functions will be moved to placeholder modules later
    - PHPStan clean: 0 errors
    Functions removed (now only in modular files):
    - core.php: escape, getDbConnection, testDbConnection, redirect, CSRF functions
    - auth.php: isLoggedIn, getCurrentUser, isAdmin, canUserEditItem, etc.
    - users.php: getUserById, createUser, updateUser, getAllUsers, user settings, etc.
    - communities.php: getAllCommunities, getCommunityById, create/update/delete
    Remaining functions (to be moved):
    - 55 functions for items, claims, images, cache, utilities modules
    by Dave Shevett
  • c4c5b75 9:26 AM
    Major refactor: Modularize functions + Add communities feature
    REFACTOR:
    - Split monolithic functions.php (3,082 lines) into 10 modular files
    - Created core.php: Database, escaping, redirects, CSRF (3.0 KB)
    - Created auth.php: Authentication and authorization (2.9 KB)
    - Created users.php: User management (12 KB)
    - Created communities.php: Community CRUD (3.1 KB)
    - Created placeholder modules: items.php, claims.php, images.php, cache.php, utilities.php
    - Updated functions.php to loader pattern with function_exists() guards
    - All functions wrapped to prevent duplicate definitions
    - PHPStan clean: 0 errors
    COMMUNITIES FEATURE:
    - Add communities management system (admin-only)
    - Create communities database migration
    - Add CRUD interface with modal form
    - Display all communities in sortable table
    - Show community short name, full name, description, owner
    - Link from admin page to communities management
    - Fix modal CSS specificity to prevent conflicts
    Benefits:
    - Better code organization and maintainability
    - Easier to find and modify specific functions
    - Clear separation of concerns by domain
    - Scalable structure for future growth
    - Backward compatible with existing code
    by Dave Shevett
  • 29f2e9a 8:33 AM
    Add user management table to admin page
    - Add getAllUsers() function to fetch all users from database
    - Add comprehensive user table displaying all user fields
    - Show admin status with three levels: SUPER (config), Yes (db), No
    - Display profile pictures, verification status, and notification preferences
    - Include total user count and responsive design
    by Dave Shevett

December 26, 2025

  • 3884a38 4:11 PM
    Remove unused YAML-based code and dashboard template
    - Delete templates/dashboard.php (replaced by user-listings)
    - Remove getUserItems() and userOwnsItem() methods from AuthService (YAML-based)
    - Remove awsService dependency from AuthService constructor
    - Update currentUserOwnsItem() to use database instead of YAML
    - Remove 'dashboard' from available pages list
    by Dave Shevett
  • 797a43b 3:15 PM
    Add PHPStan/PHPCS, fix code quality issues, and fix edit form bug
    Code Quality Improvements:
    - Add PHPStan (static analysis) and PHP_CodeSniffer (style checker)
    - Auto-fix 1,458 PSR-12 style violations across 18 files
    - Remove trailing whitespace, fix indentation, standardize formatting
    - PHPStan now reports zero errors at level 5
    Bug Fixes:
    - Fix edit item form POST body formatting (spaces around = and &)
    - Fix uniqid() type error - cast time() to string
    - Fix dead catch blocks - use \Exception instead of AwsException
    - Fix isset() on resources - use is_resource() instead
    - Initialize template variables to prevent undefined variable warnings
    - Remove redundant isset/empty checks
    Files Added:
    - phpstan.neon - PHPStan configuration
    - phpcs.xml - PHP_CodeSniffer configuration
    - Updated composer.json with dev dependencies
    by Dave Shevett
  • 62d70bb 1:15 PM
    Replace custom license with CC BY-NC-SA 4.0
    - Replace custom non-commercial license with standard CC BY-NC-SA 4.0
    - Add ShareAlike requirement: derivatives must use same license
    - Include trademark notice protecting 'ClaimIt' name
    - Update README with CC license badge and clear terms
    - Maintain non-commercial restriction and attribution requirements
    - Better international legal recognition and clarity
    by Dave Shevett
  • 3650340 12:52 PM
    Add is_admin flag to users table and fix migration issues
    - Add is_admin boolean column to users table (defaults to false)
    - Update isAdmin() to check master admin in config first, then database flag
    - Fix AddMissingColumnsToItems migration to check if columns exist before adding
    - Fix migration to check if claims table exists before creating
    - Allows multiple users to have admin privileges beyond config master admin
    by Dave Shevett
  • caffd9a 12:44 PM
    Migrate search function from YAML to database
    - Replace S3 YAML file search with fast SQL query
    - Search across title, description, tracking_number, user_name, contact_email
    - Use single database query with LIKE instead of downloading all YAML files
    - Massive performance improvement: milliseconds instead of seconds
    - Still respects user's 'show gone items' preference
    - Limit results to 100 items for performance
    - Order by most recent first
    by Dave Shevett
  • 8d1ed9a 12:39 PM
    Update README to reflect current ClaimIt platform features
    - Correct description: community item sharing/marketplace (not claims management)
    - Add all current features: Google OAuth, AWS S3/CloudFront, MySQL, claiming system
    - Update project structure with all current files and directories
    - Add database migration instructions with Phinx
    - Include AWS and Google OAuth configuration references
    - Add deployment checklist and production setup
    - Document admin features and user dashboard
    - Update license information to non-commercial license
    - Add links to all documentation files
    - Include required PHP extensions and dependencies
    - Add changelog generation instructions
    - Update version history to v2.0 (2025)
    by Dave Shevett
  • c2e672d 12:33 PM
    Add non-commercial source license
    - Allows free use, modification, and distribution for non-commercial purposes
    - Prohibits charging money for the software or services based on it
    - Permits use of 'ClaimIt' name with proper attribution
    - Requires link back to original repository
    - Copyright held by Stonekeep Consulting, Inc.
    by Dave Shevett
  • fb8b71e 9:21 AM
    Show actual user names in social media previews for user-listings
    - Query database for user's display_name instead of showing user ID
    - Get accurate item count from items table
    - Fallback to 'User' if database unavailable or user not found
    - Social previews now show 'John Smith's Items' instead of 'User #123...'
    by Dave Shevett
  • 91b1baa 9:17 AM
    Add note to 'Items gone' stat when filtered from view
    - Shows '(not currently visible)' when user has hidden gone items
    - Only displays when gone items exist but are filtered
    - Added styling for subtle, italic note text
    by Dave Shevett
  • 2f58eda 9:06 AM
    Fix user-listings stats to show accurate counts regardless of display preference
    - Added getUserItemStats() function that queries database for accurate counts
    - Stats now show correct totals even when 'Don't show gone items' is enabled
    - Uses single efficient SQL query with aggregations
    - Dashboard stats (total, free, for sale, gone, with claims) now always accurate
    by Dave Shevett
  • bf60cac 8:30 AM
    chore: whitespace
    by Dave Shevett

December 17, 2025

  • 7a40c5b 10:13 PM
    Add missing columns to items table and create claims table
    - Added columns: contact_email, image_width, image_height, user_name, user_email
    - Added columns: submitted_at, submitted_timestamp, gone, gone_at, gone_by, relisted_at, relisted_by
    - Created claims table with proper indexes
    - These columns are needed for the migration script to work
    by Dave Shevett
  • 933804c 10:03 PM
    Fix: Add table creation code to items migration
    The migration file was created but was empty. Added proper Phinx code to create the items table with all columns and indexes.
    by Dave Shevett
  • eae0ae6 9:52 PM
    Migrate items to database and fix HTML syntax error
    - Created items table migration with full schema
    - Added migration script to move items from S3 YAML to database
    - Updated functions.php to use database for item storage
    - Modified templates to work with database-backed items
    - Fixed duplicate closing HTML tag in index.php
    - Added migration summary documentation
    by Dave Shevett

November 30, 2025

  • 6256d18 10:52 PM
    Complete migration to MySQL for user preferences
    - Update EmailService to use MySQL database functions instead of S3 YAML files
    - isEmailNotificationsEnabled() now uses getUserEmailNotifications() from database
    - getUsersWithNewListingNotifications() now queries MySQL directly
    - Remove deprecated saveUserProfile() and loadUserProfile() methods from AuthService
    - All user preferences (show_gone_items, email_notifications, new_listing_notifications) now fully MySQL-based
    by Dave Shevett

November 29, 2025

  • 39a2973 5:43 PM
    Fix migration script for production environment
    - Use parseSimpleYaml() instead of yaml_parse() (no YAML extension required)
    - Add error_reporting for better debugging
    - Show error messages inline during migration
    - Include stack traces in error summary
    - Better error handling for YAML parsing failures
    by Dave Shevett
  • 3e9fa2f 5:35 PM
    Migrate user data from S3 to MySQL database
    - Add database helper functions (getUserById, createUser, updateUser, saveUser)
    - Update AuthService to use MySQL instead of S3 for user accounts
    - Update settings page handler to save directly to database
    - Update all user preference functions to read from database
    - getUserEmailNotifications, getUserNewListingNotifications
    - getUserShowGoneItems, saveUserShowGoneItems
    - getUserDisplayName, getUserZipcode
    - Update migration script to merge JSON account data + YAML preferences
    - Session data now stays in sync with database
    - Old S3 methods marked as deprecated but kept for reference
    This completes the migration from flat files to relational database for
    all user data. Items will be migrated in a future update.
    by Dave Shevett
  • cc9384a 4:19 PM
    Add user migration script from S3 JSON to MySQL
    - Create scripts/migrate_users_to_db.php for one-time data migration
    - Migrates user account data from S3 JSON files to MySQL users table
    - Safe to run multiple times (skips existing users)
    - Uses AwsService wrapper methods (listObjects, getObject)
    - Respects DEVELOPMENT_MODE for environment-specific migration
    - Provides detailed progress output and error reporting
    - Ready to migrate 37 production users to claimit_prod database
    by Dave Shevett
  • ebe7b5c 2:25 PM
    Remove config.php from git tracking
    - Remove config/config.php from repository
    - File is already in .gitignore
    - Prevents git pull from overwriting production credentials
    - Each environment maintains its own config.php locally
    by Dave Shevett
  • 5126866 2:09 PM
    Add PHP 8.3 platform constraint for production compatibility
    - Add platform config to force PHP 8.3 compatible dependencies
    - Downgrade Symfony packages from v8.0 to v7.4 for PHP 8.3 support
    - Ensures composer.lock works on both dev (PHP 8.4) and prod (PHP 8.3)
    - Fixes dependency resolution errors in production deployment
    by Dave Shevett
  • 019b2bd 1:54 PM
    Move Phinx to production dependencies
    - Move robmorgan/phinx from require-dev to require
    - Ensures Phinx is available on production for migrations
    - Fixes 'vendor/bin/phinx: No such file or directory' error in deployment
    by Dave Shevett
  • 262514a 1:40 PM
    Improve deployment workflow with verbose output
    - Add detailed logging to GitHub Actions deployment
    - Add section separators for better readability
    - Add explicit echo statements for each deployment step
    - Make Phinx migration output clearly visible in logs
    - Add set -e to exit on any error
    by Dave Shevett
  • 52bd03d 1:29 PM
    Fix users table migration and add to deployment pipeline
    - Fix CreateUsersTable migration with proper NOT NULL constraints
    - Add database migration step to GitHub Actions deploy workflow
    - Migrations now run automatically on production deployment
    - Users table structure matches existing YAML/JSON format
    by Dave Shevett
  • 7bfbcd6 9:41 AM
    Add Phinx migrations and create users table
    - Install Phinx for database schema management
    - Configure Phinx to use RDS credentials from config.php
    - Create initial migration for users table with:
    - Google OAuth fields (id, email, name, picture, etc.)
    - User settings (display_name, zipcode, notifications, etc.)
    - Proper indexes and constraints
    - Ready to test deployment pipeline to production
    by Dave Shevett

November 28, 2025

  • 656fdf5 7:59 PM
    Add RDS MySQL database connectivity
    - Add database configuration with environment-based switching
    - Create getDbConnection() and testDbConnection() helper functions
    - Add database connection test tool to admin page
    - Show database info in admin panel (name, environment)
    - Add config.example.php template for deployment
    - Keep actual config.php with credentials local (in .gitignore)
    - Support claimit_dev and claimit_prod databases
    by Dave Shevett
  • c898846 11:12 AM
    Fix image path handling across entire application
    - Ensure all image keys consistently include images/ prefix throughout
    - Fix item detail page to store full S3 path with images/ prefix
    - Fix getItemImages() to return full paths instead of stripping prefix
    - Remove manual images/ prepending in delete/rotate handlers
    - Remove manual images/ prepending in CDN bypass blocks
    - Fixes image display bug in item detail view and thumbnails
    by Dave Shevett
  • 3f20c8e 10:59 AM
    Fix image paths and improve dev environment
    - Fix image path bug: ensure images/ prefix is included in S3 keys
    - Add CloudFront bypass in development mode for immediate updates
    - Configure dev-php.ini to log errors to stderr for terminal visibility
    - Fix EmailService to dynamically use current port (8000/8080)
    - Strip images/ prefix for CloudFront URLs (origin path is /images)
    by Dave Shevett

November 27, 2025

  • 46f7dbf 2:01 PM
    Add admin page and improve dev environment setup
    - Create new admin page (templates/admin.php) for administrative functions
    - Move test email functionality from settings to admin page
    - Add admin menu item in user dropdown (visible only to admins)
    - Configure dev-php.ini with proper error reporting for development
    - Fix redirect() function to support localhost:8080
    - Add error logging for authentication failures
    - Add admin to page whitelist and auth-required pages
    by Dave Shevett

November 20, 2025

  • 78c7d8f 7:49 PM
    Center loading indicator on home page
    - Fix loading message being offset to the left
    - Add CSS to make loading indicator span all grid columns and center horizontally
    - Loading indicator now properly centered when it's the only child in items-grid
    by Dave Shevett
  • ccb8737 5:43 PM
    Add search functionality with compact search box in navigation
    by Dave Shevett

November 15, 2025

  • 0b1080b 10:38 PM
    Add paste-to-upload with validation and loading overlay
    New Features:
    - Paste images directly with Ctrl+V/Cmd+V on claim page
    - Client-side file size validation (8MB limit)
    - Professional loading overlay during upload (~10 seconds)
    - Image preview for pasted and selected files
    Paste-to-Upload:
    - Detects images in clipboard and auto-attaches to file input
    - Creates proper File object from pasted blob
    - Works with screenshots, copied images, etc.
    - Shows instant preview with success message
    File Size Validation:
    - Client-side validation before upload (8MB limit)
    - Matches PHP's actual upload limit to prevent failures
    - Shows red error box with actual file size if too large
    - Applies to both pasted and manually selected images
    - Updated all error messages and help text to reflect 8MB limit
    Loading Overlay:
    - Appears when form is submitted with valid data
    - Centered modal with animated spinner
    - Clear messaging: 'Posting Your Listing...'
    - Prevents double-submission by disabling button
    - Professional design with dark semi-transparent background
    Bug Fixes:
    - Removed closing PHP tags from config.php and functions.php
    - Fixed 'headers already sent' errors caused by whitespace
    - Added output buffering to allow redirects from templates
    - Updated redirect() function to discard output buffer
    Technical:
    - Added ob_start() in index.php for output buffering
    - Updated redirect() to call ob_end_clean() before header
    - Client-side JS validates required fields before showing overlay
    - All file size checks now consistent at 8388608 bytes (8MB)
    UX Improvements:
    - Faster workflow - paste screenshots directly
    - Immediate feedback on file size issues
    - Visual confirmation during upload process
    - Prevents confusion during slow uploads
    by Dave Shevett
  • 787c1dc 9:53 PM
    Add paste-to-upload image functionality
    New Feature:
    - Users can now paste images directly from clipboard (Ctrl+V or Cmd+V)
    - Works on the claim page when posting new items
    - Automatically attaches pasted image to file input
    Implementation:
    - Added paste event listener to detect clipboard images
    - Creates File object from pasted blob and assigns to file input
    - Shows instant preview of pasted image with success message
    - Also shows preview for manually selected files
    - Handles cleanup of object URLs to prevent memory leaks
    UX Improvements:
    - Added helpful hint: 'Press Ctrl+V (or Cmd+V) to paste'
    - Visual feedback with green success box and image preview
    - Preview shows max 300x200px thumbnail
    - Works with screenshots, copied images, etc.
    Usage:
    1. Copy an image (screenshot, right-click copy, etc.)
    2. Go to claim page
    3. Press Ctrl+V (Windows/Linux) or Cmd+V (Mac)
    4. Image is attached and preview shown
    5. Submit form normally
    Makes posting items much faster and more convenient!
    by Dave Shevett
  • 09a33a7 7:59 PM
    Set changelog timezone to Eastern Time (EDT/EST)
    Changes:
    - Added date_default_timezone_set('America/New_York') to generator
    - Automatically handles EDT (summer) and EST (winter) transitions
    - All timestamps now display in local Eastern time instead of GMT
    - Regenerated changelog with 110 commits showing correct times
    Example: '7:58 PM' instead of '12:58 AM' (GMT)
    This makes commit times more intuitive for development team.
    by Dave Shevett
  • 2c99b9a 7:53 PM
    Fix deploy workflow to handle local file changes
    Issue:
    - Production server had local changes to composer.lock
    - Git pull was aborting due to conflicts
    - New files (scripts/generate-changelog.php) weren't being pulled
    - Changelog generation failed with 'Could not open input file'
    Solution:
    - Added 'git stash' before 'git pull' in deploy workflow
    - Stashes any local changes on server before pulling
    - Allows clean pull without conflicts
    - Ensures all new files are properly deployed
    This prevents deployment failures when files are modified on server.
    by Dave Shevett
  • 885b013 7:47 PM
    Tighten changelog spacing and remove blank lines
    Changes:
    - Reduced line-height for better text density (1.3 for subjects, 1.4 for body)
    - Added regex filter to collapse multiple newlines into single ones
    - Removes excessive blank lines between bullet points in commit messages
    - Regenerated changelog with 108 commits
    Result: Cleaner, more compact changelog display
    by Dave Shevett
  • bb00ce6 7:40 PM
    Fix navigation links to work from clean URLs
    Issue:
    - Navigation links used relative URLs (?page=home)
    - When on /changelog, links became /changelog?page=home
    - Router didn't recognize these, so navigation broke
    Solution:
    - Changed all navigation links to absolute URLs (/?page=home)
    - Works correctly from any page including clean URLs
    - Affects: header nav, footer, login, settings, logout links
    Testing: Navigation now works from /changelog page
    by Dave Shevett
  • bdea7cc 7:28 PM
    Add automated changelog feature
    New Features:
    - Automated changelog generation from git commit history
    - Accessible at /changelog with clean URL routing
    - Displays commits grouped by date with full details
    - Shows commit hash, subject, body, author, and timestamp
    - Auto-generates during deployment via GitHub Actions
    Files Added:
    - scripts/generate-changelog.php: Generates changelog JSON from git log
    - templates/changelog.php: Displays changelog with nice formatting
    - public/data/changelog.json: Generated changelog data (106 commits)
    Updates:
    - .github/workflows/deploy.yml: Added changelog generation step
    - router.php: Added /changelog route mapping
    - public/index.php: Added 'changelog' to available pages & footer link
    Implementation:
    - Changelog script parses git log with formatted output
    - Groups commits by date for better organization
    - Filters out merge commits for cleaner history
    - JSON output includes full commit details
    - Template displays in card layout with hover effects
    - Runs automatically on every deployment
    - Can also be run manually: php scripts/generate-changelog.php
    UI:
    - Modern card-based layout
    - Grouped by date with collapsible sections
    - Monospace font for commit hashes
    - Shows total commit count and last update time
    - Responsive design matching site style
    by Dave Shevett
  • b2ff04d 7:08 PM
    Fix PHP 8.4 AWS SDK compatibility warnings
    Issue:
    - AWS SDK was trying to parse system ~/.aws/config files
    - PHP 8.4's stricter INI parser was throwing warnings about
    incompatible multi-line syntax (e.g., 's3 =' with no value)
    - Warning: 'syntax error, unexpected = in Unknown on line X'
    Solution:
    - Added 'use_aws_shared_config_files' => false to AWS client configs
    - This prevents SDK from loading ~/.aws/config and ~/.aws/credentials
    - App now only uses credentials from config/aws-credentials.php
    - Eliminates PHP 8.4 compatibility warnings completely
    Also:
    - Updated aws/aws-sdk-php from 3.356.5 to 3.359.13
    - Better PHP 8.4 support in newer SDK version
    Result: Clean console output, no AWS warnings
    by Dave Shevett
  • b34bbca 6:39 PM
    Add multiple images per listing feature
    Major Features:
    - Support up to 10 images per listing
    - Thumbnail gallery with click-to-swap main image
    - Add/rotate/delete individual images (owners only)
    - Smart CDN cache bypass for instant updates after rotation
    File Naming:
    - Primary image: 20251115171627-a7k3.jpg (no index)
    - Additional images: 20251115171627-a7k3-1.jpg, -2.jpg, etc.
    New Helper Functions:
    - getItemImages() - Fetches all images for an item
    - getImageIndex() - Extracts index from filename
    - deleteImageFromS3() - Safely deletes images with validation
    - getNextImageIndex() - Gets next available slot
    New API Endpoints:
    - upload_additional_image - Add images to existing listings
    - delete_image - Delete specific images (prevents deleting last/primary)
    - rotate_image (updated) - Now supports rotating any image by index
    UI Enhancements:
    - Thumbnail gallery below main image
    - Hover controls on thumbnails (rotate/delete buttons)
    - Click thumbnails to view in main display
    - Add Image button for owners (when < 10 images)
    - Informational note on upload form
    Bug Fixes:
    - Fixed tracking number validation for new format (YmdHis-xxxx)
    - Updated both POST and GET-based request handlers
    - Fixed delete_item action mismatch in multiple templates
    - Fixed image index extraction in both PHP and JavaScript
    - Fixed thumbnail click event blocking by overlay controls
    - Fixed CloudFront CDN bypass for thumbnail images after rotation
    Backward Compatibility:
    - Old format (YmdHis) still fully supported
    - Single-image listings work as before
    - All validation handles both formats
    by Dave Shevett
  • 2b848d5 10:49 AM
    Add random suffix to tracking numbers to prevent upload collisions
    - Changed tracking number format from YmdHis to YmdHis-xxxx
    - Adds 4-character random hex suffix (65,536 combinations per second)
    - Prevents filename collisions when multiple users upload simultaneously
    - Only affects new uploads; existing files remain unchanged
    by Dave Shevett

October 27, 2025

  • 0324c32 11:09 PM
    Fix image rotation with CloudFront CDN caching
    - Add CloudFront invalidation support to clear CDN cache after image rotation
    - Implement hybrid approach: direct S3 URLs for immediate display + CloudFront invalidation
    - Add bypass_cdn flag to use presigned S3 URLs while CloudFront cache propagates
    - Fix broken cache clearing functions that weren't actually clearing PHP static caches
    - Add CloudFront distribution ID to AWS config
    - Update aws-credentials.example.php with CloudFront configuration template
    This ensures users see rotated images immediately without cache-related delays or image 'pop-back' issues.
    by Dave Shevett

October 9, 2025

  • dc605e7 11:22 AM
    Fix image rotation functionality
    - Fix image key lookup to use correct 'images/' prefix for S3 storage
    - Add cache-busting timestamp to force CloudFront refresh after rotation
    - Enhance JavaScript to immediately update image with cache-busting parameter
    - Improve user experience with better visual feedback and timing
    Fixes issue where rotated images weren't displaying due to CloudFront caching.
    by Dave Shevett

September 29, 2025

  • 49d1887 1:42 PM
    Improve loading indicators and fix layout issues
    - Enhanced loading indicator design with rounded box and animated dots
    - Improved horizontal centering of loading indicators
    - Added smooth scaling animation for loading dots with staggered timing
    - Better typography and color contrast for loading text
    - Enhanced error message styling with helpful instructions
    - Fixed broken CSS grid layout on items and user-listings pages
    - Restored proper grid rendering after layout issues
    - Maintained improved loading indicator on home page
    - All pages now have consistent, professional loading experience
    by Dave Shevett
  • 3b46163 12:23 PM
    Optimize user-listings page performance
    - Add getUserItemsEfficiently() function with batch YAML loading
    - Add getItemsClaimedByUserOptimized() function to eliminate AWS API bottlenecks
    - Replace O(nร—m) image searches with O(1) lookup tables
    - Pre-process claims data to avoid redundant AWS calls
    - Add 5-minute caching for user items and claimed items
    - Reduce template rendering time from 6+ seconds to milliseconds
    - Maintain all existing functionality while dramatically improving performance
    - Add comprehensive performance logging for monitoring
    by Dave Shevett
  • 1b413e0 11:31 AM
    Add mailto button for contacting claimants
    - Add email button next to each claimant on item page (only for item owners)
    - Pre-fill email with subject and body template for easy communication
    - Style both mailto and delete buttons with consistent pale green background
    - Improve button visibility with better contrast and unified design
    - Only show mailto button if claimant has email address
    - Secure implementation with proper escaping and conditional display
    by Dave Shevett

September 27, 2025

  • 9e36ae7 4:16 PM
    Add smtp-config.php to .gitignore
    - Prevent accidental commits of SMTP configuration file containing sensitive data
    - Ensures production deployments won't conflict with local SMTP config files
    by Dave Shevett

September 26, 2025

  • af2b77b 12:45 PM
    Add new listing notifications feature and fix image upload regression
    - Add 'Notify me of any new listings' checkbox to settings page (defaults to unchecked)
    - Create getUserNewListingNotifications() function to retrieve user preferences
    - Update settings save handler to include new listing notification preference
    - Add sendNewListingNotifications() method to EmailService for bulk notifications
    - Create beautiful HTML and text email templates for new listing notifications
    - Integrate email notifications when new items are posted
    - Fix image upload regression - store images in images/ subdirectory for CloudFront compatibility
    - Fix EmailService listObjects() array structure access (use 'objects' key and lowercase 'key' property)
    - Add comprehensive error handling and logging for email notifications
    - Exclude item owner from receiving notifications about their own items
    by Dave Shevett
  • e83a741 12:09 PM
    Replace settings modal with dedicated settings page
    - Create new /settings page with modern responsive design
    - Remove settings modal from home page to improve performance
    - Update navigation to link to dedicated settings page
    - Clean up JavaScript by removing modal-related functions
    - Fix checkbox layout styling for better visual balance
    - Maintain all existing settings functionality
    - Add account information sidebar with user details
    - Improve mobile responsiveness and user experience
    by Dave Shevett

September 24, 2025

  • 1ce1a0d 9:19 AM
    Implement SMTP email notifications with admin test functionality
    - Add email notification checkbox to user settings
    - Create EmailService class with SMTP support
    - Add administrator test email functionality
    - Support both authenticated and non-authenticated SMTP
    - Add comprehensive SMTP debugging and error handling
    - Support TLS/SSL with certificate verification options
    - Add helo_hostname configuration for proper SMTP identification
    - Include beautiful HTML and plain text email templates
    - Integrate email notifications when items are claimed
    by Dave Shevett

September 18, 2025

  • ad7fe88 7:39 PM
    Fix CloudFront image URLs to work with /images origin path
    - Updated getCloudFrontUrl() to remove /images prefix from generated URLs
    - Updated image detection logic to look for images in images/ folder in S3
    - Fixed image loading in getAllItemsEfficiently(), user-listings, and item templates
    - CloudFront now correctly maps requests to S3 images/ folder via origin path
    by Dave Shevett

September 16, 2025

  • 208bec9 6:15 PM
    Fix missing images on user-listings page by adding image_url generation
    by Dave Shevett
  • 1b1f40a 5:50 PM
    Fix regression: Show claim status for logged-out users
    - Always compute activeClaims and primaryClaim in getAllItemsEfficiently()
    - Previously only computed claim data when user was logged in
    - Now logged-out users can see if items have been claimed
    - User-specific data (isUserClaimed, canUserClaim) still only computed for logged-in users
    - Fixes claim status display on home and items pages for anonymous users
    by Dave Shevett
  • 497115e 5:43 PM
    Implement CloudFront CDN integration for massive performance improvement
    by Dave Shevett
  • b423c75 3:56 PM
    Add configurable debug logging system
    - Add DEBUG configuration option in config.php (default: 'no')
    - Create debugLog() function that only logs when DEBUG='yes'
    - Convert all performance timing logs to use debugLog() instead of error_log()
    - Enable detailed timing logs for:
    - YAML file discovery and batch loading
    - Image URL generation (getCachedPresignedUrl)
    - YAML processing and item creation
    - AJAX request timing (getAllItemsEfficiently, template rendering)
    - Page load timing (routing, auth, Open Graph data, template rendering)
    Usage:
    - Set DEBUG='yes' in config.php to enable detailed performance logs
    - Set DEBUG='no' in config.php to suppress performance logs (default)
    - All timing logs now appear in server output when DEBUG is enabled
    - Clean server output when DEBUG is disabled
    by Dave Shevett
  • 28a728c 3:45 PM
    Major performance optimization: pre-compute expensive operations
    - Pre-generate image URLs during getAllItemsEfficiently() to avoid AWS calls during template rendering
    - Pre-compute item states (isItemGone, canEditItem) to avoid function calls during template rendering
    - Pre-compute claim data (activeClaims, primaryClaim, isUserClaimed, canUserClaim) to avoid AWS calls during template rendering
    - Add comprehensive performance timing logs to identify bottlenecks
    - Add performance display in footer for monitoring
    Performance improvements:
    - Total AJAX request time: 6.5s โ†’ 3.7s (43% improvement)
    - Template rendering time: 4.5s โ†’ 1.6s (64% improvement)
    - Individual item rendering: 225-265ms โ†’ 75-90ms (65% improvement)
    This eliminates the N+1 problem where expensive AWS calls were being made for each item during template rendering.
    by Dave Shevett

September 14, 2025

  • 0e520f7 10:23 PM
    Fix Open Graph meta tags undefined array key errors
    - Add fallback case for item pages when item data is not available
    - Add safety checks to ensure required meta tag keys always exist
    - Prevent undefined array key warnings and null parameter deprecation errors
    - Ensure graceful fallbacks for all Open Graph meta tag scenarios
    - Fix production errors: undefined 'title', 'description', 'type' keys
    by Dave Shevett
  • d2a1d9e 10:20 PM
    Enhance Open Graph meta tags for better link unfurling
    - Add item title and description to Open Graph meta tags for item pages
    - Format title as 'Item #ID - [Item Title]' for better link previews
    - Include item description and price in meta description
    - Add image detection for Open Graph image previews
    - Implement graceful fallbacks when item data unavailable
    - Improve link sharing experience in Slack, Discord, and social media
    - Single S3 call per item page for meta tag data (performance optimized)
    by Dave Shevett
  • 119b6fe 12:20 PM
    Enhance user-listings dashboard with comprehensive stats
    - Rename 'Items Claimed' to 'Items I've claimed' for better clarity
    - Add 'Items people have claimed' stat showing items with active claims
    - Add 'Items gone' stat showing items marked as gone
    - Fix claims counting logic to use proper claims array structure
    - Optimize stats calculation by including claims data in item processing
    - Add responsive CSS for 6 stat cards with mobile-friendly layout
    - Support waitlist functionality with proper active/removed claim status
    - Improve dashboard visual design with hover effects and better spacing
    by Dave Shevett
  • 1463f86 12:01 PM
    Implement batching mechanism for YAML file loading
    - Load all YAML files in batches of 20 to prevent performance issues
    - Users now see all items instead of being limited to first 20
    - Added detailed performance logging for batch processing
    - Maintains reasonable load times (6-7s) while showing complete catalog
    - Improved error handling for individual file failures
    - Reverted from parallel HTTP approach to optimized sequential batching
    by Dave Shevett
  • 8172575 11:18 AM
    Remove pagination functionality
    - Removed pagination parameters and logic from getAllItemsEfficiently()
    - Simplified home and items templates to show all items at once
    - Removed pagination controls and CSS styles
    - Updated AJAX endpoint to load all items without pagination
    - Simplified JavaScript fetch calls to remove pagination parameters
    Performance impact:
    - Initial page loads remain fast (13ms for home page)
    - Item loading now takes longer (7+ seconds) but shows all items
    - Eliminates pagination-related bugs and complexity
    - All items are now visible without navigation controls
    by Dave Shevett

September 13, 2025

  • f4b3ccc 9:26 PM
    Major performance optimizations and OAuth navigation fixes
    - Implemented lazy loading for AWS services to eliminate 5+ second startup delays
    - Added AJAX-based item loading for home page (2ms initial load vs 5+ seconds)
    - Fixed OAuth navigation bar authentication state display
    - Optimized static variable caching and OPcache handling
    - Added loading indicators and error handling for async operations
    - Maintained full functionality while dramatically improving performance
    - Fixed variable name conflicts in home template pagination logic
    Performance improvements:
    - Initial page load: 5.27s โ†’ 0.002s (99.96% faster)
    - Home page with items: 5.27s โ†’ 0.002s + 1.09s async (instant page + deferred items)
    - Navigation bar now properly shows logged-in state on all pages
    - AWS initialization only occurs when actually needed
    by Dave Shevett
  • ced2b8e 9:05 PM
    Major performance optimizations: Fix N+1 S3 API calls, add pagination, implement caching
    - Fixed N+1 S3 API calls: Reduced from 200+ calls to 2-3 calls per page (95% reduction)
    - Implemented pagination: 20 items per page with navigation controls
    - Added aggressive caching: 5-minute item cache, 1-hour image URL cache
    - Optimized image loading: Cached presigned URLs to avoid repeated generation
    - Added cache invalidation: Automatic clearing when items are modified
    - Fixed layout shift: Added image dimensions and CSS aspect-ratio
    - Added performance monitoring: Built-in load time tracking
    Expected performance improvement: 20 seconds โ†’ 1-2 seconds (90% faster)
    by Dave Shevett
  • e72b672 8:00 PM
    Fix item card button positioning and centralize CSS
    - Add flexbox layout to item cards to ensure buttons are always at bottom
    - Make item content and meta sections flexible to push buttons down
    - Centralize all button styling in main CSS file
    - Add complete button color schemes (primary, secondary, success, warning, danger)
    - Add hover effects and transitions for all buttons
    - Add claim status styling for consistent appearance
    - Remove duplicate CSS from item-card.php template
    - Improve responsive design with proper button stacking on mobile
    - Ensure consistent visual hierarchy across all item cards
    by Dave Shevett
  • 9feb3d8 7:49 PM
    Add 'Gone!' functionality for item owners
    - Add markItemAsGone() and relistItem() functions to mark items as gone/not gone
    - Add isItemGone() function to check item status
    - Add getUserShowGoneItems() and saveUserShowGoneItems() for user preferences
    - Add AJAX handlers for mark_gone and relist_item actions
    - Add 'Gone!' and 'Re-list' buttons to item cards for owners
    - Add 'Show gone items' checkbox to user settings modal
    - Filter gone items from listings based on user preference (default: hidden)
    - Fix item data mapping to include gone fields from YAML in all templates
    - Add gone functionality to single item view, items listing, home, and user listings
    - Items marked as gone are hidden by default but can be shown via user setting
    by Dave Shevett
  • 16cc943 4:01 PM
    Add login button for non-logged-in users viewing items
    - Add 'Log in to claim this!' button for non-logged-in users on item cards
    - Button appears when user is not logged in and item is not their own
    - Uses same login link as toolbar login button (?page=login)
    - Styled consistently with other primary buttons
    - Improves user experience by making login requirement clear
    - Only shows in listing/home contexts where users browse items
    Resolves issue where non-logged-in users couldn't easily discover they need to log in to claim items.
    by Dave Shevett

September 10, 2025

  • b4d900e 5:04 PM
    Clean up duplicate code across templates
    - Remove duplicate edit modal HTML from items.php, user-listings.php, and home.php
    - Remove duplicate edit modal CSS from individual templates
    - Remove duplicate JavaScript functions from item.php and index.php
    - Remove duplicate showMessage function from index.php
    - Add centralized edit modal CSS to main stylesheet
    - Centralize all edit functionality in shared files (app.js, index.php, style.css)
    Reduces codebase by ~400+ lines while maintaining full functionality.
    All edit buttons continue to work across all pages.
    by Dave Shevett
  • 1141b4e 4:49 PM
    Add cache-busting parameters to app.js references
    - Add version parameter to all app.js script tags to force browser cache refresh
    - Resolves production issue where edit buttons weren't working due to cached JavaScript
    - Ensures production site loads the latest JavaScript with openEditModalFromButton function
    by Dave Shevett
  • 72349fc 4:14 PM
    Fix edit button functionality across all pages
    - Add edit button to listing context in item-card.php
    - Add JavaScript file references to all templates using item cards
    - Fix JavaScript syntax errors by using data attributes instead of inline parameters
    - Add openEditModalFromButton() function for safer data handling
    - Add edit modal HTML and CSS to items.php, user-listings.php, and home.php
    - Ensure edit functionality works consistently across all item card views
    Resolves edit button not working on items, user-listings, and home pages.
    by Dave Shevett

September 9, 2025

  • fed4fa0 5:08 PM
    Standardize button layouts across all item card views
    - Create consistent button layout with right-justified, same-sized buttons
    - Centralize all button styling in item-card.php template
    - Remove conflicting CSS from individual templates (items.php, user-listings.php, dashboard.php)
    - Standardize button colors: primary (blue), danger (red), secondary (gray), warning (orange)
    - Add responsive design: buttons stack vertically on mobile
    - Improve user experience with consistent button placement and sizing
    - Fix full-width delete button issue on items page
    - Ensure all contexts (listing, dashboard, claimed) use same button layout
    by Dave Shevett
  • a75305e 4:54 PM
    Add image rotation feature for item owners
    - Add rotation button (โ†ป) to single item view for item owners
    - Implement 90-degree clockwise rotation using GD library
    - Support multiple image formats (JPEG, PNG, GIF, WebP)
    - Download image from S3, rotate, and upload back
    - Add proper error handling and user feedback
    - Fix image key detection to work with dynamic image extensions
    - Include loading states and success messages
    - Page refreshes after successful rotation to show updated image
    by Dave Shevett

September 5, 2025

  • e02a2fc 9:08 PM
    Fix admin delete button visibility and permissions
    - Fix backend delete handlers to use canUserEditItem() for proper admin permissions
    - Add delete buttons for admins in all contexts (home, listing, dashboard)
    - Add complete delete functionality to home page (modal, JS, CSS)
    - Fix redirect after deletion to go to home page instead of items page
    - Ensure currentUser is properly passed to item-card template
    - Update error messages to include admin privileges
    Fixes issue where administrators couldn't see delete buttons on home/items pages
    and were getting 'You can only delete your own items' warnings.
    by Dave Shevett
  • f9ace66 8:55 PM
    Implement administrator functionality
    - Add ADMIN_USER_ID configuration in config.php
    - Add isAdmin() and canUserEditItem() helper functions
    - Update item-card.php to show edit/delete buttons for admins
    - Update item.php to show edit/delete buttons for admins
    - Update AJAX handlers to check admin permissions for edit/delete
    - Update user-listings.php to show admin controls for all users
    - Admins can now edit and delete any item, just like item owners
    by Dave Shevett
  • d8c4eb3 4:35 PM
    Fix mobile email client URL encoding issue for Contact Seller links
    - Replace urlencode() with rawurlencode() in all mailto: links
    - Fixes issue where spaces appeared as + signs in mobile email clients
    - Affects Contact Seller links in item-card.php and item.php templates
    - rawurlencode() uses %20 for spaces which is more universally supported
    by Dave Shevett
  • 54831b5 12:47 PM
    Remove debugging code from file upload validation
    - Remove DEBUG error_log statements for file upload details
    - Remove file preservation logic in /tmp/claimit_debug/
    - Clean up Apache error logs now that upload issue is resolved
    - GD extension is now installed and image resizing should work
    by Dave Shevett
  • 237cd00 12:32 PM
    Fix file upload limit - update MAX_FILE_SIZE to 50MB
    - Change HTML form MAX_FILE_SIZE from 500KB to 50MB (52428800 bytes)
    - This was causing UPLOAD_ERR_FORM_SIZE (error 2) for files > 500KB
    - Browser was rejecting uploads before they reached server validation
    - Now matches server-side 50MB limit configuration
    by Dave Shevett
  • c6d1b43 12:04 PM
    Add debugging for file upload issues
    - Add detailed logging of file upload attempts (name, size, error code, tmp path)
    - Preserve rejected files in /tmp/claimit_debug/ for inspection
    - Debug both PHP upload errors and custom size validation
    - Help diagnose 7.9MB file upload rejection despite 50MB limit
    by Dave Shevett

September 4, 2025

  • f266b27 11:42 PM
    CRITICAL FIX: Update all remaining 10MB limits to 50MB
    - Update ini_set() calls in public/index.php (50M/51M)
    - Update ini_set() calls in router.php (50M/51M)
    - Update php.ini file (50M/51M)
    - Update dev-php.ini file (50M/51M)
    - These ini_set() calls were overriding the server configuration
    - This should finally allow 50MB uploads to work properly
    by Dave Shevett
  • 6629cc8 11:32 PM
    Fix remaining 10MB error message in PHP upload error handling
    - Update UPLOAD_ERR_INI_SIZE and UPLOAD_ERR_FORM_SIZE error messages to show 50MB
    - This was the last remaining reference to the old 10MB limit
    - Should now show consistent 50MB limit in all error messages
    by Dave Shevett
  • b7945a7 11:23 PM
    Increase upload limit from 10MB to 50MB
    - Update server-side validation in templates/claim.php (50MB limit)
    - Update client-side validation in public/assets/js/app.js (50MB limit)
    - Update form help text to show 50MB limit
    - Update Apache .htaccess configuration (50M/51M)
    - Update .user.ini configuration (50M/51M)
    - This removes the hard-coded 10MB limit that was blocking larger uploads
    - Images will still be automatically resized to under 500KB after upload
    by Dave Shevett
  • 54e4e73 11:09 PM
    Remove php_admin_value directives from .htaccess
    - Remove php_admin_value directives that are causing Apache alerts
    - Keep only php_value directives which should be allowed
    - This should eliminate the 'php_admin_value not allowed here' errors
    - The .user.ini file should still provide alternative configuration
    by Dave Shevett
  • 8e9f63b 11:06 PM
    Remove debug logging to clean up Apache error logs
    - Remove all DEBUG error_log statements from getActiveClaims() function
    - Remove all DEBUG error_log statements from isUserClaimed() function
    - Remove production debug logging from templates/claim.php
    - Keep only essential error logging for actual errors
    - This should eliminate the large array dumps in Apache error logs
    - Error logs should now be much cleaner and more manageable
    by Dave Shevett
  • cfc4096 11:05 PM
    Try multiple approaches for production upload limits
    - Add .user.ini file as alternative to .htaccess for PHP config
    - Add php_admin_value directives in .htaccess (may work when php_value doesn't)
    - Add production debugging to show actual server limits
    - Try both php_value and php_admin_value approaches
    - .user.ini files are often allowed when .htaccess php_value is restricted
    - This should help identify what the actual server limits are
    by Dave Shevett
  • b31c35d 10:51 PM
    Configure production Apache upload limits for 10MB
    - Update public/.htaccess with comprehensive PHP upload settings
    - Add php.ini file for production server configuration
    - Remove debugging code from templates/claim.php
    - Set upload_max_filesize=10M, post_max_size=11M
    - Add max_execution_time=300, max_input_time=300, memory_limit=256M
    - These settings should work with Apache in production environment
    - Local development server issues can be addressed separately
    by Dave Shevett
  • 848a8ba 10:45 PM
    Fix PHP upload limits - ini_set() not working
    - Root cause: PHP ini_set() calls were being ignored (actual limit was 2M instead of 10M)
    - Add .htaccess in root directory with php_value directives
    - Add php.ini file with upload configuration
    - Add putenv() calls as alternative approach
    - Add max_execution_time, max_input_time, and memory_limit settings
    - This should override the 2M limit that was preventing 7.9MB uploads
    by Dave Shevett
  • dc28d7f 10:40 PM
    Add debugging for PHP upload limits
    - Add error_log statements to show actual PHP upload_max_filesize and post_max_size values
    - Show file upload error code and file size in debug logs
    - Update error message to show actual PHP limit for better debugging
    - This will help identify if PHP ini_set() calls are working correctly
    by Dave Shevett
  • ef3c474 6:34 PM
    Increase upload limit from 5MB to 10MB
    - Update PHP ini_set() calls in public/index.php and router.php (10M/11M)
    - Update Apache upload limits in public/.htaccess (10M/11M)
    - Update client-side JavaScript validation in public/assets/js/app.js (10MB)
    - Update server-side validation in templates/claim.php (10MB)
    - Update HTML form help text to show 10MB limit
    - Images will still be automatically resized to under 500KB after upload
    - All environments (development and production) now support 10MB uploads
    by Dave Shevett
  • 9a17c10 6:31 PM
    Fix JavaScript validation error message for file uploads
    - Change error message from 'Picture uploads are limited to 5MB' to 'File is too large. Maximum upload size is 5MB.'
    - Makes it clearer that this is an error for files exceeding the limit
    - Avoids confusion since we do allow 5MB uploads (the limit is exactly 5MB)
    by Dave Shevett
  • ea18a5f 6:28 PM
    Fix form help text to show correct 5MB upload limit
    - Update HTML form help text from 'max 500k' to 'max 5MB - will be automatically resized'
    - Clarifies that users can upload up to 5MB and images will be automatically resized
    - Matches the actual server-side validation limits
    by Dave Shevett
  • 15e3f5a 6:07 PM
    Implement 5MB upload limit with automatic image resizing
    - Raise upload limits to 5MB for both development and production
    - Add PHP ini_set() calls in public/index.php and router.php
    - Add Apache upload limits in public/.htaccess
    - Implement GD library image resizing function in includes/functions.php
    - Resize images to max 1200x1200px and under 500KB final size
    - Update server-side validation in templates/claim.php (5MB limit)
    - Update client-side validation in public/assets/js/app.js (5MB limit)
    - Add automatic image resizing before S3 upload
    - Maintain aspect ratio and preserve transparency for PNG/GIF
    - Fallback to original image if resizing fails
    - Clean up temporary files after processing
    by Dave Shevett
  • 3d37f33 5:52 PM
    Fix mobile dropdown menu behavior
    - Change mobile dropdown from always-visible to proper toggle behavior
    - Use absolute positioning instead of static for mobile dropdown
    - Add proper opacity, visibility, and transform transitions
    - Dropdown now properly shows/hides on mobile when clicked
    - Maintains consistent behavior across desktop and mobile
    by Dave Shevett

September 3, 2025

  • fb6c91b 5:06 PM
    Improve Contact Seller email format
    - Update subject line to 'ClaimIt Interest - [Item Title]'
    - Add direct link to item in email body
    - Apply consistent formatting across all Contact Seller buttons
    - Update templates/item.php and templates/item-card.php
    - Better email experience for buyers and sellers
    by Dave Shevett

September 2, 2025

  • ec3ef79 9:18 PM
    Add Edit button to single item page
    - Add Edit button for item owners on single item page (/?page=item&id=...)
    - Include Edit modal with form for title and description editing
    - Add JavaScript functions for modal handling and AJAX submission
    - Edit button appears alongside Delete button for item owners
    - Maintains consistency with user-listings page functionality
    by Dave Shevett
  • f8e29b2 9:12 PM
    Remove debugging from edit_item functionality
    - Remove all error_log debug statements from both POST and GET edit_item handlers
    - Clean up the code while maintaining full functionality
    - Item editing is now working correctly and saving to S3
    by Dave Shevett
  • b3c6236 7:07 PM
    Fix edit_item AJAX routing and add debugging
    - Fix JavaScript to send request to correct URL: ?page=claim&action=edit_item
    - Add comprehensive debugging to both POST and GET edit_item handlers
    - This should now properly route edit requests and show debug output
    by Dave Shevett
  • 60973ae 6:30 PM
    Add debugging to edit_item functionality
    - Add error_log statements to track YAML conversion and S3 upload
    - This will help identify why item edits are not being saved
    by Dave Shevett
  • b345a80 5:52 PM
    Fix AJAX request for item editing
    - Change JavaScript to send action as POST data instead of GET parameter
    - This ensures the edit_item action reaches the correct backend handler
    - Item editing should now properly save changes to S3 YAML files
    by Dave Shevett
  • a1bf38d 5:49 PM
    Fix JavaScript syntax error in Edit button onclick
    - Replace json_encode() with htmlspecialchars() and addslashes() for proper escaping
    - Remove debugging alert from openEditModal function
    - Fix JavaScript syntax error that was preventing modal from opening
    by Dave Shevett
  • e8e4219 5:45 PM
    Add debugging to edit modal functionality
    - Add console.log and alert debugging to openEditModal function
    - Verify if function is being called and modal element is found
    by Dave Shevett
  • 8a289d9 5:40 PM
    Add item editing functionality for item owners
    - Add 'Edit...' button to dashboard context for own listings
    - Create edit modal dialog with title and description fields
    - Add backend AJAX handler for edit_item action in both POST and GET routes
    - Implement JavaScript functions for modal management and form submission
    - Add CSS styling for textarea elements in modal forms
    - Use JSON encoding for JavaScript parameters to handle quotes properly
    - Validate ownership before allowing edits and update S3 YAML files
    by Dave Shevett
  • cf56f4e 5:07 PM
    Fix AJAX routing for claim management functions
    - Add GET-based AJAX handler for ?page=claim&action=* endpoints
    - Fix mismatch between JavaScript URL parameters and PHP POST data handling
    - Ensure both POST and GET-based claim requests work properly
    - Add delete_item action to supported actions list
    by Dave Shevett
  • a15f870 5:04 PM
    Add debugging to removeMyClaim functionality
    - Add console.log statements to JavaScript removeMyClaim function
    - Add error_log statements to PHP remove_claim action handler
    - Improve error handling and debugging for claim removal process
    by Dave Shevett
  • 6144b3c 4:59 PM
    Fix 'Remove my claim' functionality and add missing JavaScript functions
    - Add missing JavaScript functions (addClaimToItem, removeMyClaim, deleteItem) to main index.php
    - Add delete_item action handler for item deletion
    - Add getItem() function to functions.php for retrieving individual items
    - Fix JavaScript function availability across all templates
    - Add showMessage() function for user feedback
    - Ensure all claim management functions work with unified item card system
    by Dave Shevett
  • 6cfe094 4:29 PM
    Fix remaining include path in user-listings.php
    - Fix the last include statement on line 290 that was still using relative path
    - This resolves the production error: 'Failed opening templates/item-card.php'
    by Dave Shevett
  • 2549859 4:19 PM
    Fix include paths for production environment
    - Change relative include paths to absolute paths using __DIR__
    - Fixes 'Failed opening templates/item-card.php' error in production
    - Affects home.php, user-listings.php, and items.php templates
    by Dave Shevett
  • 0dcabc9 4:15 PM
    Add user settings functionality with custom display names
    - Implement settings modal dialog accessible from user dropdown
    - Add display name field allowing users to customize their displayed name
    - Store user settings in S3 under users/{userId}.yaml
    - Integrate custom display names throughout the application
    - Update unified item card template to use custom names
    - Add comprehensive CSS styling for modal and form elements
    - Include JavaScript functions for modal handling and AJAX submission
    by Dave Shevett
  • 22a1d82 3:53 PM
    Add ClaimIt logo to header and favicon - Add claimit-logo.jpg to public/assets/images/ - Set logo as favicon in HTML head section - Display logo image next to ClaimIt text in navigation header - Add CSS styling for logo display (40x40px with rounded corners) - Logo appears in browser tabs and navigation bar for better branding
    by Dave Shevett
  • 4b906d4 3:34 PM
    Fix image display in unified item card template - Change image_file to image_key to match actual data structure - Images now display correctly across all pages using unified template - Fixes 'No Image' placeholder issue that was showing instead of actual images
    by Dave Shevett
  • 3f1e085 3:08 PM
    Implement unified item card system - Create templates/item-card.php for consistent item display across all pages - Add comprehensive CSS styles for unified item cards in style.css - Update templates/items.php to use unified template with 'listing' context - Update templates/home.php to use unified template with 'home' context - Update templates/user-listings.php to use unified template with 'dashboard' and 'claimed' contexts - Add truncateText() helper function to functions.php - Maintains all existing functionality while providing consistent UI - Supports different display contexts (listing, home, dashboard, claimed) - Includes proper action buttons based on user permissions and context
    by Dave Shevett
  • 2af2653 2:32 PM
    Add action buttons to posted items in user-listings template - Added Contact Seller and Delete buttons for items posted by the user - Buttons only appear when viewing own listings (isOwnListings = true) - Added CSS styling for .item-actions class with proper button layout and hover effects - Improves user experience by providing quick access to item management actions
    by Dave Shevett

September 1, 2025

  • a51301d 11:51 AM
    Fix hardcoded localhost base URL in redirect() function - Added dynamic environment detection for base URL - Uses localhost:8000 for development and claimit.stonekeep.com for production - Fixes OAuth redirect loop when accessing production site
    by Dave Shevett

August 31, 2025

  • 8c50457 9:02 PM
    Fix OAuth redirect URI for production environment - Added dynamic redirect URI detection based on HTTP_HOST - Uses localhost:8000 for development and claimit.stonekeep.com for production - Updated example configuration with proper documentation - Fixes OAuth redirect loop when accessing production site
    by Dave Shevett
  • 7118756 8:52 PM
    Add claimed items section to user listings page - Added getItemsClaimedByUser function to find items claimed by a user - Enhanced user-listings page to show claimed items when viewing own listings - Added dashboard stat showing 'Items Claimed' count - Fixed image URL generation using correct getPresignedUrl method - Improved UI to show claim status and position for claimed items - Added proper handling for users with claimed items but no posted items
    by Dave Shevett

August 30, 2025

  • e6b77cb 11:02 PM
    Fix YAML parser and claim system - Fixed parseSimpleYaml to handle malformed claim entries with proper indentation detection - Added multi-line value support for claimed_at fields - Improved claim status filtering (active vs removed) - Enhanced UI to show 'You! (User Name)' for current user's claims - Moved About link to footer - Added comprehensive waitlist section styling - Fixed claim button logic and AJAX handlers - All claim system functionality now working correctly
    by Dave Shevett
  • 9d1e40f 7:09 PM
    Add Open Graph meta tags for social media previews - Implement generateOpenGraphTags function for Slack/Facebook/Twitter previews - Add dynamic meta tags for individual items with thumbnails and descriptions - Add user listings previews showing item counts - Support both development and production URLs - Include Twitter Card meta tags for enhanced Twitter previews
    by Dave Shevett
  • 5c3f908 7:01 PM
    Make My Listings link shareable and fix dashboard styling - Update My Listings to use user-listings format with user ID for sharing - Add dashboard-style interface to user-listings when viewing own items - Move dashboard styles to main CSS file for consistency - Make stat cards more compact with tighter design
    by Dave Shevett
  • d82f459 8:04 AM
    Fix OAuth redirect loop by using absolute URLs in redirect function
    by Dave Shevett

August 29, 2025

  • 1dc4454 5:21 PM
    Update deploy.yml
    by Dave Shevett
  • afb1538 4:56 PM
    Test deployment workflow - remove sudo commands
    by Dave Shevett
  • 4be6930 4:34 PM
    Move contact link from navigation to footer
    - Remove contact link from main navigation menu
    - Add contact link to footer with separator pipe
    - Add CSS styling for footer link with hover effects
    - Cleaner navigation with contact accessible in footer
    - Footer link styled with gray color and blue hover state
    by Dave Shevett
  • 33010f3 4:25 PM
    Add GitHub Actions deployment workflow
    - Create automated deployment workflow for production server
    - Triggers on push to main branch
    - Uses SSH to connect to production server
    - Pulls latest code and updates dependencies
    - Sets proper file permissions
    - Ready for GitHub Secrets configuration
    by Dave Shevett
  • 4245b8a 12:24 PM
    Transform home page to show available items directly
    - Replace hero section with items grid display
    - Remove phone, hours, and address from contact page
    - Home page now shows all available items immediately
    - Add 'Post a New Item' button in header
    - Include empty state when no items exist
    - Maintain AWS credentials check for development
    - Users can now browse items without extra navigation steps
    by Dave Shevett

August 28, 2025

  • 39e3cfe 5:57 PM
    Fix OAuth redirect URI and localhost asset serving
    - Update Google OAuth config to use production redirect URI
    - Add auth route rewrite rules to .htaccess for clean URLs
    - Update router.php to find assets in public/ directory for localhost dev
    - Fixes OAuth redirecting to localhost instead of production domain
    - Maintains CSS/JS functionality in both localhost and production
    by Dave Shevett
  • a88c473 5:29 PM
    Move assets directory into public/ and remove rewrite rule
    - Move assets/ from project root to public/assets/
    - Remove assets rewrite rule from .htaccess (no longer needed)
    - Fixes Apache security error with directory traversal (/../assets/)
    - Assets now served directly from DocumentRoot/assets/
    by Dave Shevett
  • 8d83245 5:23 PM
    Fix assets loading by removing file existence check in .htaccess
    - Remove RewriteCond %{REQUEST_FILENAME} -f from assets rule
    - This was preventing assets from loading when DocumentRoot is set to /public
    - Assets requests now properly redirect to ../assets/ directory
    by Dave Shevett
  • e180b7d 2:59 PM
    Update claim button text and fix user-listings image scaling
    - Changed 'Never mind' button to 'You have claimed this!' with checkmark emoji
    - Kept mouseover tooltip as 'Unclaim this item' for clarity
    - Fixed image scaling on user-listings page to match main items display
    - Added proper CSS for item cards and grid layout consistency
    - Updated both individual item view and items grid view templates
    by Dave Shevett
  • 6e8bf4e 2:21 PM
    Improve image upload error messages and reduce size limit to 500KB
    - Replace generic 'An error occurred' with specific 'Picture uploads are limited to under 500k'
    - Add detailed server-side error handling for different PHP upload error codes
    - Implement client-side file validation with immediate feedback
    - Reduce upload limit from 5MB to 500KB
    - Add MAX_FILE_SIZE form field for browser-level enforcement
    - Show file size and name on successful selection
    - Add success/danger color variables to CSS
    by Dave Shevett

August 27, 2025

  • ef4c5e6 5:47 PM
    Update about page and navigation improvements
    - Added company image to about page replacing placeholder
    - Reformatted about page content with proper paragraph breaks
    - Changed 'My Posts' to 'My Listings' in navigation menu
    - Added responsive image styling with hover effects
    - Updated documentation references to reflect 'My Listings' terminology
    by Dave Shevett
  • d7104bb 5:23 PM
    Fix navigation toolbar alignment and implement Google avatar fallback system
    - Fixed vertical alignment issues in navigation bar caused by user avatars
    - Added consistent min-height values for nav elements to prevent height changes
    - Implemented comprehensive Google profile picture fallback system
    - Added automatic fallback to user initials when avatar image fails to load
    - Improved Google OAuth picture URLs with proper sizing parameters
    - Added CORS handling with referrerpolicy for cross-origin images
    - Enhanced responsive design for navigation on mobile devices
    - Includes proper error handling and graceful degradation for avatars
    by Dave Shevett

August 26, 2025

  • db3bc0b 10:17 PM
    Add title field and improve UI consistency
    - Add required title field to item posting form with validation
    - Update YAML data structure to include title field for all new items
    - Display item titles prominently on both listing and detail pages
    - Ensure backward compatibility: items without titles use description
    - Change Claim button color from green to blue to match Contact Seller button
    - Improve responsive design for item headers on mobile devices
    - Fix image sizing on individual item pages (max-width: 500px, max-height: 70vh)
    This enhances the user experience by providing clearer item identification
    and consistent button styling throughout the application.
    by Dave Shevett
  • 791b8f9 9:26 PM
    Implement individual item URLs and detailed view pages
    - Add 'item' route to available pages for individual item viewing
    - Create templates/item.php with detailed item view including:
    * Large image display with sticky positioning
    * Prominent price display with FREE badge for /bin/zsh items
    * Full description with proper line breaks
    * Item details grid (ID, posted date, contact)
    * Action buttons (Contact Seller, Claim, Delete)
    * Back navigation to items listing
    * Mobile responsive design
    - Make item listings clickable by wrapping cards in links to individual pages
    - Add hover effects and smooth animations for better UX
    - Move parseSimpleYaml function to includes/functions.php for reuse
    - Maintain all existing functionality (delete, claim, contact) on individual pages
    - URLs: ?page=item&id=TRACKING_NUMBER (clean URLs via .htaccess on Apache)
    - Proper z-index handling to keep action buttons clickable within linked cards
    by Dave Shevett
  • 59defc7 8:56 PM
    Change 'View items' URL from '/s3' to '/items'
    - Rename templates/s3.php to templates/items.php
    - Update routing in index.php to handle 'items' instead of 's3'
    - Update all navigation links from ?page=s3 to ?page=items
    - Update home page button to link to items page
    - Update redirect after posting item to go to items page
    - Update all error redirects in items template
    - Update deployment guide with new URL structure
    - Provides more user-friendly URLs hiding implementation details
    by Dave Shevett
  • 37fa6c2 8:52 PM
    Add Apache deployment configuration and guide
    - Add .htaccess for clean URLs, static asset handling, and security headers
    - Create comprehensive DEPLOYMENT.md guide for Apache hosting
    - Include virtual host configuration examples
    - Add SSL, permissions, and troubleshooting sections
    - Enable clean URLs like /claim and /s3 instead of ?page=claim
    by Dave Shevett
  • 6160afc 8:38 PM
    Replace 'Share image' button with 'Claim this!' button
    - Remove conditional Share Image button that linked to presigned URLs
    - Add new 'Claim this!' button with success styling (green)
    - Implement claimItem() JavaScript function with placeholder functionality
    - Add CSS styling for .claim-btn with hover effects and smooth transitions
    - Button shows 'Not implemented yet' alert dialog with tracking number
    - Prepares foundation for future claiming functionality
    by Dave Shevett
  • 1d60715 8:35 PM
    Update text to include giveaway option alongside sales
    - Change 'for sale' to 'for sale or for giveaway' across templates
    - Updated posting page subtitle to be more inclusive
    - Updated items listing page descriptions to reflect both sale and giveaway options
    - Updated 'no items available' message to include giveaway option
    - Makes the platform more welcoming for free item sharing
    by Dave Shevett
  • 01a08a3 8:33 PM
    Replace 'Learn More' button with 'View available items' link on home page
    - Remove the 'Learn More' button that linked to About page
    - Add 'View available items' button that links to marketplace (s3 page)
    - Maintains consistent navigation experience across site
    - Users can now directly access available items from the home page
    by Dave Shevett
  • 8ffbc36 8:26 PM
    Replace JavaScript confirm dialog with styled HTML modal
    - Replace browser confirm() popup with custom modal dialog
    - Add proper HTML modal with header, body, and action buttons
    - Style modal to match site design with rounded corners and shadows
    - Include smooth animations for modal show/hide transitions
    - Add keyboard support (ESC key to close) for accessibility
    - Add click-outside-to-close functionality
    - Responsive design for mobile devices
    - Maintain all existing delete functionality and error handling
    by Dave Shevett
  • f1795bf 8:13 PM
    Redirect to View Available Items page after posting
    - Change redirect destination from 'claim' to 's3' after successful item posting
    - Users now see their posted item immediately after submission
    - Improves user experience and confirms item was posted successfully
    by Dave Shevett
  • 1784c9f 8:03 PM
    Fix delete functionality AJAX response
    - Move delete handler from s3.php template to index.php before HTML output
    - Prevents HTML headers from being sent with JSON response
    - JavaScript can now properly parse the clean JSON response
    - Resolves 'There was an error' message during item deletion
    by Dave Shevett
  • 4756c6f 7:58 PM
    Simplify page title to just 'ClaimIt'
    - Remove dynamic page names from browser title
    - Change from '[Page] - ClaimIt' format to simply 'ClaimIt'
    - Provides consistent branding across all pages
    by Dave Shevett
  • 4f79e56 7:54 PM
    Add delete functionality with trash can icon for marketplace items
    - Add deleteObject method to AwsService.php for S3 object deletion
    - Implement AJAX-based delete functionality in s3.php template
    - Add trash can icon (๐Ÿ—‘๏ธ) button to each item card with confirmation dialog
    - Include smooth fade-out animation when items are deleted
    - Add proper error handling and user feedback with floating notifications
    - Style delete button with red danger styling and hover effects
    - Handle both YAML metadata and image file deletion
    - Update item count and show 'no items' message when all items deleted
    - Add responsive styling for mobile devices
    by Dave Shevett
  • 7476063 7:50 PM
    Implement comprehensive error handling and logging system
    - Add custom error handler to suppress AWS SDK PHP 8.4 compatibility warnings from browser display while preserving them in environment logs
    - Update router.php and public/index.php with environment-appropriate error logging
    - Configure clean user experience with professional error suppression
    - Maintain developer debugging capabilities through proper log routing
    - Ensure compatibility with both development server and production deployment (Apache/nginx)
    - Error logs now automatically route to appropriate environment logs (console for dev, web server logs for production)
    by Dave Shevett
  • 4094897 5:29 PM
    Implement complete marketplace functionality with modern UI
    Major Features Added:
    - ๐ŸŽจ Modern UI with Inter fonts, gradients, and glass-morphism effects
    - ๐Ÿ“ฑ Fully responsive design with hover animations and card layouts
    - ๐Ÿ›๏ธ Complete marketplace functionality for posting and browsing items
    - ๐Ÿ“ธ Photo upload support with S3 storage integration
    - ๐Ÿ’ฐ Support for /bin/zsh (free) item pricing
    - ๐Ÿ“ง Direct email contact integration with pre-filled subjects
    AWS S3 Integration:
    - Automatic tracking number generation (reverse datestamp)
    - Image upload to S3 bucket with tracking number naming
    - YAML metadata files for item details (description, price, email)
    - Presigned URL generation for secure image access
    - Complete S3 bucket scanning and YAML parsing
    UI/UX Improvements:
    - ClaimIt logo now serves as home navigation link
    - Removed redundant Home link from navigation
    - Beautiful item cards with image placeholders when no photo available
    - Modern gradient hero sections and smooth transitions
    - Professional marketplace layout with grid display
    Technical Enhancements:
    - Custom router.php for proper static file serving
    - PHP 8.4 compatibility with deprecation warning suppression
    - Form validation improvements (allows /bin/zsh values)
    - CSRF protection and secure file handling
    - Comprehensive error handling and user feedback
    The application now functions as a complete online marketplace where users can post items for sale (including free items) and browse available listings with modern, professional UI.
    by Dave Shevett
  • 512113a 3:59 PM
    Initial commit: ClaimIt web application
    - Complete PHP web application for claims management
    - Modern responsive design with professional UI/UX
    - Form validation and CSRF protection
    - Multiple pages: Home, About, Claims, Contact
    - Built with PHP 8.4, HTML5, CSS3, JavaScript
    - Composer dependency management
    - Security features and error handling
    by Dave Shevett