All notable changes to this project will be documented in this file.
- Per-track drag-to-resize with component-local height state (#101)
- Horizontal padding at the start and end of the timeline for visual clearance from UI boundaries (#100)
- Upgrade
@shotstack/schemasto 1.9.10
- Font variation settings applied correctly for bold weight (#92)
- IIFE build crash resolved
- Husky pre-commit hooks and updated AOS tooling (#97)
- Fallback placeholder graphics for failed image, video, and luma loads (#87)
- Caption toolbar padding, alignment, and stroke type handling (#86)
- Word spacing control and font search in caption toolbar (#86)
- Caption source linking with intelligent clip matching (#86)
- Active word styling panel with shadow and focus controls (#86)
- Rotation cursor near selection corners, follows clip angle (#85)
- Larger hit areas on selection handles and edges (#85)
- CI/CD concurrency control for sequential releases (#84)
- Default font weight resolution for variable fonts with named weight handling (#83)
- Auto-set fit to
containfor image/video clips on resize (#82) - Track insertion at last position using sentinel value (#80)
- Updated CI/CD pipeline for automated semver releases (#78)
- Rotation angles get normalized to schema bounds
- add rich-caption toolbar with layout, word animation, and active word controls
- Better, more intuitive snapping and guide lines.
- Timeline clip selection
- Fix audio bleed when switching media sources via
loadEdit()— AudioPlayer now properly reloads on source change - Fix audio/video player disposal to stop playback immediately and clean up PIXI containers
- Recalculate total timeline duration after granular
loadEdit()updates so the toolbar displays the correct time
- Canvas panning with middle mouse button drag, including grab cursor feedback
- Timeline resize handle for adjustable timeline height
- Set initial volume for audio and video players to avoid undefined default values
- Resolve merge fields as strings for
textandsrckeys
- Externalize
@napi-rs/canvasin Vite/Rollup build configs to prevent bundling of native Node addons
- Prevent deletion of the last clip in a document.
- Fixed toolbar positioning when SDK is embedded in a page with surrounding content. Toolbars now use
position: absolutewithin the canvas container instead ofposition: fixedrelative to the viewport.
Timeline
- HTML/CSS timeline rebuild - Replaced the 1.x timeline with a fully rewritten HTML/CSS implementation
- Asset type icons with variable track heights based on content type
- Playhead ghost hover preview
- Home/End key navigation (replaces meta+arrow keys)
- Copy-paste - Duplicate clips on the timeline using standard keyboard shortcuts
- Collision detection - Automatic clip pushing during drag operations to prevent overlapping
- Thumbnail rendering - Video and image thumbnails displayed directly on timeline clips
- Soundtrack support - Integrated audio player for soundtrack assets on the timeline
- Graceful error handling - Visual error indicators on clips that fail to load
- Seconds-based timing - Unified all time values to a branded
Secondstype throughout the timeline
UI Toolbars
- Rich text toolbar - Full formatting toolbar with font picker, text shadow, padding, background color, animation presets, and strikethrough
- Media toolbar - Editing controls for video and image clips including audio, fade effects, zoom/slide transitions, and effects
- SVG toolbar - Fill color, corner radius, and clip-level controls (opacity, scale, transition, effect)
- Canvas toolbar - Resolution, FPS, and background color controls in a vertical layout on the right edge
- Asset toolbar - Quick text and media insertion controls on the canvas
- Text-to-Speech toolbar - Voice selection and audio generation controls
- Text-to-image toolbar - Prompt editing and AI image generation controls
- Draggable toolbars - All toolbars support drag repositioning with reset capability
- Extensible toolbar buttons - Registry system for adding custom toolbar buttons
AI-Powered Assets
- AI asset players - Aurora loading animations for text-to-image and text-to-speech assets during generation
- AI asset overlays - Asset number badges and prompt preview overlays on AI-generated content
Merge Fields
- Merge field system - Template variable substitution across Edit properties
- Redesigned merge field popup with scroll architecture
Font System
- Font Picker - Virtual scrolling font selector with recent fonts tracking
- Font color picker - Color and highlight controls with gradient presets
- Font weight selector - Dropdown with full weight range, replacing the simple bold toggle
- OpenType integration - Font family name extraction using
opentype.jsfor accurate metadata - CDN font hosting - Migrated default font assets to CDN with expanded weight and style variants
Rotation, Resize & Alignment
- Rotation - Full rotation support for canvas objects with snapping to fixed angles
- 8-point resize handles - Corner and edge resize with proper dimension handling for SVG and rich text assets
- Alignment guides - Drag snapping to alignment guides integrated into the canvas
- Dimension labels - Live dimension display during resize operations
- Drag time tooltips - Time position display during clip drag and resize on the timeline
Luma Mask
- Luma mask system - Attach luma masks to clips using Alt+drag with automatic asset type transformation
Output & Resolution
- Output configuration commands - Commands for setting format, resolution, aspect ratio, and destinations
- Resolution presets - Predefined resolution options with rollback handling
- Multi-provider destinations - Output schema supports multiple render destinations
Canvas & Rendering
- Responsive canvas zoom - Automatic zoom scaling to fit the container
- Alpha channel support - Correct rendering for WebM VP9 transparent videos
Clip Management
- Clip reconciliation - Unidirectional data flow with unified resolution for predictable clip tracking across undo/redo
- Clip timing controls - Asset/clip mode toggle for timing configuration
- Smart loadEdit - Structural diffing with unified event dispatch when reloading an edit
- Drag-to-create track - Drop zone indicators for creating new tracks during clip drag
- Alias resolution - Clip reference system using aliases
- Caption rendering - Subtitle player with VTT/SRT parser for caption assets
Keyframes & Animations
- Layered animation composition - Effects and transitions composed as independent animation layers
- Skew transform - New skew property for clip transforms with animation builder support
- Smooth easing - New easing curve for improved carousel and slide transitions
SDK Architecture
- EditDocument - Pure data layer for edit configuration management, separating data from rendering
- Composite UI components - Reusable panels for effects, transitions, spacing, and style controls
- SVG asset support - Full SVG asset rendering, editing, and shared SVG utilities
- Keyboard arrow positioning - Arrow keys move selected clips on the canvas
- Migrated to
@shotstack/schemasas canonical type source - Upgraded
@shotstack/shotstack-canvasfrom ^1.6.5 to ^1.9.6 - Upgraded
pixi.jsfrom ^8.5.2 to ^8.15.0 - Upgraded
zodfrom ^3.23.8 to ^4.0.0 - Requires Node.js 22 (previously unconstrained)
- Timeline API simplified — feature toggles and constructor options removed
- Default preview framerate updated to 25fps
- Switched to light theme as default
- Corrected playback time unit conversions across all player types
- Fixed memory leaks from event listener accumulation and recursive handlers
- Resolved race conditions in render updates during clip selection changes
- Fixed audio stuttering caused by excessive video sync checks (now rate-limited)
- Added cache invalidation for clip and track mutations
- Corrected track layer calculation and z-index sorting for multi-track compositions
- Performance and rendering improvements
- Fixed crop scaling logic to use max ratio consistently
- Deferred audio volume keyframe initialization until timing is resolved
- Fixed left-edge clip resize to correctly adjust start position and duration
- Added track existence validation before clip reorder on same-track moves
- Corrected carousel offset calculation logic
- Normalized z-index hierarchy across UI layers
- Improved
.movvideo error messaging - Included opacity in clip keyframe detection
- Prevented toolbar container duplication on remount
- Fixed SVG icons intercepting pointer events on toolbar buttons
- Fixed clip mask offset to account for centered border strokes
./schemapackage export — schemas now provided by the@shotstack/schemaspackageTimelineOptions— Timeline constructor options removed in favour of simplified APIfast-deep-equaldependency — replaced by internal structural diffing- Schema build configuration (
vite.config.schema.ts) - Internal UI component exports from the public API surface
.webmbrowser support check
- Moved
width,height, andcustomFontsout ofRichTextAssetSchema- dimensions now resolved from clip config, custom fonts computed at runtime (#46) - Updated
@shotstack/shotstack-canvasto v1.5.3
- Audio fade effects - Added
effectproperty to audio assets supportingfadeIn,fadeOut, andfadeInFadeOutwith 2-second fade duration - updateClip command (#44, #34)
- New command to update clip properties programmatically
- Dynamic background color updates
- Rich text padding and border support (#45)
- Added
paddingproperty to rich-text assets - Added
background.borderproperty (width, color, opacity) to rich-text assets
- Added
- Merge fields support for template variable substitution
- Smart-clip timing values with support for
"auto"and"end"values with resolution logic - Emits
timeline:updatedevent when edit is reloaded - Exported
VERSIONconstant from package.json
- Added strict validation to all Zod schemas
- Rich text player implements
reconfigureAfterRestoreto clear cache and re-render
- Reset render state on seek to prevent race conditions
- Stored bound event handlers to fix listener cleanup
- Updated
@shotstack/shotstack-canvasto v1.4.7 - Removed
styleproperty from font configurations (#43)- Font style variants should now be loaded as separate font families
- Support for
background.borderproperty (width, color, opacity) - Support for
paddingproperty (uniform or per-side values)
- Fixed module resolution issues in Next.js and other bundlers (#11, #42)
- Added
inlineDynamicImports: trueto Vite build configuration to prevent chunk file generation - Resolved "Cannot find module" errors when importing the SDK in Next.js applications
- All code is now properly inlined into single ES and UMD bundle files
- Added
- Updated
@shotstack/shotstack-canvasto v1.3.0 - Improved development tooling:
- Added
typecheckscript for TypeScript validation - Added
test:packagescript to validate build output before publishing
- Added
- Updated
@shotstack/shotstack-canvasto v1.1.7 - Improved package exports with explicit TypeScript types and better module format support
- Updated schema build to output
.mjsand.cjsfiles for better compatibility
- Test cases for Jest builds (#39)
- Schema exports for Jest compatibility
- Removed makefile build commands in favour of package.json scripts
-
Rich Text Asset Support (#35)
- New
rich-textasset type with RichTextPlayer - Custom font loading from URLs and local files
- New
-
Clip Dimensions (#36)
- Added optional
widthandheightproperties to clips (1-3840px, 1-2160px)
- Added optional
-
Schema Exports (#38)
- All Zod validation schemas now exported for external package usage
- Fit property now optional with smart defaults:
nonefor rich-text,cropfor other assets (#36) - Updated
@shotstack/shotstack-canvasto v1.1.2
- Rewrote fit logic to match backend behavior (#37):
cover: non-uniform stretch to fillcrop: viewport-aware scaling, never downscales small imagescontain: fit within bounds preserving aspect rationone: native dimensions
- Fixed animation sequence and tween properties integration
- Replaced WASM-based FFmpeg with Mediabunny
- Switched from FFmpeg to WebCodecs-based Mediabunny
- Export speeds improved by 10x
- Keyboard shortcut for export/download with Cmd/Ctrl + E
- FFmpeg dependency
- Image fit behaviour corrected ([#31]):
- cover: apply non-uniform x/y scaling to fill the viewport (break aspect ratio)
- crop: scale by dominant viewport axis (height for portrait viewports)
- Mask overflow outside the edit viewport using a rectangular stage mask to prevent content drawing beyond bounds
- Timeline Component: A comprehensive visual timeline interface for editing video projects
- Visual track and clip representation with drag-and-drop support
- Clip resizing with edge detection and visual feedback
- Playhead control for timeline navigation
- Ruler with time markers and zoom support
- Toolbar with playback controls, edit actions, and time display
- Snap-to-grid functionality for precise clip alignment
- Multi-track support with visual track management
- Theme support with dark, light, and minimal themes
- Selection system with visual feedback
- Collision detection for clip placement
- Viewport management with scroll and zoom controls
- Real-time preview updates during clip manipulation
- Improved clip selection logic for better user interaction
- Fixed resize handles to always appear on top with full opacity
- Fixed TypeScript declaration files not resolving path aliases in published npm package
- Replaced custom build process with vite-plugin-dts for standard declaration file generation
- Major refactoring: Implemented command pattern architecture
- Reorganized project structure in anticipation of new UI modules
- Extracted all edit operations into dedicated command classes
- Complete undo/redo support for all editing operations
- Implemented undo functionality for all commands
- Added keyboard shortcuts ctrl/cmd-z for undo ctrl/cmd-shift-z for redo
- Enhanced TypeScript strict mode with
noImplicitAnyenabled - Improved import path aliases for better code organization
- WYSIWYG text editing for text clips with double-click activation
- Real-time cursor positioning with support for all text alignments (left, center, right)
- Arrow key navigation for precise cursor movement
- Asset loader video handling now correctly targets only Safari browsers instead of all webkit-based browsers, resolving video loading issues in Chrome and other webkit browsers (#18)
Asset loader now sets required CORS attributes for Webkit video elements, preventing loading hangs (#15).
- Luma mask rendering compatibility with Shotstack Edit API (#12)
- Luma masks in Studio now render with the same behaviour as the Shotstack Edit API.
- White areas are transparent, black areas are opaque.
- Ensures accurate previews of templates using video and image luma clips.
Corrected totalDuration calculation issue in loadEdit() method. Explicitly calls updateTotalDuration() after loading all clips to ensure accurate timeline duration and consistent playback behavior (#7).
- Separated clip selection and state update events (#6):
clip:selectevent now triggers only on initial selection (pointer down).- Added new
clip:updatedevent triggered after state changes upon manipulation (pointer up), providing structured payload with previous and current clip states.
- Fixed duplication issue in loadEdit() method where new template content appended instead of replacing existing content. All clips are now cleared before loading new content (#5).
- Moved FFmpeg to peer dependencies to reduce compatibility issues with frameworks such as Next.js
- Updated documentation to clarify FFmpeg installation requirements
- Initial release of Shotstack Studio
- Core Edit class for managing video timelines and compositions
- Controls for keyboard-based playback and editing
- VideoExporter for exporting to MP4 using browser-based FFmpeg
- Support for images, videos, text, shapes, and audio clips
- Positioning and transformation system
- Keyframing system
- Preconfigured effects and transitions
- Template-based editing system with JSON format compatible with Shotstack Edit API
- Event system
- Asset loader
- Full TypeScript support with comprehensive type definitions