diff --git a/.github/ISSUES/01-unit-tests-useFetchStories.md b/.github/ISSUES/01-unit-tests-useFetchStories.md
new file mode 100644
index 0000000..009e8e2
--- /dev/null
+++ b/.github/ISSUES/01-unit-tests-useFetchStories.md
@@ -0,0 +1,62 @@
+---
+title: Add unit tests for useFetchStories hook
+labels: testing, enhancement, good-first-issue
+---
+
+## Description
+
+Create comprehensive unit tests for the `useFetchStories` custom hook to test caching logic, error handling, and API response handling.
+
+## Background
+
+Currently, the project README mentions Jest and React Testing Library but no test files exist in the repository. The `useFetchStories` hook has complex caching logic with ETag support and localStorage fallback that needs thorough testing to ensure reliability.
+
+## Requirements
+
+Tests should cover the following scenarios:
+
+1. **Successful API fetch**
+ - Fetches stories from DEV.to API successfully
+ - Sorts stories by published date
+ - Updates state correctly
+
+2. **Cache hit scenario**
+ - Returns cached data when cache is valid (within 5 minutes)
+ - Doesn't make API call when cache is fresh
+
+3. **Cache miss scenario**
+ - Makes API call when cache is expired
+ - Updates cache with new data
+
+4. **304 Not Modified response**
+ - Handles ETag-based cache validation
+ - Uses cached data when server returns 304
+
+5. **Error states**
+ - Handles API errors gracefully
+ - Sets appropriate error messages
+ - Falls back to expired cache when available
+
+6. **Expired cache fallback**
+ - Uses stale cache data when API fails
+ - Shows error message but displays cached content
+
+## Technical Details
+
+- File location: `hooks/useFetchStories.ts`
+- Test framework: Jest
+- Testing library: React Testing Library / React Hooks Testing Library
+- Mock localStorage and fetch API
+
+## Acceptance Criteria
+
+- [ ] Test file created at `hooks/useFetchStories.test.ts`
+- [ ] All 6 scenarios covered with tests
+- [ ] Tests pass successfully
+- [ ] Code coverage for the hook is above 90%
+- [ ] Tests are well-documented with clear descriptions
+
+## Related Files
+
+- `hooks/useFetchStories.ts` - Hook to be tested
+- `types/index.ts` - Type definitions used by the hook
diff --git a/.github/ISSUES/02-e2e-tests-playwright.md b/.github/ISSUES/02-e2e-tests-playwright.md
new file mode 100644
index 0000000..e4ea138
--- /dev/null
+++ b/.github/ISSUES/02-e2e-tests-playwright.md
@@ -0,0 +1,83 @@
+---
+title: Add comprehensive E2E tests with Playwright
+labels: testing, enhancement, infrastructure
+---
+
+## Description
+
+Implement end-to-end testing suite using Playwright to test critical user flows and prevent regressions.
+
+## Background
+
+Currently, no E2E tests exist despite having critical user flows like story navigation, mini-game interaction, and API error handling. E2E tests would ensure quality before deployment and catch integration issues early.
+
+## Requirements
+
+### Test Coverage
+
+1. **Story Navigation Flow**
+ - Load application and verify stories are displayed
+ - Navigate forward through stories
+ - Navigate backward through stories
+ - Verify story counter updates correctly
+
+2. **Mini-Game Interaction**
+ - Toggle mini-game visibility
+ - Start the game
+ - Use arrow keys to move player
+ - Verify collision detection
+ - Check score updates
+
+3. **API Error Handling**
+ - Mock API failures
+ - Verify error messages are displayed
+ - Verify fallback to cached data works
+
+4. **Caching Behavior**
+ - Verify localStorage caching
+ - Test cache expiration
+ - Test ETag-based validation
+
+5. **Accessibility Features**
+ - Test keyboard navigation
+ - Verify ARIA labels
+ - Test focus management
+
+6. **Responsive Design**
+ - Test on mobile viewport
+ - Test on tablet viewport
+ - Test on desktop viewport
+
+## Technical Details
+
+- Install Playwright: `npm install -D @playwright/test`
+- Create test configuration: `playwright.config.ts`
+- Create test directory: `e2e/` or `tests/e2e/`
+- Add script to package.json: `"test:e2e": "playwright test"`
+
+## Acceptance Criteria
+
+- [ ] Playwright installed and configured
+- [ ] All 6 test categories implemented
+- [ ] Tests pass on Chromium, Firefox, and WebKit
+- [ ] GitHub Actions workflow includes E2E tests
+- [ ] Test reports generated and accessible
+- [ ] README updated with testing instructions
+
+## CI/CD Integration
+
+Add to `.github/workflows/nextjs.yml`:
+```yaml
+- name: Install Playwright Browsers
+ run: npx playwright install --with-deps
+
+- name: Run E2E tests
+ run: npm run test:e2e
+```
+
+## Related Files
+
+- `app/page.tsx` - Main page component
+- `components/StoryCard.tsx` - Story display component
+- `components/MiniGame.tsx` - Mini-game component
+- `hooks/useFetchStories.ts` - Data fetching logic
diff --git a/.github/ISSUES/03-loading-skeleton-storycard.md b/.github/ISSUES/03-loading-skeleton-storycard.md
new file mode 100644
index 0000000..9ff266a
--- /dev/null
+++ b/.github/ISSUES/03-loading-skeleton-storycard.md
@@ -0,0 +1,94 @@
+---
+title: Add loading skeleton for StoryCard component
+labels: enhancement, ui/ux, performance
+---
+
+## Description
+
+Replace the simple "Loading stories..." text with an animated skeleton loader that matches the StoryCard layout to improve perceived performance.
+
+## Background
+
+Currently, when stories are loading, users see only plain text saying "Loading stories...". A skeleton loader provides visual feedback about the layout structure and creates a better perceived performance, making the app feel faster and more polished.
+
+## Requirements
+
+### Skeleton Structure
+
+The skeleton should include placeholders for:
+1. **Header section**
+ - Title placeholder (2-3 lines)
+ - XP badge placeholder
+
+2. **Content section**
+ - Description placeholder (4-5 lines)
+
+3. **Author section**
+ - Avatar placeholder (circular, 48x48px)
+ - Author name placeholder (1 line)
+ - Username placeholder (1 line)
+
+4. **Footer section**
+ - Progress bar placeholder
+ - Navigation buttons placeholders
+ - Level indicator placeholder
+
+### Animation
+
+- Use CSS shimmer/pulse animation effect
+- Animation should be smooth and subtle
+- **Must respect `prefers-reduced-motion`** - no animation for users who prefer reduced motion
+
+## Technical Details
+
+**Option 1: Pure CSS Implementation**
+```css
+.skeleton {
+ background: linear-gradient(
+ 90deg,
+ var(--skeleton-base) 0%,
+ var(--skeleton-highlight) 50%,
+ var(--skeleton-base) 100%
+ );
+ background-size: 200% 100%;
+ animation: shimmer 1.5s infinite;
+}
+
+@keyframes shimmer {
+ 0% { background-position: -200% 0; }
+ 100% { background-position: 200% 0; }
+}
+
+@media (prefers-reduced-motion: reduce) {
+ .skeleton {
+ animation: none;
+ }
+}
+```
+
+**Option 2: Use a library**
+- `react-loading-skeleton` or similar
+
+## Acceptance Criteria
+
+- [ ] Create `SkeletonCard` component or skeleton variant of `StoryCard`
+- [ ] Skeleton matches the actual `StoryCard` layout
+- [ ] Smooth shimmer/pulse animation implemented
+- [ ] Animation respects `prefers-reduced-motion`
+- [ ] Skeleton shown during initial load
+- [ ] Skeleton shown when refetching stories
+- [ ] Works well with dark/light themes (if theme toggle exists)
+- [ ] No layout shift when skeleton is replaced with actual content
+
+## Design Considerations
+
+- Use existing CSS variables for colors
+- Skeleton should be subtle, not distracting
+- Border radius should match actual card
+- Spacing should match actual card layout
+
+## Related Files
+
+- `components/StoryCard.tsx` - Main card component
+- `app/page.tsx` - Page that shows loading state
+- `components/StoryCard.module.css` - Card styles
diff --git a/.github/ISSUES/04-bundle-optimization-code-splitting.md b/.github/ISSUES/04-bundle-optimization-code-splitting.md
new file mode 100644
index 0000000..f9830e4
--- /dev/null
+++ b/.github/ISSUES/04-bundle-optimization-code-splitting.md
@@ -0,0 +1,114 @@
+---
+title: Optimize bundle size and implement code splitting
+labels: performance, enhancement, optimization
+---
+
+## Description
+
+Analyze and optimize bundle size using next/bundle-analyzer to improve initial load time and Core Web Vitals scores.
+
+## Background
+
+Currently, no bundle analysis is configured, and all components load upfront. The MiniGame component, in particular, is loaded even when not used, increasing the initial bundle size unnecessarily.
+
+## Requirements
+
+### 1. Bundle Analysis Setup
+
+Install and configure `@next/bundle-analyzer`:
+```bash
+npm install --save-dev @next/bundle-analyzer
+```
+
+Configure in `next.config.mjs`:
+```javascript
+import bundleAnalyzer from '@next/bundle-analyzer';
+
+const withBundleAnalyzer = bundleAnalyzer({
+ enabled: process.env.ANALYZE === 'true',
+});
+
+export default withBundleAnalyzer({
+ // ... existing config
+});
+```
+
+Add script to `package.json`:
+```json
+"analyze": "ANALYZE=true npm run build"
+```
+
+### 2. Dynamic Imports
+
+Implement dynamic imports for components that are:
+- Not needed on initial render
+- Behind user interaction
+- Heavy/large components
+
+**Priority: MiniGame component**
+```tsx
+const MiniGame = dynamic(() => import('../components/MiniGame').then(mod => ({ default: mod.MiniGame })), {
+ loading: () =>
Loading game...
,
+ ssr: false
+});
+```
+
+### 3. Image Optimization
+
+Ensure all images are properly optimized:
+- Use `next/image` consistently (already done for profile images)
+- Optimize SVG files in `/public`
+- Consider using WebP format where appropriate
+
+### 4. Dependency Audit
+
+Review and optimize dependencies:
+- Check for unused dependencies
+- Look for lighter alternatives to heavy libraries
+- Ensure proper tree-shaking
+
+### 5. Route-Based Code Splitting
+
+Verify Next.js automatic code splitting is working:
+- Check each route has its own bundle
+- Verify shared chunks are optimized
+
+## Target Metrics
+
+- **Initial bundle size**: < 200KB (gzipped)
+- **First Contentful Paint (FCP)**: < 1.8s
+- **Largest Contentful Paint (LCP)**: < 2.5s
+- **Time to Interactive (TTI)**: < 3.8s
+
+## Acceptance Criteria
+
+- [ ] Bundle analyzer installed and configured
+- [ ] Analysis script added to package.json
+- [ ] MiniGame component dynamically imported
+- [ ] Bundle analysis report generated and reviewed
+- [ ] Identified and removed unused dependencies (if any)
+- [ ] Documentation added explaining bundle optimization strategy
+- [ ] Performance improvements measured and documented
+- [ ] Core Web Vitals scores improved
+
+## Implementation Steps
+
+1. Install and configure bundle analyzer
+2. Run initial analysis to establish baseline
+3. Implement dynamic import for MiniGame
+4. Re-run analysis to measure improvement
+5. Identify other optimization opportunities
+6. Document findings and results
+
+## Related Files
+
+- `next.config.mjs` - Next.js configuration
+- `package.json` - Dependencies and scripts
+- `app/page.tsx` - Main page (imports MiniGame)
+- `components/MiniGame.tsx` - Component to be dynamically loaded
+
+## Resources
+
+- [Next.js Bundle Analyzer](https://www.npmjs.com/package/@next/bundle-analyzer)
+- [Next.js Dynamic Imports](https://nextjs.org/docs/advanced-features/dynamic-import)
+- [Web Vitals](https://web.dev/vitals/)
diff --git a/.github/ISSUES/05-rate-limiting-retry-logic.md b/.github/ISSUES/05-rate-limiting-retry-logic.md
new file mode 100644
index 0000000..74d6dbe
--- /dev/null
+++ b/.github/ISSUES/05-rate-limiting-retry-logic.md
@@ -0,0 +1,120 @@
+---
+title: Implement rate limiting and error retry logic
+labels: enhancement, reliability, bug
+---
+
+## Description
+
+Add exponential backoff retry logic and proper rate limit handling for DEV.to API calls to improve reliability and user experience.
+
+## Background
+
+Currently, if an API call to DEV.to fails, the app only tries once. This can lead to failures during temporary network issues or API rate limiting. Implementing retry logic with exponential backoff would significantly improve reliability.
+
+## Requirements
+
+### 1. Exponential Backoff Retry
+
+Implement retry logic with exponential backoff:
+- **Maximum retries**: 3 attempts
+- **Backoff strategy**: 1s, 2s, 4s
+- **Jitter**: Add random jitter to prevent thundering herd
+
+Example implementation:
+```typescript
+async function fetchWithRetry(url: string, options: RequestInit, maxRetries = 3) {
+ for (let i = 0; i < maxRetries; i++) {
+ try {
+ const response = await fetch(url, options);
+
+ // Don't retry on 4xx errors (except 429)
+ if (response.status >= 400 && response.status < 500 && response.status !== 429) {
+ throw new Error(`Client error: ${response.status}`);
+ }
+
+ if (!response.ok) {
+ throw new Error(`HTTP error: ${response.status}`);
+ }
+
+ return response;
+ } catch (error) {
+ const isLastAttempt = i === maxRetries - 1;
+ if (isLastAttempt) throw error;
+
+ // Exponential backoff with jitter
+ const delay = Math.pow(2, i) * 1000 + Math.random() * 1000;
+ await new Promise(resolve => setTimeout(resolve, delay));
+ }
+ }
+}
+```
+
+### 2. Rate Limit Handling
+
+Properly handle 429 (Too Many Requests) responses:
+- Check for `Retry-After` header
+- Show user-friendly message explaining rate limit
+- Automatically retry after specified time
+- Consider implementing request throttling
+
+### 3. User-Friendly Error Messages
+
+Provide specific error messages for different scenarios:
+- **Network error**: "Unable to connect. Please check your internet connection."
+- **Rate limited**: "Too many requests. Retrying in [X] seconds..."
+- **Server error**: "DEV.to is temporarily unavailable. Using cached stories."
+- **Timeout**: "Request timed out. Please try again."
+
+### 4. Request Debouncing
+
+If implementing a refresh button, add debouncing to prevent rapid requests:
+```typescript
+const debouncedFetch = debounce(fetchStories, 2000);
+```
+
+## Technical Implementation
+
+### Files to Modify
+
+**`hooks/useFetchStories.ts`**
+- Add retry logic to fetch function
+- Handle rate limiting
+- Improve error messages
+- Add request debouncing (if refresh functionality exists)
+
+### New Utility (Optional)
+
+Create `utils/fetchWithRetry.ts` for reusable retry logic
+
+## Acceptance Criteria
+
+- [ ] Retry logic implemented with exponential backoff
+- [ ] Maximum 3 retry attempts
+- [ ] Random jitter added to prevent thundering herd
+- [ ] 429 rate limit responses handled with Retry-After header
+- [ ] User-friendly error messages for different error types
+- [ ] Cached data used as fallback when available
+- [ ] Loading states properly reflect retry attempts
+- [ ] Tests added for retry logic
+- [ ] Documentation updated
+
+## Testing
+
+Test scenarios to verify:
+1. Successful fetch after 1 retry
+2. Successful fetch after 2 retries
+3. Failure after 3 retries
+4. Rate limit handling with Retry-After
+5. Immediate failure on 4xx errors (except 429)
+6. Fallback to cache on repeated failures
+
+## Related Files
+
+- `hooks/useFetchStories.ts` - Main hook to modify
+- `types/index.ts` - Type definitions
+
+## Resources
+
+- [Exponential Backoff](https://en.wikipedia.org/wiki/Exponential_backoff)
+- [DEV.to API Rate Limits](https://developers.forem.com/api/#section/Rate-limiting)
+- [HTTP 429 Status Code](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/429)
diff --git a/.github/ISSUES/06-keyboard-shortcuts-navigation.md b/.github/ISSUES/06-keyboard-shortcuts-navigation.md
new file mode 100644
index 0000000..e4f537a
--- /dev/null
+++ b/.github/ISSUES/06-keyboard-shortcuts-navigation.md
@@ -0,0 +1,134 @@
+---
+title: Implement keyboard shortcuts for story navigation
+labels: enhancement, accessibility, a11y
+---
+
+## Description
+
+Add keyboard shortcuts (arrow keys) for navigating between stories when the mini-game is not active, improving accessibility and user experience.
+
+## Background
+
+Currently, users can only navigate between stories using mouse clicks on the "Previous" and "Next" buttons. Adding keyboard navigation would significantly improve accessibility for keyboard-only users and provide a more efficient navigation experience for all users.
+
+## Requirements
+
+### Keyboard Shortcuts
+
+- **Left Arrow** (←): Navigate to previous story
+- **Right Arrow** (→): Navigate to next story
+- **Escape**: Close mini-game (if open)
+
+### Behavior
+
+1. **When mini-game is NOT active**:
+ - Arrow keys navigate between stories
+ - Visual feedback on button when key is pressed
+
+2. **When mini-game IS active**:
+ - Arrow keys control the game (existing behavior)
+ - Story navigation is disabled
+
+3. **Focus management**:
+ - Shortcuts work regardless of which element has focus
+ - Don't interfere with form inputs (if any added in future)
+
+### Accessibility Considerations
+
+- Add visual indicator showing keyboard shortcuts are available
+- Include keyboard shortcuts in "How to Play" section
+- Add `aria-live` announcement when story changes via keyboard
+- Ensure shortcuts don't conflict with browser/screen reader shortcuts
+
+## Technical Implementation
+
+```typescript
+// In app/page.tsx
+useEffect(() => {
+ const handleKeyDown = (e: KeyboardEvent) => {
+ // Don't handle shortcuts in input fields
+ if (e.target instanceof HTMLInputElement || e.target instanceof HTMLTextAreaElement) {
+ return;
+ }
+
+ // Don't handle shortcuts when mini-game is active
+ if (showMiniGame) {
+ return;
+ }
+
+ if (e.key === 'ArrowLeft') {
+ e.preventDefault();
+ prevStory();
+ } else if (e.key === 'ArrowRight') {
+ e.preventDefault();
+ nextStory();
+ }
+ };
+
+ window.addEventListener('keydown', handleKeyDown);
+ return () => window.removeEventListener('keydown', handleKeyDown);
+}, [showMiniGame, prevStory, nextStory]);
+```
+
+### Visual Indicators
+
+Add keyboard shortcut hints to the navigation buttons:
+```tsx
+
+```
+
+## Acceptance Criteria
+
+- [ ] Left arrow key navigates to previous story
+- [ ] Right arrow key navigates to next story
+- [ ] Shortcuts disabled when mini-game is active
+- [ ] Shortcuts work from anywhere on the page (except form inputs)
+- [ ] Visual indicators added to show keyboard shortcuts
+- [ ] "How to Play" section updated with keyboard shortcuts
+- [ ] ARIA announcements added for screen reader users
+- [ ] No conflicts with existing functionality
+- [ ] Works across all major browsers
+
+## UI Updates
+
+### Navigation Buttons
+Add subtle keyboard shortcut hints to buttons:
+```css
+.keyboardHint {
+ font-size: 0.75rem;
+ opacity: 0.6;
+ margin-left: 0.5rem;
+}
+```
+
+### How to Play Section
+Update the "Read Stories" card to include:
+```markdown
+- Use Left/Right arrow keys for quick navigation
+- Click Previous/Next buttons to navigate between stories
+```
+
+## Testing Checklist
+
+- [ ] Arrow keys navigate stories when game is closed
+- [ ] Arrow keys control game when game is open
+- [ ] Escape key closes mini-game (if implemented)
+- [ ] No interference with form inputs
+- [ ] Screen reader announces story changes
+- [ ] Visual feedback on keyboard navigation
+- [ ] Works without mouse interaction
+
+## Related Files
+
+- `app/page.tsx` - Add keyboard event listeners
+- `components/StoryCard.tsx` - Update button UI with hints
+- `components/HowToPlay.tsx` - Add keyboard shortcut documentation
+- `components/StoryCard.module.css` - Styles for keyboard hints
+
+## Accessibility Resources
+
+- [WCAG 2.1 Keyboard Accessible](https://www.w3.org/WAI/WCAG21/Understanding/keyboard.html)
+- [MDN Keyboard Events](https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent)
diff --git a/.github/ISSUES/07-dark-light-theme-toggle.md b/.github/ISSUES/07-dark-light-theme-toggle.md
new file mode 100644
index 0000000..490e678
--- /dev/null
+++ b/.github/ISSUES/07-dark-light-theme-toggle.md
@@ -0,0 +1,180 @@
+---
+title: Add dark/light theme toggle
+labels: enhancement, accessibility, ui/ux, a11y
+---
+
+## Description
+
+Implement a theme toggle feature to switch between light and dark modes, enhancing user experience and accessibility.
+
+## Background
+
+The application currently has CSS variables defined in the codebase that suggest theme support, but there's no user-facing toggle to switch themes. Many users prefer dark mode for reduced eye strain, especially during extended reading sessions.
+
+## Requirements
+
+### Core Functionality
+
+1. **Theme Toggle UI**
+ - Add theme toggle button in the header (near score/title)
+ - Use icon: 🌙 for dark mode, ☀️ for light mode
+ - Smooth transition between themes (respect prefers-reduced-motion)
+
+2. **Theme Persistence**
+ - Save user preference in localStorage
+ - Restore theme on page load
+ - Prevent flash of wrong theme (FOUT)
+
+3. **System Preference Detection**
+ - Detect `prefers-color-scheme` media query
+ - Use system preference as default (if no saved preference)
+ - Allow user to override system preference
+
+4. **Theme Implementation**
+ - Light mode (default)
+ - Dark mode with appropriate color palette
+
+### Color Palette
+
+Define CSS variables for both themes:
+
+```css
+/* Light Theme (default) */
+:root {
+ --background-primary: rgb(255, 255, 255);
+ --background-secondary: rgb(245, 245, 247);
+ --foreground: rgb(0, 0, 0);
+ --foreground-secondary: rgb(60, 60, 67);
+ --border-color: rgb(229, 229, 234);
+ --card-background: rgb(255, 255, 255);
+ --card-shadow: rgba(0, 0, 0, 0.1);
+}
+
+/* Dark Theme */
+[data-theme="dark"] {
+ --background-primary: rgb(0, 0, 0);
+ --background-secondary: rgb(28, 28, 30);
+ --foreground: rgb(255, 255, 255);
+ --foreground-secondary: rgb(174, 174, 178);
+ --border-color: rgb(58, 58, 60);
+ --card-background: rgb(28, 28, 30);
+ --card-shadow: rgba(0, 0, 0, 0.3);
+}
+```
+
+## Technical Implementation
+
+### 1. Theme Context/Hook
+
+Create `hooks/useTheme.ts`:
+```typescript
+export function useTheme() {
+ const [theme, setTheme] = useState<'light' | 'dark'>('light');
+
+ useEffect(() => {
+ // Check localStorage
+ const saved = localStorage.getItem('theme');
+ if (saved) {
+ setTheme(saved as 'light' | 'dark');
+ return;
+ }
+
+ // Check system preference
+ const prefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches;
+ setTheme(prefersDark ? 'dark' : 'light');
+ }, []);
+
+ useEffect(() => {
+ document.documentElement.setAttribute('data-theme', theme);
+ localStorage.setItem('theme', theme);
+ }, [theme]);
+
+ const toggleTheme = () => {
+ setTheme(prev => prev === 'light' ? 'dark' : 'light');
+ };
+
+ return { theme, toggleTheme };
+}
+```
+
+### 2. Theme Toggle Component
+
+Create `components/ThemeToggle.tsx`:
+```tsx
+export const ThemeToggle: React.FC = () => {
+ const { theme, toggleTheme } = useTheme();
+
+ return (
+
+ );
+};
+```
+
+### 3. Prevent Flash of Unstyled Theme
+
+Add inline script in `app/layout.tsx` (before other content):
+```tsx
+
+```
+
+## Acceptance Criteria
+
+- [ ] Theme toggle button added to header
+- [ ] Dark and light themes fully implemented
+- [ ] Theme persists across page reloads
+- [ ] System preference detected and used as default
+- [ ] No flash of unstyled content (FOUT)
+- [ ] Smooth transitions between themes
+- [ ] Transitions respect `prefers-reduced-motion`
+- [ ] All components render correctly in both themes
+- [ ] Contrast ratios meet WCAG AA standards in both themes
+- [ ] Documentation updated with theme feature
+
+## Testing Checklist
+
+- [ ] Toggle switches between light and dark mode
+- [ ] Theme persists after page reload
+- [ ] System preference properly detected
+- [ ] User preference overrides system preference
+- [ ] No FOUT on initial page load
+- [ ] All components readable in both themes
+- [ ] Icons/images appropriate for each theme
+- [ ] Proper ARIA labels on toggle button
+
+## Accessibility Considerations
+
+- Toggle button has proper ARIA label
+- Keyboard accessible (tab + enter/space)
+- Visual focus indicator on toggle button
+- Sufficient contrast in both themes (WCAG AA: 4.5:1 for text)
+- Icons clearly indicate current/next theme state
+
+## Related Files
+
+- `app/globals.css` - Theme variables
+- `app/styles/variables.css` - CSS variables
+- `app/layout.tsx` - Add theme prevention script
+- `components/GameHeader.tsx` - Add toggle button
+- `hooks/useTheme.ts` - New theme hook (to create)
+- `components/ThemeToggle.tsx` - New toggle component (to create)
+
+## Resources
+
+- [Dark Mode Best Practices](https://web.dev/prefers-color-scheme/)
+- [CSS Custom Properties](https://developer.mozilla.org/en-US/docs/Web/CSS/Using_CSS_custom_properties)
diff --git a/.github/ISSUES/08-accessibility-audit.md b/.github/ISSUES/08-accessibility-audit.md
new file mode 100644
index 0000000..81a2530
--- /dev/null
+++ b/.github/ISSUES/08-accessibility-audit.md
@@ -0,0 +1,216 @@
+---
+title: Implement comprehensive accessibility audit fixes
+labels: accessibility, a11y, enhancement, bug
+---
+
+## Description
+
+Conduct a comprehensive accessibility audit using automated tools and fix identified issues to ensure WCAG 2.1 AA compliance.
+
+## Background
+
+While the README claims WCAG 2.1 AA compliance, no formal accessibility testing has been documented. A thorough audit will identify and fix any accessibility barriers for users with disabilities.
+
+## Audit Tools to Use
+
+1. **Automated Testing**
+ - [axe DevTools](https://www.deque.com/axe/devtools/) browser extension
+ - [Lighthouse](https://developers.google.com/web/tools/lighthouse) in Chrome DevTools
+ - [WAVE](https://wave.webaim.org/) browser extension
+ - `@axe-core/react` for runtime testing
+
+2. **Manual Testing**
+ - Keyboard-only navigation
+ - Screen reader testing (NVDA/JAWS/VoiceOver)
+ - Browser zoom to 200%
+ - High contrast mode testing
+
+## Areas to Audit
+
+### 1. Semantic HTML
+
+- [ ] Proper heading hierarchy (h1 → h2 → h3, no skipping)
+- [ ] Use semantic elements (`