---
title: Cut an event sizzle reel and a town hall recap from one day of footage
description: Turn a day of event or all-hands footage into a sizzle reel with music and titles, and a one-minute recap with captions and an SRT file.
---
Turn a day of conference, launch event or all-hands footage into two videos: an event sizzle reel, or highlight reel, with music and titles, and a one-minute town hall recap of the speakers' best lines with captions. You also get an SRT captions file for your intranet player. Your agent finds the applause, the laughs and the strongest quotes, so you do not scrub through hours of footage.

Use invideo for this when you need both cuts by the next morning from the same footage, each on its own branch you can review and change in the editor.

The agent never posts to your intranet, your social accounts or Slack. You publish.

## Quickest path

Set up your agent first with [invideo for AI agents](/agents). Then give it this prompt.

```text
Here is yesterday's event footage in ./event. Make two cuts on two
branches: a 60-second sizzle reel cut to upbeat music with the event
name as a title, and a one-minute recap of the CEO's and the panel's
best lines with captions. Give me an SRT for the recap. Price the
transcripts and music first.
```

In a chat app, you drag the files into the project. In a terminal, the agent names the folder and uploads it.

## What you need

These are the inputs the agent asks for.

- The footage: stage cameras, the room camera, phone clips, the stream recording.
- The names and titles of the speakers, spelled right.
- The event name, date and logo, and your brand colors.
- A music mood for the sizzle reel, or a track you own.
- Who must be in the recap, and anything that must stay out, like a confidential slide.

## Steps

The agent finds the moments first, then cuts the two videos from them.

### Find the moments

The agent builds one selects timeline, then branches it into the two cuts.

<Steps>
<Step title="Upload the footage">
Event files are large, so the agent uploads each with `start_upload`, PUTs the bytes, then calls `add_media` with the `upload_id`. Expected result: one sequence URL per file.
</Step>
<Step title="Find the loud moments and the scene changes">
The agent runs `media` `audio.onsets` and `audio.content` on each file for applause, cheers, laughs and music. It runs `video.sceneSplit` on long camera files to find the cuts, and `video.frames` at each candidate to look. Expected result: a list of moments with times and a frame each.
</Step>
<Step title="Find the best lines">
The agent prices `audio.transcript` on the sequence URL of each talk and the panel with `dry_run`, tells you the price, starts it with `max_credits` set to that price, and calls again after `retry_after_s` for the words. It picks the short, complete lines that land without context. Expected result: a list of quotes with the speaker, the file and the times, shown to you.
</Step>
<Step title="Build the selects and branch">
The agent makes a 16:9 timeline with `new_timeline`, places the picks with `place_media`, and marks each with `add_marker`. Then it runs `timeline_history` with `create_branch` twice, named `sizzle` and `recap`. Expected result: two branch URLs from one selects timeline.
</Step>
</Steps>

### Cut both videos

The agent cuts each video on its own branch, then checks both before export.

<Steps>
<Step title="Make the music">
The agent runs `find_models` with the job in words, picks one, and reads its inputs with `get_model`. A good pick is `elevenlabs_music_v2_5_instrumental`. It calls `generate` with `dry_run: true`, a `prompt` and a `duration`, and tells you the price. Then it calls `generate` with `max_credits` set to that price and an `idempotency_key`. Expected result: a sequence URL, which the agent reads with `read`.
</Step>
<Step title="Cut the sizzle reel">
On the `sizzle` branch, the agent runs `audio.beats` on the track for the beats and `audio.markers` for the drops and phrases. It cuts on the beats with `split_clip`, `trim_clip` and `delete_clip`, puts the biggest moment on a drop, and adds the event title and the logo with `add_text` and `place_media`. Expected result: a tight cut that ends on the music's last beat.
</Step>
<Step title="Cut the recap and caption it">
On the `recap` branch, the agent keeps the chosen lines in order, adds a lower third per speaker with `add_text`, and adds captions with `add_captions` from the transcript words. Expected result: a cut with captions that match the speech.
</Step>
<Step title="Check, export, and write the SRT">
The agent runs `capture` at each cut and `check_timeline` on both branches, then `export` each branch with `format` video. For the SRT, it reads the recap's caption slides with `get_timeline` mode `collection` and `collection` `caption_slide`, and writes the file. Expected result: two export cards with status `completed`, and an SRT file for the recap.
</Step>
</Steps>

