10 hours of Ludwig doing the Luddy!
A fun Next.js web app showcasing 10 hours of Ludwig's iconic dance. Built with modern web technologies and optimized for performance.
π Live Site: luddy.dance
- π¬ YouTube Integration: Embedded 10-hour Ludwig dance video with lazy loading
- π¨ Modern Design: Gradient background with responsive layout
- β‘ Performance Optimized: Lighthouse CI, lazy loading, optimized images
- π‘οΈ Error Monitoring: Comprehensive error tracking with structured logging
- π SEO Ready: Meta tags, Open Graph, Twitter Cards, structured data
- βΏ Accessible: ARIA labels, semantic HTML, screen reader friendly
- π§ͺ Well Tested: Vitest + React Testing Library
- π CI/CD Ready: GitHub Actions with automated testing and performance monitoring
- Framework: Next.js 16.0.3 with React 19.2
- Language: TypeScript 5.9
- Styling: Tailwind CSS 4.1.17
- Runtime: Node.js 24.x
- Package Manager: pnpm
- Linting: Biome 2.3 for code quality and formatting
- Testing: Vitest 4.0 + React Testing Library
- Bundle Analysis: @next/bundle-analyzer
- Error Tracking: logan-logger with structured logging
- Performance Testing: Lighthouse CI
- Environment-based Logging: Production-optimized logging controls
- CI/CD: GitHub Actions with automated testing, linting, and performance monitoring
- Containerization: Optimized Docker with multi-stage builds (Alpine-based, 234MB)
- Node Version Testing: CI matrix testing on Node 20.x, 22.x, and 24.x
- Node.js: 24.x (recommended) or 20.x/22.x
- pnpm: Latest version (10.x+)
# Clone the repository
git clone git@github.com:llbbl/luddy.dance.git
cd luddy.dance
# Install dependencies
pnpm install
# Start development server
pnpm devOpen http://localhost:3000 to see the app.
# Development
pnpm dev # Start development server
pnpm build # Build for production
pnpm start # Start production server
# Code Quality
pnpm lint # Run Biome linting
pnpm biome:check # Check code formatting
pnpm biome:fix # Fix linting and formatting issues
# Testing
pnpm test # Run all tests
pnpm test:ui # Run tests with UI
# Performance & Analysis
pnpm analyze # Analyze bundle size
pnpm lighthouse # Run Lighthouse CICopy the example environment file:
cp .env.example .env.localAvailable Variables:
NODE_ENV:development|productionNEXT_PUBLIC_ENABLE_LOGGING: Set totrueto force enable logging in production
luddy.dance/
βββ components/ # React components
β βββ ErrorBoundary.tsx # Error boundary with fallback UI
β βββ SEO.tsx # SEO meta tags and structured data
β βββ layout.tsx # Main layout wrapper
βββ lib/ # Utilities and libraries
β βββ logger.ts # Structured logging with logan-logger
βββ pages/ # Next.js pages
β βββ _app.tsx # App wrapper
β βββ index.tsx # Home page with video
βββ public/ # Static assets
βββ tests/ # Test files
βββ .github/workflows/ # GitHub Actions CI/CD
βββ docs/ # Documentation
βββ scripts/ # Utility scripts
- Linting: Biome with TypeScript and React rules
- Formatting: Automatic code formatting with Biome
- Testing: Component and integration tests with Vitest
- Performance: Lighthouse CI with performance budgets
- Accessibility: ARIA labels, semantic HTML, screen reader support
The app uses an optimized multi-stage Docker build:
Features:
- 3-stage build (deps β builder β runner)
- Alpine Linux base image (minimal size)
- Next.js standalone output mode
- Non-root user for security
- 78% size reduction (1.05GB β 234MB)
# Build image
docker buildx build --load -t luddy-dance .
# Run container
docker run -p 3000:3000 luddy-danceNote: The Dockerfile includes registry override for public npm registry to ensure builds work in CI/CD environments.
# Build for production
pnpm build
# Start production server
pnpm startThe app is optimized for performance:
- Bundle Size: ~105kB total (excellent for web apps)
- Core Web Vitals: Optimized for Google's performance standards
- Lighthouse Score: Monitored via CI with performance budgets
- Image Optimization: WebP images with Next.js optimization
- Lazy Loading: YouTube iframe loads only when visible
- First Contentful Paint: < 3 seconds
- Largest Contentful Paint: < 4 seconds
- Cumulative Layout Shift: < 0.1
- Scripts: < 150KB
- Total Resources: < 500KB
Run the test suite:
# Run all tests
pnpm test
# Run tests in watch mode
pnpm test:watch
# Run tests with coverage
pnpm test:coverage- Component rendering: Smoke tests for all major components
- User interactions: Event handling and state updates
- Error boundaries: Error handling and fallback UI
- Accessibility: Screen reader compatibility
Build Failures:
# Clear Next.js cache
rm -rf .next
pnpm buildTypeScript Errors:
# Check TypeScript
pnpm biome:checkPerformance Issues:
# Analyze bundle
pnpm analyzeDevelopment logging is enabled by default. In production, set NEXT_PUBLIC_ENABLE_LOGGING=true to enable detailed logging.
We welcome contributions! Please see CONTRIBUTING.md for guidelines.
- Fork the repository
- Create a feature branch:
git checkout -b feature/amazing-feature - Make your changes
- Run tests:
pnpm test - Run linting:
pnpm lint - Commit changes:
git commit -m 'Add amazing feature' - Push to branch:
git push origin feature/amazing-feature - Open a Pull Request
This project is open source and available under the MIT License.
- Ludwig for the iconic dance moves
- Next.js team for the amazing framework
- Open source community for the excellent tools and libraries
Made with β€οΈ for the Ludwig community
Keep dancing! πΊ