# Send a script to Voiceover

Review a connected SDK script output as project narration while preserving existing audio takes.

A recipe, JavaScript, or hosted text-generation Block can supply narration to a
Voiceover Step through an explicit Project Type connection. Add both Steps,
then use **Advanced connections and legacy workflows → Connect steps** to connect
the Block's declared `script` output to Voiceover's `input`. Placing the Steps
next to one another alone does not create this document handoff. Production users
then work through the normal Step screens; no Canvas node or wire is required.

The [Script draft example](/block-sdk/examples/script-draft.stillmade.json) declares
`outputs: {"script":{"type":"script","primary":true}}`. Embed that exact package
in the Project Type's `packages` array, with these Steps and connection:

```json
{
  "stages": [
    {"id":"draft","blockId":"example.script-draft","version":"1.0.0","label":"Draft narration"},
    {"id":"narration","blockId":"sm.voiceover","version":"1.1.0","label":"Voiceover"}
  ],
  "connections": [
    {"from":{"stage":"draft","port":"script"},"to":{"stage":"narration","port":"input"}}
  ]
}
```

This is the relevant portion of a Project Type, not a complete package. The
selected output must contain `{"schemaVersion":1,"text":"Your narration"}` with
non-empty text of at most 200,000 characters. The hosted text runtime has its
smaller 32,768-character output limit. A plain `text` port is not automatically
converted to `script`; authors must declare and return the structured type.

Run the source Block, then continue to Voiceover. Review **Use script from [Step]**
and choose **Apply script**, or **Keep current** to leave the existing narration.
Applying rechecks the exact source placement, pinned version, completed result,
current narration and edit access. Stale, skipped or unverifiable results are not
substituted; older saved outputs may need a fresh run. A new library release does
not replace the pinned Block. Multiple results are not concatenated or selected
arbitrarily for narration.

Applying preserves existing audio takes and history, clears stale word timings
and transcript text, and marks the narration changed. Shared narration uses the
normal collaboration and conflict controls. Voice generation and timing analysis
remain separate explicit actions; opening Voiceover or applying a script does not
start a paid audio request. Protected Chat and the built-in Script Writer's
Narrative Compiler remain unchanged.
