KT FEATURED

NovaCut

Full-featured Android video editor — 40+ effects, 37 transitions, 29 engines. Open alternative to PowerDirector.

KotlinAndroidVideo
Delivery
Source-first
Browse code, README, and release notes on GitHub.
Primary lane
Kotlin / Android lane
The clearest adjacent context for this project inside the portfolio.
Freshness
Updated Jun 5, 2026
Latest release
v3.73.2
Published May 13, 2026

Preview

Using the generated project card as a clean fallback until a live capture is available.

NovaCut card

Source at github.com/SysAdminDoc/NovaCut.

Proof

Structured claims with explicit source links, so the page can show why the project matters without leaning on unsourced marketing copy.

Problem

Android video editing should have a local, open alternative to subscription-heavy mobile editors.

Platform Support

  • Android
  • Kotlin
  • Media editing

Install Path

Use the repository README and releases for the current Android build/install flow.

Build Evidence

  • Catalog data describes a full-featured Android video editor with 40+ effects, 37 transitions, and 29 engines.
  • The project appears in the Android lane and Greatest Hits narrative, so visitors can compare it against related mobile work.
  • Repository source and releases are available for implementation and packaging review.

Known Limitations

Media-editor capability depends on device performance, Android media APIs, and codec support.

Sources

Case Study

Every capable Android video editor is either subscription-locked (PowerDirector, KineMaster) or ad-heavy (InShot). I wanted a full editing experience — timeline, effects, transitions, export — that was open source, ran entirely on-device, and respected the user. NovaCut started as a learning project for Jetpack Compose + Media3 and grew into a 38K-line production editor.

Key Decisions

  • Built on Jetpack Compose + Media3 1.9.x instead of the legacy MediaCodec/SurfaceTexture stack — cleaner API, hardware-accelerated by default, and future-proof against Android API changes.
  • Implemented 40+ effects and 37 transitions as composable pipeline stages rather than monolithic render passes — each effect is a standalone unit testable in isolation.
  • Used R8/ProGuard aggressively to keep the APK under 15MB despite the feature set — comparable to much simpler editors.
  • Signed release builds with a dedicated keystore and published via GitHub Releases, not Play Store — avoiding the 30% cut and review delays.

Outcomes

  • 10 stars and growing — the largest Kotlin project in the portfolio by line count.
  • Proved that a single developer with AI tooling can ship a video editor that competes on features with funded teams.
  • The Media3 integration patterns from NovaCut were reused in Vertigo (vertical video studio) and OpenCut (Premiere Pro extension).

README

Cached at build time, cleaned up for in-site reading, and linked back to the canonical GitHub source.

10 min read 1,987 words 24 sections
Contents
  1. NovaCut
  2. Project planning
  3. Features
  4. Timeline Editing
  5. Effects & Transitions
  6. Color Grading
  7. Audio
  8. AI Tools
  9. Text & Titles
  10. Text-to-Speech
  11. Export
  12. Effect Library
  13. Project Management
  14. Settings
  15. Tech Stack
  16. Architecture
  17. Build
  18. Requirements
  19. Release Signing
  20. Dependencies
  21. Supported Devices
  22. Permissions
  23. Known Limitations
  24. License

NovaCut

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-logo

NovaCut PREMIUM MOBILE VIDEO EDITING

See CHANGELOG.md for full release history.

Project planning

Features

Timeline Editing

  • 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

Effects & Transitions

  • 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

Color Grading

  • 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+)

Audio

  • 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

AI Tools

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 -- SAM 2.1 Hiera Tiny target with MobileSAM fallback 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

Text & Titles

  • 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

Text-to-Speech

  • 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

Export

  • 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
  • HDR export confidence — HEVC, AV1, and VP9 preflight reports HDR10+, Dolby Vision Profile 10, Ultra HDR source gain maps, and device-tier hardware encode support before render
  • One-tap platform presets — YouTube 1080p, YouTube 4K, TikTok, Instagram Reels, Instagram Square, Threads
  • Multi-sequence Media3 Composition export for visible video and overlay tracks, with dedicated audio-track mixdown
  • 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

Effect Library

  • Copy/paste effects between clips
  • Export effects to .ncfx file for sharing
  • Import effects from .ncfx with portable LUT references (filename-based, not absolute paths)

Project Management

  • 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

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

Tech Stack

Component Technology
Language Kotlin 2.1.0
UI Jetpack Compose + Material 3 (Catppuccin Mocha theme)
Video Media3 1.10.1 (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.26.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.35
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)
ASR acceleration target Sherpa-ONNX v1.13.2 AAR + Moonshine v2 Tiny EN policy (native backend still gated)
Animated Titles Lottie Compose 6.7.1 and Media3 Lottie overlay support
Startup performance AndroidX Baseline Profile / Macrobenchmark 1.4.1
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

