This commit completely removes document conversion functionality to focus exclusively on media file conversions (video, audio, images). Changes: - Remove all document converter services (pandocService.ts, pdfService.ts, docxService.ts) - Uninstall document-related packages: marked, turndown, dompurify, jspdf, pdfjs-dist, docx, mammoth, @types/turndown - Remove document formats (PDF, DOCX, Markdown, HTML, TXT) from formatMappings.ts - Remove pandoc converter from FileConverter.tsx - Remove pandoc loader and references from wasmLoader.ts - Update TypeScript types to remove 'pandoc' from ConverterEngine and 'document' from FileCategory - Remove pandoc from WASMModuleState interface - Update README.md to remove all document conversion documentation - Update UI descriptions to reflect media-only conversions Supported conversions now: - Video: MP4, WebM, AVI, MOV, MKV, GIF - Audio: MP3, WAV, OGG, AAC, FLAC - Images: PNG, JPG, WebP, GIF, BMP, TIFF, SVG 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
220 lines
6.5 KiB
Markdown
220 lines
6.5 KiB
Markdown
# 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 <repository-url>
|
|
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**
|