-
Notifications
You must be signed in to change notification settings - Fork 5
Releases: SysAdminDoc/NovaCut
NovaCut v3.74.100
What's Changed
Correctness Fixes
- Fixed potential crash in WhisperEngine audio decode when a corrupt media file reports zero channels
- Replaced force-unwrap on ModelDownloadManager SHA-256 field with
requireNotNullfor safer error reporting - Added zero-duration guard to
Clip.relinkedTo()preventingIllegalArgumentExceptionon degenerate media
I18n
- Replaced hardcoded English media-read-failed toast with localized string resource
Diagnostics
- Added logging to silent catch in ExportDelegate audio-conformance probe
Full Changelog: v3.73.2...v3.74.100
Assets 3
NovaCut v3.74.93
NovaCut v3.74.93 — Android video editor.
Install
Download NovaCut-v3.74.93.apk below and open it on your device to install.
You may need to allow "Install unknown apps" for your browser/file manager.
- Works on Android 8.0 (API 26) and newer.
- Universal APK — includes every CPU architecture (arm64-v8a, armeabi-v7a, x86, x86_64), so it installs on any compatible phone, tablet, or emulator.
- Signed with the same key as previous releases, so it updates cleanly over an existing NovaCut install.
What's new
Feature
- Opt-in update check for sideload / GitHub-release installs. A new Settings → Updates section can do a single, secure version lookup against the GitHub releases page and link you to a newer build. Off by default; it never downloads or installs an APK for you.
Reliability
- Fixed a resource leak in the dotLottie loader: the animation stream is now closed on every path, including cancellation and load failures.
Data safety
- Clearing detected beat markers is now undoable (and no-ops when already empty) instead of wiping silently.
Accessibility & localization
- The caption-translation "Regenerate" control now meets the 48dp minimum touch-target size.
- Completed the Spanish (es) locale — Project Inspector, before/after preview comparison, storyboard, audio-conformance notices and more no longer fall back to English.
- Split content-description strings that were reused as visible text so spoken and visible copy can be translated independently.
SHA-256 (NovaCut-v3.74.93.apk): 20667f3c609d4d95b925cf85b5332a0d4d5c3d276076a449272f358f4bf00454
Assets 3
NovaCut v3.73.2
NovaCut 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 action to show all projects, plus a secondary new-project path.
- Filtered result headers now include filter name, visible/total counts, and sort context.
- Mobile first-run layout keeps the empty state visible and moves filter chips into a compact rail.
Verification:
- Built release APK with
assembleRelease. - Verified package metadata:
com.novacut.editor, versionCode136, versionName3.73.2. - Verified APK Signature Scheme v2 signature.
- APK SHA-256:
AE404C7DB2F2CF4F3109B65922EA1BB7EAFC3B97E4D3C806730F5069B40958A6.
Assets 3
NovaCut v3.72.0 — Hardening pass
Hardening pass — Cut Assistant correctness, resource leaks, persistence guards
Critical bug fixes
- Cut Assistant deleted the wrong slice.
applyAcceptedCuts()looked upop.clipIdAFTER the firstsplitClipAt(), butsplitClipAtkeeps the LEFT half on the original id — so the "middle" lookup matched the wrong slice and the engine erased content before the silence range instead of the silence itself. The new applier diffs per-track clip-id sets across both splits, deletes the correct middle slice, and ripple-shifts every subsequent clip back by the deleted span so the timeline closes without orphan gaps. - Cut Assistant proposeCutsForReview no longer trusts pre-IO state. Tracks are re-read after the IO waveform scan; clips deleted/moved/replaced mid-scan are filtered out, and
CancellationExceptionis propagated so cancelling actually tears down the scope. - Cut Assistant review drops on panel dismissal.
dismissedPanelState()now resetscutAssistantReview = nullalongside the other auxiliary state — opening other panels no longer leaks the ReviewSet (which can hold per-clip word transcripts). - TrackedObjectKeyframe rejects NaN/non-finite/out-of-range inputs. Adds
require()guards forclipTimeMs >= 0, finitecenterX/centerY, and[0, 1]bounds on the center — corrupt JSON can no longer slip NaN coordinates into the mosaic/blur shader pipeline. - ProjectArchive no longer swallows CancellationException. Both
exportArchiveandimportArchiveWithReportre-throw after cleanup so a cancelled coroutine sees real cancellation. - VideoEngine.extractThumbnail bitmap leak fixed.
Bitmap.createScaledBitmapthrows OOM (anError, notException); the sourceframeis now released on every exit path. - ModelDownloadManager deletes corrupt cached models on SHA-256 mismatch. Avoids paying for a full hash scan over known-bad bytes on every launch.
Security
keystore.propertiesadded to.gitignore— release-signing credentials file was untracked but unprotected.
Tests
- 22 new unit-test cases across
TrackedObjectKeyframeTestandCutAssistantEngineTestcovering the new guards, projection math, trim-clipping, merge tolerance, and apply-order ordering.
APK: NovaCut-v3.72.0.apk (118 MB, signed, v2 scheme, min SDK 26).
Assets 3
NovaCut v3.71.0 - Cut Assistant + TrackedObject + speed-ramp fixes
Release v3.71.0 ships the Cut Assistant review UI, TrackedObject scaffolding for the mosaic effect, template compatibility validation, export color confidence checks, stream-copy export control, and speed-ramp duration integration fix.
Note: this APK is signed with a debug certificate (release keystore password was unavailable). To upgrade an installed v3.69.0 you must uninstall the old release-signed build first.
Assets 3
NovaCut v3.69.0 — 15-Feature Wave + Hardening
Twelve new engines behind a composite v3.69 feature hub, real implementations
for stream-copy export / HDR preservation / text stroke export / keyframe
remap on text-based edits / transcript persistence, and a production
hardening pass that closes several latent crashes.
Highlights
- Text-based editing (Descript/CapCut Script Editor style) — delete words
in the transcript to delete the mapped clip ranges, with ripple and
keyframe remap. - Karaoke captions — eight word-pop preset styles (MrBeast / Subway /
Hormozi / TikTok / Pop / Typewriter / Neon / Minimal). - Auto-chapters — TextTiling segmentation over the Whisper transcript;
exports as a YouTube description-ready clipboard block. - Stream-copy export via Android MediaMuxer. Around 50x faster than the
Transformer path on eligible timelines (single clip or multi-clip same
source, no effects / color grade / speed changes / audio fades). - Talking-head auto-framing — face tracking + one-euro smoothing, output
as position keyframes. - Flash safety scan — WCAG-style photosensitive-epilepsy detector.
- Color-blind preview — Deuteranopia / Protanopia / Tritanopia /
Achromatopsia via a single shared GL shader with matrix uniforms. - HDR preservation on HEVC/AV1/VP9 exports via HDR_MODE_KEEP_HDR.
- Text stroke export — Canvas-based stroke+fill pass so overlay strokes
actually make it into the final render. - AI thumbnail picker — sharpness / face / rule-of-thirds scoring.
- Content-ID fingerprint — local audio hash for pre-upload checks.
- Direct publish — YouTube / TikTok / Instagram / Threads / X / LinkedIn.
- S Pen + BT MIDI jog/shuttle controller.
- Transcript persistence across app restart.
- DeX / Chromebook desktop sidebar with media bin and quick actions.
- One-handed compact layout toggle.
Production hardening in the same release
- StreamCopyMuxer no longer emits overlapping timestamps between ranges and
rethrows CancellationException instead of silently returning false. - StrokedTextBitmapOverlay double-buffers bitmaps so Media3's async GPU
upload cannot race a recycle. - AiThumbnailEngine.saveThumbnail no longer recycles the input bitmap while
the Compose panel is still rendering it. - ExportDelegate rethrows CancellationException so user-cancelled exports
do not surface as ERROR. - ColorBlindGlEffect reuses a single compiled shader across all modes.
- StreamCopyExportEngine compares URIs by toString so JVM unit tests work.
- Nineteen new tests cover every eligibility branch of
StreamCopyExportEngine.analyze; full suite green.
Install
Download the APK below. Allow installs from unknown sources if prompted.
Assets 3
NovaCut v3.68.0 — Performance & Responsiveness Pass
Broad optimization sweep across recomposition hotspots, per-tick I/O, and hot-path allocation. No new features. No DB schema changes. No new dependencies.
Compose recomposition fixes
- Per-clip
Brush.verticalGradientoverlay hoisted toremember— a 10-clip project recomposing at 30 Hz was churning 300+ Brush + List allocations/sec for a gradient whose contents never change. - Render-phase snap-target list memoized via remember keyed on the static inputs. The
flatMap { filter { } flatMap { } }.distinct().plus(...).let { ... }.let { ... }chain previously ran on every playhead tick. volumeKeyframesSortedmemoized per-clip onclip.keyframes. Was O(n log n) per audio clip per recomposition.previewTrackClips/previewClipAtPlayheaddecoupled fromplayheadMs. The sort that builtpreviewTrackClipswas re-keyed onplayheadMsvia the downstream derive chain, so a static clip list was being re-sorted 30 times/sec during playback.
Per-tick I/O reduction
Eight slider/gesture paths no longer call saveProject() on every onValueChange tick. All have matching begin*/end* hooks so the full-project JSON serialize + disk write runs once per gesture instead of 60 times per second:
updateEffect→endEffectAdjust()setTrackVolume→endVolumeAdjust()setTrackPan→endPanAdjust()setClipVolume→endVolumeChange()setClipTransform→endTransformChange()setClipOpacity→endOpacityChange()(new hook)setClipFadeIn/setClipFadeOut→endFadeAdjust()beginSlideEdit/beginSlipEditnow also enablescrubbingMode(true)(previously onlybeginTrimdid)
The preview-pan pinch gesture was rewritten from detectTransformGestures to awaitEachGesture so it actually has an end hook — the old implementation had no way to signal "gesture finished", which is why setClipTransform was calling saveProject() on every frame in the first place.
Playback loop
- Playhead sync's per-5-frame state broadcast now gated on drift ≥200ms. During playback, every 5th frame previously emitted an unconditional 40-field
state.copy(), invalidating every Compose subscriber of the state flow ~6 times/sec. The dedicated_playheadMsflow already serves live consumers; the full-state broadcast only needs to keepstate.playheadMsfresh enough for user-triggered reads likesplitClipAtPlayheadand autosave.
Usability
- Clip-label picker close button 24dp → 44dp to meet Material 3 minimum touch target. Icon 16dp → 20dp.
Assets 3
NovaCut v3.67.0 — Snackbar Fix, Drag Responsiveness, Quieter Suggestions
Follow-up fixes based on v3.66 user testing.
Snackbar covering the screen (also broke video playback)
PremiumSnackbar's accent stripe used fillMaxHeight() inside a height-unconstrained Row. Compose resolves fillMaxHeight against the nearest height-constrained ancestor — which was the screen-root Box — so a "Clips split" toast wasn't just visually oversized, its opaque-ish Surface absorbed touch input across the whole area. That's why the play button appeared unresponsive immediately after a split. Two-line fix: .wrapContentHeight() on the Surface + .height(IntrinsicSize.Min) on the Row so fillMaxHeight now resolves against the Row's wrap-content height (~52dp) instead of the screen.
Timeline drag responsiveness
trimClip, slideClip, and slipClip no longer call rebuildPlayerTimeline() on every tick. All three fire at touch-event rate (60–120 Hz) during a drag; tearing down and rebuilding ExoPlayer's MediaItem + ClippingConfiguration set on every tick was the primary cause of the clunky feel. The rebuild now runs exactly once per gesture in endTrim / endSlideEdit / endSlipEdit. beginSlideEdit and beginSlipEdit also enable scrubbingMode (previously only beginTrim did), so ExoPlayer skips intermediate seek/decode work across all three edit modes.
Suggestion banner cleanup
Removed the unsolicited "This clip could use color correction" suggestion banner that fired every time a long visual clip was selected with no effects. Users can still trigger auto-color from the AI tools panel.
Assets 3
NovaCut v3.66.0 — Timeline & Editing Overhaul
Timeline & Editing Overhaul
Focused rework of the timeline gesture model and viewport framing. Addresses three long-standing usability issues.
Timeline gesture unification
- Unified clip-body pointer input replaces three competing gesture detectors. Previously the clip body's slide/slip
detectDragGesturesand the nested trim-handledetectHorizontalDragGesturesblocks all waited for drag slop on the same down event, and the parent body detector routinely consumed edge drags before the handle detectors could react — which is why pulling on the edge of a clip to trim often did nothing. A singledetectDragGestureson the clip body now measures the touch X at drag start and routes the gesture to one of four zones:TRIM_LEFT,TRIM_RIGHT,SLIP, orSLIDE. Drag events are explicitly consumed so the ancestor pinch-zoom detector doesn't double-handle them. - Selected clip shows thicker edge handles with grip lines. When a clip is selected, the trim-handle visual width grows from 14dp to 18dp and three vertical grip lines appear — an unambiguous affordance cue. Matches CapCut / KineMaster edit UX.
Full-duration viewport framing
- Minimum zoom lowered from 0.1 → 0.01. The old floor meant the fit-to-window calc couldn't actually fit videos longer than ~60 seconds on a phone screen. The new floor lets a 10-minute project fit cleanly.
- Auto-fit on first layout.
fitTimelineToWindow()now fires automatically when the timeline lays out with content present, after autosave/Room restore populates tracks, and after the first clip is added to an empty project. Guarded so subsequent user zoom preferences aren't overridden. - Viewport overview strip below the tracks. New
TimelineOverviewBarrenders a full-project-duration mini-strip with clip footprints, a highlighted viewport window, and a playhead tick. Tap or drag to scroll — centering the viewport on the tapped position. Primary purpose is discoverability: users can see at a glance that there is more content off-screen.
Cut / delete accessibility
- Prominent "Cut at playhead" and "Delete selected" buttons added to the timeline toolbar row. Split was previously only reachable through a two-level tool sub-menu or a radial long-press menu. The split button uses the Peach accent + highlight border so it reads as a primary action. Delete auto-disables when no clip is selected. Both always visible, regardless of the current tool mode.
Notes
- No DB schema changes. No new dependencies. No model changes.
Assets 3
NovaCut v3.65.0
Deep Audit Phase 27: Error-Path Allocation & OOM Cleanup
Targeted correctness fixes from continued engineering audit. No behaviour change on valid inputs, no new dependencies.
Bug fixes
-
AudioEngine.extractWaveform— exception path allocated unboundedFloatArray(sampleCount)— Every other return path allocatesFloatArray(boundedSampleCount)(capped at 10,000). A caller that passedsampleCount=48_000received a 192 KB array on decoder failure instead of the expected 40 KB, and the oversized result was cached in the LRU under its"uri|sampleCount"key. Now usesboundedSampleCounton the exception path, completing the v3.59.0 fix which only patched theaudioTrackIndex < 0path. -
ContactSheetExporter.export— PNG-encoderOutOfMemoryErrorbypassed partial-file cleanup —sheet.compress(...)allocates native PNG-encoder buffers and can raiseOutOfMemoryErroron very large contact-sheet grids. The outercatch (e: Exception)did not catchOutOfMemoryError(aThrowablesubclass, notException), sooutputFile.delete()was skipped. Thefinallystill recycled the source bitmap (no native leak), but a half-written or 0-byte PNG was left on disk — subsequent opens silently served it as though the export had succeeded. Now catchesThrowablebut rethrowsCancellationExceptionfirst so coroutine cancellation still propagates.
Notes
- No DB schema changes. No new dependencies. No UI changes.