The bottom of the z order is the program frame. Its place, place_keys and
start are reported, not applied. Editing them is refused at edit time (exit 5)
because accepting an edit the compositor will ignore is worse than refusing it.The layer at z: 0 carries the program audio and must fill the canvas. It is
usually the same layer as the bottom one, but not always: with layers at z: -5
and z: 0, the z: -5 layer is the bottom, and the z: 0 layer is composited.
A document that already carries placement keys or a start on the bottom layer
keeps rendering and reports place_keys_unused, layer_start_unused or
place_unused, each with the command that clears it. Nothing is bricked.
Placement keys animate position only. Size does not animate — scale has no
time variable, and two mechanisms for “how big is this” would compete. Use a
camera key if you want the whole frame to change size.
splice key main --t 0 --zoom 1.0splice key main --t 4 --zoom 1.6 --at 0.4,0.5
Camera keys are zoom and where the camera looks (--at, as fractions of the
frame). A constant camera lowers to crop+scale; a moving one to scale+zoompan.
On the bottom layer a camera works, because the bottom layer is the frame.
A mask applies to its layer before placement, so a chroma key keeps the
layer’s own alpha rather than the composite’s. Masks are refused on the bottom
layer: the program frame is full-canvas by invariant.
grade inserts one eq (plus lut3d for a LUT) before text and captions, so
titles are not graded with the picture. It is document-wide by design: per-layer
grading would be a second place to look for “why is this shot orange”.
The pipeline is: normalize each source, concat, composite layers in z order,
apply the grade, then burn text and captions, then mix audio. splice plan prints
the argv for each step before anything runs.
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"splice","description":"A video-editing CLI for AI agents: one JSON document in, ffmpeg out.","colors":{"primary":"#5B8DEF","light":"#8FB2F5","dark":"#3A6BD0"},"navbar":{"links":[{"href":"https://github.com/matthew-eth724/splice-cli","label":"GitHub"}]},"footer":{"socials":{"github":"https://github.com/matthew-eth724/splice-cli"}},"styling":{"latex":false},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"splice-cli","hasAudioNarration":false,"actualSubdomain":"splice-cli","customDomains":[],"gitSource":{"type":"artifacts","owner":"prod","repo":"d4a098ae4a762e701b8337e9","deployBranch":"main","contentDirectory":"","isPrivate":true,"mountPath":"","label":"","_id":"6af6eecc4b52838f62bf6ead"},"entitlements":{},"buildId":"6af6eedc7f87d88f98cf1366","clientVersion":"0.0.4124","searchFilterCounts":[]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableContextualStarterQuestions":false,"enableAskAiSearchBar":true},"basePath":"","hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-rbac-roles","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"rbac-expansion","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"full-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-dual-write","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-metadata","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"sso-setup-deadline-banner","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-serve","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"live-agents","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":false},"customCss":[],"page":{"pagePath":"guides/layers","slug":"/guides/layers","pageMetadata":{"title":"Layers, camera, masks","description":"How the z-ordered stack composites, what the bottom layer means, and how placement, camera keys and masks differ.","href":"/guides/layers"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"How the z-ordered stack composites, what the bottom layer means, and how placement, camera keys and masks differ.\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={code:`code`,p:`p`,pre:`pre`,span:`span`,strong:`strong`,..._provideComponents(),...props.components},{CodeBlock,Heading,Warning}=_components;if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Warning)_missingMdxReference(`Warning`,true);return _jsxs(_Fragment,{children:[_jsxs(_components.p,{children:[`A project has one stack of layers, ordered by `,_jsx(_components.code,{children:`z`}),`. That stack is the picture.`]}),`\n`,_jsx(Heading,{level:`2`,id:`the-two-rules-people-conflate`,children:`The two rules people conflate`}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`The bottom of the z order is the program frame.`}),` Its `,_jsx(_components.code,{children:`place`}),`, `,_jsx(_components.code,{children:`place_keys`}),` and\n`,_jsx(_components.code,{children:`start`}),` are reported, not applied. Editing them is refused at edit time (exit 5)\nbecause accepting an edit the compositor will ignore is worse than refusing it.`]}),`\n`,_jsxs(_components.p,{children:[_jsxs(_components.strong,{children:[`The layer at `,_jsx(_components.code,{children:`z: 0`}),` carries the program audio and must fill the canvas.`]}),` It is\nusually the same layer as the bottom one, but not always: with layers at `,_jsx(_components.code,{children:`z: -5`}),`\nand `,_jsx(_components.code,{children:`z: 0`}),`, the `,_jsx(_components.code,{children:`z: -5`}),` layer is the bottom, and the `,_jsx(_components.code,{children:`z: 0`}),` layer is composited.`]}),`\n`,_jsx(Warning,{children:_jsxs(_components.p,{children:[`A document that already carries placement keys or a start on the bottom layer\nkeeps rendering and reports `,_jsx(_components.code,{children:`place_keys_unused`}),`, `,_jsx(_components.code,{children:`layer_start_unused`}),` or\n`,_jsx(_components.code,{children:`place_unused`}),`, each with the command that clears it. Nothing is bricked.`]})}),`\n`,_jsx(Heading,{level:`2`,id:`adding-a-layer`,children:`Adding a layer`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`2`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`2`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`splice`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` layer`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` add`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` pip`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` --z`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:` 10`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` --place`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 0.7,0.7,0.3`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`splice`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` add`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` lower-third.png`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` --layer`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` pip`})]}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.code,{children:`--place`}),` is `,_jsx(_components.code,{children:`x,y,size`}),` in fractions of the canvas; `,_jsx(_components.code,{children:`size`}),` is the width. A layer\nabove the bottom is composited with `,_jsx(_components.code,{children:`overlay`}),`, in z order.`]}),`\n`,_jsx(Heading,{level:`2`,id:`moving-without-resizing`,children:`Moving without resizing`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`2`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`2`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`splice`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` key`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` pip`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` --t`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:` 0`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` --place`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 0.7,0.7`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`splice`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` key`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` pip`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` --t`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:` 3`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` --place`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 0.2,0.2`})]}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[`Placement keys animate `,_jsx(_components.strong,{children:`position only`}),`. Size does not animate — `,_jsx(_components.code,{children:`scale`}),` has no\ntime variable, and two mechanisms for “how big is this” would compete. Use a\ncamera key if you want the whole frame to change size.`]}),`\n`,_jsx(Heading,{level:`2`,id:`camera`,children:`Camera`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`2`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`2`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`splice`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` key`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` main`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` --t`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:` 0`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` --zoom`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:` 1.0`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`splice`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` key`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` main`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` --t`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:` 4`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` --zoom`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:` 1.6`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` --at`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 0.4,0.5`})]}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[`Camera keys are `,_jsx(_components.code,{children:`zoom`}),` and where the camera looks (`,_jsx(_components.code,{children:`--at`}),`, as fractions of the\nframe). A constant camera lowers to `,_jsx(_components.code,{children:`crop`}),`+`,_jsx(_components.code,{children:`scale`}),`; a moving one to `,_jsx(_components.code,{children:`scale`}),`+`,_jsx(_components.code,{children:`zoompan`}),`.\nOn the bottom layer a camera works, because the bottom layer is the frame.`]}),`\n`,_jsx(Heading,{level:`2`,id:`masks`,children:`Masks`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`2`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`2`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`splice`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` mask`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` pip`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` --chroma`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:` 0x00FF00`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`splice`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` mask`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` pip`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` --vignette`})]}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[`A mask applies to its layer `,_jsx(_components.strong,{children:`before`}),` placement, so a chroma key keeps the\nlayer’s own alpha rather than the composite’s. Masks are refused on the bottom\nlayer: the program frame is full-canvas by invariant.`]}),`\n`,_jsx(Heading,{level:`2`,id:`one-grade-for-the-whole-program`,children:`One grade for the whole program`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`2`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`2`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`splice`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` grade`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` --saturation`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:` 1.2`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` --contrast`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:` 1.05`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`splice`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` grade`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` --lut`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` film.cube`})]}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.code,{children:`grade`}),` inserts one `,_jsx(_components.code,{children:`eq`}),` (plus `,_jsx(_components.code,{children:`lut3d`}),` for a LUT) before text and captions, so\ntitles are not graded with the picture. It is document-wide by design: per-layer\ngrading would be a second place to look for “why is this shot orange”.`]}),`\n`,_jsx(Heading,{level:`2`,id:`where-it-lands-in-the-render`,children:`Where it lands in the render`}),`\n`,_jsxs(_components.p,{children:[`The pipeline is: normalize each source, concat, composite layers in z order,\napply the grade, then burn text and captions, then mix audio. `,_jsx(_components.code,{children:`splice plan`}),` prints\nthe argv for each step before anything runs.`]})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Layers, camera, masks","description":"How the z-ordered stack composites, what the bottom layer means, and how placement, camera keys and masks differ.","href":"/guides/layers"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"The two rules people conflate","slug":"the-two-rules-people-conflate","depth":2,"children":[]},{"title":"Adding a layer","slug":"adding-a-layer","depth":2,"children":[]},{"title":"Moving without resizing","slug":"moving-without-resizing","depth":2,"children":[]},{"title":"Camera","slug":"camera","depth":2,"children":[]},{"title":"Masks","slug":"masks","depth":2,"children":[]},{"title":"One grade for the whole program","slug":"one-grade-for-the-whole-program","depth":2,"children":[]},{"title":"Where it lands in the render","slug":"where-it-lands-in-the-render","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":[],"subdomain":"splice-cli","siteName":"splice","title":"Layers, camera, masks - splice","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-11-13T11:05:02.953Z","originalFileLocation":"guides/layers.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"How the z-ordered stack composites, what the bottom layer means, and how placement, camera keys and masks differ.\">\u003cmeta data-mint-head name=\"application-name\" content=\"splice\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"https://mintlify.s3.us-west-1.amazonaws.com/splice-cli/_generated/favicon/apple-touch-icon.png?v=3\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"https://mintlify.s3.us-west-1.amazonaws.com/splice-cli/_generated/favicon/favicon-32x32.png?v=3\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"https://mintlify.s3.us-west-1.amazonaws.com/splice-cli/_generated/favicon/favicon-16x16.png?v=3\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"https://mintlify.s3.us-west-1.amazonaws.com/splice-cli/_generated/favicon/favicon.ico?v=3\">\u003cmeta data-mint-head property=\"og:title\" content=\"Layers, camera, masks - splice\">\u003cmeta data-mint-head property=\"og:description\" content=\"How the z-ordered stack composites, what the bottom layer means, and how placement, camera keys and masks differ.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"splice\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://splice-cli.mintlify.app/guides/layers\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://splice-cli.mintlify.site/_mintlify/api/og/v2?division=Guides\u0026amp;title=Layers%2C+camera%2C+masks\u0026amp;description=How+the+z-ordered+stack+composites%2C+what+the+bottom+layer+means%2C+and+how+placement%2C+camera+keys+and+masks+differ.\u0026amp;theme=3c76fba90887bc4b9ed696df\u0026amp;signature=400076c04f184de89ff6b629a3bafeb8bab781a8dbbab1ee7eff5352512e537b\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Layers, camera, masks - splice\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"How the z-ordered stack composites, what the bottom layer means, and how placement, camera keys and masks differ.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://splice-cli.mintlify.site/_mintlify/api/og/v2?division=Guides\u0026amp;title=Layers%2C+camera%2C+masks\u0026amp;description=How+the+z-ordered+stack+composites%2C+what+the+bottom+layer+means%2C+and+how+placement%2C+camera+keys+and+masks+differ.\u0026amp;theme=3c76fba90887bc4b9ed696df\u0026amp;signature=400076c04f184de89ff6b629a3bafeb8bab781a8dbbab1ee7eff5352512e537b\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"https://mintlify.s3.us-west-1.amazonaws.com/splice-cli/_generated/favicon/browserconfig.xml?v=3\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"splice\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#5B8DEF\">\u003clink data-mint-head rel=\"canonical\" href=\"https://splice-cli.mintlify.app/guides/layers\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/guides/layers.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://splice-cli.mintlify.app/#organization\",\"name\":\"splice\",\"url\":\"https://splice-cli.mintlify.app\"},{\"@type\":\"WebSite\",\"@id\":\"https://splice-cli.mintlify.app#website\",\"name\":\"splice\",\"url\":\"https://splice-cli.mintlify.app\",\"publisher\":{\"@id\":\"https://splice-cli.mintlify.app/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://splice-cli.mintlify.app/guides/layers#webpage\",\"url\":\"https://splice-cli.mintlify.app/guides/layers\",\"name\":\"Layers, camera, masks\",\"description\":\"How the z-ordered stack composites, what the bottom layer means, and how placement, camera keys and masks differ.\",\"dateModified\":\"2026-11-13T11:05:02.953Z\",\"isPartOf\":{\"@id\":\"https://splice-cli.mintlify.app#website\"},\"breadcrumb\":{\"@id\":\"https://splice-cli.mintlify.app/guides/layers#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://splice-cli.mintlify.app/guides/layers#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Guides\",\"item\":\"https://splice-cli.mintlify.app/guides/editing\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Layers, camera, masks\",\"item\":\"https://splice-cli.mintlify.app/guides/layers\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://splice-cli.mintlify.app/guides/layers#article\",\"headline\":\"Layers, camera, masks\",\"name\":\"Layers, camera, masks\",\"description\":\"How the z-ordered stack composites, what the bottom layer means, and how placement, camera keys and masks differ.\",\"url\":\"https://splice-cli.mintlify.app/guides/layers\",\"mainEntityOfPage\":{\"@id\":\"https://splice-cli.mintlify.app/guides/layers#webpage\"},\"dateModified\":\"2026-11-13T11:05:02.953Z\",\"publisher\":{\"@id\":\"https://splice-cli.mintlify.app/#organization\"},\"isPartOf\":{\"@id\":\"https://splice-cli.mintlify.app#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"splice\",\"publisher\":{\"@type\":\"Organization\",\"name\":\"splice\"},\"provider\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","agentPointerHref":"/guides/layers.md","siteName":"splice","nav":{"global":null,"groups":[{"group":"Get started","icon":"rocket","pages":[{"title":"Introduction","sidebarTitle":"Overview","href":"/index"},{"title":"Quickstart","href":"/quickstart"},{"title":"Install and ffmpeg","href":"/guides/installation"}]},{"group":"Guides","icon":"book-open","pages":[{"title":"Editing","description":"Trim, retime, reorder, ramps, and removing fillers or long silences.","href":"/guides/editing"},{"title":"Layers, camera, masks","href":"/guides/layers"},{"title":"Captions and transcription","description":"Turn a recording into an SRT, review it, then decide separately whether to burn it in.","href":"/guides/captions"},{"title":"Rendering and caching","href":"/guides/rendering"},{"title":"For agents","href":"/guides/agents"}]},{"group":"Reference","icon":"code","pages":[{"title":"Command reference","href":"/reference/cli"},{"title":"Project file","href":"/reference/project-file"},{"title":"Errors and warnings","href":"/reference/errors"},{"title":"How it works","href":"/reference/how-it-works"}]}]},"basePath":"","title":"Layers, camera, masks - splice","buildId":"dpl_8hoxaqFTU7hTr6A2fUraxAyjuiZo","deploymentId":"dpl_8hoxaqFTU7hTr6A2fUraxAyjuiZo","dynamics":[],"chunks":[]}