A professional Android video editor built with Kotlin and Jetpack Compose. Open alternative to CapCut, PowerDirector, and DaVinci Resolve — with on-device AI, GPU-accelerated effects, and desktop NLE interoperability.
NovaCut PREMIUM MOBILE VIDEO EDITING
See CHANGELOG.md for full release history.
- Multi-track timeline with video, audio, overlay, text, and adjustment layers
- Trim, split, merge, crop, rotate with visual handles
- Slip/slide editing — drag clip body to slide (reposition) or slip (shift source window)
- Magnetic snapping — clips snap to edges, playhead, and markers (8dp threshold with diamond indicators)
- Clip grouping — select multiple clips, group/ungroup, move as a unit
- Speed control (0.1x-16x) with bezier speed ramping curves and presets
- Keyframe animation for position, scale, rotation, opacity, volume with 12 easing types (linear, ease in/out, spring, bounce, elastic, back, circular, expo, sine, cubic)
- 14 speed presets including time freeze, film reel, heartbeat, crescendo
- Undo/redo (50 levels) with full state restoration + command-based undo foundation
- Long-press multi-select for batch operations
- Pinch-to-zoom + zoom in/out/fit buttons
- Timeline scrubbing with frame-accurate seeking
- Colored timeline markers — 6 colors (red/orange/yellow/green/blue/purple) with labels, notes, and jump navigation
- Sticker/GIF/image overlays — position, scale, rotate, opacity with timeline placement
- Favorites & recent effects — mark effects as favorites, track recently used for quick access
- Multi-cam sync — audio-based clip synchronization across tracks
- Clip reorder & move — reorder clips within a track or move between tracks
- Haptic feedback — tactile response on trim handle grab and magnetic snap
- Waveform caching — LRU cache avoids redundant audio decoding on timeline recomposition
- Clip color labels — 7 Catppuccin colors (red, peach, green, blue, mauve, yellow, none) with colored top border on Timeline
- Track collapse/expand — Per-track chevron + collapse/expand all toggle, collapsed tracks show thin 24dp colored bars
- Track height cycling — Long-press track type icon to cycle 48→64→80→96dp
- Keyboard shortcuts — Space, Ctrl+Z/Y, arrow keys, M, S, +/-, Delete, Ctrl+S, Ctrl+C/V for external keyboard editing
- Snap-to-beat/marker — Beat markers and timeline markers as additional snap targets (settings-driven)
- Marker list panel — Searchable, filterable marker list with color chips, inline label editing, jump-to-time
- 37 GPU-accelerated GLSL transitions with unique Material icons per type — dissolve, wipe, zoom, spin, flip, cube, ripple, pixelate, morph, glitch, swirl, heart, dreamy, plus 12 new: door open, burn, radial wipe, mosaic reveal, bounce, lens flare, page curl, cross warp, angular, kaleidoscope, squares wire, color phase
- 40+ video effects — brightness, contrast, saturation, hue, sharpen, vignette, mosaic, fisheye, wave, chromatic aberration, radial blur, motion blur, tilt shift
- Film grain — perceptual-aware (more in shadows, less in highlights), animated blue noise pattern
- VHS/Retro — scanlines, chroma bleeding, tracking distortion, posterized color depth
- Glitch — RGB channel splitting, 8x8 block corruption, horizontal line displacement
- Light leak — procedural animated warm gradient with screen blend mode
- 9-tap Gaussian blur — separable kernel with proper sigma-based weights
- 18 blend modes (normal, multiply, screen, overlay, soft light, hard light, difference, exclusion, etc.)
- Freehand/rectangle/ellipse/gradient masks with feather, expansion, and motion tracking
- Professional chroma key — YCbCr color space keying with smoothstep feathering and green/blue spill suppression
- Lift/gamma/gain color wheels with continuous control
- RGB curves and HSL qualifier
- LUT import (.cube/.3dl) with file picker and intensity control
- Color matching — per-channel gamma correction between reference and target clips
- Video scopes — histogram, waveform, vectorscope with animated overlay (GPU compute shader ready for ES 3.1+)
- Full audio mixer with per-track volume faders, pan slider, mute/solo, smoothed VU meters (ballistic attack/decay)
- 15 DSP effects — parametric EQ, compressor (corrected attack/release), limiter, delay, chorus, de-esser, pitch shift, noise gate
- Waveform visualization with fade envelope overlay
- Beat detection — spectral flux onset detection with adaptive thresholding and BPM estimation (aubio NDK ready)
- Auto-duck — speech-aware volume keyframing (analyzes voice track, creates keyframes on music track)
- EBU R128 loudness normalization — K-weighted measurement with 6 platform presets:
- YouTube/Spotify (-14 LUFS), TikTok (-14 LUFS), Podcast/Apple (-16 LUFS), Broadcast EBU R128 (-23 LUFS), Cinema (-24 LUFS), Loud (-9 LUFS)
- True-peak limiting to prevent clipping
- Voiceover recording with automatic timeline placement
- Fade overlap protection — fade in + fade out constrained to clip duration
- Noise reduction — Spectral gate heuristic (5 modes: off/light/moderate/aggressive/spectral gate). DeepFilterNet ML path planned
| Tool | Engine | On-Device? |
|---|---|---|
| Auto Captions | ONNX Runtime Whisper (multilingual, 99 languages) | Yes |
| Background Removal | MediaPipe Selfie Segmentation (~1-7MB, ~30fps) | Yes |
| AI Green Screen | Planned -- RobustVideoMatting (requires model integration) | Planned |
| Object Removal | LaMa-Dilated inpainting (40ms/frame @ 512x512 on flagship devices) | Yes |
| Video Upscaling | Planned -- Real-ESRGAN (requires model integration) | Planned |
| Frame Interpolation | Planned -- RIFE v4.6 (requires NCNN dependency) | Planned |
| Style Transfer | Planned -- AnimeGANv2 + Fast NST (requires model integration) | Planned |
| Stabilization | Planned -- OpenCV (requires dependency) | Planned |
| Smart Reframe | EMA-smoothed crop trajectory, 3 strategies (face/pose detection is stub) | Partial |
| Tap-to-Segment | Planned -- MobileSAM (requires dependency) | Planned |
| Scene Detection | Content-aware frame difference analysis with auto-split | Yes |
| Auto Color | Histogram-based brightness/contrast/saturation/temperature | Yes |
| Motion Tracking | Template matching with position keyframe generation | Yes |
| Audio Denoise | Spectral gate heuristic (DeepFilterNet ML planned) | Yes |
- Rich text overlays with 10+ animation styles
- Static templates — lower thirds, title cards, end screens, CTAs
- Animated Lottie templates — 10 built-in (slide-in lower third, bounce title, typewriter, glitch reveal, neon glow, fade subtitle, circle logo reveal, countdown, subscribe button). Render frame-by-frame for export via LottieDrawable
- Caption editor with start/end time sliders (mutually constrained)
- Caption style gallery with karaoke, word-pop, bounce, typewriter, minimal styles
- Continuous caption positioning via BiasAlignment (not 3-zone snap)
- Text on path (straight, curved, circular, wave)
- Shadow, glow, letter spacing, line height controls
- System TTS — Android built-in voices with mutex-protected synthesis
- Piper TTS (planned) — near-human quality VITS voices via Sherpa-ONNX (stub, requires dependency integration)
- 10 voice profiles defined: Amy (US), Ryan (US), Alba (UK), Thorsten (DE), Dave (ES), Siwis (FR), Takumi (JP), Huayan (CN), Sunhi (KR), Faber (BR)
- Currently falls back to Android System TTS
- System/Piper engine toggle in TTS panel
- GIF export — Self-contained GIF89a encoder with LZW compression, configurable frame rate (10/15/20fps) and max width (320/480/640px)
- Frame capture — PNG/JPEG single-frame export from current playhead position
- 480p to 4K Ultra HD
- 4 codecs — H.264, H.265 (HEVC), AV1, VP9 with hardware capability detection via
MediaCodecList - One-tap platform presets — YouTube 1080p, YouTube 4K, TikTok, Instagram Reels, Instagram Square, Threads
- Batch export with multiple presets simultaneously
- Background export with progress notification, ETA display, and cancel
- Timeline interchange — OTIO (OpenTimelineIO) JSON export/import + FCPXML export for desktop NLE round-tripping (DaVinci Resolve, Premiere Pro, Final Cut Pro)
- EDL export (CMX 3600) with sanitized reel names and proper timecodes
- Chapter markers and subtitle export (SRT, VTT with word-level cues, ASS/SSA with full styling)
- Burned-in subtitle rendering — Canvas-based with ASS/SSA file generation for FFmpeg integration
- Audio-only and stems export modes
- Export error cleanup — partial output files deleted on failure/timeout
- Copy/paste effects between clips
- Export effects to
.ncfxfile for sharing - Import effects from
.ncfxwith portable LUT references (filename-based, not absolute paths)
- User template system (save/load/delete project templates, preserves non-media track clips)
- Project snapshots with version history and auto-generated default names
- Project archive (ZIP export)
- Auto-save with configurable interval, format versioning, rotating backups
- Full serialization: all clip fields, compound clips, 9 caption style properties, mask bezier handles, clip group IDs
- Command-based undo/redo foundation — sealed class with AddClip, RemoveClip, TrimClip, MoveClip, SetClipSpeed, ApplyEffect, CompoundCommand
- 3-tier proxy workflow — thumbnail (scrubbing) / proxy (540p editing) / original (export) with auto-switch and storage management
- Cloud backup UI (backend pending)
- First-run tutorial — auto-shows on first launch, dismissable, resettable from Settings
- Default resolution, frame rate, aspect ratio, export codec
- Auto-save toggle + interval (15-300s)
- Proxy resolution selector
- Reset first-run tutorial
- Show waveforms — Global waveform visibility toggle
- Snap to beat / snap to markers — Timeline snap behavior toggles
- Default track height — 48/64/80/96dp chips
- Confirm before delete — Gate clip deletion dialog
- Thumbnail cache size — 64/128/256 MB
- Default export quality — LOW/MEDIUM/HIGH
- All settings persist via DataStore
| Component | Technology |
|---|---|
| Language | Kotlin 2.1.0 |
| UI | Jetpack Compose + Material 3 (Catppuccin Mocha theme) |
| Video | Media3 1.9.2 (Transformer + ExoPlayer) |
| Effects | OpenGL ES 3.0 (37 GLSL transitions, 40+ effect shaders) |
| Audio DSP | Custom engine (EQ, compressor, chorus, delay, pitch shift) |
| Speech-to-Text | ONNX Runtime 1.17.0 (Whisper) |
| Noise Reduction | Spectral gate fallback (DeepFilterNet planned) |
| Beat Detection | Spectral flux onset detection (aubio NDK ready) |
| Loudness | EBU R128 / ITU-R BS.1770 measurement |
| Segmentation | MediaPipe Tasks Vision 0.10.14 |
| Video Matting | Planned (RobustVideoMatting, ONNX Runtime) |
| Object Removal | LaMa-Dilated (ONNX Runtime, neighbor-fill fallback) |
| Upscaling | Planned (Real-ESRGAN) |
| Frame Interpolation | Planned (NCNN + Vulkan) |
| Style Transfer | Planned (AnimeGANv2 + Fast NST) |
| Stabilization | Planned (OpenCV) |
| TTS | Android System TTS (Piper via Sherpa-ONNX planned) |
| Animated Titles | Lottie (Airbnb) |
| Timeline Exchange | Planned (OpenTimelineIO) |
| DI | Hilt / Dagger |
| Database | Room (v4 with migration chain 1→4) |
| Settings | DataStore Preferences |
| Architecture | MVVM, single-activity Compose navigation, StateFlow |
com.novacut.editor/
├── ai/ # AI features (captions, scene detect, stabilize, auto-edit)
├── engine/ # Core engines (29 injectable singletons)
│ ├── VideoEngine # Media3 playback + export
│ ├── AudioEngine # Waveform extraction + PCM processing
│ ├── AudioEffectsEngine # DSP chain (EQ, compressor, chorus, etc.)
│ ├── ShaderEffect # GLSL fragment shader pipeline
│ ├── KeyframeEngine # Bezier/hold interpolation
│ ├── ProjectAutoSave # JSON serialization with format versioning
│ ├── ExportService # Foreground service for background export
│ ├── BeatDetectionEngine # Spectral flux onset + BPM estimation
│ ├── LoudnessEngine # EBU R128 measurement + normalization
│ ├── NoiseReductionEngine # Spectral gate (DeepFilterNet stub)
│ ├── FrameInterpolationEngine # RIFE v4.6 slow-motion (stub)
│ ├── InpaintingEngine # LaMa object removal (ONNX Runtime + NNAPI)
│ ├── UpscaleEngine # Real-ESRGAN video upscaling (stub)
│ ├── VideoMattingEngine # RVM AI green screen (stub)
│ ├── StabilizationEngine # OpenCV optical flow (stub)
│ ├── StyleTransferEngine # AnimeGAN + Fast NST (stub)
│ ├── SmartReframeEngine # Subject-tracking auto-crop
│ ├── TapSegmentEngine # MobileSAM tap-to-segment (stub)
│ ├── PiperTtsEngine # Piper VITS TTS (stub, system TTS fallback)
│ ├── LottieTemplateEngine # Animated title rendering
│ ├── FFmpegEngine # FFmpegX fallback encoder (stub)
│ ├── SubtitleRenderEngine # Canvas + ASS subtitle rendering
│ ├── CloudInpaintingEngine # ProPainter cloud API (stub)
│ ├── TimelineExchangeEngine # OTIO/FCPXML interchange
│ ├── ProxyWorkflowEngine # 3-tier media management
│ ├── EditCommand # Command-pattern undo/redo
│ ├── db/ProjectDatabase # Room database with migrations
│ ├── whisper/WhisperEngine # Built-in Whisper (ONNX)
│ ├── whisper/SherpaAsrEngine # Sherpa-ONNX ASR (stub)
│ └── segmentation/ # MediaPipe selfie segmentation
├── model/ # Data classes (Project, Clip, Track, Effect, etc.)
├── ui/
│ ├── editor/ # Main editor (EditorScreen, EditorViewModel, 40+ panels)
│ ├── export/ # ExportSheet, BatchExportPanel
│ ├── mediapicker/ # MediaPickerSheet
│ ├── projects/ # ProjectListScreen, ProjectTemplateSheet
│ ├── settings/ # SettingsScreen, SettingsViewModel
│ └── theme/ # Catppuccin Mocha theme
├── MainActivity.kt # Single activity, Compose navigation, permission handling
└── NovaCutApp.kt # Application class, notification channels
# Debug build
./gradlew assembleDebug
# Release build (requires keystore.properties or env vars)
./gradlew assembleRelease- Android Studio Ladybug+ (2024.2+)
- AGP 8.7.3, Gradle 8.9, JDK 17
- Android SDK 35
Configure via keystore.properties:
storeFile=path/to/your.jks
storePassword=yourpass
keyAlias=youralias
keyPassword=yourpassOr via environment variables: NOVACUT_KS_PASS, NOVACUT_KEY_ALIAS, NOVACUT_KEY_PASS
Key external dependencies currently in build.gradle.kts:
| Dependency | Version | Purpose |
|---|---|---|
| ONNX Runtime | 1.17.0 | Whisper ASR + LaMa inpainting |
| MediaPipe | 0.10.14 | Selfie segmentation |
| Lottie | 6.6.2 | Animated title templates |
| OkHttp | 4.12.0 | Cloud inpainting API |
- Min SDK: 26 (Android 8.0 Oreo)
- Target SDK: 35 (Android 15)
- Required: OpenGL ES 3.0
- Recommended: 4GB+ RAM, Snapdragon 7-series or better for AI features
- AV1 hardware encoding: Pixel 8+, Snapdragon 8 Gen 3+, Dimensity 9200+
| Permission | Purpose |
|---|---|
READ_MEDIA_VIDEO/AUDIO/IMAGES |
Access media files (API 33+) |
READ_EXTERNAL_STORAGE |
Legacy media access (API < 33) |
WRITE_EXTERNAL_STORAGE |
Save exports (API < 29) |
RECORD_AUDIO |
Voiceover recording |
CAMERA |
Video capture from camera |
FOREGROUND_SERVICE |
Background export processing |
POST_NOTIFICATIONS |
Export progress notifications |
INTERNET |
Model downloads (Whisper), cloud inpainting API |
VIBRATE |
Haptic feedback |
- Blend modes use mid-gray as virtual blend layer (not true dual-texture compositing — requires Media3 Compositor API)
clip.isReversedworks in preview but not in export (Media3 Transformer has no reverse playback support)- Speed curve clips don't correctly affect timeline duration calculation (
Clip.durationMsuses constant speed only) - SmartRenderEngine analysis results not used for actual export bypass
- Text overlay strokeWidth not exported (SpannableString has no native stroke support)
- ProjectArchive.importArchive() is export-only (import not fully implemented)
- 11 AI/ML engine stubs awaiting dependency integration (see ROADMAP.md)
MIT