Open-source Adobe Media Encoder replacement powered by FFmpeg.
A full-featured local video/audio transcoder with a modern dark UI. No subscriptions, no watermarks, no cloud dependency.
- Batch encoding queue β drag & drop or browse for files
- 16+ built-in presets β H.264, H.265, AV1, VP9, ProRes, GIF, MP3, AAC, FLAC, Opus, WAV
- Per-job preset selection β assign different settings per file
- Live progress tracking β real-time progress bars, FPS, and ETA per job
- Media probing β FFprobe detects resolution, duration, codec, bitrate
- Concurrent encoding β 1β4 parallel jobs (configurable)
- Custom output folders β or output next to source
- Frameless dark UI β custom title bar, keyboard-friendly
- Persistent settings β output directory and concurrency saved across sessions
- Error handling & recovery β clear error messages with retry capability
Download the latest release for your platform from GitHub Releases:
- Windows:
OpenEncoder-setup-*.exeβ Installer (recommended for most users)OpenEncoder-*.exeβ Portable executable (no installation required)
- macOS:
OpenEncoder-*.dmgβ DMG installer (Universal binary: Intel + Apple Silicon) - Linux:
OpenEncoder-*.AppImageβ AppImage (self-contained, no dependencies)
- Add files: Drag & drop into the queue, or click "Add Files"
- Choose preset: Select an output format (per-file or batch)
- Set output: Choose where to save encoded files
- Start encoding: Click "Start" to begin
- Monitor progress: Watch real-time ETA and performance metrics
- Output Directory: Default location for encoded files
- Concurrent Jobs: Number of simultaneous encoding tasks (1-4)
- Theme: Light or dark mode (persisted)
- Node.js 18+
- npm or yarn
# Install dependencies
npm install
# Run in development mode
npm run dev
# Build for distribution (all platforms)
npm run dist
# Platform-specific builds
npm run dist:win # Windows installer
npm run dist:mac # macOS DMG
npm run dist:linux # Linux AppImagenpm run lint # Check code quality
npm run format # Auto-format code
npm run test # Run tests
npm run test:cov # Coverage report- Contributing Guide β Development workflow, testing, code standards
- Release Guide β Automated releases, building installers, GitHub Actions
- Deployment Guide β Pre-release checklist, signing, publishing
- Security Policy β Security considerations and best practices
- Changelog β Version history and updates
| Component | Technology |
|---|---|
| Shell | Electron 31 |
| Build | electron-vite + Vite 5 |
| UI Framework | React 18 + TypeScript |
| Styling | Tailwind CSS 3 |
| State Management | Zustand |
| Encoding | FFmpeg (via fluent-ffmpeg) |
| Binaries | ffmpeg-static + ffprobe-static |
| Storage | electron-store |
src/
βββ main/ # Electron main process
β βββ index.ts # App lifecycle, window management
β βββ ffmpeg-service.ts # FFmpeg probe & encode engine
β βββ ipc-handlers.ts # IPC channel handlers
β βββ ipc-security.ts # Security validation & helpers
β βββ ipc-validation.ts # Path & payload validation
β βββ error-handler.ts # Global error handling
βββ preload/
β βββ index.ts # Secure renderer β main bridge
βββ shared/
β βββ types.ts # Shared TypeScript types & IPC constants
β βββ presets.ts # Built-in encoding presets
βββ renderer/src/
βββ App.tsx
βββ components/
β βββ TitleBar.tsx
β βββ Sidebar.tsx
β βββ EncodeBar.tsx
β βββ Queue/ # Queue panel, items, drop zone
β βββ Presets/ # Preset browser
β βββ Settings/ # Settings panel
βββ hooks/
β βββ useFFmpeg.ts # FFmpeg event listeners
βββ store/
β βββ useEncoderStore.ts # Global state (Zustand)
βββ utils.ts
- Sandbox isolation β Renderer process runs in restricted sandbox
- Context isolation β No direct access to Node.js APIs
- Preload bridge β Typed IPC for all communication
- Input validation β All file paths and payloads validated
- No eval() β No dynamic code execution
See SECURITY.md for detailed security policies and roadmap.
Edit src/shared/presets.ts and add a new entry following the Preset interface from src/shared/types.ts:
{
id: 'my-preset',
name: 'My Preset',
description: 'Custom encoding settings',
category: 'video',
container: 'mp4',
videoCodec: 'libx265',
crf: 28,
preset: 'medium',
format: 'h265'
}The preset will automatically appear in the queue dropdown and Presets browser.
- Ensure you downloaded the official installer, not built from source
- Try reinstalling the app
- Check file format compatibility with chosen preset
- Verify sufficient disk space (output directory)
- Check file permissions
- This is normal for high-bitrate or long files
- Try reducing concurrent jobs in settings
- Close other resource-intensive applications
- Right-click the app β "Open" β "Open" (one-time bypass)
- This is a known macOS security feature; normal for unsigned apps during beta
MIT License β See LICENSE file for details.
Contributions are welcome! Please read CONTRIBUTING.md for:
- Code standards & testing requirements
- Development setup
- Release process
- Pull request guidelines
- GitHub Issues β Bug reports and feature requests
- Discussions β General questions and feedback
- Security Issues β Report privately (see SECURITY.md)
- Auto-update mechanism with delta compression
- Custom preset browser with sharing
- Advanced filtering (curves, color grading)
- Subtitle/caption embedding
- Batch watermarking
- Hardware acceleration (NVIDIA NVENC, AMD VCE, Intel QSV)
- Queue persistence across restarts
- Web interface for remote encoding
