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 singleAVAssetImageGenerator, 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 byAVAssetImageGenerator.images(for:) cancel();FramecarriesrequestedTime/actualTime/imageVideo.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.
ThumbnailGeneratoris afinal class @unchecked Sendable(not anactor): its batch stream drivesimages(for:)from a producer task, which fights actor isolation under Swift 6 strict concurrency.AVAssetImageGeneratoris thread-safe for generation.
Full diff: v0.13.0...v0.14.0