# Convert UI A modern, browser-based file conversion application built with Next.js 16, Tailwind CSS 4, and WebAssembly. Convert videos, audio, and images directly in your browser without uploading files to any server. ## Features - **🎬 Video Conversion** - Convert between MP4, WebM, AVI, MOV, MKV, and GIF - **🎵 Audio Conversion** - Convert between MP3, WAV, OGG, AAC, and FLAC - **🖼️ Image Conversion** - Convert between PNG, JPG, WebP, GIF, BMP, TIFF, and SVG - **🔒 Privacy First** - All conversions happen locally in your browser, no server uploads - **⚡ Fast & Efficient** - Powered by WebAssembly for near-native performance - **🎨 Beautiful UI** - Modern, responsive design with dark/light theme support - **🔍 Smart Search** - Fuzzy search for quick format selection - **📝 Conversion History** - Track your recent conversions - **🎯 Drag & Drop** - Easy file upload with drag-and-drop support ## Tech Stack - **Next.js 16** - React framework with App Router and static export - **React 19** - Latest React with concurrent features - **TypeScript 5** - Type-safe development - **Tailwind CSS 4** - Utility-first CSS with OKLCH color system - **FFmpeg.wasm** - Video and audio conversion - **ImageMagick WASM** - Image processing and conversion - **Fuse.js** - Fuzzy search for format selection - **Lucide React** - Beautiful icon library ## Getting Started ### Prerequisites - Node.js 22+ (managed via nvm) - pnpm (enabled via corepack) ### Installation ```bash # Clone the repository git clone cd convert-ui # Install dependencies pnpm install # Run development server pnpm dev ``` Open [http://localhost:3000](http://localhost:3000) to view the app. ### Build for Production ```bash # Build static export pnpm build # Output will be in the /out directory ``` ## Project Structure ``` convert-ui/ ├── app/ # Next.js App Router │ ├── layout.tsx # Root layout with theme │ ├── page.tsx # Main page │ └── globals.css # Global styles ├── components/ │ ├── converter/ # Converter components │ │ ├── FileConverter.tsx # Main state manager │ │ ├── FileUpload.tsx # Drag-and-drop upload │ │ ├── FormatSelector.tsx # Format selection with search │ │ ├── ConversionPreview.tsx # Preview and download │ │ └── ConversionOptions.tsx # Format-specific options │ ├── layout/ │ │ └── ThemeToggle.tsx # Dark/light theme toggle │ └── ui/ # Reusable UI components │ ├── Button.tsx │ ├── Card.tsx │ ├── Toast.tsx │ ├── Progress.tsx │ ├── Skeleton.tsx │ └── Input.tsx ├── lib/ │ ├── converters/ # Conversion services │ │ ├── ffmpegService.ts # Video/audio conversion │ │ └── imagemagickService.ts # Image conversion │ ├── wasm/ │ │ └── wasmLoader.ts # WASM module lazy loading │ ├── storage/ │ │ └── history.ts # Conversion history │ └── utils/ │ ├── cn.ts # Class name utility │ ├── fileUtils.ts # File operations │ ├── formatMappings.ts # Supported formats │ └── debounce.ts # Debounce utility └── types/ └── conversion.ts # TypeScript interfaces ``` ## Supported Formats ### Video (FFmpeg) - **Input/Output:** MP4, WebM, AVI, MOV, MKV, GIF ### Audio (FFmpeg) - **Input/Output:** MP3, WAV, OGG, AAC, FLAC ### Images (ImageMagick) - **Input/Output:** PNG, JPG, WebP, GIF, BMP, TIFF, SVG ## How It Works 1. **File Upload** - Users can drag-and-drop or click to select a file 2. **Format Detection** - The app automatically detects the input format 3. **Format Selection** - Choose from compatible output formats 4. **Conversion** - WASM modules are loaded on-demand and process the file 5. **Download** - Preview and download the converted file ### WASM Architecture - **Lazy Loading** - WASM modules are only loaded when needed - **Memory Management** - Proper cleanup after each conversion - **Progress Tracking** - Real-time progress updates during conversion - **Error Handling** - Graceful error handling with user-friendly messages ## Browser Compatibility - **Chrome/Edge** - Full support - **Firefox** - Full support - **Safari** - Full support (with SharedArrayBuffer) **Note:** Some features require SharedArrayBuffer support. The app sets the required COOP/COEP headers for this. ## Performance - **File Size Limit** - 500MB (configurable) - **Conversion Speed** - Varies by file size and format - Images: < 5s for typical files - Videos: Depends on length and quality - **Memory Usage** - Managed automatically with cleanup ## Development ### Scripts ```bash # Development server with Turbopack pnpm dev # Build for production pnpm build # Run production server pnpm start # Lint code pnpm lint ``` ### Adding New Formats 1. Add format to `lib/utils/formatMappings.ts` 2. Implement converter in appropriate service 3. Update type definitions in `types/conversion.ts` ### Customizing Theme Colors are defined in `app/globals.css` using OKLCH color space. Modify CSS variables to change the theme: ```css :root { --primary: oklch(22.4% 0.053 285.8); --background: oklch(100% 0 0); /* ... other colors */ } ``` ## Docker Deployment ```bash # Build Docker image docker build -t convert-ui . # Run container docker run -p 80:80 convert-ui ``` The Dockerfile uses a multi-stage build with Nginx to serve the static export. ## Contributing Contributions are welcome! Please follow these steps: 1. Fork the repository 2. Create a feature branch 3. Make your changes 4. Test thoroughly 5. Submit a pull request ## License MIT License - See LICENSE file for details ## Acknowledgments - [FFmpeg.wasm](https://github.com/ffmpegwasm/ffmpeg.wasm) - Video/audio conversion - [ImageMagick WASM](https://github.com/dlemstra/magick-wasm) - Image processing - [Next.js](https://nextjs.org/) - React framework - [Tailwind CSS](https://tailwindcss.com/) - Styling - [Fuse.js](https://fusejs.io/) - Fuzzy search ## Support For issues, questions, or suggestions, please open an issue on GitHub. --- **Made with ❤️ using Next.js 16 and WebAssembly**