Native desktop video editor — multi-track timeline, real-time preview, FFmpeg export.
Built with Tauri 2 + Rust + React (Next.js). Runs as a real Windows app — no browser limits.
- Multi-track — video + audio tracks, add/remove/mute/reorder freely
- Clip trimming — drag left/right trim handles to resize clips
- Drag & drop — drag media from library onto timeline, reorder clips between tracks
- Automatic ripple — clips shift when neighbours are moved
- Snap to grid — smart snapping at configurable intervals
- Zoom — scroll to zoom in/out on the timeline (pixels per second)
- Real-time canvas — WebGL compositing via HTML5 video elements
- Scrub — click anywhere on the progress bar to seek
- Playback controls — play/pause, rewind, timecode display
- Zoom — scale preview from 25% to 400%
- Fullscreen — one-click fullscreen mode
- Native file picker — powered by
@tauri-apps/plugin-dialog - Supported formats: MP4, WebM, MKV, MOV, AVI, WMV, FLV, MP3, WAV, OGG, FLAC, AAC, M4A
- Thumbnails — auto-generated from each media file on import
- Waveform — audio waveform extracted and displayed on clips
- Filters — brightness, contrast, saturation, blur (per-clip)
- Fades — fade in / fade out per clip (configurable duration)
- Transitions — dissolve, wipe-left, wipe-right between adjacent clips
- Keyframes — animate volume, opacity, position over time
- Text overlays — custom text with font, size, color, opacity
| Mode | Description | Formats |
|---|---|---|
| Quick | Real-time canvas capture via MediaRecorder | WebM (VP8, VP9) |
| FFmpeg | Frame-by-frame rendering + FFmpeg encoding | H.264, H.265/HEVC, VP9, AV1 |
- Resolution: 480p / 720p / 1080p / 4K
- Bitrate: 4 / 8 / 16 / 40 Mbps
- Frame rate: 24 / 30 / 60 / 120 fps
- Multi-clip mixing via rodio (symphonia under the hood)
- Play / pause / seek / stop
- Per-clip volume control
- Speed control (0.25× – 4×)
- Trim in/out points per clip
| Key | Action |
|---|---|
Space |
Play / Pause |
J |
Rewind 5s |
K |
Pause |
L |
Forward 5s |
I |
Set in point |
O |
Set out point |
C |
Split clip at playhead |
Delete / Backspace |
Remove selected clip(s) |
Ctrl+Z |
Undo |
Ctrl+Shift+Z |
Redo |
Escape |
Clear in/out points |
- Frameless window — custom titlebar with drag region, min/max/close buttons
- Undo / Redo — 50-step history stack
- Auto-save — project state saved to
%APPDATA%/Apexedit/every 30 seconds - Hotkeys — full keyboard-driven workflow
| Layer | Technology |
|---|---|
| Desktop shell | Tauri 2 |
| Backend | Rust (tokio, serde, rodio, image 0.25, symphonia 0.5) |
| Frontend | Next.js 16 (React 19, TypeScript) |
| State management | Zustand 5 + Rust IPC |
| Video encoding | ffmpeg CLI (optional, detected in PATH) |
pnpm installpnpm tauri devpnpm tauri buildOutput will be in src-tauri/target/release/:
apexedit.exe— standalone portable binarybundle/msi/Apexedit_*_x64_en-US.msi— MSI installerbundle/nsis/Apexedit_*_x64-setup.exe— NSIS installer
apexedit/
├── app/ # Next.js app router (pages, layout)
├── components/
│ └── video-editor/ # React components: Timeline, PreviewPlayer, MediaLibrary, ExportPanel, ClipInspector
├── lib/
│ ├── video-editor/ # Types, utilities
│ ├── editor-store.ts # Web proxy to Rust store
│ └── tauri.ts # Tauri IPC wrappers
├── src-tauri/
│ └── src/
│ ├── main.rs # Entry point
│ ├── lib.rs # Tauri app setup, command registration
│ ├── models.rs # Shared data types (Clip, Track, TimelineState, etc.)
│ ├── store.rs # EditorStore — in-memory state + undo/redo
│ ├── render.rs # Software frame compositing
│ ├── media.rs # Media parsing via ffmpeg (thumbnails, waveform, frame extraction)
│ ├── audio.rs # Audio mixer using rodio
│ ├── export.rs # Video export via ffmpeg pipe
│ └── commands.rs # 30+ Tauri commands
├── public/ # Static assets
├── package.json
└── Cargo.toml
┌─────────────────────────────────────────┐
│ Frontend (React) │
│ ┌──────────┐ ┌──────────────────────┐ │
│ │ Timeline │ │ PreviewPlayer │ │
│ │ (clips, │ │ (canvas compositing│ │
│ │ tracks) │ │ + playback loop) │ │
│ └────┬─────┘ └──────────┬───────────┘ │
│ └────────┬──────────┘ │
│ editor-store.ts │
│ (useSyncExternalStore) │
└───────────────┬─────────────────────────┘
│ invoke()
┌───────────────┴─────────────────────────┐
│ Backend (Rust) │
│ ┌──────────┐ ┌──────┐ ┌──────────┐ │
│ │ store │ │media │ │ export │ │
│ │ (state + │ │(ffmpeg│ │(ffmpeg │ │
│ │ undo) │ │ parse)│ │ pipe) │ │
│ └────┬─────┘ └──────┘ └──────────┘ │
│ │ │
│ ┌────┴─────┐ ┌──────────────────────┐ │
│ │ render │ │ audio (rodio) │ │
│ │composite │ │ multi-clip mixer │ │
│ └──────────┘ └──────────────────────┘ │
└─────────────────────────────────────────┘
MIT