The terminal version of the same job:

```bash
invideo project new --title "Summit recap"
invideo agent register <project-url> --name <name>
export INVIDEO_AS=<name>
invideo asset upload <project-url> ./event/*.mp4
invideo media audio.onsets <sequence-url>
invideo media audio.content <sequence-url>
invideo media video.sceneSplit <sequence-url> --dry-run
invideo media audio.transcript <sequence-url> --dry-run
invideo media audio.transcript <sequence-url> --max-credits <price>
invideo edit new <project-url> --name "Summit selects"
invideo edit show <edit-url> --json
invideo branch new <edit-url> --name sizzle --token <state_token>
invideo edit show <edit-url> --json
invideo branch new <edit-url> --name recap --token <state_token>
invideo edit show <sizzle-url> --json
invideo gen models <project-url> --query "upbeat instrumental music"
invideo gen model <project-url> --model elevenlabs_music_v2_5_instrumental
invideo gen run <page-url> --model elevenlabs_music_v2_5_instrumental \
  --dry-run -i prompt="driving, bright, festival energy" -i duration=60
invideo gen run <page-url> --model elevenlabs_music_v2_5_instrumental \
  --max-credits <price> --idempotency-key summit-music-v1 \
  -i prompt="driving, bright, festival energy" -i duration=60
invideo media audio.beats <music-seq-url>
invideo media audio.markers <music-seq-url>
invideo edit change <sizzle-url> --timeline T1 --token <state_token> \
  --operations @sizzle.json
invideo edit show <recap-url> --json
invideo edit change <recap-url> --timeline T1 --token <state_token> \
  --operations @recap.json
invideo edit show <recap-url> --mode collection \
  --collection caption_slide --json > slides.json
invideo edit check <sizzle-url>
invideo edit export <sizzle-url> --format video --quality 1080 --json
invideo status <card-url> --wait
invideo notebook show <card-url> --out ./sizzle
invideo edit export <recap-url> --format video --quality 1080 --json
```

Where the values come from:

- `<project-url>` comes from `invideo project new`, and `<edit-url>` from `invideo edit new`. `<name>` is the name you choose in `invideo agent register`. `<page-url>` is a notebook page from `invideo notebook show <project-url>`.
- `<sequence-url>` is the `url` the upload returns for each file. Each `<price>` is the dry run right before it.
- `<music-seq-url>` is the sequence URL from the music run or the stock pick.
- `<state_token>` comes from `invideo edit show <edit-url>`, read fresh before each `branch new`.
- `<sizzle-url>` and `<recap-url>` are the `.branch_url` each `invideo branch new` returns. Before each change, `<state_token>` is the one `invideo edit show` returns on that branch; the main token is stale there.
- `<card-url>` is `.sequences[0]` of what each export returns. `invideo status` waits and does not download; `invideo notebook show` saves the file as `./sizzle/export.mp4`. The recap export gets its own `status` and `notebook show`.

The file `./recap.json` holds a bare list of operations for the recap branch. On the MCP path, the same list goes in the `operations` field of `edit_timeline`. It adds a speaker's lower third and the caption for one line, both on `V3` (Titles). The lower third takes that span first, so `add_captions` puts the captions on the next free video track above it. At 30 fps, frame 90 is 3 seconds.

```json
[
  { "op": "add_text", "track": "V3", "start_f": 0, "end_f": 90,
    "text": "Maya Sen, CEO",
    "style": { "font_size": 42, "color": "#ffffff",
      "align": "left", "shadow": true } },
  { "op": "add_captions", "track": "V3",
    "slides": [
      { "text": "This year the team shipped more than in the last three.",
        "start_f": 0, "end_f": 96 }
    ] }
]
```

