Timeline and production API
Access these methods through project.production. Timeline positions use global integer frames. Read values are inspection copies; use the mutation methods to apply changes. See animation, camera, audio, and components.
Parameter declarations below are extracted from the current source. A value after = is the default; ? marks an optional input. Named data shapes are listed in API types.
ProductionTools
captureComponent
captureComponent(layerId: Id, name: string, options: MutationOptions & {
id?: Id;
} = {}): Id;reviseComponent
reviseComponent(id: Id, sourceLayerId: Id, options: MutationOptions = {}): void;instantiateComponent
instantiateComponent(componentId: Id, panelId: Id, transform: Partial<Transform> = {}, options: MutationOptions & {
id?: Id;
} = {}): Id;refreshComponentInstance
refreshComponentInstance(layerId: Id, options: MutationOptions & {
comments?: "reject" | "anchor-to-instance";
} = {}): void;moveLayer
moveLayer(layerId: Id, beforeLayerId?: Id, options: MutationOptions = {}): void;reparentLayer
reparentLayer(layerId: Id, parentId: Id | null, options: MutationOptions & {
beforeLayerId?: Id;
} = {}): void;removeLayer
removeLayer(layerId: Id, options: MutationOptions = {}): void;find
find(query: ObjectQuery = {}): ObjectSummary[];coordinates
coordinates(targetId: Id, options: CoordinateOptions = {}): CoordinateSpace;layer
layer(id: Id): Layer;layerKeyframes
layerKeyframes(id: Id, options: PageOptions = {}): LayerKeyframe[];cameraKeyframes
cameraKeyframes(shotId: Id, options: PageOptions = {}): CameraKeyframe[];element
element(id: Id): DrawingElement;drawingSequence
drawingSequence(groupId: Id): {
keys: DrawingExposure[] | null;
drawings: { id: Id; name: string; kind: Layer["kind"]; }[];
};setPlaneDepth
setPlaneDepth(layerId: Id, depth: number, options: MutationOptions = {}): void;drawingNeighbors
drawingNeighbors(groupId: Id, frame: number, options: {
skipBlank?: boolean;
} = {}): DrawingNeighbors;twoBoneRig
twoBoneRig(rootId: Id): TwoBoneRig | null;setTwoBoneRig
setTwoBoneRig(rootId: Id, definition: TwoBoneRig | null, options: MutationOptions = {}): void;poseTwoBoneRig
poseTwoBoneRig(rootId: Id, frame: number, target: {
x: number;
y: number;
}, options: MutationOptions & {
bend?: 1 | -1;
easing?: Easing;
} = {}): TwoBoneSolution;setDrawingSequence
setDrawingSequence(groupId: Id, keys: readonly DrawingExposure[] | null, options: MutationOptions = {}): void;duplicateDrawing
duplicateDrawing(groupId: Id, drawingId: Id, name: string, options: MutationOptions = {}): Id;setDrawingRange
setDrawingRange(groupId: Id, startFrame: number, endFrame: number, drawingId: Id | null, options: MutationOptions = {}): void;setExposure
setExposure(layerId: Id, exposure: Layer["exposure"], options: MutationOptions = {}): void;inspect
inspect(): {
readonly schemaVersion: 3;
readonly version: number;
readonly frameRate: number;
readonly durationFrames: number;
readonly scenes: { shots: (Shot | undefined)[]; sequenceId: Id; id: Id; name: string; shotIds: Id[]; }[];
readonly sequences: Sequence[];
readonly assets: Asset[];
readonly audioTracks: AudioTrack[];
readonly locks: ProjectLock[];
readonly openComments: ReviewComment[];
readonly capabilities: { readonly vectorFill: "solid-linear-radial-local-coordinates"; readonly rasterPainting: "working"; readonly vectorStrokeEditing: "working"; readonly vectorBooleans: "closed-contours-skia"; readonly vectorStrokeOutlining: "explicit-editable-contour-conversion"; readonly pixelRegionEditing: "rgba8-source-rectangles"; readonly pixelSelections: "polygon-color-flood-combination-gaussian-feather"; readonly pixelFill: "source-over-copy-destination-out-source-atop"; readonly timeline: "working"; readonly camera2d: "independent-property-keys-and-easing"; readonly layerAnimation: "independent-property-keys-and-easing"; readonly animationEasing: "linear-smoothstep-hold-bounded-cubic-bezier"; readonly layerPivots: "permanent-local-joints"; readonly twoBoneIK: "stored-cutout-rig-baked-rotation-keys"; readonly drawingSequences: "reusable-drawings-holds-blanks"; readonly audioPlacement: "working"; readonly multiplane: "independent-root-depth-keys-2d-parallax"; readonly audioMixdown: "ffmpeg"; readonly audioInspection: "paged-tracks-clips-and-frame-filter"; readonly animaticFrameExport: "working"; readonly movieExport: "ffmpeg"; readonly referenceAssets: "partial"; readonly onionSkin: "layer-selection-tint-frame-samples"; readonly coordinateInspection: "animated-local-frame-matrices"; readonly renderComparison: "premultiplied-pixel-deltas"; readonly compositionGuides: "frame-space-review-overlay"; readonly reviewLocks: "working"; };
};audioTracks
audioTracks(options: PageOptions = {}): AudioTrackSummary[];audioClips
audioClips(trackId: Id, options: AudioClipQuery = {}): AudioClip[];audioClip
audioClip(id: Id): AudioClip & {
trackId: Id;
};changesSince
changesSince(version: number, options: PageOptions = {}): ChangeEntry[];brush
brush(id: Id): BrushPreset;createBrush
createBrush(definition: Omit<BrushPreset, "id" | "version"> & {
id?: Id;
}, options: MutationOptions = {}): Id;reviseBrush
reviseBrush(id: Id, changes: Partial<Omit<BrushPreset, "id" | "version">>, options: MutationOptions = {}): number;duplicateBrush
duplicateBrush(id: Id, name: string, options: MutationOptions = {}): Id;setPanelDuration
setPanelDuration(panelId: Id, durationFrames: number, mode: "ripple" | "preserve" = "ripple", options: MutationOptions = {}): void;setTransition
setTransition(panelId: Id, transition: Transition, options: MutationOptions = {}): void;movePanel
movePanel(panelId: Id, beforePanelId?: Id, options: MutationOptions = {}): void;duplicatePanel
duplicatePanel(panelId: Id, options: MutationOptions = {}): Id;deletePanel
deletePanel(panelId: Id, options: MutationOptions = {}): void;setPanelStatus
setPanelStatus(panelId: Id, status: Panel["status"], options: MutationOptions = {}): void;setPanelNumber
setPanelNumber(panelId: Id, number: string, options: MutationOptions = {}): void;addCameraKeyframe
addCameraKeyframe(shotId: Id, frame: number, value: Partial<Pick<CameraKeyframe, CameraChannel | "easing">>, options: MutationOptions = {}): Id;updateCameraKeyframe
updateCameraKeyframe(shotId: Id, keyframeId: Id, changes: Partial<Omit<CameraKeyframe, "id">>, options: MutationOptions = {}): void;removeCameraKeyframe
removeCameraKeyframe(shotId: Id, keyframeId: Id, options: MutationOptions = {}): void;removeCameraKeyframeChannels
removeCameraKeyframeChannels(shotId: Id, keyframeId: Id, channels: readonly CameraChannel[], options: MutationOptions = {}): void;addLayerKeyframe
addLayerKeyframe(layerId: Id, frame: number, value: {
transform?: Partial<Transform>;
opacity?: number;
depth?: number;
easing?: LayerKeyframe["easing"];
}, options: MutationOptions = {}): Id;updateLayerKeyframe
updateLayerKeyframe(layerId: Id, keyframeId: Id, changes: Partial<Omit<LayerKeyframe, "id">>, options: MutationOptions = {}): void;removeLayerKeyframe
removeLayerKeyframe(layerId: Id, keyframeId: Id, options: MutationOptions = {}): void;removeLayerKeyframeChannels
removeLayerKeyframeChannels(layerId: Id, keyframeId: Id, channels: readonly LayerChannel[], options: MutationOptions = {}): void;addAsset
addAsset(asset: Omit<Asset, "id"> & {
id?: Id;
}, options: MutationOptions = {}): Id;updateAsset
updateAsset(id: Id, changes: Partial<Omit<Asset, "id">>, options: MutationOptions = {}): void;addAudioTrack
addAudioTrack(name: string, options: MutationOptions & {
id?: Id;
} = {}): Id;updateAudioTrack
updateAudioTrack(trackId: Id, changes: {
name?: string;
muted?: boolean;
locked?: boolean;
}, options: MutationOptions = {}): void;removeAudioTrack
removeAudioTrack(trackId: Id, options: MutationOptions = {}): void;addAudioClip
addAudioClip(trackId: Id, clip: Omit<AudioClip, "id"> & {
id?: Id;
}, options: MutationOptions = {}): Id;updateAudioClip
updateAudioClip(trackId: Id, clipId: Id, changes: Partial<Pick<AudioClip, "startFrame" | "sourceInFrame" | "durationFrames" | "volume" | "fadeInFrames" | "fadeOutFrames" | "name">>, options: MutationOptions = {}): void;removeAudioClip
removeAudioClip(trackId: Id, clipId: Id, options: MutationOptions = {}): void;moveAudioClip
moveAudioClip(clipId: Id, targetTrackId: Id, options: MutationOptions & {
startFrame?: number;
} = {}): void;splitAudioClip
splitAudioClip(clipId: Id, frame: number, options: MutationOptions = {}): Id;comment
comment(body: string, anchor: ReviewComment["anchor"], options: MutationOptions & {
author?: string;
} = {}): Id;resolveComment
resolveComment(commentId: Id, options: MutationOptions = {}): void;lock
lock(targetType: ProjectLock["targetType"], targetId: Id, reason: string, options: MutationOptions = {}): Id;unlock
unlock(lockId: Id, options: MutationOptions = {}): void;