Legacy Flash games sometimes emit URLs like /http:/domain.com/path
instead of /http://domain.com/path. Add normalization to detect
and fix these malformed URLs before parsing in both the proxy
handler and GameZip server.
The nginx envsubst command doesn't support the ${VAR:-default}
syntax. Move default values for BACKEND_HOST, BACKEND_PORT, and
GAME_SERVICE_HOST to docker-entrypoint.sh where they're properly
handled by bash before envsubst runs.
Routes game content through nginx instead of requiring direct
localhost:22500 access from browser. This enables proper Docker
networking where containers communicate internally.
Changes:
- Add /game-proxy and /gamezip-proxy locations to nginx config
- Add GAME_SERVICE_EXTERNAL_URL config for browser-facing URLs
- Update games route to use external URL config
- Add GAME_SERVICE_HOST env var to frontend container
- Add game-service dependency to frontend in docker-compose
Remove logoPath and screenshotPath fields from Game interface
and database queries. Images are stored on disk with paths
derived from game ID (e.g., Logos/ab/cd/{game-id}.png).
- Add gameUtils.ts with path/URL derivation functions
- Update GameCard, GameListItem, GameDetailView, GamePlayerView
- Update GameService to exclude unused columns from queries
- Update tests with valid UUID format for image URL testing
- Update database schema docs to clarify image storage
- Consolidate duplicate filter UI code by migrating all filters
(platform, series, developer, publisher, play mode, language, tags)
to use the FilterDropdown component across desktop and mobile layouts.
- Add compact mode to FilterDropdown for space-efficient mobile display.
- Implement accessibility improvements with skip navigation links in
AppShell for keyboard users.
- Optimize build configuration with manual code-splitting strategy for vendor libraries, charts, icons, forms,
and UI primitives to improve initial load performance.
Accessibility Enhancements:
- Add comprehensive aria-labels to interactive elements (GameCard, FilterDropdown, SidebarItem, FavoriteButton)
- Add aria-hidden to decorative icons
- Add aria-current="page" to active navigation items
- Improve screen reader support throughout the application
Logging Standardization:
- Replace all console.log/error/warn statements with logger utility
- Updated 15 files to use centralized logger (ErrorBoundary, LoginForm, AuthContext, useAuth, GamePlayer, and more)
- Prevents console pollution in production builds
Error Handling:
- Add ErrorBoundary to GameDetailView, DashboardView, and PlaylistsView
- Wrap major views in error boundaries to prevent full application crashes
- Improve error recovery and user experience
Components Updated:
- frontend/src/components/library/GameCard.tsx - Added descriptive aria-labels for all interactive elements
- frontend/src/components/search/FilterDropdown.tsx - Added aria-labels to filter controls
- frontend/src/components/layout/Sidebar.tsx - Added aria-label to navigation
- frontend/src/components/layout/SidebarItem.tsx - Added aria-labels and aria-current
- frontend/src/components/common/FavoriteButton.tsx - Added aria-label
- frontend/src/components/common/RemoveFavoriteButton.tsx - Added aria-label
- frontend/src/views/{GameDetailView,DashboardView,PlaylistsView}.tsx - Added ErrorBoundary wrappers
All changes verified with TypeScript compilation - no errors.
Introduce the `FilterDropdown` component to eliminate code duplication
in `FilterPanel` by creating a reusable dropdown for filters. This helps
unify UI behavior across multiple dropdown filters.
Implement `useFilterDropdowns` custom hook for consolidated management
of dropdown states in `FilterPanel`. It replaces over 16 individual
`useState` calls, simplifying state management with `isOpen`, `setOpen`,
and `closeAll` methods. This enhances code clarity and maintainability.
Implement activity analytics dashboard with real-time stats, charts, and
user leaderboard. Add automated Ruffle update job for Flash emulator
maintenance. Standardize datetime formatting across frontend/backend with
ISO 8601 and user preferences. Enhance security with comprehensive input
validation, rate limiting, and CSRF protection. Improve accessibility
with ARIA labels, keyboard navigation, and screen reader support. Fix
multiple security vulnerabilities including XSS, SQL injection risks, and
session management issues.