# Fix authentication issues and improve developer experience ## Summary This MR fixes critical authentication issues that prevented login on localhost and improves the developer experience with consolidated rebuild scripts and a working help modal keyboard shortcut. ## Problems Fixed ### 1. Authentication Issues - **UntrustedHost Error**: NextAuth v5 was rejecting localhost requests with "UntrustedHost: Host must be trusted" error - **Cookie Prefix Errors**: Cookies were being set with `__Host-` and `__Secure-` prefixes on HTTP (localhost), causing browser rejection - **MissingCSRF Error**: CSRF token cookies were not being set correctly due to cookie configuration issues ### 2. Help Modal Keyboard Shortcut - **Shift+? not working**: The help modal keyboard shortcut was not detecting the question mark key correctly ### 3. Developer Experience - **Multiple rebuild scripts**: Had several overlapping rebuild scripts that were confusing - **Unused code**: Removed unused `useSecureCookies` variable and misleading comments ## Changes Made ### Authentication Fixes (`lib/auth.ts`) - Set `trustHost: true` to fix UntrustedHost error (required for NextAuth v5) - Added explicit cookie configuration for HTTP (localhost) to prevent prefix errors: - Cookies use `secure: false` for HTTP - Cookie names without prefixes for HTTP - Let Auth.js defaults handle HTTPS (with prefixes and Secure flag) - Removed unused `useSecureCookies` variable - Simplified debug logging ### Help Modal Fix (`components/HelpModal.tsx`) - Fixed keyboard shortcut detection to properly handle Shift+? (Shift+/) - Updated help text to show correct shortcut (Shift+? instead of Ctrl+?) ### Developer Scripts - **Consolidated rebuild scripts**: Merged `CLEAN_REBUILD.sh`, `FIX_AND_RESTART.sh`, and `start-server.sh` into single `rebuild.sh` - **Added REBUILD.md**: Documentation for rebuild process - Removed redundant script files ### Code Cleanup - Removed unused `useSecureCookies` variable from `lib/auth.ts` - Removed misleading comment from `app/api/auth/[...nextauth]/route.ts` - Cleaned up verbose debug logging ## Technical Details ### Cookie Configuration The fix works by explicitly configuring cookies for HTTP environments: - **HTTP (localhost)**: Cookies without prefixes, `secure: false` - **HTTPS (production)**: Let Auth.js defaults handle (prefixes + Secure flag) This prevents NextAuth v5 from auto-detecting HTTPS from proxy headers and incorrectly adding cookie prefixes. ### Keyboard Shortcut The question mark key requires Shift+/ on most keyboards. The fix now properly detects: - `event.shiftKey && event.key === "/"` - `event.key === "?"` (fallback) - `event.code === "Slash" && event.shiftKey` (additional fallback) ## Testing - ✅ Login works on localhost (http://localhost:3000) - ✅ No cookie prefix errors in browser console - ✅ No UntrustedHost errors in server logs - ✅ Help modal opens/closes with Shift+? - ✅ Rebuild script works in both dev and prod modes ## Files Changed ### Modified - `lib/auth.ts` - Authentication configuration fixes - `components/HelpModal.tsx` - Keyboard shortcut fix - `app/api/auth/[...nextauth]/route.ts` - Removed misleading comment ### Added - `rebuild.sh` - Consolidated rebuild script - `REBUILD.md` - Rebuild documentation ## Migration Notes No database migrations or environment variable changes required. The fix works with existing configuration. ## Related Issues Fixes authentication issues preventing local development and testing. Reviewed-on: #5
26 KiB
MirrorMatch - Improvement Ideas & Future Enhancements
This document contains ideas, suggestions, and potential enhancements to make MirrorMatch better, faster, and more professional.
🚀 Performance Optimizations
Database & Query Optimization
-
Add database indexes - Create indexes on frequently queried fields (
Photo.createdAt,User.points) to speed up queries- Why: As your database grows, queries without indexes become exponentially slower. Indexes can make queries 10-100x faster, especially for leaderboard and photo listing queries that run frequently.
-
Implement pagination - Add pagination to photos list to handle large datasets efficiently
- Why: Loading all photos at once becomes slow and memory-intensive as you scale. Pagination improves load times, reduces server load, and provides better UX by showing manageable chunks of data.
-
Database connection pooling - Configure connection pooling to optimize database connections
- Why: Without pooling, each request creates a new database connection, which is expensive. Connection pooling reuses connections, reducing latency and allowing your app to handle more concurrent users.
-
Cache leaderboard data - Use Redis or in-memory cache with TTL (1-5 minutes) to reduce database load
- Why: The leaderboard is queried frequently but changes infrequently. Caching it reduces database load by 90%+ and makes the page load instantly, improving user experience significantly.
-
Lazy loading for photos - Load images as user scrolls to improve initial page load
- Why: Loading all images upfront is slow and wastes bandwidth. Lazy loading makes pages load 3-5x faster and reduces server costs, especially important for mobile users.
-
Query optimization - Use
selectto fetch only needed fields, reducing data transfer- Why: Fetching entire records when you only need a few fields wastes bandwidth and memory. This simple change can reduce data transfer by 50-80% and speed up queries.
Frontend Performance
-
Image optimization - Use Next.js Image component with proper sizing and automatic format optimization
- Why: Unoptimized images can be 5-10x larger than needed. Next.js Image automatically serves WebP/AVIF formats and resizes images, reducing bandwidth by 60-80% and improving page load times dramatically.
-
Image lazy loading - Implement lazy loading for photo thumbnails to improve page load times
- Why: Loading all thumbnails at once slows initial page load. Lazy loading defers off-screen images, making pages load 2-3x faster and improving Core Web Vitals scores.
-
Virtual scrolling - Use virtual scrolling for large photo lists to maintain performance
- Why: Rendering hundreds of DOM elements causes lag. Virtual scrolling only renders visible items, keeping the UI smooth even with thousands of photos.
-
Code splitting - Implement route-based code splitting to reduce initial bundle size
- Why: Large JavaScript bundles slow initial page load. Code splitting loads only what's needed per route, reducing initial bundle by 40-60% and improving Time to Interactive.
-
React.memo() optimization - Wrap expensive components with React.memo() to prevent unnecessary re-renders
- Why: Unnecessary re-renders waste CPU and cause UI lag. Memoization prevents re-renders when props haven't changed, making the UI more responsive, especially on lower-end devices.
-
Bundle size optimization - Analyze and optimize bundle size using webpack-bundle-analyzer
- Why: Large bundles slow page loads and hurt SEO. Identifying and removing unused code can reduce bundle size by 20-40%, improving load times and user experience.
-
Progressive image loading - Show blur placeholder while images load, then transition to full image
- Why: Blank spaces while images load feel slow. Progressive loading provides immediate visual feedback, making the app feel faster and more polished, improving perceived performance.
API & Backend
-
Rate limiting - Add rate limiting to prevent abuse and protect API endpoints
- Why: Without rate limiting, malicious users can overwhelm your server or abuse features. Rate limiting protects against DDoS, prevents spam, and ensures fair resource usage for all users.
-
Request caching - Implement caching for static data and frequently accessed endpoints
- Why: Many API calls return the same data repeatedly. Caching reduces database queries by 70-90%, lowers server costs, and makes responses 10-100x faster.
-
Compression middleware - Add gzip/brotli compression to reduce response sizes
- Why: Text responses (JSON, HTML) compress by 70-90%. Compression reduces bandwidth costs, speeds up transfers (especially on mobile), and improves user experience with minimal effort.
-
Email queue system - Use Bull/BullMQ to queue email sending and prevent blocking
- Why: Sending emails synchronously blocks requests and can cause timeouts. A queue system makes email sending non-blocking, improves response times, and provides retry logic for failed emails.
-
Batch photo uploads - Optimize bulk photo upload operations for better performance
- Why: Uploading photos one-by-one is slow and inefficient. Batch uploads reduce overhead, improve upload speeds by 2-3x, and provide better progress feedback to users.
-
CDN integration - Add CDN for static assets and uploaded images to reduce server load
- Why: Serving files from your server uses bandwidth and slows responses. A CDN serves files from locations closer to users, reducing latency by 50-80% and offloading server load.
🎨 UI/UX Enhancements
User Interface
-
Dark mode support - Add dark mode toggle with user preference persistence
- Why: Many users prefer dark mode for reduced eye strain, especially in low-light. It's become an expected feature and can increase user satisfaction and retention.
-
Mobile responsiveness - Improve mobile experience with better touch targets and swipe gestures
- Why: A significant portion of users access from mobile. Poor mobile UX leads to frustration and abandonment. Better touch targets and gestures make the app feel native and professional.
-
Loading skeletons - Replace blank screens with loading skeletons for better perceived performance
- Why: Blank screens make the app feel broken or slow. Skeletons show structure immediately, making wait times feel shorter and the app more responsive, improving user confidence.
-
Toast notifications - Implement toast notifications for user feedback (success, error, info)
- Why: Users need clear feedback for their actions. Toast notifications are non-intrusive, provide immediate feedback, and improve UX by clearly communicating success/error states.
-
Smooth page transitions - Add smooth transitions between pages for better user experience
- Why: Abrupt page changes feel jarring. Smooth transitions create a polished, professional feel and make navigation feel faster and more cohesive.
-
Inline form validation - Show validation errors inline as user types for better feedback
- Why: Waiting until form submission to show errors is frustrating. Inline validation provides immediate feedback, reduces errors, and improves form completion rates.
-
Keyboard navigation - Add full keyboard navigation support for accessibility
- Why: Keyboard navigation is essential for accessibility (WCAG compliance) and power users. It makes your app usable for people with disabilities and improves efficiency for all users.
-
Drag-and-drop uploads - Allow users to drag and drop photos for easier uploads
- Why: Drag-and-drop is faster and more intuitive than clicking "Choose File". It's a modern UX pattern users expect and can increase upload engagement.
-
Empty states - Create better empty states for when there are no photos, guesses, etc.
- Why: Empty screens confuse users. Well-designed empty states guide users on what to do next, reduce confusion, and make the app feel more polished and helpful.
-
Animations and micro-interactions - Add subtle animations to improve user engagement
- Why: Subtle animations provide visual feedback, make interactions feel responsive, and create a premium, polished feel that increases user satisfaction and engagement.
-
Infinite scroll - Implement infinite scroll for photos list instead of pagination
- Why: Infinite scroll feels more modern and seamless, especially on mobile. It reduces friction and can increase engagement by making it easier to browse through photos.
-
Photo filters and search - Add filtering and search functionality to find photos easily
- Why: As the photo library grows, finding specific photos becomes difficult. Filters and search help users quickly find what they're looking for, improving usability and engagement.
User Experience
-
Onboarding tour - Create interactive tour for new users explaining key features
- Why: New users often don't understand how to use the app. An onboarding tour reduces confusion, increases feature discovery, and improves user retention by helping users get value quickly.
-
Remember me option - Add "Remember me" checkbox to login for longer session duration
- Why: Frequent logouts frustrate users. A "Remember me" option improves convenience, reduces friction, and increases user satisfaction, especially for regular users.
-
Guess history display - Show user's guess history for each photo (correct/wrong attempts)
- Why: Users want to see their past attempts. Showing guess history provides context, helps users learn, and adds transparency that increases trust and engagement.
-
Already guessed indicator - Display clear indicator when user has already guessed a photo
- Why: Without indicators, users waste time trying to guess photos they've already attempted. Clear indicators prevent confusion and improve efficiency.
-
Photo tags system - Allow users to tag photos for better organization and filtering
- Why: Tags help organize and categorize photos, making them easier to find and filter. This improves discoverability and allows for better content organization as the library grows.
-
Photo descriptions/clues - Add optional descriptions or clues to photos for hints
- Why: Some photos are too difficult without context. Optional clues make the game more accessible, increase engagement, and allow for more creative photo challenges.
-
Confirmation dialogs - Add confirmation dialogs for destructive actions (delete, etc.)
- Why: Accidental deletions are frustrating and can't be undone. Confirmation dialogs prevent mistakes, protect user data, and reduce support requests from accidental actions.
-
Photo filtering - Add filters to show: unguessed photos, correct guesses, wrong guesses, and photos by specific users
- Why: Users want to focus on specific subsets of photos. Filtering helps users find unguessed photos to play, review their performance, or follow specific uploaders, significantly improving usability.
🔒 Security Improvements
-
CSRF protection - Implement CSRF tokens for all state-changing operations
- Why: CSRF attacks can trick users into performing unwanted actions. CSRF protection is a security best practice that prevents unauthorized state changes and protects user accounts.
-
Input sanitization - Sanitize all user inputs to prevent XSS attacks
- Why: Malicious scripts in user input can steal data or hijack sessions. Input sanitization prevents XSS attacks, protects user data, and is essential for any app accepting user input.
-
File type validation - Validate actual file content (not just extension) to prevent malicious uploads
- Why: Attackers can rename malicious files with safe extensions. Content validation ensures only legitimate image files are uploaded, preventing security vulnerabilities and server compromise.
-
Virus scanning - Add virus scanning for uploaded files before storing
- Why: Malicious files can harm your server or other users. Virus scanning protects your infrastructure and users, especially important if files are shared or downloaded by others.
-
Session timeout - Implement automatic session timeout for inactive users
- Why: Long-lived sessions increase security risk if devices are compromised. Session timeouts reduce risk of unauthorized access and are a security best practice for sensitive applications.
-
Security headers - Add security headers (CSP, HSTS, X-Frame-Options, etc.)
- Why: Security headers prevent common attacks (clickjacking, XSS, MITM). They're easy to implement, provide significant security benefits, and are recommended by security standards.
-
Audit logging - Log all admin actions for security auditing and compliance
- Why: Admin actions can have significant impact. Audit logs provide accountability, help detect unauthorized access, and are essential for security compliance and incident investigation.
📊 Features & Functionality
Game Mechanics
-
Streak tracking - Track consecutive correct guesses and display current streak
- Why: Streaks add excitement and encourage daily engagement. They create a sense of achievement and competition, increasing user retention and making the game more addictive.
-
Achievements/badges system - Create achievement system with badges for milestones
- Why: Achievements provide goals and recognition. They increase engagement, encourage exploration of features, and create a sense of progression that keeps users coming back.
-
Hints system - Allow optional hints for photos (earn fewer points when using hints)
- Why: Some photos are too difficult, leading to frustration. Hints make the game more accessible while still rewarding skill, increasing engagement and reducing abandonment.
Social Features
-
Photo comments - Allow users to comment on photos
- Why: Comments add social interaction and context. They increase engagement, create community, and make photos more interesting by adding discussion and stories.
-
Reactions/emojis - Add emoji reactions to photos for quick feedback
- Why: Reactions are quick, low-friction ways to engage. They increase interaction rates, add fun, and provide feedback to uploaders without requiring comments.
-
User mentions - Support @username mentions in comments
- Why: Mentions notify users and create conversations. They increase engagement, enable discussions, and help build community by connecting users.
-
Activity feed - Display recent activity feed (guesses, uploads, achievements)
- Why: Activity feeds show what's happening in real-time. They increase engagement, help users discover new content, and create a sense of community and activity.
Admin Features
-
User activity logs dashboard - Create admin dashboard showing user activity logs
- Why: Admins need visibility into user behavior. Activity logs help identify issues, understand usage patterns, detect abuse, and make data-driven decisions about the platform.
-
Analytics dashboard - Build analytics dashboard showing uploads, guesses, engagement metrics
- Why: Data-driven decisions require visibility. Analytics help understand what's working, identify trends, measure growth, and optimize features based on actual usage.
-
System health monitoring - Add system health monitoring and status page
- Why: Proactive monitoring prevents downtime. Health checks help catch issues before users notice, reduce support requests, and provide transparency about system status.
-
Backup/export functionality - Create tools to backup and export data
- Why: Data loss is catastrophic. Backups protect against disasters, and export functionality helps with migrations, compliance, and gives users control over their data.
Photo Management
-
Photo editing tools - Add basic editing (crop, rotate, filters) before upload
- Why: Users often need to adjust photos before uploading. Built-in editing reduces friction, improves photo quality, and eliminates the need for external editing tools.
-
Improved duplicate detection - Enhance duplicate photo detection beyond hash matching
- Why: Current hash matching only catches exact duplicates. Better detection (visual similarity) prevents near-duplicates, keeps content fresh, and improves user experience.
-
Photo tagging system - Implement tagging system for better organization
- Why: Tags enable better organization and discovery. They make it easier to find photos, create themed collections, and improve search functionality as content grows.
-
Photo search functionality - Add full-text search for photos by tags, descriptions, answers
- Why: As the library grows, finding photos becomes difficult. Search enables quick discovery, improves usability, and is essential for a good user experience at scale.
-
Photo archiving - Allow archiving old photos while keeping them accessible
- Why: Old photos clutter the main view but shouldn't be deleted. Archiving keeps content organized, maintains history, and improves the browsing experience for active content.
-
Photo approval workflow - Add optional admin approval workflow (can be toggled on/off)
- Why: Content moderation ensures quality and safety. An approval workflow lets admins control what goes public, prevents inappropriate content, and maintains content standards.
🧪 Testing & Quality
-
Increase test coverage - Expand test coverage to all critical paths and edge cases
- Why: Bugs in production are expensive and damage trust. Comprehensive tests catch issues early, reduce regressions, and give confidence when making changes.
-
E2E tests - Add end-to-end tests using Playwright or Cypress
- Why: Unit tests don't catch integration issues. E2E tests verify the full user flow works, catch real-world bugs, and prevent breaking changes from reaching users.
-
Visual regression testing - Implement visual regression testing to catch UI changes
- Why: UI bugs are easy to miss in code review. Visual regression tests catch unintended visual changes, ensure consistency, and save time in QA.
-
Performance testing - Add Lighthouse CI for continuous performance monitoring
- Why: Performance degrades over time. Automated performance testing catches regressions early, ensures good Core Web Vitals, and maintains fast user experience.
-
Load testing - Create load testing scenarios to test system under stress
- Why: Systems behave differently under load. Load testing reveals bottlenecks, ensures the app can handle traffic spikes, and prevents crashes during high usage.
-
API integration tests - Add comprehensive integration tests for all API routes
- Why: API bugs affect all clients. Integration tests verify API contracts, catch breaking changes, and ensure APIs work correctly with the database and auth.
-
Accessibility testing - Implement automated accessibility testing (a11y)
- Why: Accessibility is a legal requirement and moral obligation. Automated testing catches a11y issues early, ensures WCAG compliance, and makes the app usable for everyone.
-
Error boundaries - Add React error boundaries to gracefully handle component errors
- Why: One component error shouldn't crash the entire app. Error boundaries isolate failures, show helpful error messages, and keep the rest of the app functional.
-
Error logging and monitoring - Create comprehensive error logging and monitoring system
- Why: You can't fix what you can't see. Error monitoring catches production bugs, provides context for debugging, and helps prioritize fixes based on impact.
🔧 Technical Improvements
Architecture
-
Microservices migration - Consider migrating to microservices if scale requires it
- Why: Monoliths become hard to scale and maintain at large scale. Microservices enable independent scaling, faster deployments, and better fault isolation, but only if needed.
-
Event-driven architecture - Implement event-driven architecture for notifications
- Why: Tight coupling makes systems brittle. Event-driven architecture decouples components, improves scalability, and makes it easier to add new features without modifying existing code.
-
Message queue - Add message queue (RabbitMQ, Redis Queue) for async operations
- Why: Synchronous operations block requests. Message queues enable async processing, improve response times, provide retry logic, and handle traffic spikes better.
-
GraphQL API - Consider GraphQL API for more flexible querying
- Why: REST APIs often over-fetch or under-fetch data. GraphQL lets clients request exactly what they need, reduces bandwidth, and simplifies frontend development.
-
API versioning - Implement API versioning for backward compatibility
- Why: API changes break clients. Versioning allows gradual migration, prevents breaking changes, and enables supporting multiple client versions simultaneously.
-
Health check endpoints - Add health check endpoints for monitoring
- Why: Monitoring systems need to check if the app is healthy. Health endpoints enable automated monitoring, load balancer health checks, and quick status verification.
-
Monitoring and alerting - Create comprehensive monitoring and alerting system
- Why: Issues caught early are easier to fix. Monitoring provides visibility, alerts notify of problems immediately, and helps maintain uptime and performance.
Code Quality
-
ESLint strict rules - Add stricter ESLint rules for better code quality
- Why: Code quality issues lead to bugs. Stricter linting catches problems early, enforces best practices, and maintains consistent code style across the team.
-
Prettier formatting - Implement Prettier for consistent code formatting
- Why: Inconsistent formatting wastes time in reviews. Prettier automates formatting, eliminates style debates, and ensures consistent code across the codebase.
-
Pre-commit hooks - Add Husky pre-commit hooks to run linters and tests
- Why: Catching issues before commit saves time. Pre-commit hooks prevent bad code from entering the repo, enforce quality standards, and reduce CI failures.
-
Component library/storybook - Create component library with Storybook documentation
- Why: Reusable components reduce duplication. Storybook documents components, enables isolated development, and helps maintain design consistency.
-
TypeScript strict mode - Enable TypeScript strict mode for better type safety
- Why: Type errors cause runtime bugs. Strict mode catches more errors at compile time, improves code quality, and provides better IDE support and refactoring safety.
-
Error tracking - Integrate error tracking (Sentry, LogRocket) for production monitoring
- Why: Production errors are hard to debug without context. Error tracking provides stack traces, user context, and helps prioritize and fix bugs quickly.
-
Performance monitoring - Add performance monitoring (New Relic, Datadog)
- Why: Slow performance hurts user experience. Performance monitoring identifies bottlenecks, tracks metrics over time, and helps optimize critical paths.
DevOps & Infrastructure
-
CI/CD pipeline - Set up continuous integration and deployment pipeline
- Why: Manual deployments are error-prone and slow. CI/CD automates testing and deployment, reduces human error, enables faster releases, and improves confidence in changes.
-
Automated deployments - Implement automated deployments on merge to main
- Why: Manual deployments delay releases and can be forgotten. Automation ensures consistent deployments, reduces downtime, and enables rapid iteration.
-
Blue-green deployments - Set up blue-green deployment strategy for zero downtime
- Why: Deployments cause downtime and risk. Blue-green deployments enable zero-downtime updates, instant rollbacks, and reduce deployment risk significantly.
-
Database migration strategy - Create proper database migration strategy and rollback plan
- Why: Database changes are risky and hard to undo. A migration strategy ensures safe, reversible changes and prevents data loss or corruption during updates.
-
Staging environment - Create staging environment for testing before production
- Why: Testing in production is dangerous. Staging mirrors production, allows safe testing, and catches issues before they affect real users.
-
Automated backups - Implement automated database and file backups
- Why: Data loss is catastrophic. Automated backups protect against disasters, enable recovery, and are essential for any production system.
-
Monitoring and logging - Set up ELK stack or Grafana for centralized logging and monitoring
- Why: Logs are essential for debugging and monitoring. Centralized logging makes logs searchable, enables alerting, and provides visibility into system behavior.
-
Container orchestration - Set up Docker and Kubernetes for container orchestration
- Why: Containers provide consistency and scalability. Kubernetes enables easy scaling, rolling updates, and manages infrastructure, making deployment and operations easier.
Priority Recommendations
High Priority (Quick Wins)
- Image Optimization - Use Next.js Image component for automatic optimization
- Loading States - Add loading skeletons for better UX
- Toast Notifications - Implement toast notifications for user feedback
- Error Boundaries - Add error boundaries for graceful error handling
- Rate Limiting - Add rate limiting to prevent abuse
Medium Priority (Significant Impact)
- Caching - Implement Redis caching for leaderboard and frequently accessed data
- Dark Mode - Add dark mode support for user preference
- Search Functionality - Add photo search and filtering capabilities
- Achievements System - Implement achievements/badges for increased engagement
- Analytics Dashboard - Create admin analytics dashboard for insights
Low Priority (Nice to Have)
- Social Features - Add comments, reactions, and activity feed
- Advanced Gamification - Implement levels, ranks, and advanced gamification features
Note: This is a living document. Add new ideas as they come up, and mark items as completed when implemented.