{
  "schemaVersion": "1.3",
  "kind": "template",
  "id": "beatreel-launch",
  "variantId": "beatreel-launch",
  "template": "beatreel",
  "engine": "remotion",
  "engineLabel": "Remotion",
  "title": "Launch Beat Showreel",
  "url": "https://cliphou.se/templates/beatreel-launch/",
  "editorUrl": "https://cliphou.se/#/v/beatreel-launch",
  "templateVersion": 1,
  "latestTemplateVersion": 1,
  "sourceHash": "2bf0924680ff9db6",
  "generation": {
    "model": "GPT-5",
    "modelId": "gpt-5",
    "provider": "OpenAI",
    "effort": "medium"
  },
  "siteCommit": "1339c8397c731da9921c763821bea988e0126bbf",
  "license": "MIT-0",
  "licenseUrl": "https://cliphou.se/license/",
  "price": "Free",
  "attributionRequired": false,
  "format": {
    "aspectRatio": "16:9",
    "width": 1920,
    "height": 1080,
    "fps": 30,
    "durationInFrames": 480,
    "seconds": 16
  },
  "scenes": [
    {
      "type": "title-reveal",
      "label": "Title reveal",
      "from": 0,
      "duration": 120,
      "roles": [
        "brand",
        "headline"
      ]
    },
    {
      "type": "list",
      "label": "List",
      "from": 120,
      "duration": 120,
      "roles": [
        "point1",
        "point2",
        "point3"
      ]
    },
    {
      "type": "transition",
      "label": "Transition",
      "from": 240,
      "duration": 60,
      "roles": []
    },
    {
      "type": "counter",
      "label": "Counter",
      "from": 300,
      "duration": 60,
      "roles": [
        "stat"
      ]
    },
    {
      "type": "end-screen",
      "label": "End screen",
      "from": 360,
      "duration": 120,
      "roles": [
        "brand",
        "subhead",
        "cta"
      ]
    }
  ],
  "props": {
    "texts": {
      "brand": "NORTHWIND",
      "headline": "Built to move",
      "point1": "Faster",
      "point2": "Sharper",
      "point3": "Louder",
      "stat": "98%",
      "subhead": "Motion that keeps time with your story.",
      "cta": "Start free"
    },
    "theme": {
      "background": "#0f1115",
      "surface": "#2a2f3a",
      "foreground": "#f4f1ea",
      "accent": "#ff5a36",
      "accent2": "#3ec9b0"
    },
    "hidden": [],
    "audio": {
      "enabled": true
    }
  },
  "editableFields": {
    "texts": {
      "brand": {
        "label": "Brand",
        "maxLength": 18,
        "current": "NORTHWIND"
      },
      "headline": {
        "label": "Headline",
        "maxLength": 24,
        "current": "Built to move"
      },
      "point1": {
        "label": "Point 1",
        "maxLength": 16,
        "current": "Faster"
      },
      "point2": {
        "label": "Point 2",
        "maxLength": 16,
        "current": "Sharper"
      },
      "point3": {
        "label": "Point 3",
        "maxLength": 16,
        "current": "Louder"
      },
      "stat": {
        "label": "Stat",
        "maxLength": 12,
        "format": "Include a number, for example 12.4k or 98%.",
        "current": "98%"
      },
      "subhead": {
        "label": "Subhead",
        "maxLength": 52,
        "current": "Motion that keeps time with your story."
      },
      "cta": {
        "label": "Call to action",
        "maxLength": 20,
        "current": "Start free"
      }
    },
    "theme": {
      "background": {
        "format": "#RRGGBB",
        "current": "#0f1115"
      },
      "surface": {
        "format": "#RRGGBB",
        "current": "#2a2f3a"
      },
      "foreground": {
        "format": "#RRGGBB",
        "current": "#f4f1ea"
      },
      "accent": {
        "format": "#RRGGBB",
        "current": "#ff5a36"
      },
      "accent2": {
        "format": "#RRGGBB",
        "current": "#3ec9b0"
      }
    },
    "hidden": {
      "format": "List of optional text roles",
      "options": [
        "point3",
        "subhead"
      ],
      "current": [],
      "note": "Hidden roles disappear with their accent notes. brand, headline, and cta cannot be hidden."
    },
    "audio": {
      "format": "{\"enabled\": boolean}",
      "current": {
        "enabled": true
      },
      "note": "When enabled, the MP4 includes the generated score as AAC 48 kHz stereo audio."
    }
  },
  "music": {
    "bpm": 120,
    "meter": "4/4",
    "bars": 8,
    "seconds": 16,
    "scenes": [
      {
        "type": "title-reveal",
        "bars": 2,
        "roles": [
          "brand",
          "headline"
        ]
      },
      {
        "type": "list",
        "bars": 2,
        "roles": [
          "point1",
          "point2",
          "point3"
        ]
      },
      {
        "type": "transition",
        "bars": 1,
        "roles": []
      },
      {
        "type": "counter",
        "bars": 1,
        "roles": [
          "stat"
        ]
      },
      {
        "type": "end-screen",
        "bars": 2,
        "roles": [
          "brand",
          "subhead",
          "cta"
        ]
      }
    ],
    "accentSlots": [
      {
        "role": "brand",
        "scene": 0,
        "beat": 0,
        "beats": 1,
        "maxHits": 2
      },
      {
        "role": "headline",
        "scene": 0,
        "beat": 1,
        "beats": 3,
        "maxHits": 4
      },
      {
        "role": "point1",
        "scene": 1,
        "beat": 0,
        "beats": 1,
        "maxHits": 2
      },
      {
        "role": "point2",
        "scene": 1,
        "beat": 1,
        "beats": 1,
        "maxHits": 2
      },
      {
        "role": "point3",
        "scene": 1,
        "beat": 2,
        "beats": 1.5,
        "maxHits": 3
      },
      {
        "role": "stat",
        "scene": 3,
        "beat": 0,
        "beats": 2,
        "maxHits": 1
      },
      {
        "role": "subhead",
        "scene": 4,
        "beat": 0.5,
        "beats": 1.5,
        "maxHits": 3
      },
      {
        "role": "cta",
        "scene": 4,
        "beat": 2,
        "beats": 2,
        "maxHits": 3
      }
    ],
    "loudness": "-14 LUFS integrated, -1 dBTP ceiling",
    "sampleRate": 48000,
    "note": "Text edits change only accent notes inside each role's slot. Tempo, bars, scene timing, and length never change."
  },
  "jsonSchema": {
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "type": "object",
    "properties": {
      "texts": {
        "type": "object",
        "properties": {
          "brand": {
            "type": "string",
            "minLength": 1,
            "maxLength": 18,
            "role": "brand"
          },
          "headline": {
            "type": "string",
            "minLength": 1,
            "maxLength": 24,
            "role": "headline"
          },
          "point1": {
            "type": "string",
            "minLength": 1,
            "maxLength": 16,
            "role": "point1"
          },
          "point2": {
            "type": "string",
            "minLength": 1,
            "maxLength": 16,
            "role": "point2"
          },
          "point3": {
            "type": "string",
            "minLength": 1,
            "maxLength": 16,
            "role": "point3"
          },
          "stat": {
            "type": "string",
            "minLength": 1,
            "maxLength": 12,
            "pattern": "\\d",
            "role": "stat"
          },
          "subhead": {
            "type": "string",
            "minLength": 1,
            "maxLength": 52,
            "role": "subhead"
          },
          "cta": {
            "type": "string",
            "minLength": 1,
            "maxLength": 20,
            "role": "cta"
          }
        },
        "required": [
          "brand",
          "headline",
          "point1",
          "point2",
          "point3",
          "stat",
          "subhead",
          "cta"
        ],
        "additionalProperties": false
      },
      "theme": {
        "type": "object",
        "properties": {
          "background": {
            "type": "string",
            "pattern": "^#[0-9a-fA-F]{6}$",
            "role": "background"
          },
          "surface": {
            "type": "string",
            "pattern": "^#[0-9a-fA-F]{6}$",
            "role": "surface"
          },
          "foreground": {
            "type": "string",
            "pattern": "^#[0-9a-fA-F]{6}$",
            "role": "foreground"
          },
          "accent": {
            "type": "string",
            "pattern": "^#[0-9a-fA-F]{6}$",
            "role": "accent"
          },
          "accent2": {
            "type": "string",
            "pattern": "^#[0-9a-fA-F]{6}$",
            "role": "accent2"
          }
        },
        "required": [
          "background",
          "surface",
          "foreground",
          "accent",
          "accent2"
        ],
        "additionalProperties": false
      },
      "hidden": {
        "maxItems": 2,
        "type": "array",
        "items": {
          "type": "string",
          "enum": [
            "point3",
            "subhead"
          ]
        },
        "kind": "hidden",
        "options": [
          "point3",
          "subhead"
        ],
        "required": [
          "brand",
          "headline",
          "cta"
        ]
      },
      "audio": {
        "type": "object",
        "properties": {
          "enabled": {
            "type": "boolean"
          }
        },
        "required": [
          "enabled"
        ],
        "additionalProperties": false
      }
    },
    "required": [
      "texts",
      "theme",
      "hidden",
      "audio"
    ],
    "additionalProperties": false
  },
  "handoff": {
    "urlTemplate": "https://cliphou.se/#/v/beatreel-launch?props=<url-encoded props JSON>",
    "example": "https://cliphou.se/#/v/beatreel-launch?props=%7B%22texts%22%3A%7B%22brand%22%3A%22NORTHWIND%22%2C%22headline%22%3A%22Built%20to%20move%22%2C%22point1%22%3A%22Faster%22%2C%22point2%22%3A%22Sharper%22%2C%22point3%22%3A%22Louder%22%2C%22stat%22%3A%2298%25%22%2C%22subhead%22%3A%22Motion%20that%20keeps%20time%20with%20your%20story.%22%2C%22cta%22%3A%22Start%20free%22%7D%2C%22theme%22%3A%7B%22background%22%3A%22%230f1115%22%2C%22surface%22%3A%22%232a2f3a%22%2C%22foreground%22%3A%22%23f4f1ea%22%2C%22accent%22%3A%22%23ff5a36%22%2C%22accent2%22%3A%22%233ec9b0%22%7D%2C%22hidden%22%3A%5B%5D%2C%22audio%22%3A%7B%22enabled%22%3Atrue%7D%7D",
    "maxEncodedLength": 8000,
    "note": "cliphou.se validates the props before it opens them. Invalid props are rejected and never saved."
  },
  "source": {
    "package": "https://cliphou.se/source/beatreel/v1.tar.gz",
    "packageSha256": "d3148c039deda3cd4417134d75de9a59712dd3270e6637aa27504e295cdd04d4",
    "templateVersion": 1,
    "renderCommand": "npm ci && node music/render.mjs",
    "repository": "https://github.com/sunmer/voodoo",
    "path": "src/videos/beatreel/",
    "contents": "Remotion component, schema, scene metadata, shared helpers, exact dependency versions, lockfile, example props, the score, audio generator, generated WAV, render script, and MIT-0 license. Fonts install from pinned Fontsource packages.",
    "note": "Rendering uses Remotion, which has separate license terms: https://remotion.dev/license"
  },
  "instructions": [
    "For text, color, and image edits, change only props.texts, props.theme, and props.media when present. Keep each text within maxLength, each color as #RRGGBB, and each image as one of its listed options.",
    "For music templates, props.hidden lists optional roles to remove and props.audio.enabled turns the score on or off in the MP4.",
    "Return text and color edits as handoff.urlTemplate with the props JSON URL-encoded.",
    "For layout, motion, timing, or scene edits, download source.package, extract it, and edit the code.",
    "Render the source package with source.renderCommand. Edit props.json to change text and colors.",
    "Never send code through the handoff URL. It accepts props only."
  ]
}