Architecture

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     # SAM 2.1 / MobileSAM target metadata (stub)
│   ├── PiperTtsEngine       # Piper VITS TTS (stub, system TTS fallback)
│   ├── LottieTemplateEngine # Animated title rendering
│   ├── FFmpegEngine         # FFmpegX fallback encoder (stub)
│   ├── SubtitleRenderEngine # Canvas + ASS subtitle rendering
│   ├── GenerativeVideoPolicy # Cloud-only trust gates for large video generators
│   ├── 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 target metadata + fallback
│   └── 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

Build

# Debug build
./gradlew assembleDebug

# Release build (requires keystore.properties or env vars)
./gradlew assembleRelease

# Managed-device startup/editor performance gate
./gradlew :baselineprofile:pixel6Api36BenchmarkReleaseAndroidTest :baselineprofile:collectNonMinifiedReleaseBaselineProfile

Requirements

  • Android Studio Ladybug+ (2024.2+)
  • AGP 8.7.3, Gradle 8.9, JDK 21
  • Android SDK 36

Release Signing

Configure via keystore.properties:

storeFile=path/to/your.jks
storePassword=yourpass
keyAlias=youralias
keyPassword=yourpass

Or via environment variables: NOVACUT_STORE_FILE, NOVACUT_STORE_PASSWORD, NOVACUT_KEY_ALIAS, NOVACUT_KEY_PASSWORD

If release credentials are not configured, assembleRelease falls back to debug signing so CI and local verification can still produce a testable release artifact without relying on an embedded keystore.

Dependencies

Key external dependencies currently in build.gradle.kts:

Dependency Version Purpose
ONNX Runtime 1.26.0 Whisper ASR + LaMa inpainting
Sherpa-ONNX 1.13.2 target Future native Moonshine v2 ASR path; official AAR is a GitHub release asset, not a Maven dependency
SAM 2.1 ONNX Targeted Future tracked-mask path via explicit model download; MobileSAM remains the small-device fallback
MediaPipe 0.10.35 Selfie segmentation
Lottie Compose 6.7.1 Animated title templates
AndroidX Benchmark/ProfileInstaller 1.4.1 / 1.4.1 Baseline Profile generation and release profile install
OkHttp 5.3.2 Future opt-in cloud APIs

Supported Devices

  • Min SDK: 26 (Android 8.0 Oreo)
  • Target SDK: 36 (Android 16)
  • 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+

Permissions

Permission Purpose
RECORD_AUDIO Voiceover recording
FOREGROUND_SERVICE Background export processing
FOREGROUND_SERVICE_MEDIA_PROCESSING Android 14+ foreground export classification
POST_NOTIFICATIONS Export progress notifications
INTERNET Model downloads (Whisper), cloud inpainting API
ACCESS_NETWORK_STATE Respect Wi-Fi-only model download settings
VIBRATE Haptic feedback

Media access uses the system Photo Picker (ActivityResultContracts.PickVisualMedia) and ACTION_OPEN_DOCUMENT exclusively — NovaCut requests no broad READ_MEDIA_VIDEO / READ_MEDIA_IMAGES / READ_MEDIA_AUDIO / READ_EXTERNAL_STORAGE / WRITE_EXTERNAL_STORAGE permissions, so the per-URI grant model survives background kill without the Android 14 Selected Photos compatibility-mode loss.

Known Limitations

  • Multi-sequence export now honors track opacity through Media3 compositor settings, and all 18 fallback blend modes render distinctly; true source-over-destination blend math still needs a custom programmable compositor because Media3's public settings only expose alpha/transform
  • clip.isReversed works in preview but not in export (Media3 Transformer has no reverse playback support)
  • SmartRenderEngine analysis results not used for actual export bypass
  • 11 AI/ML engine stubs awaiting dependency integration (see ROADMAP.md)

License

MIT

Read on GitHub → github.com/SysAdminDoc/NovaCut

Recent Releases

Latest tagged notes pulled from GitHub release history for this project.

  • v3.73.2

    Premium project-home polish release. · - First-run project home now focuses on creating, restoring, or sampling a project instead of showing inactive library controls. · - Empty filtered views provide a single recovery a

  • v3.72.0

    - **Cut Assistant deleted the wrong slice.** `applyAcceptedCuts()` looked up `op.clipId` AFTER the first `splitClipAt()`, but `splitClipAt` keeps the LEFT half on the original id — so the "middle" lookup matched the wron

Esc
Start with the strongest work, a key route, or the full archive.