A sophisticated, fully-featured photo booth web application with real-time camera capture, professional photo strips, advanced sticker system, custom backgrounds/frames, and comprehensive internationalization support.
- β¨ Features
- π Quick Start
- π How to Use
- ποΈ Architecture
- π οΈ Tech Stack
- π§ Configuration
- π€ Contributing
- π Security
- π Community & Contributors
- π Troubleshooting
- π License
- π¨βπ» Author & Support
- Real-time camera access with high-quality photo capture
- Multiple photo strip templates (1-photo, 2-photo, 4-photo strips)
- Professional photo layouts (vertical strips, grid layouts, single photos)
- Automatic photo strip composition with proper spacing and borders
- Flash effect and smooth capture animations
- Custom backgrounds (solid colors, gradients, patterns)
- Professional frames with various styles and effects
- SVG sticker support with PNG conversion for optimal rendering
- Drag-and-drop sticker placement with resize and rotation
- Layered composition (background β photo β stickers)
- Real-time preview with Fabric.js canvas integration
- Local photo gallery with persistent storage
- High-quality photo export (JPEG with optimized compression)
- Instant download functionality
- Photo strip creation with multiple layouts
- Background/frame application before photo capture
- 7 language support: English, Spanish, French, German, Japanese, Chinese, Portuguese
- Dynamic language switching with persistent preference
- Localized UI elements and user feedback messages
- Right-to-left (RTL) text support for applicable languages
- Fully responsive design optimized for mobile, tablet, and desktop
- Progressive Web App (PWA) ready
- Accessibility compliant with keyboard navigation and screen reader support
- Modern Material Design with smooth animations
- Toast notifications for user feedback
- Loading states and error handling
- Modular architecture with custom React hooks
- TypeScript throughout for type safety
- Optimized performance with lazy loading and code splitting
- Professional build pipeline with Next.js 14
- Clean console output (production-ready, no debug logs)
- Node.js 18+
- npm, pnpm, or yarn package manager
-
Clone the repository:
git clone <https://github.com/tedy69/photobooth> cd photobooth
-
Install dependencies:
npm install # or pnpm install # or yarn install
-
Set up environment variables:
cp .env.example .env
Configure your
.envfile:WEB3FORMS_ACCESS_KEY=your_web3forms_access_key SUPPORT_EMAIL=[email protected]
-
Start development server:
npm run dev # or pnpm dev # or yarn dev
-
Open the app: Navigate to http://localhost:3000 in your browser
npm run build
npm start- Grant camera permissions when prompted
- Position yourself in the camera view
- Select your preferred photo template (single photo or strip)
- Browse available backgrounds (colors, gradients, patterns)
- Select a decorative frame style
- Preview your selection in real-time
- Single Photo: Click "Take Photo" for instant capture
- Photo Strip: Click "Take Photo" to start the timer sequence
- Multiple photos captured automatically (every 5 seconds)
- Timer shows progress and countdown
- Complete strip created automatically
- Add stickers by dragging from the sticker panel
- Resize stickers using corner handles
- Rotate stickers by dragging
- Remove stickers with delete key or remove button
- Change backgrounds/frames anytime
- Download high-quality images instantly
- Save to local gallery for later access
- Photos persist between sessions
The app uses a clean, modular architecture with specialized hooks:
// Custom Hooks
useCamera(); // Camera access, photo capture
useFabricStickers(); // Canvas management, stickers, backgrounds
usePhotoGallery(); // Local storage, photo management
useLanguage(); // Internationalizationcomponents/
βββ photo-booth.tsx # Main application logic
βββ background-frame-selector.tsx # Background/frame selection
βββ sticker-selector.tsx # Sticker browsing and selection
βββ photo-gallery.tsx # Gallery view and management
βββ timer-indicator.tsx # Photo strip countdown timer
βββ ui/ # Reusable UI components
- React hooks for local component state
- Context providers for shared state (language, theme)
- Local storage for persistence (photos, preferences)
- Canvas state managed through Fabric.js integration
- Next.js 14 - React framework with App Router and server-side rendering
- TypeScript - Full type safety throughout the application
- React 18 - Modern React with hooks and concurrent features
- Tailwind CSS - Utility-first CSS framework for rapid UI development
- Radix UI - Headless, accessible component primitives
- Lucide React - Beautiful, customizable icon library
- Fabric.js - Powerful canvas library for image manipulation
- Canvas API - Native browser image capture and processing
- File API - Handle image uploads and downloads
- Base64 encoding - Efficient image data management
- Custom i18n system - Lightweight, type-safe translations
- Dynamic imports - Language bundles loaded on demand
- Locale persistence - User language preference storage
- ESLint - Code linting and style enforcement
- Prettier - Code formatting
- Husky - Git hooks for code quality
- VS Code integration - Optimized developer experience
# Email service configuration (optional)
WEB3FORMS_ACCESS_KEY=your_web3forms_key
SUPPORT_EMAIL=[email protected]
# App configuration
NEXT_PUBLIC_APP_URL=http://localhost:3000- Chrome/Edge 90+ (full features)
- Firefox 88+ (full features)
- Safari 14+ (full features)
- Mobile browsers iOS 14+, Android 10+
- HTTPS required for camera access (or localhost for development)
- User permission required for camera and microphone
- Fallback UI for devices without camera access
We welcome contributions from developers of all skill levels! This project is designed to be developer-friendly and extensible.
- π Read the Contributing Guidelines - Comprehensive guide with development setup, code style, and best practices
- π Check existing Issues - See what needs to be done or report bugs
- π‘ Propose ideas in Discussions - Share feature ideas and get feedback
- π Report security issues via our Security Policy
# 1. Fork and clone
git clone https://github.com/tedy69/photobooth.git
cd photobooth
# 2. Install dependencies
npm install
# 3. Start development
npm run dev
# 4. Create feature branch
git checkout -b feature/amazing-new-feature
# 5. Make changes and test
npm run build && npm run lint && npm run type-check| Priority | Area | Description |
|---|---|---|
| π₯ High | Unit Tests | Add tests for custom hooks and components |
| π₯ High | New Languages | Add translations for additional languages |
| π Medium | Sticker Collections | Add more SVG sticker categories |
| π Medium | PWA Features | Enhance progressive web app capabilities |
| π‘ Low | New Templates | Additional photo strip layouts |
| π‘ Low | Animations | Enhanced UI transitions and effects |
We provide structured templates to help you contribute effectively:
- π Bug Report - Report issues with detailed information
- β¨ Feature Request - Suggest new features or enhancements
- π Documentation - Improve guides and documentation
Add SVG files to /public/stickers/ and they'll be automatically available.
- Create translation file in
/lib/translations/[locale].ts - Export from
/lib/translations/index.ts - Follow existing translation key structure
Add templates to /lib/frames.ts with layout specifications.
Add background definitions to /lib/backgrounds.ts with type and properties.
- β Read Contributing Guidelines for detailed instructions
- β Check existing issues to avoid duplicates
- β Follow our code style and commit message conventions
- β Test your changes thoroughly across browsers
- β Update documentation for new features
All contributors are recognized in our:
- π Contributors section in this README
- π Release notes for significant contributions
- π Special thanks for major features
See our Contributing Guidelines for complete details!
Security is a top priority for the Advanced PhotoBooth App. We are committed to protecting user privacy and ensuring the integrity of the application.
- Local Processing: All image processing happens client-side - no data sent to servers
- Camera Permissions: Explicit user consent required for camera access
- HTTPS Only: Production deployments enforce HTTPS connections
- No Tracking: Zero analytics or tracking without explicit consent
- User Control: Complete control over local data storage and deletion
Please DO NOT report security vulnerabilities through public GitHub issues.
- π§ Email: [email protected]
- π Process: See our Security Policy for detailed reporting instructions
- β±οΈ Response: Initial response within 48 hours
- Camera access vulnerabilities
- Data storage and privacy issues
- XSS/CSRF vulnerabilities
- File upload security
- Session management (if applicable)
Read our complete Security Policy for full details.
We appreciate all contributors who help make this project better!
- π¨ Design Inspiration: Modern photo booth interfaces and Material Design principles
- π§ Technical Foundation: Next.js, React, and Fabric.js communities
- π Internationalization: Contributors who helped with translations
- π§ͺ Testing: Community members who tested across different devices and browsers
- β Star the repository to show your support
- π Report bugs using our structured issue templates
- π‘ Suggest features through GitHub discussions
- π§ Contribute code following our contributing guidelines
- π Improve documentation to help other users and developers
- π Add translations for your language
- π¨ Share your customizations in discussions
- Be respectful and inclusive in all interactions
- Help newcomers learn and contribute
- Share knowledge and best practices
- Follow our Code of Conduct
- Use issue templates for structured communication
- Permission denied: Ensure HTTPS or localhost
- No camera detected: Check browser permissions
- Poor quality: Verify camera resolution settings
- Slow sticker rendering: Check browser Canvas API support
- Memory usage: Clear gallery periodically on mobile devices
- Build issues: Ensure Node.js 18+ is installed
- Missing translations: Check translation file completeness
- Incorrect locale: Verify browser language settings
MIT License - Feel free to use this project for personal or commercial purposes.
β
Commercial use allowed
β
Modification allowed
β
Distribution allowed
β
Private use allowed
π License text must be included
π Copyright notice must be preserved
See LICENSE file for full details.
Created by Tedy Fazrin
| Type | Where to Go | Description |
|---|---|---|
| π Bug Reports | Create Issue | Use our structured bug report template |
| β¨ Feature Requests | Create Issue | Suggest new features with detailed requirements |
| π Documentation | Create Issue | Help improve our guides and docs |
| π¬ Questions | GitHub Discussions | Ask questions and share ideas |
| οΏ½ Security Issues | [email protected] | Private security vulnerability reporting |
| π§ Direct Contact | [email protected] | General inquiries and business |
- π Contributing Guidelines - Complete developer guide
- π Security Policy - Security practices and reporting
- π Issue Templates - Structured issue reporting
- π Pull Request Template - PR guidelines and checklist
- β Star this repo to show support and get updates
- π Watch releases for new features and security updates
- π΄ Fork to create your own customizations
- π¬ Join discussions to share ideas and feedback
- π€ Contribute to help improve the project for everyone
Made with β€οΈ for the developer community