DamilolaDami / DamilolaDami/EditOS
Keyframe animation for clip transform (position, scale, rotation, opacity)
- Dominant language
- Swift
- Stars
- 2
- Forks
- 0
- PR merge metrics
- No merged PRs in 30d
Description
## Why this matters
Every clip currently has a single static `transform` (`scale`, `rotation`, `opacity`, position). To do CapCut-style motion — a logo zooming in, a sticker drifting across the canvas, a Ken Burns pan on a still — we need keyframe animation.
## Scope
- Add a `[Keyframe]` collection to `Clip` (or to each animatable property). A keyframe is `(time: TimeInterval, value: Double, easing: Easing)`.
- Animatable properties (V1): position X, position Y, scale, rotation, opacity. Stickers and text clips first, then video.
- Inspector UI: an inline timeline strip per property showing keyframe diamonds; click on the property's row to drop a keyframe at the playhead; drag a diamond to retime; right-click to delete or change easing.
- Evaluation happens in the composition pipeline (preview + export). Interpolate using the selected easing curve (linear, ease-in/out, cubic).
### Acceptance criteria
- Drag the playhead, change opacity → a keyframe is auto-created at that time.
- Scrubbing back/forward animates the value smoothly between keyframes.
- Export bakes the animation into the rendered MP4.
- Removing all keyframes restores the static-value behaviour.
## Pointers
- `EditOS/Core/Models/Clip.swift` — model
- `EditOS/Features/Editor/Inspector/InspectorPanel.swift` — UI
- `EditOS/Core/Engine/CompositionBuilder.swift` — overlay/sticker rendering (see `renderStickerOverlay`, `OverlayInstance`)
## Difficulty
🔴 Advanced — significant model + UI + pipeline work. Worth breaking into sub-PRs by property type.
Contributor guide
No contributing guide indexed for this repository
Research direction
Start by reading EditOS/Core/Models/Clip.swift, then trace the inspector flow in EditOS/Features/Editor/Inspector/InspectorPanel.swift and rendering in EditOS/Core/Engine/CompositionBuilder.swift, including renderStickerOverlay and OverlayInstance. Break the work into property-focused sub-PRs. Done means keyframes can be created, retimed, deleted, eased, previewed, exported to MP4, and removed to restore static values.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- swift
- Domain
- computer-graphics
- Issue type
- Feature
- Difficulty
- 5/5
- Estimated time
- Over a week
- Activity status
- Quiet
- Clarity
- Mostly clear
- Newbie friendliness
- 35/100