Skip to content

v0.14.0 — Core closeout

Latest

Choose a tag to compare

@SteliyanH SteliyanH released this 17 Jun 06:04

The final cycle before the v1.0 semver lock. Clears everything still deferred in kadr core so v1.0 will be a pure lock with no code changes — no API deletions in the release that promises "stable forever."

Added

  • ThumbnailGenerator + Video.thumbnailGenerator() — a reusable thumbnail / scrub-frame generator that composes the video once and holds a single AVAssetImageGenerator, so a scrubber or filmstrip pays the composition + generator-allocation cost a single time instead of per call.
    • thumbnail(at:) (CMTime + TimeInterval)
    • batch thumbnails(at:)AsyncThrowingStream<Frame, Error> (filmstrips), backed by AVAssetImageGenerator.images(for:)
    • cancel(); Frame carries requestedTime / actualTime / image
    • Video.thumbnail(at:) now delegates to it (one code path, identical output)

Removed (⚠️ breaking)

Three APIs deprecated since v0.11 (each tagged "Removal target: v0.12", overdue). Migration table:

Removed Replace with
VideoClip.speed(_ rate: Double) VideoClip.speed(.flat(rate))
VideoClip.speed(curve: Animation<Double>) VideoClip.speed(.curved(animation))
VideoClip.filterAnimation(at index: Int, _:) VideoClip.filterAnimation(for: FilterID, _:)

AudioTrack.speed(_:algorithm:) is a separate, non-deprecated API and is unaffected.

Downstream: repos still calling these (reels-studio, kadr-ui) need the one-line migrations above when bumping their kadr floor to 0.14.

Notes

  • This is the last cycle with code changes before v1.0. v1.0.0 will be the stability commitment plus DocC tutorials, benchmarks, and the migration guide — no further API changes.
  • ThumbnailGenerator is a final class @unchecked Sendable (not an actor): its batch stream drives images(for:) from a producer task, which fights actor isolation under Swift 6 strict concurrency. AVAssetImageGenerator is thread-safe for generation.

Full diff: v0.13.0...v0.14.0