### The SRT file

The agent turns each caption slide into one SRT block: a number, the start and end time as hours, minutes, seconds and milliseconds, then the text. It converts frames to time at the timeline's rate. Then it gives you the file to upload with the video.

```text
1
00:00:00,000 --> 00:00:03,200
This year the team shipped more than in the last three.
```

## Cost and time

Edits and exports are free. Generation and transcripts cost credits. Paid stock costs a small credit charge, or one of your workspace's iStock licenses. Your agent runs a dry run first and tells you the price before it spends anything.

- Free: every edit, the SRT, `capture` and `export`.
- Costs credits: `audio.transcript` on each talk, stock music or a generated track.
- The `media` reads (`audio.onsets`, `audio.content`, `audio.beats`, `audio.markers`, `video.frames`, `video.sceneSplit`): the dry run shows the price before anything starts.

The upload and the transcripts take the longest. Plan the evening after the event for both, and the cuts the next morning. See [Credits](/account/credits) for prices.

## If something goes wrong

Most problems come from long files or loud rooms.

| Symptom | Fix |
| --- | --- |
| `get_model` or `generate` refuses the model as not found | Models retire. Run `find_models` with the job in words, use the best match, and tell the person which model you used. |
| Exit code 6, or `status` is `held` | A safety review, not a refusal. Wait, then run `invideo status <url> --wait` again. Do not resend. If it ends `failed`, change the input the review flagged. |
| The upload PUT fails | Call `start_upload` again for a new `upload_url`, and PUT once more. |
| A file has no sound, so it has no audio cues | Pick its moments from `video.frames` and the scene cuts. |
| You want stock music instead of a generated track | Run `search_library` in `stock_music`, and bring the pick in with `add_media`. |
| The applause list is mostly crowd noise | Check each candidate with `video.frames`. Keep the ones where the stage shows a moment. |
| A quote starts mid-word | Move the in point to the gap before the first word from the transcript. |
| The SRT drifts from the speech | The frame-to-time math used the wrong rate. Read the timeline's rate with `get_timeline` and write it again. |
| `audio.transcript` returns a status, not words | It is still running. Call again with the same file after `retry_after_s`. |
| An edit on one branch shows up on the other | It does not. Check that the URL names the right branch. |
| CLI exit 3 | The edit changed since your read, or the token is from main. Run `invideo edit show` on that branch's URL and use its `state_token`. |
| The `./sizzle` folder is empty after `status` | `status` waits and does not download. Run `invideo notebook show <card-url> --out ./sizzle`. |
| CLI exit 7 | Nothing ran. Run the same command again. |
| Avoid: one timeline for both cuts | Instead: one branch per deliverable, so a change to one never breaks the other. |
| Avoid: keeping a confidential slide in frame | Instead: check each frame with `capture`, and cut or blur what the person named. |

## Prompts to try

Each prompt is a real variation of this job.

```text
Make the sizzle reel in 9:16 too, on a third branch, with the title at
the top and no text near the bottom.
```

```text
The town hall has no slides worth showing. Cut the CEO's five best lines
into one minute with captions and the CEO's name as a lower third.
```

```text
Make a 15-second teaser from the sizzle branch for tomorrow's newsletter,
ending on the logo.
```

## When to use something else

invideo does not record or stream the event, post to your intranet, or make SCC caption files. Use your streaming tool to record, your intranet or video platform to publish, and a captioning tool such as Rev or 3Play Media if your platform needs SCC. For a multi-camera live switch during the event, use a production switcher.

## Related

- [Repurpose one video for every platform, one branch each](/how-to/creators/repurpose-for-every-platform)
- [Add word-by-word captions](/how-to/creators/word-by-word-captions)
- [Make an SRT captions file for an LMS](/how-to/training/srt-for-an-lms)
- [Add music and sound effects that clear rights](/how-to/creators/music-and-sound-effects)
- [Check your video before you say it is done](/how-to/check-your-video)
- [Know the cost before you spend](/how-to/cost-before-you-spend)