Desktop video processing application built with Tauri v2 (Rust backend) + React (TypeScript frontend). Drop in raw videos, configure settings, and export polished platform-ready content.
| Layer | Technology |
|---|---|
| Framework | Tauri v2 (native desktop) |
| Frontend | React 19 + TypeScript + Vite |
| Styling | Tailwind CSS v4 + shadcn/ui |
| Backend | Rust (Tauri commands) |
| Video Engine | FFmpeg (bundled) |
| Transcription | Whisper.cpp (bundled) |
content-factory/
├── src/ # React frontend
│ ├── components/
│ │ ├── ui/ # shadcn/ui base components
│ │ ├── layout/ # AppLayout, Sidebar, MainPanel
│ │ ├── dashboard/ # DropZone, JobQueue, JobCard, QueueToolbar
│ │ └── settings/ # CaptionSettings, OverlaySettings, etc.
│ ├── hooks/ # Custom React hooks
│ ├── lib/ # Utilities (cn helper)
│ ├── stores/ # State management (future)
│ ├── types/ # TypeScript type definitions
│ ├── App.tsx
│ ├── main.tsx
│ └── index.css # Tailwind + theme variables
│
├── src-tauri/ # Rust backend
│ ├── src/
│ │ ├── commands/ # Tauri IPC command handlers
│ │ ├── ffmpeg/ # FFmpeg binary resolution + arg builder
│ │ ├── whisper/ # Whisper model path + transcription
│ │ ├── jobs/ # Job queue manager (thread-safe)
│ │ ├── presets/ # Preset save/load/delete
│ │ ├── types.rs # Shared Rust types
│ │ └── lib.rs # App setup + command registration
│ ├── binaries/
│ │ ├── ffmpeg/ # Place ffmpeg + ffprobe binaries here
│ │ └── whisper/ # Place ggml model files here
│ ├── Cargo.toml
│ └── tauri.conf.json
│
├── package.json
├── vite.config.ts
└── tsconfig.app.json
- Node.js 18+ and npm
- Rust toolchain — install from https://rustup.rs
- FFmpeg binaries — place in
src-tauri/binaries/ffmpeg/
npm install
npm run tauri devnpm run tauri buildThe Rust backend spawns ffmpeg and ffprobe as child processes and communicates via CLI arguments + stderr parsing. No FFmpeg library linking required.
React UI ──IPC invoke──→ Tauri Commands (Rust) ──spawn──→ FFmpeg/FFprobe/Whisper
←─IPC events─── ←─stderr──
- Probe —
ffprobe -print_format json→ get metadata - Extract Audio —
ffmpeg -vn -ar 16000 -ac 1→ WAV for Whisper - Transcribe — Whisper.cpp → timestamped word segments
- Build Filter Graph — Compose FFmpeg
-filter_complex - Encode — Spawn FFmpeg with full filter graph + codec settings
- Track Progress — Parse stderr
time=field → emit progress events - Multi-Format — Separate FFmpeg pass per aspect ratio
| Feature | FFmpeg Implementation |
|---|---|
| Caption burn-in | drawtext filter with enable='between(t,start,end)' |
| Highlight words | Separate drawtext per word with color override |
| Progress bar | drawbox with w=iw*t/duration |
| Blurred background | split→scale→boxblur→overlay chain |
| Bouncing watermark | overlay with sine position expression |
| Loudness norm | -af loudnorm=I=-14:TP=-1.5:LRA=11 |
| GPU encode | -c:v h264_nvenc / hevc_nvenc |